@adcp/sdk 12.1.1 → 13.0.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (410) hide show
  1. package/README.md +19 -3
  2. package/bin/adcp-fuzz.js +3 -1
  3. package/dist/lib/adapters/content-standards-adapter.d.mts +9 -9
  4. package/dist/lib/adapters/content-standards-adapter.d.ts +9 -9
  5. package/dist/lib/adapters/content-standards-adapter.d.ts.map +1 -1
  6. package/dist/lib/adapters/content-standards-adapter.js +22 -22
  7. package/dist/lib/adapters/content-standards-adapter.js.map +1 -1
  8. package/dist/lib/adapters/content-standards-adapter.mjs +18 -18
  9. package/dist/lib/adapters/content-standards-adapter.mjs.map +1 -1
  10. package/dist/lib/adapters/index.d.mts +2 -2
  11. package/dist/lib/adapters/index.d.ts +2 -2
  12. package/dist/lib/adapters/index.d.ts.map +1 -1
  13. package/dist/lib/adapters/index.js +10 -10
  14. package/dist/lib/adapters/index.js.map +1 -1
  15. package/dist/lib/adapters/index.mjs +9 -9
  16. package/dist/lib/adapters/index.mjs.map +1 -1
  17. package/dist/lib/auth/oauth/provider-cache.d.mts +7 -0
  18. package/dist/lib/auth/oauth/provider-cache.d.ts +8 -0
  19. package/dist/lib/auth/oauth/provider-cache.d.ts.map +1 -0
  20. package/dist/lib/auth/oauth/provider-cache.js +44 -0
  21. package/dist/lib/auth/oauth/provider-cache.js.map +1 -0
  22. package/dist/lib/auth/oauth/provider-cache.mjs +19 -0
  23. package/dist/lib/auth/oauth/provider-cache.mjs.map +1 -0
  24. package/dist/lib/conformance/invariants/uniformError.js +1 -1
  25. package/dist/lib/conformance/invariants/uniformError.js.map +1 -1
  26. package/dist/lib/conformance/invariants/uniformError.mjs +1 -1
  27. package/dist/lib/conformance/invariants/uniformError.mjs.map +1 -1
  28. package/dist/lib/conformance/runners.js +1 -1
  29. package/dist/lib/conformance/runners.js.map +1 -1
  30. package/dist/lib/conformance/runners.mjs +1 -1
  31. package/dist/lib/conformance/runners.mjs.map +1 -1
  32. package/dist/lib/conformance/seeder.js +5 -5
  33. package/dist/lib/conformance/seeder.js.map +1 -1
  34. package/dist/lib/conformance/seeder.mjs +5 -5
  35. package/dist/lib/conformance/seeder.mjs.map +1 -1
  36. package/dist/lib/core/ADCPMultiAgentClient.d.mts +26 -29
  37. package/dist/lib/core/ADCPMultiAgentClient.d.ts +26 -29
  38. package/dist/lib/core/ADCPMultiAgentClient.d.ts.map +1 -1
  39. package/dist/lib/core/ADCPMultiAgentClient.js +27 -19
  40. package/dist/lib/core/ADCPMultiAgentClient.js.map +1 -1
  41. package/dist/lib/core/ADCPMultiAgentClient.mjs +27 -19
  42. package/dist/lib/core/ADCPMultiAgentClient.mjs.map +1 -1
  43. package/dist/lib/core/AgentClient.d.mts +148 -138
  44. package/dist/lib/core/AgentClient.d.ts +148 -138
  45. package/dist/lib/core/AgentClient.d.ts.map +1 -1
  46. package/dist/lib/core/AgentClient.js +174 -85
  47. package/dist/lib/core/AgentClient.js.map +1 -1
  48. package/dist/lib/core/AgentClient.mjs +174 -85
  49. package/dist/lib/core/AgentClient.mjs.map +1 -1
  50. package/dist/lib/core/AsyncHandler.d.mts +18 -16
  51. package/dist/lib/core/AsyncHandler.d.ts +18 -16
  52. package/dist/lib/core/AsyncHandler.d.ts.map +1 -1
  53. package/dist/lib/core/AsyncHandler.js +22 -1
  54. package/dist/lib/core/AsyncHandler.js.map +1 -1
  55. package/dist/lib/core/AsyncHandler.mjs +22 -1
  56. package/dist/lib/core/AsyncHandler.mjs.map +1 -1
  57. package/dist/lib/core/ConversationTypes.d.mts +6 -2
  58. package/dist/lib/core/ConversationTypes.d.ts +6 -2
  59. package/dist/lib/core/ConversationTypes.d.ts.map +1 -1
  60. package/dist/lib/core/ConversationTypes.js.map +1 -1
  61. package/dist/lib/core/CreativeAgentClient.d.mts +41 -17
  62. package/dist/lib/core/CreativeAgentClient.d.ts +41 -17
  63. package/dist/lib/core/CreativeAgentClient.d.ts.map +1 -1
  64. package/dist/lib/core/CreativeAgentClient.js +39 -12
  65. package/dist/lib/core/CreativeAgentClient.js.map +1 -1
  66. package/dist/lib/core/CreativeAgentClient.mjs +39 -12
  67. package/dist/lib/core/CreativeAgentClient.mjs.map +1 -1
  68. package/dist/lib/core/SingleAgentClient.d.mts +127 -50
  69. package/dist/lib/core/SingleAgentClient.d.ts +127 -50
  70. package/dist/lib/core/SingleAgentClient.d.ts.map +1 -1
  71. package/dist/lib/core/SingleAgentClient.js +1617 -177
  72. package/dist/lib/core/SingleAgentClient.js.map +1 -1
  73. package/dist/lib/core/SingleAgentClient.mjs +1627 -177
  74. package/dist/lib/core/SingleAgentClient.mjs.map +1 -1
  75. package/dist/lib/core/TaskExecutor.d.mts +9 -0
  76. package/dist/lib/core/TaskExecutor.d.ts +9 -0
  77. package/dist/lib/core/TaskExecutor.d.ts.map +1 -1
  78. package/dist/lib/core/TaskExecutor.js +136 -43
  79. package/dist/lib/core/TaskExecutor.js.map +1 -1
  80. package/dist/lib/core/TaskExecutor.mjs +136 -43
  81. package/dist/lib/core/TaskExecutor.mjs.map +1 -1
  82. package/dist/lib/index.d.mts +111 -17
  83. package/dist/lib/index.d.ts +111 -17
  84. package/dist/lib/index.d.ts.map +1 -1
  85. package/dist/lib/index.js +94 -94
  86. package/dist/lib/index.js.map +1 -1
  87. package/dist/lib/index.mjs +93 -94
  88. package/dist/lib/index.mjs.map +1 -1
  89. package/dist/lib/protocols/index.d.ts.map +1 -1
  90. package/dist/lib/protocols/index.js +6 -15
  91. package/dist/lib/protocols/index.js.map +1 -1
  92. package/dist/lib/protocols/index.mjs +6 -16
  93. package/dist/lib/protocols/index.mjs.map +1 -1
  94. package/dist/lib/protocols/mcp-modern.d.ts.map +1 -1
  95. package/dist/lib/protocols/mcp-modern.js +87 -12
  96. package/dist/lib/protocols/mcp-modern.js.map +1 -1
  97. package/dist/lib/protocols/mcp-modern.mjs +89 -12
  98. package/dist/lib/protocols/mcp-modern.mjs.map +1 -1
  99. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  100. package/dist/lib/server/create-adcp-server.d.mts +6 -0
  101. package/dist/lib/server/create-adcp-server.d.ts +6 -0
  102. package/dist/lib/server/create-adcp-server.d.ts.map +1 -1
  103. package/dist/lib/server/create-adcp-server.js +295 -48
  104. package/dist/lib/server/create-adcp-server.js.map +1 -1
  105. package/dist/lib/server/create-adcp-server.mjs +301 -50
  106. package/dist/lib/server/create-adcp-server.mjs.map +1 -1
  107. package/dist/lib/server/decisioning/assembly-helpers.d.mts +27 -13
  108. package/dist/lib/server/decisioning/assembly-helpers.d.ts +27 -13
  109. package/dist/lib/server/decisioning/assembly-helpers.d.ts.map +1 -1
  110. package/dist/lib/server/decisioning/assembly-helpers.js +136 -14
  111. package/dist/lib/server/decisioning/assembly-helpers.js.map +1 -1
  112. package/dist/lib/server/decisioning/assembly-helpers.mjs +134 -13
  113. package/dist/lib/server/decisioning/assembly-helpers.mjs.map +1 -1
  114. package/dist/lib/server/decisioning/index.d.mts +13 -12
  115. package/dist/lib/server/decisioning/index.d.ts +13 -12
  116. package/dist/lib/server/decisioning/index.d.ts.map +1 -1
  117. package/dist/lib/server/decisioning/index.js +6 -0
  118. package/dist/lib/server/decisioning/index.js.map +1 -1
  119. package/dist/lib/server/decisioning/index.mjs +9 -3
  120. package/dist/lib/server/decisioning/index.mjs.map +1 -1
  121. package/dist/lib/server/decisioning/list-helpers.d.mts +13 -3
  122. package/dist/lib/server/decisioning/list-helpers.d.ts +13 -3
  123. package/dist/lib/server/decisioning/list-helpers.d.ts.map +1 -1
  124. package/dist/lib/server/decisioning/list-helpers.js +13 -3
  125. package/dist/lib/server/decisioning/list-helpers.js.map +1 -1
  126. package/dist/lib/server/decisioning/list-helpers.mjs +11 -2
  127. package/dist/lib/server/decisioning/list-helpers.mjs.map +1 -1
  128. package/dist/lib/server/decisioning/manifest-helpers.d.mts +5 -3
  129. package/dist/lib/server/decisioning/manifest-helpers.d.ts +5 -3
  130. package/dist/lib/server/decisioning/manifest-helpers.d.ts.map +1 -1
  131. package/dist/lib/server/decisioning/manifest-helpers.js.map +1 -1
  132. package/dist/lib/server/decisioning/manifest-helpers.mjs.map +1 -1
  133. package/dist/lib/server/decisioning/proposal/dispatch.d.mts +2 -2
  134. package/dist/lib/server/decisioning/proposal/dispatch.d.ts +2 -2
  135. package/dist/lib/server/decisioning/proposal/dispatch.d.ts.map +1 -1
  136. package/dist/lib/server/decisioning/proposal/dispatch.js.map +1 -1
  137. package/dist/lib/server/decisioning/proposal/dispatch.mjs.map +1 -1
  138. package/dist/lib/server/decisioning/proposal/index.d.mts +1 -1
  139. package/dist/lib/server/decisioning/proposal/index.d.ts +1 -1
  140. package/dist/lib/server/decisioning/proposal/index.d.ts.map +1 -1
  141. package/dist/lib/server/decisioning/proposal/index.js.map +1 -1
  142. package/dist/lib/server/decisioning/proposal/index.mjs.map +1 -1
  143. package/dist/lib/server/decisioning/proposal/lifecycle.d.mts +3 -2
  144. package/dist/lib/server/decisioning/proposal/lifecycle.d.ts +3 -2
  145. package/dist/lib/server/decisioning/proposal/lifecycle.d.ts.map +1 -1
  146. package/dist/lib/server/decisioning/proposal/lifecycle.js.map +1 -1
  147. package/dist/lib/server/decisioning/proposal/lifecycle.mjs.map +1 -1
  148. package/dist/lib/server/decisioning/proposal/mock-manager.d.mts +3 -3
  149. package/dist/lib/server/decisioning/proposal/mock-manager.d.ts +3 -3
  150. package/dist/lib/server/decisioning/proposal/mock-manager.d.ts.map +1 -1
  151. package/dist/lib/server/decisioning/proposal/mock-manager.js.map +1 -1
  152. package/dist/lib/server/decisioning/proposal/mock-manager.mjs.map +1 -1
  153. package/dist/lib/server/decisioning/proposal/types.d.mts +10 -6
  154. package/dist/lib/server/decisioning/proposal/types.d.ts +10 -6
  155. package/dist/lib/server/decisioning/proposal/types.d.ts.map +1 -1
  156. package/dist/lib/server/decisioning/proposal/types.js.map +1 -1
  157. package/dist/lib/server/decisioning/proposal/types.mjs.map +1 -1
  158. package/dist/lib/server/decisioning/runtime/from-platform.d.mts +21 -2
  159. package/dist/lib/server/decisioning/runtime/from-platform.d.ts +21 -2
  160. package/dist/lib/server/decisioning/runtime/from-platform.d.ts.map +1 -1
  161. package/dist/lib/server/decisioning/runtime/from-platform.js +754 -81
  162. package/dist/lib/server/decisioning/runtime/from-platform.js.map +1 -1
  163. package/dist/lib/server/decisioning/runtime/from-platform.mjs +763 -81
  164. package/dist/lib/server/decisioning/runtime/from-platform.mjs.map +1 -1
  165. package/dist/lib/server/decisioning/specialisms/brand-rights.d.mts +9 -9
  166. package/dist/lib/server/decisioning/specialisms/brand-rights.d.ts +9 -9
  167. package/dist/lib/server/decisioning/specialisms/brand-rights.d.ts.map +1 -1
  168. package/dist/lib/server/decisioning/specialisms/brand-rights.js.map +1 -1
  169. package/dist/lib/server/decisioning/specialisms/content-standards.d.mts +16 -16
  170. package/dist/lib/server/decisioning/specialisms/content-standards.d.ts +16 -16
  171. package/dist/lib/server/decisioning/specialisms/content-standards.d.ts.map +1 -1
  172. package/dist/lib/server/decisioning/specialisms/content-standards.js.map +1 -1
  173. package/dist/lib/server/decisioning/specialisms/creative-ad-server.d.mts +15 -13
  174. package/dist/lib/server/decisioning/specialisms/creative-ad-server.d.ts +15 -13
  175. package/dist/lib/server/decisioning/specialisms/creative-ad-server.d.ts.map +1 -1
  176. package/dist/lib/server/decisioning/specialisms/creative-ad-server.js.map +1 -1
  177. package/dist/lib/server/decisioning/specialisms/creative.d.mts +12 -11
  178. package/dist/lib/server/decisioning/specialisms/creative.d.ts +12 -11
  179. package/dist/lib/server/decisioning/specialisms/creative.d.ts.map +1 -1
  180. package/dist/lib/server/decisioning/specialisms/creative.js.map +1 -1
  181. package/dist/lib/server/decisioning/specialisms/sales.d.mts +25 -15
  182. package/dist/lib/server/decisioning/specialisms/sales.d.ts +25 -15
  183. package/dist/lib/server/decisioning/specialisms/sales.d.ts.map +1 -1
  184. package/dist/lib/server/decisioning/specialisms/sales.js.map +1 -1
  185. package/dist/lib/server/index.d.mts +3 -3
  186. package/dist/lib/server/index.d.ts +3 -3
  187. package/dist/lib/server/index.d.ts.map +1 -1
  188. package/dist/lib/server/index.js +72 -72
  189. package/dist/lib/server/index.js.map +1 -1
  190. package/dist/lib/server/index.mjs +36 -36
  191. package/dist/lib/server/index.mjs.map +1 -1
  192. package/dist/lib/server/legacy/v5/index.d.mts +1 -0
  193. package/dist/lib/server/legacy/v5/index.d.ts +1 -0
  194. package/dist/lib/server/legacy/v5/index.d.ts.map +1 -1
  195. package/dist/lib/server/legacy/v5/index.js +74 -1
  196. package/dist/lib/server/legacy/v5/index.js.map +1 -1
  197. package/dist/lib/server/legacy/v5/index.mjs +75 -1
  198. package/dist/lib/server/legacy/v5/index.mjs.map +1 -1
  199. package/dist/lib/server/responses.d.mts +2 -2
  200. package/dist/lib/server/responses.d.ts +2 -2
  201. package/dist/lib/server/responses.js.map +1 -1
  202. package/dist/lib/server/responses.mjs.map +1 -1
  203. package/dist/lib/testing/client.js +1 -1
  204. package/dist/lib/testing/client.js.map +1 -1
  205. package/dist/lib/testing/client.mjs +1 -1
  206. package/dist/lib/testing/client.mjs.map +1 -1
  207. package/dist/lib/testing/scenarios/brand-rights.js +6 -6
  208. package/dist/lib/testing/scenarios/brand-rights.js.map +1 -1
  209. package/dist/lib/testing/scenarios/brand-rights.mjs +6 -6
  210. package/dist/lib/testing/scenarios/brand-rights.mjs.map +1 -1
  211. package/dist/lib/testing/scenarios/creative.js +7 -7
  212. package/dist/lib/testing/scenarios/creative.js.map +1 -1
  213. package/dist/lib/testing/scenarios/creative.mjs +7 -7
  214. package/dist/lib/testing/scenarios/creative.mjs.map +1 -1
  215. package/dist/lib/testing/scenarios/discovery.js +2 -2
  216. package/dist/lib/testing/scenarios/discovery.js.map +1 -1
  217. package/dist/lib/testing/scenarios/discovery.mjs +2 -2
  218. package/dist/lib/testing/scenarios/discovery.mjs.map +1 -1
  219. package/dist/lib/testing/scenarios/edge-cases.js +11 -11
  220. package/dist/lib/testing/scenarios/edge-cases.js.map +1 -1
  221. package/dist/lib/testing/scenarios/edge-cases.mjs +11 -11
  222. package/dist/lib/testing/scenarios/edge-cases.mjs.map +1 -1
  223. package/dist/lib/testing/scenarios/governance.d.ts.map +1 -1
  224. package/dist/lib/testing/scenarios/governance.js +16 -22
  225. package/dist/lib/testing/scenarios/governance.js.map +1 -1
  226. package/dist/lib/testing/scenarios/governance.mjs +16 -22
  227. package/dist/lib/testing/scenarios/governance.mjs.map +1 -1
  228. package/dist/lib/testing/scenarios/media-buy.js +5 -5
  229. package/dist/lib/testing/scenarios/media-buy.js.map +1 -1
  230. package/dist/lib/testing/scenarios/media-buy.mjs +5 -5
  231. package/dist/lib/testing/scenarios/media-buy.mjs.map +1 -1
  232. package/dist/lib/testing/scenarios/schema-compliance.js +1 -1
  233. package/dist/lib/testing/scenarios/schema-compliance.js.map +1 -1
  234. package/dist/lib/testing/scenarios/schema-compliance.mjs +1 -1
  235. package/dist/lib/testing/scenarios/schema-compliance.mjs.map +1 -1
  236. package/dist/lib/testing/scenarios/trusted-match.d.ts.map +1 -1
  237. package/dist/lib/testing/scenarios/trusted-match.js +4 -3
  238. package/dist/lib/testing/scenarios/trusted-match.js.map +1 -1
  239. package/dist/lib/testing/scenarios/trusted-match.mjs +4 -3
  240. package/dist/lib/testing/scenarios/trusted-match.mjs.map +1 -1
  241. package/dist/lib/testing/storyboard/shape-drift-hints.d.mts +3 -4
  242. package/dist/lib/testing/storyboard/shape-drift-hints.d.ts +3 -4
  243. package/dist/lib/testing/storyboard/shape-drift-hints.d.ts.map +1 -1
  244. package/dist/lib/testing/storyboard/shape-drift-hints.js +27 -27
  245. package/dist/lib/testing/storyboard/shape-drift-hints.js.map +1 -1
  246. package/dist/lib/testing/storyboard/shape-drift-hints.mjs +27 -27
  247. package/dist/lib/testing/storyboard/shape-drift-hints.mjs.map +1 -1
  248. package/dist/lib/testing/storyboard/task-map.d.ts.map +1 -1
  249. package/dist/lib/testing/storyboard/task-map.js +43 -5
  250. package/dist/lib/testing/storyboard/task-map.js.map +1 -1
  251. package/dist/lib/testing/storyboard/task-map.mjs +43 -5
  252. package/dist/lib/testing/storyboard/task-map.mjs.map +1 -1
  253. package/dist/lib/testing/test-helpers.d.mts +2 -2
  254. package/dist/lib/testing/test-helpers.d.ts +2 -2
  255. package/dist/lib/testing/test-helpers.js.map +1 -1
  256. package/dist/lib/testing/test-helpers.mjs.map +1 -1
  257. package/dist/lib/types/adcp.d.mts +14 -14
  258. package/dist/lib/types/adcp.d.ts +14 -14
  259. package/dist/lib/types/adcp.d.ts.map +1 -1
  260. package/dist/lib/types/adcp.js.map +1 -1
  261. package/dist/lib/types/adcp.mjs.map +1 -1
  262. package/dist/lib/types/index.d.mts +2 -2
  263. package/dist/lib/types/index.d.ts +2 -2
  264. package/dist/lib/types/index.d.ts.map +1 -1
  265. package/dist/lib/types/index.js.map +1 -1
  266. package/dist/lib/types/index.mjs.map +1 -1
  267. package/dist/lib/utils/capabilities.d.mts +6 -0
  268. package/dist/lib/utils/capabilities.d.ts +6 -0
  269. package/dist/lib/utils/capabilities.d.ts.map +1 -1
  270. package/dist/lib/utils/capabilities.js +4 -0
  271. package/dist/lib/utils/capabilities.js.map +1 -1
  272. package/dist/lib/utils/capabilities.mjs +4 -0
  273. package/dist/lib/utils/capabilities.mjs.map +1 -1
  274. package/dist/lib/utils/creative-delivery.d.mts +52 -10
  275. package/dist/lib/utils/creative-delivery.d.ts +52 -10
  276. package/dist/lib/utils/creative-delivery.d.ts.map +1 -1
  277. package/dist/lib/utils/creative-delivery.js +104 -9
  278. package/dist/lib/utils/creative-delivery.js.map +1 -1
  279. package/dist/lib/utils/creative-delivery.mjs +104 -8
  280. package/dist/lib/utils/creative-delivery.mjs.map +1 -1
  281. package/dist/lib/utils/format-assets.d.mts +41 -38
  282. package/dist/lib/utils/format-assets.d.ts +41 -38
  283. package/dist/lib/utils/format-assets.d.ts.map +1 -1
  284. package/dist/lib/utils/format-assets.js +3 -1
  285. package/dist/lib/utils/format-assets.js.map +1 -1
  286. package/dist/lib/utils/format-assets.mjs +3 -1
  287. package/dist/lib/utils/format-assets.mjs.map +1 -1
  288. package/dist/lib/utils/index.d.mts +8 -8
  289. package/dist/lib/utils/index.d.ts +8 -8
  290. package/dist/lib/utils/index.d.ts.map +1 -1
  291. package/dist/lib/utils/index.js +11 -9
  292. package/dist/lib/utils/index.js.map +1 -1
  293. package/dist/lib/utils/index.mjs +9 -8
  294. package/dist/lib/utils/index.mjs.map +1 -1
  295. package/dist/lib/utils/preview-utils.d.mts +11 -8
  296. package/dist/lib/utils/preview-utils.d.ts +11 -8
  297. package/dist/lib/utils/preview-utils.d.ts.map +1 -1
  298. package/dist/lib/utils/preview-utils.js +4 -4
  299. package/dist/lib/utils/preview-utils.js.map +1 -1
  300. package/dist/lib/utils/preview-utils.mjs +3 -3
  301. package/dist/lib/utils/preview-utils.mjs.map +1 -1
  302. package/dist/lib/utils/tool-request-schemas.d.mts +2 -2
  303. package/dist/lib/utils/tool-request-schemas.d.ts +2 -2
  304. package/dist/lib/v2/projection/aao-reference-formats.json +492 -0
  305. package/dist/lib/v2/projection/augment-response.d.mts +31 -11
  306. package/dist/lib/v2/projection/augment-response.d.ts +31 -11
  307. package/dist/lib/v2/projection/augment-response.d.ts.map +1 -1
  308. package/dist/lib/v2/projection/augment-response.js +233 -27
  309. package/dist/lib/v2/projection/augment-response.js.map +1 -1
  310. package/dist/lib/v2/projection/augment-response.mjs +232 -27
  311. package/dist/lib/v2/projection/augment-response.mjs.map +1 -1
  312. package/dist/lib/v2/projection/builders.d.mts +7 -6
  313. package/dist/lib/v2/projection/builders.d.ts +7 -6
  314. package/dist/lib/v2/projection/builders.d.ts.map +1 -1
  315. package/dist/lib/v2/projection/builders.js +11 -8
  316. package/dist/lib/v2/projection/builders.js.map +1 -1
  317. package/dist/lib/v2/projection/builders.mjs +9 -6
  318. package/dist/lib/v2/projection/builders.mjs.map +1 -1
  319. package/dist/lib/v2/projection/catalog-snapshot.d.mts +47 -0
  320. package/dist/lib/v2/projection/catalog-snapshot.d.ts +48 -0
  321. package/dist/lib/v2/projection/catalog-snapshot.d.ts.map +1 -0
  322. package/dist/lib/v2/projection/catalog-snapshot.js +291 -0
  323. package/dist/lib/v2/projection/catalog-snapshot.js.map +1 -0
  324. package/dist/lib/v2/projection/catalog-snapshot.mjs +265 -0
  325. package/dist/lib/v2/projection/catalog-snapshot.mjs.map +1 -0
  326. package/dist/lib/v2/projection/catalog.d.mts +23 -2
  327. package/dist/lib/v2/projection/catalog.d.ts +23 -2
  328. package/dist/lib/v2/projection/catalog.d.ts.map +1 -1
  329. package/dist/lib/v2/projection/catalog.js +34 -10
  330. package/dist/lib/v2/projection/catalog.js.map +1 -1
  331. package/dist/lib/v2/projection/catalog.mjs +33 -10
  332. package/dist/lib/v2/projection/catalog.mjs.map +1 -1
  333. package/dist/lib/v2/projection/creative-delivery.d.mts +157 -0
  334. package/dist/lib/v2/projection/creative-delivery.d.ts +158 -0
  335. package/dist/lib/v2/projection/creative-delivery.d.ts.map +1 -0
  336. package/dist/lib/v2/projection/creative-delivery.js +967 -0
  337. package/dist/lib/v2/projection/creative-delivery.js.map +1 -0
  338. package/dist/lib/v2/projection/creative-delivery.mjs +941 -0
  339. package/dist/lib/v2/projection/creative-delivery.mjs.map +1 -0
  340. package/dist/lib/v2/projection/index.d.mts +8 -6
  341. package/dist/lib/v2/projection/index.d.ts +8 -6
  342. package/dist/lib/v2/projection/index.d.ts.map +1 -1
  343. package/dist/lib/v2/projection/index.js +26 -4
  344. package/dist/lib/v2/projection/index.js.map +1 -1
  345. package/dist/lib/v2/projection/index.mjs +28 -4
  346. package/dist/lib/v2/projection/index.mjs.map +1 -1
  347. package/dist/lib/v2/projection/legacy-metadata.d.mts +21 -0
  348. package/dist/lib/v2/projection/legacy-metadata.d.ts +22 -0
  349. package/dist/lib/v2/projection/legacy-metadata.d.ts.map +1 -0
  350. package/dist/lib/v2/projection/legacy-metadata.js +73 -0
  351. package/dist/lib/v2/projection/legacy-metadata.js.map +1 -0
  352. package/dist/lib/v2/projection/legacy-metadata.mjs +45 -0
  353. package/dist/lib/v2/projection/legacy-metadata.mjs.map +1 -0
  354. package/dist/lib/v2/projection/types.d.mts +29 -23
  355. package/dist/lib/v2/projection/types.d.ts +29 -23
  356. package/dist/lib/v2/projection/types.d.ts.map +1 -1
  357. package/dist/lib/v2/projection/types.js.map +1 -1
  358. package/dist/lib/v2/projection/v1-to-v2.d.mts +29 -6
  359. package/dist/lib/v2/projection/v1-to-v2.d.ts +29 -6
  360. package/dist/lib/v2/projection/v1-to-v2.d.ts.map +1 -1
  361. package/dist/lib/v2/projection/v1-to-v2.js +218 -9
  362. package/dist/lib/v2/projection/v1-to-v2.js.map +1 -1
  363. package/dist/lib/v2/projection/v1-to-v2.mjs +219 -10
  364. package/dist/lib/v2/projection/v1-to-v2.mjs.map +1 -1
  365. package/dist/lib/v2/projection/v2-to-v1.d.mts +31 -2
  366. package/dist/lib/v2/projection/v2-to-v1.d.ts +31 -2
  367. package/dist/lib/v2/projection/v2-to-v1.d.ts.map +1 -1
  368. package/dist/lib/v2/projection/v2-to-v1.js +138 -7
  369. package/dist/lib/v2/projection/v2-to-v1.js.map +1 -1
  370. package/dist/lib/v2/projection/v2-to-v1.mjs +135 -6
  371. package/dist/lib/v2/projection/v2-to-v1.mjs.map +1 -1
  372. package/dist/lib/v2/projection/write-side.d.mts +12 -13
  373. package/dist/lib/v2/projection/write-side.d.ts +12 -13
  374. package/dist/lib/v2/projection/write-side.d.ts.map +1 -1
  375. package/dist/lib/v2/projection/write-side.js +16 -12
  376. package/dist/lib/v2/projection/write-side.js.map +1 -1
  377. package/dist/lib/v2/projection/write-side.mjs +16 -12
  378. package/dist/lib/v2/projection/write-side.mjs.map +1 -1
  379. package/dist/lib/version.d.mts +3 -3
  380. package/dist/lib/version.d.ts +3 -3
  381. package/dist/lib/version.d.ts.map +1 -1
  382. package/dist/lib/version.js +3 -3
  383. package/dist/lib/version.js.map +1 -1
  384. package/dist/lib/version.mjs +3 -3
  385. package/dist/lib/version.mjs.map +1 -1
  386. package/docs/guides/BUILD-AN-AGENT.md +7 -2
  387. package/docs/guides/PREVIEW-ASSET-DURABILITY.md +6 -2
  388. package/docs/llms.txt +1 -0
  389. package/examples/README.md +1 -1
  390. package/examples/batch-preview-test.ts +3 -3
  391. package/examples/conversation-client.ts +2 -2
  392. package/examples/debug-preview-response.ts +1 -1
  393. package/examples/decisioning-platform-broadcast-tv.ts +10 -4
  394. package/examples/decisioning-platform-mock-seller.ts +16 -9
  395. package/examples/decisioning-platform-programmatic.ts +18 -7
  396. package/examples/error-compliant-server.ts +26 -16
  397. package/examples/generative-creative-demo.ts +7 -19
  398. package/examples/hello_creative_adapter_ad_server.ts +37 -16
  399. package/examples/hello_creative_adapter_template.ts +12 -10
  400. package/examples/hello_seller_adapter_guaranteed.ts +52 -23
  401. package/examples/hello_seller_adapter_multi_tenant.ts +6 -3
  402. package/examples/hello_seller_adapter_non_guaranteed.ts +54 -26
  403. package/examples/hello_seller_adapter_proposal_mode.ts +40 -14
  404. package/examples/hello_seller_adapter_social.ts +2 -7
  405. package/examples/inspect-card-formats.ts +1 -1
  406. package/examples/simple-getting-started.ts +1 -1
  407. package/examples/test-helpers-demo.ts +1 -1
  408. package/package.json +2 -2
  409. package/skills/build-decisioning-creative-template/SKILL.md +11 -11
  410. package/skills/build-decisioning-platform/advanced/REFERENCE.md +8 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/core/AsyncHandler.ts"],"sourcesContent":["/**\n * Structured async handler for AdCP webhook responses\n * Provides type-safe callbacks for each AdCP tool completion\n */\n\nimport type { IdempotencyBackend } from '../server/idempotency/store';\nimport type {\n ListCreativeFormatsResponse,\n ListCreativesResponse,\n PreviewCreativeResponse,\n BuildCreativeResponse,\n GetMediaBuysResponse,\n GetMediaBuyDeliveryResponse,\n ProvidePerformanceFeedbackResponse,\n GetSignalsResponse,\n ActivateSignalResponse,\n ListAccountsResponse,\n SyncAccountsResponse,\n SyncAudiencesResponse,\n CreatePropertyListResponse,\n GetPropertyListResponse,\n UpdatePropertyListResponse,\n ListPropertyListsResponse,\n DeletePropertyListResponse,\n ListContentStandardsResponse,\n GetContentStandardsResponse,\n CalibrateContentResponse,\n ValidateContentDeliveryResponse,\n SIGetOfferingResponse,\n SIInitiateSessionResponse,\n SISendMessageResponse,\n SITerminateSessionResponse,\n} from '../types/tools.generated';\n\nimport type {\n AdCPAsyncResponseData,\n CreateMediaBuyAsyncInputRequired,\n CreateMediaBuyAsyncSubmitted,\n CreateMediaBuyAsyncWorking,\n CreateMediaBuyResponse,\n GetProductsAsyncInputRequired,\n GetProductsAsyncSubmitted,\n GetProductsAsyncWorking,\n GetProductsResponse,\n SyncCreativesAsyncInputRequired,\n SyncCreativesAsyncSubmitted,\n SyncCreativesAsyncWorking,\n SyncCreativesResponse,\n TaskStatus,\n TaskType,\n UpdateMediaBuyAsyncInputRequired,\n UpdateMediaBuyAsyncSubmitted,\n UpdateMediaBuyAsyncWorking,\n UpdateMediaBuyResponse,\n} from '../types/core.generated';\nimport type { TaskResultMetadata } from './ConversationTypes';\nimport {\n CreateMediaBuyAsyncResponseData,\n GetProductsAsyncResponseData,\n SyncCreativesAsyncResponseData,\n UpdateMediaBuyAsyncResponseData,\n} from '../types';\n\n/**\n * Metadata provided with webhook responses\n */\nexport interface WebhookMetadata {\n /** Client-provided operation ID */\n operation_id: string;\n /** Server's task ID */\n task_id: string;\n /** Agent ID */\n agent_id: string;\n /** Task type/tool name */\n task_type: string;\n /** Task status (completed, failed, needs_input, working, etc) */\n status: TaskStatus;\n /** Server's context ID */\n context_id?: string;\n /** Human-readable context about the status change */\n message?: string;\n /** Timestamp */\n timestamp: string;\n /** raw HTTP payload */\n rawHTTPPayload?: any;\n /**\n * Wire protocol that delivered this webhook. Useful for handler code\n * that needs to treat MCP and A2A transports differently (e.g.,\n * `idempotency_key` is only present on MCP payloads).\n */\n protocol?: 'mcp' | 'a2a';\n /**\n * Sender-generated key stable across retries of the same webhook event\n * (MCP envelope only — A2A webhooks do not carry this field). Use this\n * as the canonical dedup key; see `AsyncHandlerConfig.webhookDedup`.\n */\n idempotency_key?: string;\n /**\n * Buyer-side product property policy evaluation for completed get_products\n * webhooks. Present when the client filters, audits, or rejects a webhook\n * result before dispatching it to handlers.\n */\n productPropertyPolicy?: TaskResultMetadata['productPropertyPolicy'];\n /**\n * Buyer-side pricing-options enforcement summary for completed get_products\n * webhooks. Present when the client drops products that arrived without a\n * usable `pricing_options[]` array before dispatching to handlers.\n */\n productPricingPolicy?: TaskResultMetadata['productPricingPolicy'];\n}\n\n/**\n * Metadata for agent-initiated notifications\n * Same as WebhookMetadata but includes notification-specific fields\n */\nexport interface NotificationMetadata extends WebhookMetadata {\n /** Notification type */\n notification_type: 'scheduled' | 'final' | 'delayed';\n /** Sequence number of this notification */\n sequence_number?: number;\n /** When next notification is expected (not present for 'final') */\n next_expected_at?: string;\n}\n\n// Simple union-typed handlers for webhook status changes\nexport type GetProductsStatusChangeHandler = (\n response: GetProductsResponse | GetProductsAsyncSubmitted | GetProductsAsyncWorking | GetProductsAsyncInputRequired,\n metadata: WebhookMetadata\n) => void | Promise<void>;\n\nexport type CreateMediaBuyStatusChangeHandler = (\n response:\n | CreateMediaBuyResponse\n | CreateMediaBuyAsyncSubmitted\n | CreateMediaBuyAsyncWorking\n | CreateMediaBuyAsyncInputRequired,\n metadata: WebhookMetadata\n) => void | Promise<void>;\n\nexport type UpdateMediaBuyStatusChangeHandler = (\n response:\n | UpdateMediaBuyResponse\n | UpdateMediaBuyAsyncSubmitted\n | UpdateMediaBuyAsyncWorking\n | UpdateMediaBuyAsyncInputRequired,\n metadata: WebhookMetadata\n) => void | Promise<void>;\n\nexport type SyncCreativesStatusChangeHandler = (\n response:\n | SyncCreativesResponse\n | SyncCreativesAsyncSubmitted\n | SyncCreativesAsyncWorking\n | SyncCreativesAsyncInputRequired,\n metadata: WebhookMetadata\n) => void | Promise<void>;\n\n/**\n * Media buy delivery notification payload (PR #81)\n * Agent-initiated periodic reporting, not tied to any client operation\n */\nexport interface MediaBuyDeliveryNotification {\n /** Type of notification */\n notification_type: 'scheduled' | 'final' | 'delayed';\n /** Sequential notification number (starts at 1) */\n sequence_number?: number;\n /** When next notification is expected (omitted for 'final') */\n next_expected_at?: string;\n /** Reporting period for this notification */\n reporting_period?: {\n start: string;\n end: string;\n };\n /** Currency used for financial metrics */\n currency?: string;\n /** Array of media buy deliveries being reported */\n media_buy_deliveries?: Array<{\n media_buy_id: string;\n impressions?: number;\n clicks?: number;\n spend?: number;\n conversions?: number;\n [key: string]: any;\n }>;\n}\n\n/**\n * Activity event for logging/observability\n */\nexport interface Activity {\n type:\n | 'protocol_request'\n | 'protocol_response'\n | 'status_change'\n | 'webhook_received'\n | 'webhook_duplicate'\n | 'governance_check'\n | 'governance_outcome';\n operation_id: string;\n agent_id: string;\n context_id?: string;\n task_id?: string;\n task_type: string;\n status?: string;\n /**\n * Full AdCP response payload. Populated on `webhook_received` and\n * protocol/status events. INTENTIONALLY omitted on `webhook_duplicate`\n * to avoid re-logging potentially-sensitive data on every retry — the\n * originating `webhook_received` event already carries it. Correlate\n * the two via `idempotency_key`.\n */\n payload?: any;\n /**\n * Webhook idempotency key when available. Present on `webhook_received`\n * and `webhook_duplicate` events from MCP envelopes, enabling\n * correlation between a first delivery and its retry echoes.\n */\n idempotency_key?: string;\n timestamp: string;\n}\n\n/**\n * Configuration for async handler with typed callbacks\n */\nexport interface AsyncHandlerConfig {\n // AdCP tool status change handlers - called for ALL status changes (completed, failed, working, input-required, submitted)\n onGetProductsStatusChange?: GetProductsStatusChangeHandler;\n onListCreativeFormatsStatusChange?: (\n data: ListCreativeFormatsResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onCreateMediaBuyStatusChange?: CreateMediaBuyStatusChangeHandler;\n onUpdateMediaBuyStatusChange?: UpdateMediaBuyStatusChangeHandler;\n onSyncCreativesStatusChange?: SyncCreativesStatusChangeHandler;\n onListCreativesStatusChange?: (response: ListCreativesResponse, metadata: WebhookMetadata) => void | Promise<void>;\n onPreviewCreativeStatusChange?: (\n response: PreviewCreativeResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onGetMediaBuysStatusChange?: (response: GetMediaBuysResponse, metadata: WebhookMetadata) => void | Promise<void>;\n onGetMediaBuyDeliveryStatusChange?: (\n response: GetMediaBuyDeliveryResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onProvidePerformanceFeedbackStatusChange?: (\n response: ProvidePerformanceFeedbackResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onGetSignalsStatusChange?: (response: GetSignalsResponse, metadata: WebhookMetadata) => void | Promise<void>;\n onActivateSignalStatusChange?: (response: ActivateSignalResponse, metadata: WebhookMetadata) => void | Promise<void>;\n onBuildCreativeStatusChange?: (response: BuildCreativeResponse, metadata: WebhookMetadata) => void | Promise<void>;\n onListAccountsStatusChange?: (response: ListAccountsResponse, metadata: WebhookMetadata) => void | Promise<void>;\n onSyncAccountsStatusChange?: (response: SyncAccountsResponse, metadata: WebhookMetadata) => void | Promise<void>;\n onSyncAudiencesStatusChange?: (response: SyncAudiencesResponse, metadata: WebhookMetadata) => void | Promise<void>;\n onCreatePropertyListStatusChange?: (\n response: CreatePropertyListResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onGetPropertyListStatusChange?: (\n response: GetPropertyListResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onUpdatePropertyListStatusChange?: (\n response: UpdatePropertyListResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onListPropertyListsStatusChange?: (\n response: ListPropertyListsResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onDeletePropertyListStatusChange?: (\n response: DeletePropertyListResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onListContentStandardsStatusChange?: (\n response: ListContentStandardsResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onGetContentStandardsStatusChange?: (\n response: GetContentStandardsResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onCalibrateContentStatusChange?: (\n response: CalibrateContentResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onValidateContentDeliveryStatusChange?: (\n response: ValidateContentDeliveryResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onSIGetOfferingStatusChange?: (response: SIGetOfferingResponse, metadata: WebhookMetadata) => void | Promise<void>;\n onSIInitiateSessionStatusChange?: (\n response: SIInitiateSessionResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onSISendMessageStatusChange?: (response: SISendMessageResponse, metadata: WebhookMetadata) => void | Promise<void>;\n onSITerminateSessionStatusChange?: (\n response: SITerminateSessionResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n\n // Fallback handler for any task status change\n onTaskStatusChange?: (response: any, metadata: WebhookMetadata) => void | Promise<void>;\n\n // Activity logging (low-level protocol events)\n onActivity?: (activity: Activity) => void | Promise<void>;\n\n /**\n * Receiver-side deduplication of webhook payloads by `idempotency_key`.\n *\n * AdCP webhooks use at-least-once delivery — publishers retry until they\n * see a 2xx, so the same event may arrive more than once. When configured,\n * the first delivery for a given `(agent_id, idempotency_key)` tuple\n * dispatches to handlers; subsequent deliveries are dropped and surface\n * as a `webhook_duplicate` activity.\n *\n * Reuses `IdempotencyBackend` from `@adcp/sdk/server` — you can share\n * the same backend across request-side and webhook-side dedup, or use a\n * dedicated one. Scope is per-agent so keys from different senders are\n * independent, matching the spec's \"scoped to authenticated sender\n * identity\" rule.\n *\n * If a payload arrives without `idempotency_key` (non-conforming sender,\n * or A2A transport which does not carry the field), dispatch proceeds\n * without dedup and a warning is logged.\n */\n webhookDedup?: {\n backend: IdempotencyBackend;\n /** Retention for dedup keys. Defaults to 86_400 (24h). */\n ttlSeconds?: number;\n };\n\n // Notification handlers (agent-initiated, no operation_id)\n onMediaBuyDeliveryNotification?: (\n notification: MediaBuyDeliveryNotification,\n metadata: NotificationMetadata\n ) => void | Promise<void>;\n}\n\n/**\n * Async handler class\n */\nexport class AsyncHandler {\n constructor(private config: AsyncHandlerConfig) {}\n\n /**\n * Handle incoming webhook payload (both task completions and notifications)\n */\n async handleWebhook({\n result,\n metadata,\n }: {\n result: AdCPAsyncResponseData | undefined;\n metadata: WebhookMetadata;\n }): Promise<void> {\n if (await this.isDuplicate(metadata)) {\n await this.emitActivity({\n type: 'webhook_duplicate',\n operation_id: metadata.operation_id,\n agent_id: metadata.agent_id,\n context_id: metadata.context_id,\n task_id: metadata.task_id,\n task_type: metadata.task_type,\n status: metadata.status,\n idempotency_key: metadata.idempotency_key,\n timestamp: metadata.timestamp,\n });\n return;\n }\n\n // Emit activity\n await this.emitActivity({\n type: 'webhook_received',\n idempotency_key: metadata.idempotency_key,\n operation_id: metadata.operation_id,\n agent_id: metadata.agent_id,\n context_id: metadata.context_id,\n task_id: metadata.task_id,\n task_type: metadata.task_type,\n status: metadata.status,\n payload: metadata.rawHTTPPayload?.result ?? result,\n timestamp: metadata.timestamp,\n });\n\n // Check if this is a notification (media_buy_delivery with notification_type)\n // Notifications are treated like status updates for an ongoing \"get delivery report\" operation\n // The operation_id (from URL) groups all reports for the same agent + month\n if (\n metadata.task_type === 'media_buy_delivery' &&\n result &&\n typeof result === 'object' &&\n 'notification_type' in result\n ) {\n const notificationPayload = result as unknown as MediaBuyDeliveryNotification;\n\n // Build notification metadata\n // operation_id comes from webhook URL and was lazily generated from agent + month\n const notificationMetadata: NotificationMetadata = {\n ...metadata,\n notification_type: notificationPayload.notification_type,\n sequence_number: notificationPayload.sequence_number,\n next_expected_at: notificationPayload.next_expected_at,\n };\n\n await this.config.onMediaBuyDeliveryNotification?.(notificationPayload, notificationMetadata);\n return;\n }\n\n // All status changes go through the specific handler\n // The handler receives metadata with status and can act accordingly\n await this.handleCompletion(metadata.task_type, result, metadata);\n }\n\n /**\n * Handle task completion - route to specific handler\n */\n private async handleCompletion(\n taskType: string,\n result: AdCPAsyncResponseData | undefined,\n metadata: WebhookMetadata\n ): Promise<void> {\n let handler: ((result: any, metadata: any) => void | Promise<void>) | undefined;\n\n // Route to specific handler based on task type\n switch (taskType) {\n case 'get_products':\n handler = this.config.onGetProductsStatusChange;\n break;\n\n case 'list_creative_formats':\n handler = this.config.onListCreativeFormatsStatusChange;\n break;\n\n case 'create_media_buy':\n handler = this.config.onCreateMediaBuyStatusChange;\n break;\n\n case 'update_media_buy':\n handler = this.config.onUpdateMediaBuyStatusChange;\n break;\n\n case 'sync_creatives':\n handler = this.config.onSyncCreativesStatusChange;\n break;\n\n case 'list_creatives':\n handler = this.config.onListCreativesStatusChange;\n break;\n\n case 'get_media_buys':\n handler = this.config.onGetMediaBuysStatusChange;\n break;\n\n case 'get_media_buy_delivery':\n handler = this.config.onGetMediaBuyDeliveryStatusChange;\n break;\n\n case 'provide_performance_feedback':\n handler = this.config.onProvidePerformanceFeedbackStatusChange;\n break;\n\n case 'get_signals':\n handler = this.config.onGetSignalsStatusChange;\n break;\n\n case 'activate_signal':\n handler = this.config.onActivateSignalStatusChange;\n break;\n }\n\n // Call specific handler if configured, otherwise fallback to generic handler\n const handlerToCall = handler || this.config.onTaskStatusChange;\n\n if (handlerToCall) {\n try {\n await handlerToCall(result, metadata);\n } catch (error) {\n // Log error but don't crash webhook processing\n console.error(\n `Error in handler for task ${taskType}:`,\n error instanceof Error ? error.message : 'unknown error'\n );\n }\n }\n }\n\n /**\n * Emit activity event\n */\n private async emitActivity(activity: Activity): Promise<void> {\n await this.config.onActivity?.(activity);\n }\n\n /**\n * Claim the webhook for processing, returning true if the event has\n * already been delivered for this `(agent_id, idempotency_key)` tuple.\n *\n * Uses `IdempotencyBackend.putIfAbsent` so concurrent retries race on a\n * single claim: exactly one caller gets `true` and proceeds, the rest\n * observe the existing entry and return.\n */\n private async isDuplicate(metadata: WebhookMetadata): Promise<boolean> {\n const dedup = this.config.webhookDedup;\n if (!dedup) return false;\n\n const key = metadata.idempotency_key;\n if (!key || !IDEMPOTENCY_KEY_PATTERN.test(key)) {\n // No valid key. MCP senders MUST emit one per AdCP 3.0; A2A\n // transport doesn't carry the field at all. Warn MCP (so\n // integrators notice non-conforming publishers) and stay quiet\n // for A2A (expected and unactionable).\n if (metadata.protocol !== 'a2a') {\n console.warn(\n `[AdCP] webhookDedup enabled but webhook from agent=${metadata.agent_id} task=${metadata.task_id} has ${\n key ? 'an invalid' : 'no'\n } idempotency_key. Expected format: ${IDEMPOTENCY_KEY_PATTERN.source}. ` +\n 'Dispatching without dedup — duplicate deliveries from this sender will re-trigger handlers. ' +\n 'See docs/guides/PUSH-NOTIFICATION-CONFIG.md#deduplication'\n );\n }\n return false;\n }\n\n const ttlSeconds = dedup.ttlSeconds ?? 86_400;\n // Reserved prefix `adcp\\u001fwebhook\\u001fv1\\u001f...` namespaces the\n // claim so webhook dedup entries can coexist with request-side\n // idempotency entries in a shared backend — a request-side principal\n // can never produce a scoped key with this prefix because the\n // principal regex excludes U+001F.\n const scopedKey = `adcp\\u001fwebhook\\u001fv1\\u001f${metadata.agent_id}\\u001f${key}`;\n const expiresAt = Math.floor(Date.now() / 1000) + ttlSeconds;\n\n const claimed = await dedup.backend.putIfAbsent(scopedKey, {\n payloadHash: '',\n response: null,\n expiresAt,\n });\n return !claimed;\n }\n}\n\n// AdCP spec: `^[A-Za-z0-9_.:-]{16,255}$`. Any key not matching this\n// pattern is malformed — treat as missing rather than forming a scoped\n// key from arbitrary sender-supplied bytes.\nconst IDEMPOTENCY_KEY_PATTERN = /^[A-Za-z0-9_.:-]{16,255}$/;\n\n/**\n * Factory function to create async handler\n */\nexport function createAsyncHandler(config: AsyncHandlerConfig): AsyncHandler {\n return new AsyncHandler(config);\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/core/AsyncHandler.ts"],"sourcesContent":["/**\n * Structured async handler for AdCP webhook responses\n * Provides type-safe callbacks for each AdCP tool completion\n */\n\nimport type { IdempotencyBackend } from '../server/idempotency/store';\nimport type {\n ListCreativeFormatsResponse,\n ListCreativesResponse,\n PreviewCreativeResponse,\n BuildCreativeResponse,\n GetMediaBuysResponse,\n GetMediaBuyDeliveryResponse,\n GetCreativeDeliveryResponse,\n ProvidePerformanceFeedbackResponse,\n GetSignalsResponse,\n ActivateSignalResponse,\n ListAccountsResponse,\n SyncAccountsResponse,\n SyncAudiencesResponse,\n CreatePropertyListResponse,\n GetPropertyListResponse,\n UpdatePropertyListResponse,\n ListPropertyListsResponse,\n DeletePropertyListResponse,\n ListContentStandardsResponse,\n GetContentStandardsResponse,\n CalibrateContentResponse,\n ValidateContentDeliveryResponse,\n SIGetOfferingResponse,\n SIInitiateSessionResponse,\n SISendMessageResponse,\n SITerminateSessionResponse,\n} from '../types/tools.generated';\n\nimport type {\n AdCPAsyncResponseData,\n CreateMediaBuyAsyncInputRequired,\n CreateMediaBuyAsyncSubmitted,\n CreateMediaBuyAsyncWorking,\n CreateMediaBuyResponse,\n GetProductsAsyncInputRequired,\n GetProductsAsyncSubmitted,\n GetProductsAsyncWorking,\n GetProductsResponse,\n SyncCreativesAsyncInputRequired,\n SyncCreativesAsyncSubmitted,\n SyncCreativesAsyncWorking,\n SyncCreativesResponse,\n TaskStatus,\n TaskType,\n UpdateMediaBuyAsyncInputRequired,\n UpdateMediaBuyAsyncSubmitted,\n UpdateMediaBuyAsyncWorking,\n UpdateMediaBuyResponse,\n} from '../types/core.generated';\nimport type { TaskResultMetadata } from './ConversationTypes';\nimport {\n CreateMediaBuyAsyncResponseData,\n GetProductsAsyncResponseData,\n SyncCreativesAsyncResponseData,\n UpdateMediaBuyAsyncResponseData,\n} from '../types';\nimport type {\n CanonicalCreativeResponse,\n CanonicalGetProductsResponse,\n CanonicalListCreativesResponse,\n} from '../v2/projection/creative-delivery';\n\n/**\n * Metadata provided with webhook responses\n */\nexport interface WebhookMetadata {\n /** Client-provided operation ID */\n operation_id: string;\n /** Server's task ID */\n task_id: string;\n /** Agent ID */\n agent_id: string;\n /** Task type/tool name */\n task_type: string;\n /** Task status (completed, failed, needs_input, working, etc) */\n status: TaskStatus;\n /** Server's context ID */\n context_id?: string;\n /** Human-readable context about the status change */\n message?: string;\n /** Timestamp */\n timestamp: string;\n /** raw HTTP payload */\n rawHTTPPayload?: any;\n /**\n * Wire protocol that delivered this webhook. Useful for handler code\n * that needs to treat MCP and A2A transports differently (e.g.,\n * `idempotency_key` is only present on MCP payloads).\n */\n protocol?: 'mcp' | 'a2a';\n /**\n * Sender-generated key stable across retries of the same webhook event\n * (MCP envelope only — A2A webhooks do not carry this field). Use this\n * as the canonical dedup key; see `AsyncHandlerConfig.webhookDedup`.\n */\n idempotency_key?: string;\n /**\n * Buyer-side product property policy evaluation for completed get_products\n * webhooks. Present when the client filters, audits, or rejects a webhook\n * result before dispatching it to handlers.\n */\n productPropertyPolicy?: TaskResultMetadata['productPropertyPolicy'];\n /**\n * Buyer-side pricing-options enforcement summary for completed get_products\n * webhooks. Present when the client drops products that arrived without a\n * usable `pricing_options[]` array before dispatching to handlers.\n */\n productPricingPolicy?: TaskResultMetadata['productPricingPolicy'];\n}\n\n/**\n * Metadata for agent-initiated notifications\n * Same as WebhookMetadata but includes notification-specific fields\n */\nexport interface NotificationMetadata extends WebhookMetadata {\n /** Notification type */\n notification_type: 'scheduled' | 'final' | 'delayed';\n /** Sequence number of this notification */\n sequence_number?: number;\n /** When next notification is expected (not present for 'final') */\n next_expected_at?: string;\n}\n\n// Simple union-typed handlers for webhook status changes\nexport type GetProductsStatusChangeHandler = (\n response:\n | CanonicalGetProductsResponse\n | GetProductsAsyncSubmitted\n | GetProductsAsyncWorking\n | GetProductsAsyncInputRequired,\n metadata: WebhookMetadata\n) => void | Promise<void>;\n\nexport type CreateMediaBuyStatusChangeHandler = (\n response: CanonicalCreativeResponse<\n | CreateMediaBuyResponse\n | CreateMediaBuyAsyncSubmitted\n | CreateMediaBuyAsyncWorking\n | CreateMediaBuyAsyncInputRequired\n >,\n metadata: WebhookMetadata\n) => void | Promise<void>;\n\nexport type UpdateMediaBuyStatusChangeHandler = (\n response: CanonicalCreativeResponse<\n | UpdateMediaBuyResponse\n | UpdateMediaBuyAsyncSubmitted\n | UpdateMediaBuyAsyncWorking\n | UpdateMediaBuyAsyncInputRequired\n >,\n metadata: WebhookMetadata\n) => void | Promise<void>;\n\nexport type SyncCreativesStatusChangeHandler = (\n response: CanonicalCreativeResponse<\n SyncCreativesResponse | SyncCreativesAsyncSubmitted | SyncCreativesAsyncWorking | SyncCreativesAsyncInputRequired\n >,\n metadata: WebhookMetadata\n) => void | Promise<void>;\n\n/**\n * Media buy delivery notification payload (PR #81)\n * Agent-initiated periodic reporting, not tied to any client operation\n */\nexport interface MediaBuyDeliveryNotification {\n /** Type of notification */\n notification_type: 'scheduled' | 'final' | 'delayed';\n /** Sequential notification number (starts at 1) */\n sequence_number?: number;\n /** When next notification is expected (omitted for 'final') */\n next_expected_at?: string;\n /** Reporting period for this notification */\n reporting_period?: {\n start: string;\n end: string;\n };\n /** Currency used for financial metrics */\n currency?: string;\n /** Array of media buy deliveries being reported */\n media_buy_deliveries?: Array<{\n media_buy_id: string;\n impressions?: number;\n clicks?: number;\n spend?: number;\n conversions?: number;\n [key: string]: any;\n }>;\n}\n\n/**\n * Activity event for logging/observability\n */\nexport interface Activity {\n type:\n | 'protocol_request'\n | 'protocol_response'\n | 'status_change'\n | 'webhook_received'\n | 'webhook_duplicate'\n | 'governance_check'\n | 'governance_outcome';\n operation_id: string;\n agent_id: string;\n context_id?: string;\n task_id?: string;\n task_type: string;\n status?: string;\n /**\n * Full AdCP response payload. Populated on `webhook_received` and\n * protocol/status events. INTENTIONALLY omitted on `webhook_duplicate`\n * to avoid re-logging potentially-sensitive data on every retry — the\n * originating `webhook_received` event already carries it. Correlate\n * the two via `idempotency_key`.\n */\n payload?: any;\n /**\n * Webhook idempotency key when available. Present on `webhook_received`\n * and `webhook_duplicate` events from MCP envelopes, enabling\n * correlation between a first delivery and its retry echoes.\n */\n idempotency_key?: string;\n timestamp: string;\n}\n\n/**\n * Configuration for async handler with typed callbacks\n */\nexport interface AsyncHandlerConfig {\n // AdCP tool status change handlers - called for ALL status changes (completed, failed, working, input-required, submitted)\n onGetProductsStatusChange?: GetProductsStatusChangeHandler;\n onListCreativeFormatsLegacyStatusChange?: (\n data: ListCreativeFormatsResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onCreateMediaBuyStatusChange?: CreateMediaBuyStatusChangeHandler;\n onUpdateMediaBuyStatusChange?: UpdateMediaBuyStatusChangeHandler;\n onSyncCreativesStatusChange?: SyncCreativesStatusChangeHandler;\n onListCreativesStatusChange?: (\n response: CanonicalListCreativesResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onPreviewCreativeLegacyStatusChange?: (\n response: PreviewCreativeResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onGetMediaBuysStatusChange?: (\n response: CanonicalCreativeResponse<GetMediaBuysResponse>,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onGetMediaBuyDeliveryStatusChange?: (\n response: CanonicalCreativeResponse<GetMediaBuyDeliveryResponse>,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onGetCreativeDeliveryStatusChange?: (\n response: CanonicalCreativeResponse<GetCreativeDeliveryResponse>,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onProvidePerformanceFeedbackStatusChange?: (\n response: ProvidePerformanceFeedbackResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onGetSignalsStatusChange?: (response: GetSignalsResponse, metadata: WebhookMetadata) => void | Promise<void>;\n onActivateSignalStatusChange?: (response: ActivateSignalResponse, metadata: WebhookMetadata) => void | Promise<void>;\n onBuildCreativeLegacyStatusChange?: (\n response: BuildCreativeResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onListAccountsStatusChange?: (response: ListAccountsResponse, metadata: WebhookMetadata) => void | Promise<void>;\n onSyncAccountsStatusChange?: (response: SyncAccountsResponse, metadata: WebhookMetadata) => void | Promise<void>;\n onSyncAudiencesStatusChange?: (response: SyncAudiencesResponse, metadata: WebhookMetadata) => void | Promise<void>;\n onCreatePropertyListStatusChange?: (\n response: CreatePropertyListResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onGetPropertyListStatusChange?: (\n response: GetPropertyListResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onUpdatePropertyListStatusChange?: (\n response: UpdatePropertyListResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onListPropertyListsStatusChange?: (\n response: ListPropertyListsResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onDeletePropertyListStatusChange?: (\n response: DeletePropertyListResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onListContentStandardsLegacyStatusChange?: (\n response: ListContentStandardsResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onGetContentStandardsLegacyStatusChange?: (\n response: GetContentStandardsResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onCalibrateContentLegacyStatusChange?: (\n response: CalibrateContentResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onValidateContentDeliveryLegacyStatusChange?: (\n response: ValidateContentDeliveryResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onSIGetOfferingStatusChange?: (response: SIGetOfferingResponse, metadata: WebhookMetadata) => void | Promise<void>;\n onSIInitiateSessionStatusChange?: (\n response: SIInitiateSessionResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onSISendMessageStatusChange?: (response: SISendMessageResponse, metadata: WebhookMetadata) => void | Promise<void>;\n onSITerminateSessionStatusChange?: (\n response: SITerminateSessionResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n\n // Fallback handler for any task status change\n onTaskStatusChange?: (response: any, metadata: WebhookMetadata) => void | Promise<void>;\n\n // Activity logging (low-level protocol events)\n onActivity?: (activity: Activity) => void | Promise<void>;\n\n /**\n * Receiver-side deduplication of webhook payloads by `idempotency_key`.\n *\n * AdCP webhooks use at-least-once delivery — publishers retry until they\n * see a 2xx, so the same event may arrive more than once. When configured,\n * the first delivery for a given `(agent_id, idempotency_key)` tuple\n * dispatches to handlers; subsequent deliveries are dropped and surface\n * as a `webhook_duplicate` activity.\n *\n * Reuses `IdempotencyBackend` from `@adcp/sdk/server` — you can share\n * the same backend across request-side and webhook-side dedup, or use a\n * dedicated one. Scope is per-agent so keys from different senders are\n * independent, matching the spec's \"scoped to authenticated sender\n * identity\" rule.\n *\n * If a payload arrives without `idempotency_key` (non-conforming sender,\n * or A2A transport which does not carry the field), dispatch proceeds\n * without dedup and a warning is logged.\n */\n webhookDedup?: {\n backend: IdempotencyBackend;\n /** Retention for dedup keys. Defaults to 86_400 (24h). */\n ttlSeconds?: number;\n };\n\n // Notification handlers (agent-initiated, no operation_id)\n onMediaBuyDeliveryNotification?: (\n notification: MediaBuyDeliveryNotification,\n metadata: NotificationMetadata\n ) => void | Promise<void>;\n}\n\n/**\n * Async handler class\n */\nexport class AsyncHandler {\n constructor(private config: AsyncHandlerConfig) {}\n\n /**\n * Handle incoming webhook payload (both task completions and notifications)\n */\n async handleWebhook({\n result,\n metadata,\n }: {\n result: AdCPAsyncResponseData | undefined;\n metadata: WebhookMetadata;\n }): Promise<void> {\n if (await this.isDuplicate(metadata)) {\n await this.emitActivity({\n type: 'webhook_duplicate',\n operation_id: metadata.operation_id,\n agent_id: metadata.agent_id,\n context_id: metadata.context_id,\n task_id: metadata.task_id,\n task_type: metadata.task_type,\n status: metadata.status,\n idempotency_key: metadata.idempotency_key,\n timestamp: metadata.timestamp,\n });\n return;\n }\n\n // Emit activity\n await this.emitActivity({\n type: 'webhook_received',\n idempotency_key: metadata.idempotency_key,\n operation_id: metadata.operation_id,\n agent_id: metadata.agent_id,\n context_id: metadata.context_id,\n task_id: metadata.task_id,\n task_type: metadata.task_type,\n status: metadata.status,\n payload: metadata.rawHTTPPayload?.result ?? result,\n timestamp: metadata.timestamp,\n });\n\n // Check if this is a notification (media_buy_delivery with notification_type)\n // Notifications are treated like status updates for an ongoing \"get delivery report\" operation\n // The operation_id (from URL) groups all reports for the same agent + month\n if (\n metadata.task_type === 'media_buy_delivery' &&\n result &&\n typeof result === 'object' &&\n 'notification_type' in result\n ) {\n const notificationPayload = result as unknown as MediaBuyDeliveryNotification;\n\n // Build notification metadata\n // operation_id comes from webhook URL and was lazily generated from agent + month\n const notificationMetadata: NotificationMetadata = {\n ...metadata,\n notification_type: notificationPayload.notification_type,\n sequence_number: notificationPayload.sequence_number,\n next_expected_at: notificationPayload.next_expected_at,\n };\n\n await this.config.onMediaBuyDeliveryNotification?.(notificationPayload, notificationMetadata);\n return;\n }\n\n // All status changes go through the specific handler\n // The handler receives metadata with status and can act accordingly\n await this.handleCompletion(metadata.task_type, result, metadata);\n }\n\n /**\n * Handle task completion - route to specific handler\n */\n private async handleCompletion(\n taskType: string,\n result: AdCPAsyncResponseData | undefined,\n metadata: WebhookMetadata\n ): Promise<void> {\n let handler: ((result: any, metadata: any) => void | Promise<void>) | undefined;\n\n // Route to specific handler based on task type\n switch (taskType) {\n case 'get_products':\n handler = this.config.onGetProductsStatusChange;\n break;\n\n case 'list_creative_formats':\n handler = this.config.onListCreativeFormatsLegacyStatusChange;\n break;\n\n case 'preview_creative':\n handler = this.config.onPreviewCreativeLegacyStatusChange;\n break;\n\n case 'build_creative':\n handler = this.config.onBuildCreativeLegacyStatusChange;\n break;\n\n case 'create_media_buy':\n handler = this.config.onCreateMediaBuyStatusChange;\n break;\n\n case 'update_media_buy':\n handler = this.config.onUpdateMediaBuyStatusChange;\n break;\n\n case 'sync_creatives':\n handler = this.config.onSyncCreativesStatusChange;\n break;\n\n case 'list_creatives':\n handler = this.config.onListCreativesStatusChange;\n break;\n\n case 'get_media_buys':\n handler = this.config.onGetMediaBuysStatusChange;\n break;\n\n case 'get_media_buy_delivery':\n handler = this.config.onGetMediaBuyDeliveryStatusChange;\n break;\n\n case 'get_creative_delivery':\n handler = this.config.onGetCreativeDeliveryStatusChange;\n break;\n\n case 'provide_performance_feedback':\n handler = this.config.onProvidePerformanceFeedbackStatusChange;\n break;\n\n case 'get_signals':\n handler = this.config.onGetSignalsStatusChange;\n break;\n\n case 'activate_signal':\n handler = this.config.onActivateSignalStatusChange;\n break;\n\n case 'list_content_standards':\n handler = this.config.onListContentStandardsLegacyStatusChange;\n break;\n\n case 'get_content_standards':\n handler = this.config.onGetContentStandardsLegacyStatusChange;\n break;\n\n case 'calibrate_content':\n handler = this.config.onCalibrateContentLegacyStatusChange;\n break;\n\n case 'validate_content_delivery':\n handler = this.config.onValidateContentDeliveryLegacyStatusChange;\n break;\n }\n\n // Call specific handler if configured, otherwise fallback to generic handler\n const handlerToCall = handler || this.config.onTaskStatusChange;\n\n if (handlerToCall) {\n try {\n await handlerToCall(result, metadata);\n } catch (error) {\n // Log error but don't crash webhook processing\n console.error(\n `Error in handler for task ${taskType}:`,\n error instanceof Error ? error.message : 'unknown error'\n );\n }\n }\n }\n\n /**\n * Emit activity event\n */\n private async emitActivity(activity: Activity): Promise<void> {\n await this.config.onActivity?.(activity);\n }\n\n /**\n * Claim the webhook for processing, returning true if the event has\n * already been delivered for this `(agent_id, idempotency_key)` tuple.\n *\n * Uses `IdempotencyBackend.putIfAbsent` so concurrent retries race on a\n * single claim: exactly one caller gets `true` and proceeds, the rest\n * observe the existing entry and return.\n */\n private async isDuplicate(metadata: WebhookMetadata): Promise<boolean> {\n const dedup = this.config.webhookDedup;\n if (!dedup) return false;\n\n const key = metadata.idempotency_key;\n if (!key || !IDEMPOTENCY_KEY_PATTERN.test(key)) {\n // No valid key. MCP senders MUST emit one per AdCP 3.0; A2A\n // transport doesn't carry the field at all. Warn MCP (so\n // integrators notice non-conforming publishers) and stay quiet\n // for A2A (expected and unactionable).\n if (metadata.protocol !== 'a2a') {\n console.warn(\n `[AdCP] webhookDedup enabled but webhook from agent=${metadata.agent_id} task=${metadata.task_id} has ${\n key ? 'an invalid' : 'no'\n } idempotency_key. Expected format: ${IDEMPOTENCY_KEY_PATTERN.source}. ` +\n 'Dispatching without dedup — duplicate deliveries from this sender will re-trigger handlers. ' +\n 'See docs/guides/PUSH-NOTIFICATION-CONFIG.md#deduplication'\n );\n }\n return false;\n }\n\n const ttlSeconds = dedup.ttlSeconds ?? 86_400;\n // Reserved prefix `adcp\\u001fwebhook\\u001fv1\\u001f...` namespaces the\n // claim so webhook dedup entries can coexist with request-side\n // idempotency entries in a shared backend — a request-side principal\n // can never produce a scoped key with this prefix because the\n // principal regex excludes U+001F.\n const scopedKey = `adcp\\u001fwebhook\\u001fv1\\u001f${metadata.agent_id}\\u001f${key}`;\n const expiresAt = Math.floor(Date.now() / 1000) + ttlSeconds;\n\n const claimed = await dedup.backend.putIfAbsent(scopedKey, {\n payloadHash: '',\n response: null,\n expiresAt,\n });\n return !claimed;\n }\n}\n\n// AdCP spec: `^[A-Za-z0-9_.:-]{16,255}$`. Any key not matching this\n// pattern is malformed — treat as missing rather than forming a scoped\n// key from arbitrary sender-supplied bytes.\nconst IDEMPOTENCY_KEY_PATTERN = /^[A-Za-z0-9_.:-]{16,255}$/;\n\n/**\n * Factory function to create async handler\n */\nexport function createAsyncHandler(config: AsyncHandlerConfig): AsyncHandler {\n return new AsyncHandler(config);\n}\n"],"mappings":"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","names":[]}
@@ -59,7 +59,13 @@ class AsyncHandler {
59
59
  handler = this.config.onGetProductsStatusChange;
60
60
  break;
61
61
  case "list_creative_formats":
62
- handler = this.config.onListCreativeFormatsStatusChange;
62
+ handler = this.config.onListCreativeFormatsLegacyStatusChange;
63
+ break;
64
+ case "preview_creative":
65
+ handler = this.config.onPreviewCreativeLegacyStatusChange;
66
+ break;
67
+ case "build_creative":
68
+ handler = this.config.onBuildCreativeLegacyStatusChange;
63
69
  break;
64
70
  case "create_media_buy":
65
71
  handler = this.config.onCreateMediaBuyStatusChange;
@@ -79,6 +85,9 @@ class AsyncHandler {
79
85
  case "get_media_buy_delivery":
80
86
  handler = this.config.onGetMediaBuyDeliveryStatusChange;
81
87
  break;
88
+ case "get_creative_delivery":
89
+ handler = this.config.onGetCreativeDeliveryStatusChange;
90
+ break;
82
91
  case "provide_performance_feedback":
83
92
  handler = this.config.onProvidePerformanceFeedbackStatusChange;
84
93
  break;
@@ -88,6 +97,18 @@ class AsyncHandler {
88
97
  case "activate_signal":
89
98
  handler = this.config.onActivateSignalStatusChange;
90
99
  break;
100
+ case "list_content_standards":
101
+ handler = this.config.onListContentStandardsLegacyStatusChange;
102
+ break;
103
+ case "get_content_standards":
104
+ handler = this.config.onGetContentStandardsLegacyStatusChange;
105
+ break;
106
+ case "calibrate_content":
107
+ handler = this.config.onCalibrateContentLegacyStatusChange;
108
+ break;
109
+ case "validate_content_delivery":
110
+ handler = this.config.onValidateContentDeliveryLegacyStatusChange;
111
+ break;
91
112
  }
92
113
  const handlerToCall = handler || this.config.onTaskStatusChange;
93
114
  if (handlerToCall) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/core/AsyncHandler.ts"],"sourcesContent":["/**\n * Structured async handler for AdCP webhook responses\n * Provides type-safe callbacks for each AdCP tool completion\n */\n\nimport type { IdempotencyBackend } from '../server/idempotency/store';\nimport type {\n ListCreativeFormatsResponse,\n ListCreativesResponse,\n PreviewCreativeResponse,\n BuildCreativeResponse,\n GetMediaBuysResponse,\n GetMediaBuyDeliveryResponse,\n ProvidePerformanceFeedbackResponse,\n GetSignalsResponse,\n ActivateSignalResponse,\n ListAccountsResponse,\n SyncAccountsResponse,\n SyncAudiencesResponse,\n CreatePropertyListResponse,\n GetPropertyListResponse,\n UpdatePropertyListResponse,\n ListPropertyListsResponse,\n DeletePropertyListResponse,\n ListContentStandardsResponse,\n GetContentStandardsResponse,\n CalibrateContentResponse,\n ValidateContentDeliveryResponse,\n SIGetOfferingResponse,\n SIInitiateSessionResponse,\n SISendMessageResponse,\n SITerminateSessionResponse,\n} from '../types/tools.generated';\n\nimport type {\n AdCPAsyncResponseData,\n CreateMediaBuyAsyncInputRequired,\n CreateMediaBuyAsyncSubmitted,\n CreateMediaBuyAsyncWorking,\n CreateMediaBuyResponse,\n GetProductsAsyncInputRequired,\n GetProductsAsyncSubmitted,\n GetProductsAsyncWorking,\n GetProductsResponse,\n SyncCreativesAsyncInputRequired,\n SyncCreativesAsyncSubmitted,\n SyncCreativesAsyncWorking,\n SyncCreativesResponse,\n TaskStatus,\n TaskType,\n UpdateMediaBuyAsyncInputRequired,\n UpdateMediaBuyAsyncSubmitted,\n UpdateMediaBuyAsyncWorking,\n UpdateMediaBuyResponse,\n} from '../types/core.generated';\nimport type { TaskResultMetadata } from './ConversationTypes';\nimport {\n CreateMediaBuyAsyncResponseData,\n GetProductsAsyncResponseData,\n SyncCreativesAsyncResponseData,\n UpdateMediaBuyAsyncResponseData,\n} from '../types';\n\n/**\n * Metadata provided with webhook responses\n */\nexport interface WebhookMetadata {\n /** Client-provided operation ID */\n operation_id: string;\n /** Server's task ID */\n task_id: string;\n /** Agent ID */\n agent_id: string;\n /** Task type/tool name */\n task_type: string;\n /** Task status (completed, failed, needs_input, working, etc) */\n status: TaskStatus;\n /** Server's context ID */\n context_id?: string;\n /** Human-readable context about the status change */\n message?: string;\n /** Timestamp */\n timestamp: string;\n /** raw HTTP payload */\n rawHTTPPayload?: any;\n /**\n * Wire protocol that delivered this webhook. Useful for handler code\n * that needs to treat MCP and A2A transports differently (e.g.,\n * `idempotency_key` is only present on MCP payloads).\n */\n protocol?: 'mcp' | 'a2a';\n /**\n * Sender-generated key stable across retries of the same webhook event\n * (MCP envelope only — A2A webhooks do not carry this field). Use this\n * as the canonical dedup key; see `AsyncHandlerConfig.webhookDedup`.\n */\n idempotency_key?: string;\n /**\n * Buyer-side product property policy evaluation for completed get_products\n * webhooks. Present when the client filters, audits, or rejects a webhook\n * result before dispatching it to handlers.\n */\n productPropertyPolicy?: TaskResultMetadata['productPropertyPolicy'];\n /**\n * Buyer-side pricing-options enforcement summary for completed get_products\n * webhooks. Present when the client drops products that arrived without a\n * usable `pricing_options[]` array before dispatching to handlers.\n */\n productPricingPolicy?: TaskResultMetadata['productPricingPolicy'];\n}\n\n/**\n * Metadata for agent-initiated notifications\n * Same as WebhookMetadata but includes notification-specific fields\n */\nexport interface NotificationMetadata extends WebhookMetadata {\n /** Notification type */\n notification_type: 'scheduled' | 'final' | 'delayed';\n /** Sequence number of this notification */\n sequence_number?: number;\n /** When next notification is expected (not present for 'final') */\n next_expected_at?: string;\n}\n\n// Simple union-typed handlers for webhook status changes\nexport type GetProductsStatusChangeHandler = (\n response: GetProductsResponse | GetProductsAsyncSubmitted | GetProductsAsyncWorking | GetProductsAsyncInputRequired,\n metadata: WebhookMetadata\n) => void | Promise<void>;\n\nexport type CreateMediaBuyStatusChangeHandler = (\n response:\n | CreateMediaBuyResponse\n | CreateMediaBuyAsyncSubmitted\n | CreateMediaBuyAsyncWorking\n | CreateMediaBuyAsyncInputRequired,\n metadata: WebhookMetadata\n) => void | Promise<void>;\n\nexport type UpdateMediaBuyStatusChangeHandler = (\n response:\n | UpdateMediaBuyResponse\n | UpdateMediaBuyAsyncSubmitted\n | UpdateMediaBuyAsyncWorking\n | UpdateMediaBuyAsyncInputRequired,\n metadata: WebhookMetadata\n) => void | Promise<void>;\n\nexport type SyncCreativesStatusChangeHandler = (\n response:\n | SyncCreativesResponse\n | SyncCreativesAsyncSubmitted\n | SyncCreativesAsyncWorking\n | SyncCreativesAsyncInputRequired,\n metadata: WebhookMetadata\n) => void | Promise<void>;\n\n/**\n * Media buy delivery notification payload (PR #81)\n * Agent-initiated periodic reporting, not tied to any client operation\n */\nexport interface MediaBuyDeliveryNotification {\n /** Type of notification */\n notification_type: 'scheduled' | 'final' | 'delayed';\n /** Sequential notification number (starts at 1) */\n sequence_number?: number;\n /** When next notification is expected (omitted for 'final') */\n next_expected_at?: string;\n /** Reporting period for this notification */\n reporting_period?: {\n start: string;\n end: string;\n };\n /** Currency used for financial metrics */\n currency?: string;\n /** Array of media buy deliveries being reported */\n media_buy_deliveries?: Array<{\n media_buy_id: string;\n impressions?: number;\n clicks?: number;\n spend?: number;\n conversions?: number;\n [key: string]: any;\n }>;\n}\n\n/**\n * Activity event for logging/observability\n */\nexport interface Activity {\n type:\n | 'protocol_request'\n | 'protocol_response'\n | 'status_change'\n | 'webhook_received'\n | 'webhook_duplicate'\n | 'governance_check'\n | 'governance_outcome';\n operation_id: string;\n agent_id: string;\n context_id?: string;\n task_id?: string;\n task_type: string;\n status?: string;\n /**\n * Full AdCP response payload. Populated on `webhook_received` and\n * protocol/status events. INTENTIONALLY omitted on `webhook_duplicate`\n * to avoid re-logging potentially-sensitive data on every retry — the\n * originating `webhook_received` event already carries it. Correlate\n * the two via `idempotency_key`.\n */\n payload?: any;\n /**\n * Webhook idempotency key when available. Present on `webhook_received`\n * and `webhook_duplicate` events from MCP envelopes, enabling\n * correlation between a first delivery and its retry echoes.\n */\n idempotency_key?: string;\n timestamp: string;\n}\n\n/**\n * Configuration for async handler with typed callbacks\n */\nexport interface AsyncHandlerConfig {\n // AdCP tool status change handlers - called for ALL status changes (completed, failed, working, input-required, submitted)\n onGetProductsStatusChange?: GetProductsStatusChangeHandler;\n onListCreativeFormatsStatusChange?: (\n data: ListCreativeFormatsResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onCreateMediaBuyStatusChange?: CreateMediaBuyStatusChangeHandler;\n onUpdateMediaBuyStatusChange?: UpdateMediaBuyStatusChangeHandler;\n onSyncCreativesStatusChange?: SyncCreativesStatusChangeHandler;\n onListCreativesStatusChange?: (response: ListCreativesResponse, metadata: WebhookMetadata) => void | Promise<void>;\n onPreviewCreativeStatusChange?: (\n response: PreviewCreativeResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onGetMediaBuysStatusChange?: (response: GetMediaBuysResponse, metadata: WebhookMetadata) => void | Promise<void>;\n onGetMediaBuyDeliveryStatusChange?: (\n response: GetMediaBuyDeliveryResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onProvidePerformanceFeedbackStatusChange?: (\n response: ProvidePerformanceFeedbackResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onGetSignalsStatusChange?: (response: GetSignalsResponse, metadata: WebhookMetadata) => void | Promise<void>;\n onActivateSignalStatusChange?: (response: ActivateSignalResponse, metadata: WebhookMetadata) => void | Promise<void>;\n onBuildCreativeStatusChange?: (response: BuildCreativeResponse, metadata: WebhookMetadata) => void | Promise<void>;\n onListAccountsStatusChange?: (response: ListAccountsResponse, metadata: WebhookMetadata) => void | Promise<void>;\n onSyncAccountsStatusChange?: (response: SyncAccountsResponse, metadata: WebhookMetadata) => void | Promise<void>;\n onSyncAudiencesStatusChange?: (response: SyncAudiencesResponse, metadata: WebhookMetadata) => void | Promise<void>;\n onCreatePropertyListStatusChange?: (\n response: CreatePropertyListResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onGetPropertyListStatusChange?: (\n response: GetPropertyListResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onUpdatePropertyListStatusChange?: (\n response: UpdatePropertyListResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onListPropertyListsStatusChange?: (\n response: ListPropertyListsResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onDeletePropertyListStatusChange?: (\n response: DeletePropertyListResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onListContentStandardsStatusChange?: (\n response: ListContentStandardsResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onGetContentStandardsStatusChange?: (\n response: GetContentStandardsResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onCalibrateContentStatusChange?: (\n response: CalibrateContentResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onValidateContentDeliveryStatusChange?: (\n response: ValidateContentDeliveryResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onSIGetOfferingStatusChange?: (response: SIGetOfferingResponse, metadata: WebhookMetadata) => void | Promise<void>;\n onSIInitiateSessionStatusChange?: (\n response: SIInitiateSessionResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onSISendMessageStatusChange?: (response: SISendMessageResponse, metadata: WebhookMetadata) => void | Promise<void>;\n onSITerminateSessionStatusChange?: (\n response: SITerminateSessionResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n\n // Fallback handler for any task status change\n onTaskStatusChange?: (response: any, metadata: WebhookMetadata) => void | Promise<void>;\n\n // Activity logging (low-level protocol events)\n onActivity?: (activity: Activity) => void | Promise<void>;\n\n /**\n * Receiver-side deduplication of webhook payloads by `idempotency_key`.\n *\n * AdCP webhooks use at-least-once delivery — publishers retry until they\n * see a 2xx, so the same event may arrive more than once. When configured,\n * the first delivery for a given `(agent_id, idempotency_key)` tuple\n * dispatches to handlers; subsequent deliveries are dropped and surface\n * as a `webhook_duplicate` activity.\n *\n * Reuses `IdempotencyBackend` from `@adcp/sdk/server` — you can share\n * the same backend across request-side and webhook-side dedup, or use a\n * dedicated one. Scope is per-agent so keys from different senders are\n * independent, matching the spec's \"scoped to authenticated sender\n * identity\" rule.\n *\n * If a payload arrives without `idempotency_key` (non-conforming sender,\n * or A2A transport which does not carry the field), dispatch proceeds\n * without dedup and a warning is logged.\n */\n webhookDedup?: {\n backend: IdempotencyBackend;\n /** Retention for dedup keys. Defaults to 86_400 (24h). */\n ttlSeconds?: number;\n };\n\n // Notification handlers (agent-initiated, no operation_id)\n onMediaBuyDeliveryNotification?: (\n notification: MediaBuyDeliveryNotification,\n metadata: NotificationMetadata\n ) => void | Promise<void>;\n}\n\n/**\n * Async handler class\n */\nexport class AsyncHandler {\n constructor(private config: AsyncHandlerConfig) {}\n\n /**\n * Handle incoming webhook payload (both task completions and notifications)\n */\n async handleWebhook({\n result,\n metadata,\n }: {\n result: AdCPAsyncResponseData | undefined;\n metadata: WebhookMetadata;\n }): Promise<void> {\n if (await this.isDuplicate(metadata)) {\n await this.emitActivity({\n type: 'webhook_duplicate',\n operation_id: metadata.operation_id,\n agent_id: metadata.agent_id,\n context_id: metadata.context_id,\n task_id: metadata.task_id,\n task_type: metadata.task_type,\n status: metadata.status,\n idempotency_key: metadata.idempotency_key,\n timestamp: metadata.timestamp,\n });\n return;\n }\n\n // Emit activity\n await this.emitActivity({\n type: 'webhook_received',\n idempotency_key: metadata.idempotency_key,\n operation_id: metadata.operation_id,\n agent_id: metadata.agent_id,\n context_id: metadata.context_id,\n task_id: metadata.task_id,\n task_type: metadata.task_type,\n status: metadata.status,\n payload: metadata.rawHTTPPayload?.result ?? result,\n timestamp: metadata.timestamp,\n });\n\n // Check if this is a notification (media_buy_delivery with notification_type)\n // Notifications are treated like status updates for an ongoing \"get delivery report\" operation\n // The operation_id (from URL) groups all reports for the same agent + month\n if (\n metadata.task_type === 'media_buy_delivery' &&\n result &&\n typeof result === 'object' &&\n 'notification_type' in result\n ) {\n const notificationPayload = result as unknown as MediaBuyDeliveryNotification;\n\n // Build notification metadata\n // operation_id comes from webhook URL and was lazily generated from agent + month\n const notificationMetadata: NotificationMetadata = {\n ...metadata,\n notification_type: notificationPayload.notification_type,\n sequence_number: notificationPayload.sequence_number,\n next_expected_at: notificationPayload.next_expected_at,\n };\n\n await this.config.onMediaBuyDeliveryNotification?.(notificationPayload, notificationMetadata);\n return;\n }\n\n // All status changes go through the specific handler\n // The handler receives metadata with status and can act accordingly\n await this.handleCompletion(metadata.task_type, result, metadata);\n }\n\n /**\n * Handle task completion - route to specific handler\n */\n private async handleCompletion(\n taskType: string,\n result: AdCPAsyncResponseData | undefined,\n metadata: WebhookMetadata\n ): Promise<void> {\n let handler: ((result: any, metadata: any) => void | Promise<void>) | undefined;\n\n // Route to specific handler based on task type\n switch (taskType) {\n case 'get_products':\n handler = this.config.onGetProductsStatusChange;\n break;\n\n case 'list_creative_formats':\n handler = this.config.onListCreativeFormatsStatusChange;\n break;\n\n case 'create_media_buy':\n handler = this.config.onCreateMediaBuyStatusChange;\n break;\n\n case 'update_media_buy':\n handler = this.config.onUpdateMediaBuyStatusChange;\n break;\n\n case 'sync_creatives':\n handler = this.config.onSyncCreativesStatusChange;\n break;\n\n case 'list_creatives':\n handler = this.config.onListCreativesStatusChange;\n break;\n\n case 'get_media_buys':\n handler = this.config.onGetMediaBuysStatusChange;\n break;\n\n case 'get_media_buy_delivery':\n handler = this.config.onGetMediaBuyDeliveryStatusChange;\n break;\n\n case 'provide_performance_feedback':\n handler = this.config.onProvidePerformanceFeedbackStatusChange;\n break;\n\n case 'get_signals':\n handler = this.config.onGetSignalsStatusChange;\n break;\n\n case 'activate_signal':\n handler = this.config.onActivateSignalStatusChange;\n break;\n }\n\n // Call specific handler if configured, otherwise fallback to generic handler\n const handlerToCall = handler || this.config.onTaskStatusChange;\n\n if (handlerToCall) {\n try {\n await handlerToCall(result, metadata);\n } catch (error) {\n // Log error but don't crash webhook processing\n console.error(\n `Error in handler for task ${taskType}:`,\n error instanceof Error ? error.message : 'unknown error'\n );\n }\n }\n }\n\n /**\n * Emit activity event\n */\n private async emitActivity(activity: Activity): Promise<void> {\n await this.config.onActivity?.(activity);\n }\n\n /**\n * Claim the webhook for processing, returning true if the event has\n * already been delivered for this `(agent_id, idempotency_key)` tuple.\n *\n * Uses `IdempotencyBackend.putIfAbsent` so concurrent retries race on a\n * single claim: exactly one caller gets `true` and proceeds, the rest\n * observe the existing entry and return.\n */\n private async isDuplicate(metadata: WebhookMetadata): Promise<boolean> {\n const dedup = this.config.webhookDedup;\n if (!dedup) return false;\n\n const key = metadata.idempotency_key;\n if (!key || !IDEMPOTENCY_KEY_PATTERN.test(key)) {\n // No valid key. MCP senders MUST emit one per AdCP 3.0; A2A\n // transport doesn't carry the field at all. Warn MCP (so\n // integrators notice non-conforming publishers) and stay quiet\n // for A2A (expected and unactionable).\n if (metadata.protocol !== 'a2a') {\n console.warn(\n `[AdCP] webhookDedup enabled but webhook from agent=${metadata.agent_id} task=${metadata.task_id} has ${\n key ? 'an invalid' : 'no'\n } idempotency_key. Expected format: ${IDEMPOTENCY_KEY_PATTERN.source}. ` +\n 'Dispatching without dedup — duplicate deliveries from this sender will re-trigger handlers. ' +\n 'See docs/guides/PUSH-NOTIFICATION-CONFIG.md#deduplication'\n );\n }\n return false;\n }\n\n const ttlSeconds = dedup.ttlSeconds ?? 86_400;\n // Reserved prefix `adcp\\u001fwebhook\\u001fv1\\u001f...` namespaces the\n // claim so webhook dedup entries can coexist with request-side\n // idempotency entries in a shared backend — a request-side principal\n // can never produce a scoped key with this prefix because the\n // principal regex excludes U+001F.\n const scopedKey = `adcp\\u001fwebhook\\u001fv1\\u001f${metadata.agent_id}\\u001f${key}`;\n const expiresAt = Math.floor(Date.now() / 1000) + ttlSeconds;\n\n const claimed = await dedup.backend.putIfAbsent(scopedKey, {\n payloadHash: '',\n response: null,\n expiresAt,\n });\n return !claimed;\n }\n}\n\n// AdCP spec: `^[A-Za-z0-9_.:-]{16,255}$`. Any key not matching this\n// pattern is malformed — treat as missing rather than forming a scoped\n// key from arbitrary sender-supplied bytes.\nconst IDEMPOTENCY_KEY_PATTERN = /^[A-Za-z0-9_.:-]{16,255}$/;\n\n/**\n * Factory function to create async handler\n */\nexport function createAsyncHandler(config: AsyncHandlerConfig): AsyncHandler {\n return new AsyncHandler(config);\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/core/AsyncHandler.ts"],"sourcesContent":["/**\n * Structured async handler for AdCP webhook responses\n * Provides type-safe callbacks for each AdCP tool completion\n */\n\nimport type { IdempotencyBackend } from '../server/idempotency/store';\nimport type {\n ListCreativeFormatsResponse,\n ListCreativesResponse,\n PreviewCreativeResponse,\n BuildCreativeResponse,\n GetMediaBuysResponse,\n GetMediaBuyDeliveryResponse,\n GetCreativeDeliveryResponse,\n ProvidePerformanceFeedbackResponse,\n GetSignalsResponse,\n ActivateSignalResponse,\n ListAccountsResponse,\n SyncAccountsResponse,\n SyncAudiencesResponse,\n CreatePropertyListResponse,\n GetPropertyListResponse,\n UpdatePropertyListResponse,\n ListPropertyListsResponse,\n DeletePropertyListResponse,\n ListContentStandardsResponse,\n GetContentStandardsResponse,\n CalibrateContentResponse,\n ValidateContentDeliveryResponse,\n SIGetOfferingResponse,\n SIInitiateSessionResponse,\n SISendMessageResponse,\n SITerminateSessionResponse,\n} from '../types/tools.generated';\n\nimport type {\n AdCPAsyncResponseData,\n CreateMediaBuyAsyncInputRequired,\n CreateMediaBuyAsyncSubmitted,\n CreateMediaBuyAsyncWorking,\n CreateMediaBuyResponse,\n GetProductsAsyncInputRequired,\n GetProductsAsyncSubmitted,\n GetProductsAsyncWorking,\n GetProductsResponse,\n SyncCreativesAsyncInputRequired,\n SyncCreativesAsyncSubmitted,\n SyncCreativesAsyncWorking,\n SyncCreativesResponse,\n TaskStatus,\n TaskType,\n UpdateMediaBuyAsyncInputRequired,\n UpdateMediaBuyAsyncSubmitted,\n UpdateMediaBuyAsyncWorking,\n UpdateMediaBuyResponse,\n} from '../types/core.generated';\nimport type { TaskResultMetadata } from './ConversationTypes';\nimport {\n CreateMediaBuyAsyncResponseData,\n GetProductsAsyncResponseData,\n SyncCreativesAsyncResponseData,\n UpdateMediaBuyAsyncResponseData,\n} from '../types';\nimport type {\n CanonicalCreativeResponse,\n CanonicalGetProductsResponse,\n CanonicalListCreativesResponse,\n} from '../v2/projection/creative-delivery';\n\n/**\n * Metadata provided with webhook responses\n */\nexport interface WebhookMetadata {\n /** Client-provided operation ID */\n operation_id: string;\n /** Server's task ID */\n task_id: string;\n /** Agent ID */\n agent_id: string;\n /** Task type/tool name */\n task_type: string;\n /** Task status (completed, failed, needs_input, working, etc) */\n status: TaskStatus;\n /** Server's context ID */\n context_id?: string;\n /** Human-readable context about the status change */\n message?: string;\n /** Timestamp */\n timestamp: string;\n /** raw HTTP payload */\n rawHTTPPayload?: any;\n /**\n * Wire protocol that delivered this webhook. Useful for handler code\n * that needs to treat MCP and A2A transports differently (e.g.,\n * `idempotency_key` is only present on MCP payloads).\n */\n protocol?: 'mcp' | 'a2a';\n /**\n * Sender-generated key stable across retries of the same webhook event\n * (MCP envelope only — A2A webhooks do not carry this field). Use this\n * as the canonical dedup key; see `AsyncHandlerConfig.webhookDedup`.\n */\n idempotency_key?: string;\n /**\n * Buyer-side product property policy evaluation for completed get_products\n * webhooks. Present when the client filters, audits, or rejects a webhook\n * result before dispatching it to handlers.\n */\n productPropertyPolicy?: TaskResultMetadata['productPropertyPolicy'];\n /**\n * Buyer-side pricing-options enforcement summary for completed get_products\n * webhooks. Present when the client drops products that arrived without a\n * usable `pricing_options[]` array before dispatching to handlers.\n */\n productPricingPolicy?: TaskResultMetadata['productPricingPolicy'];\n}\n\n/**\n * Metadata for agent-initiated notifications\n * Same as WebhookMetadata but includes notification-specific fields\n */\nexport interface NotificationMetadata extends WebhookMetadata {\n /** Notification type */\n notification_type: 'scheduled' | 'final' | 'delayed';\n /** Sequence number of this notification */\n sequence_number?: number;\n /** When next notification is expected (not present for 'final') */\n next_expected_at?: string;\n}\n\n// Simple union-typed handlers for webhook status changes\nexport type GetProductsStatusChangeHandler = (\n response:\n | CanonicalGetProductsResponse\n | GetProductsAsyncSubmitted\n | GetProductsAsyncWorking\n | GetProductsAsyncInputRequired,\n metadata: WebhookMetadata\n) => void | Promise<void>;\n\nexport type CreateMediaBuyStatusChangeHandler = (\n response: CanonicalCreativeResponse<\n | CreateMediaBuyResponse\n | CreateMediaBuyAsyncSubmitted\n | CreateMediaBuyAsyncWorking\n | CreateMediaBuyAsyncInputRequired\n >,\n metadata: WebhookMetadata\n) => void | Promise<void>;\n\nexport type UpdateMediaBuyStatusChangeHandler = (\n response: CanonicalCreativeResponse<\n | UpdateMediaBuyResponse\n | UpdateMediaBuyAsyncSubmitted\n | UpdateMediaBuyAsyncWorking\n | UpdateMediaBuyAsyncInputRequired\n >,\n metadata: WebhookMetadata\n) => void | Promise<void>;\n\nexport type SyncCreativesStatusChangeHandler = (\n response: CanonicalCreativeResponse<\n SyncCreativesResponse | SyncCreativesAsyncSubmitted | SyncCreativesAsyncWorking | SyncCreativesAsyncInputRequired\n >,\n metadata: WebhookMetadata\n) => void | Promise<void>;\n\n/**\n * Media buy delivery notification payload (PR #81)\n * Agent-initiated periodic reporting, not tied to any client operation\n */\nexport interface MediaBuyDeliveryNotification {\n /** Type of notification */\n notification_type: 'scheduled' | 'final' | 'delayed';\n /** Sequential notification number (starts at 1) */\n sequence_number?: number;\n /** When next notification is expected (omitted for 'final') */\n next_expected_at?: string;\n /** Reporting period for this notification */\n reporting_period?: {\n start: string;\n end: string;\n };\n /** Currency used for financial metrics */\n currency?: string;\n /** Array of media buy deliveries being reported */\n media_buy_deliveries?: Array<{\n media_buy_id: string;\n impressions?: number;\n clicks?: number;\n spend?: number;\n conversions?: number;\n [key: string]: any;\n }>;\n}\n\n/**\n * Activity event for logging/observability\n */\nexport interface Activity {\n type:\n | 'protocol_request'\n | 'protocol_response'\n | 'status_change'\n | 'webhook_received'\n | 'webhook_duplicate'\n | 'governance_check'\n | 'governance_outcome';\n operation_id: string;\n agent_id: string;\n context_id?: string;\n task_id?: string;\n task_type: string;\n status?: string;\n /**\n * Full AdCP response payload. Populated on `webhook_received` and\n * protocol/status events. INTENTIONALLY omitted on `webhook_duplicate`\n * to avoid re-logging potentially-sensitive data on every retry — the\n * originating `webhook_received` event already carries it. Correlate\n * the two via `idempotency_key`.\n */\n payload?: any;\n /**\n * Webhook idempotency key when available. Present on `webhook_received`\n * and `webhook_duplicate` events from MCP envelopes, enabling\n * correlation between a first delivery and its retry echoes.\n */\n idempotency_key?: string;\n timestamp: string;\n}\n\n/**\n * Configuration for async handler with typed callbacks\n */\nexport interface AsyncHandlerConfig {\n // AdCP tool status change handlers - called for ALL status changes (completed, failed, working, input-required, submitted)\n onGetProductsStatusChange?: GetProductsStatusChangeHandler;\n onListCreativeFormatsLegacyStatusChange?: (\n data: ListCreativeFormatsResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onCreateMediaBuyStatusChange?: CreateMediaBuyStatusChangeHandler;\n onUpdateMediaBuyStatusChange?: UpdateMediaBuyStatusChangeHandler;\n onSyncCreativesStatusChange?: SyncCreativesStatusChangeHandler;\n onListCreativesStatusChange?: (\n response: CanonicalListCreativesResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onPreviewCreativeLegacyStatusChange?: (\n response: PreviewCreativeResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onGetMediaBuysStatusChange?: (\n response: CanonicalCreativeResponse<GetMediaBuysResponse>,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onGetMediaBuyDeliveryStatusChange?: (\n response: CanonicalCreativeResponse<GetMediaBuyDeliveryResponse>,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onGetCreativeDeliveryStatusChange?: (\n response: CanonicalCreativeResponse<GetCreativeDeliveryResponse>,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onProvidePerformanceFeedbackStatusChange?: (\n response: ProvidePerformanceFeedbackResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onGetSignalsStatusChange?: (response: GetSignalsResponse, metadata: WebhookMetadata) => void | Promise<void>;\n onActivateSignalStatusChange?: (response: ActivateSignalResponse, metadata: WebhookMetadata) => void | Promise<void>;\n onBuildCreativeLegacyStatusChange?: (\n response: BuildCreativeResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onListAccountsStatusChange?: (response: ListAccountsResponse, metadata: WebhookMetadata) => void | Promise<void>;\n onSyncAccountsStatusChange?: (response: SyncAccountsResponse, metadata: WebhookMetadata) => void | Promise<void>;\n onSyncAudiencesStatusChange?: (response: SyncAudiencesResponse, metadata: WebhookMetadata) => void | Promise<void>;\n onCreatePropertyListStatusChange?: (\n response: CreatePropertyListResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onGetPropertyListStatusChange?: (\n response: GetPropertyListResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onUpdatePropertyListStatusChange?: (\n response: UpdatePropertyListResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onListPropertyListsStatusChange?: (\n response: ListPropertyListsResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onDeletePropertyListStatusChange?: (\n response: DeletePropertyListResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onListContentStandardsLegacyStatusChange?: (\n response: ListContentStandardsResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onGetContentStandardsLegacyStatusChange?: (\n response: GetContentStandardsResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onCalibrateContentLegacyStatusChange?: (\n response: CalibrateContentResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onValidateContentDeliveryLegacyStatusChange?: (\n response: ValidateContentDeliveryResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onSIGetOfferingStatusChange?: (response: SIGetOfferingResponse, metadata: WebhookMetadata) => void | Promise<void>;\n onSIInitiateSessionStatusChange?: (\n response: SIInitiateSessionResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n onSISendMessageStatusChange?: (response: SISendMessageResponse, metadata: WebhookMetadata) => void | Promise<void>;\n onSITerminateSessionStatusChange?: (\n response: SITerminateSessionResponse,\n metadata: WebhookMetadata\n ) => void | Promise<void>;\n\n // Fallback handler for any task status change\n onTaskStatusChange?: (response: any, metadata: WebhookMetadata) => void | Promise<void>;\n\n // Activity logging (low-level protocol events)\n onActivity?: (activity: Activity) => void | Promise<void>;\n\n /**\n * Receiver-side deduplication of webhook payloads by `idempotency_key`.\n *\n * AdCP webhooks use at-least-once delivery — publishers retry until they\n * see a 2xx, so the same event may arrive more than once. When configured,\n * the first delivery for a given `(agent_id, idempotency_key)` tuple\n * dispatches to handlers; subsequent deliveries are dropped and surface\n * as a `webhook_duplicate` activity.\n *\n * Reuses `IdempotencyBackend` from `@adcp/sdk/server` — you can share\n * the same backend across request-side and webhook-side dedup, or use a\n * dedicated one. Scope is per-agent so keys from different senders are\n * independent, matching the spec's \"scoped to authenticated sender\n * identity\" rule.\n *\n * If a payload arrives without `idempotency_key` (non-conforming sender,\n * or A2A transport which does not carry the field), dispatch proceeds\n * without dedup and a warning is logged.\n */\n webhookDedup?: {\n backend: IdempotencyBackend;\n /** Retention for dedup keys. Defaults to 86_400 (24h). */\n ttlSeconds?: number;\n };\n\n // Notification handlers (agent-initiated, no operation_id)\n onMediaBuyDeliveryNotification?: (\n notification: MediaBuyDeliveryNotification,\n metadata: NotificationMetadata\n ) => void | Promise<void>;\n}\n\n/**\n * Async handler class\n */\nexport class AsyncHandler {\n constructor(private config: AsyncHandlerConfig) {}\n\n /**\n * Handle incoming webhook payload (both task completions and notifications)\n */\n async handleWebhook({\n result,\n metadata,\n }: {\n result: AdCPAsyncResponseData | undefined;\n metadata: WebhookMetadata;\n }): Promise<void> {\n if (await this.isDuplicate(metadata)) {\n await this.emitActivity({\n type: 'webhook_duplicate',\n operation_id: metadata.operation_id,\n agent_id: metadata.agent_id,\n context_id: metadata.context_id,\n task_id: metadata.task_id,\n task_type: metadata.task_type,\n status: metadata.status,\n idempotency_key: metadata.idempotency_key,\n timestamp: metadata.timestamp,\n });\n return;\n }\n\n // Emit activity\n await this.emitActivity({\n type: 'webhook_received',\n idempotency_key: metadata.idempotency_key,\n operation_id: metadata.operation_id,\n agent_id: metadata.agent_id,\n context_id: metadata.context_id,\n task_id: metadata.task_id,\n task_type: metadata.task_type,\n status: metadata.status,\n payload: metadata.rawHTTPPayload?.result ?? result,\n timestamp: metadata.timestamp,\n });\n\n // Check if this is a notification (media_buy_delivery with notification_type)\n // Notifications are treated like status updates for an ongoing \"get delivery report\" operation\n // The operation_id (from URL) groups all reports for the same agent + month\n if (\n metadata.task_type === 'media_buy_delivery' &&\n result &&\n typeof result === 'object' &&\n 'notification_type' in result\n ) {\n const notificationPayload = result as unknown as MediaBuyDeliveryNotification;\n\n // Build notification metadata\n // operation_id comes from webhook URL and was lazily generated from agent + month\n const notificationMetadata: NotificationMetadata = {\n ...metadata,\n notification_type: notificationPayload.notification_type,\n sequence_number: notificationPayload.sequence_number,\n next_expected_at: notificationPayload.next_expected_at,\n };\n\n await this.config.onMediaBuyDeliveryNotification?.(notificationPayload, notificationMetadata);\n return;\n }\n\n // All status changes go through the specific handler\n // The handler receives metadata with status and can act accordingly\n await this.handleCompletion(metadata.task_type, result, metadata);\n }\n\n /**\n * Handle task completion - route to specific handler\n */\n private async handleCompletion(\n taskType: string,\n result: AdCPAsyncResponseData | undefined,\n metadata: WebhookMetadata\n ): Promise<void> {\n let handler: ((result: any, metadata: any) => void | Promise<void>) | undefined;\n\n // Route to specific handler based on task type\n switch (taskType) {\n case 'get_products':\n handler = this.config.onGetProductsStatusChange;\n break;\n\n case 'list_creative_formats':\n handler = this.config.onListCreativeFormatsLegacyStatusChange;\n break;\n\n case 'preview_creative':\n handler = this.config.onPreviewCreativeLegacyStatusChange;\n break;\n\n case 'build_creative':\n handler = this.config.onBuildCreativeLegacyStatusChange;\n break;\n\n case 'create_media_buy':\n handler = this.config.onCreateMediaBuyStatusChange;\n break;\n\n case 'update_media_buy':\n handler = this.config.onUpdateMediaBuyStatusChange;\n break;\n\n case 'sync_creatives':\n handler = this.config.onSyncCreativesStatusChange;\n break;\n\n case 'list_creatives':\n handler = this.config.onListCreativesStatusChange;\n break;\n\n case 'get_media_buys':\n handler = this.config.onGetMediaBuysStatusChange;\n break;\n\n case 'get_media_buy_delivery':\n handler = this.config.onGetMediaBuyDeliveryStatusChange;\n break;\n\n case 'get_creative_delivery':\n handler = this.config.onGetCreativeDeliveryStatusChange;\n break;\n\n case 'provide_performance_feedback':\n handler = this.config.onProvidePerformanceFeedbackStatusChange;\n break;\n\n case 'get_signals':\n handler = this.config.onGetSignalsStatusChange;\n break;\n\n case 'activate_signal':\n handler = this.config.onActivateSignalStatusChange;\n break;\n\n case 'list_content_standards':\n handler = this.config.onListContentStandardsLegacyStatusChange;\n break;\n\n case 'get_content_standards':\n handler = this.config.onGetContentStandardsLegacyStatusChange;\n break;\n\n case 'calibrate_content':\n handler = this.config.onCalibrateContentLegacyStatusChange;\n break;\n\n case 'validate_content_delivery':\n handler = this.config.onValidateContentDeliveryLegacyStatusChange;\n break;\n }\n\n // Call specific handler if configured, otherwise fallback to generic handler\n const handlerToCall = handler || this.config.onTaskStatusChange;\n\n if (handlerToCall) {\n try {\n await handlerToCall(result, metadata);\n } catch (error) {\n // Log error but don't crash webhook processing\n console.error(\n `Error in handler for task ${taskType}:`,\n error instanceof Error ? error.message : 'unknown error'\n );\n }\n }\n }\n\n /**\n * Emit activity event\n */\n private async emitActivity(activity: Activity): Promise<void> {\n await this.config.onActivity?.(activity);\n }\n\n /**\n * Claim the webhook for processing, returning true if the event has\n * already been delivered for this `(agent_id, idempotency_key)` tuple.\n *\n * Uses `IdempotencyBackend.putIfAbsent` so concurrent retries race on a\n * single claim: exactly one caller gets `true` and proceeds, the rest\n * observe the existing entry and return.\n */\n private async isDuplicate(metadata: WebhookMetadata): Promise<boolean> {\n const dedup = this.config.webhookDedup;\n if (!dedup) return false;\n\n const key = metadata.idempotency_key;\n if (!key || !IDEMPOTENCY_KEY_PATTERN.test(key)) {\n // No valid key. MCP senders MUST emit one per AdCP 3.0; A2A\n // transport doesn't carry the field at all. Warn MCP (so\n // integrators notice non-conforming publishers) and stay quiet\n // for A2A (expected and unactionable).\n if (metadata.protocol !== 'a2a') {\n console.warn(\n `[AdCP] webhookDedup enabled but webhook from agent=${metadata.agent_id} task=${metadata.task_id} has ${\n key ? 'an invalid' : 'no'\n } idempotency_key. Expected format: ${IDEMPOTENCY_KEY_PATTERN.source}. ` +\n 'Dispatching without dedup — duplicate deliveries from this sender will re-trigger handlers. ' +\n 'See docs/guides/PUSH-NOTIFICATION-CONFIG.md#deduplication'\n );\n }\n return false;\n }\n\n const ttlSeconds = dedup.ttlSeconds ?? 86_400;\n // Reserved prefix `adcp\\u001fwebhook\\u001fv1\\u001f...` namespaces the\n // claim so webhook dedup entries can coexist with request-side\n // idempotency entries in a shared backend — a request-side principal\n // can never produce a scoped key with this prefix because the\n // principal regex excludes U+001F.\n const scopedKey = `adcp\\u001fwebhook\\u001fv1\\u001f${metadata.agent_id}\\u001f${key}`;\n const expiresAt = Math.floor(Date.now() / 1000) + ttlSeconds;\n\n const claimed = await dedup.backend.putIfAbsent(scopedKey, {\n payloadHash: '',\n response: null,\n expiresAt,\n });\n return !claimed;\n }\n}\n\n// AdCP spec: `^[A-Za-z0-9_.:-]{16,255}$`. Any key not matching this\n// pattern is malformed — treat as missing rather than forming a scoped\n// key from arbitrary sender-supplied bytes.\nconst IDEMPOTENCY_KEY_PATTERN = /^[A-Za-z0-9_.:-]{16,255}$/;\n\n/**\n * Factory function to create async handler\n */\nexport function createAsyncHandler(config: AsyncHandlerConfig): AsyncHandler {\n return new AsyncHandler(config);\n}\n"],"mappings":"AA6WO,MAAM,aAAa;AAAA,EACxB,YAAoB,QAA4B;AAA5B;AAAA,EAA6B;AAAA,EAA7B;AAAA;AAAA;AAAA;AAAA,EAKpB,MAAM,cAAc;AAAA,IAClB;AAAA,IACA;AAAA,EACF,GAGkB;AAChB,QAAI,MAAM,KAAK,YAAY,QAAQ,GAAG;AACpC,YAAM,KAAK,aAAa;AAAA,QACtB,MAAM;AAAA,QACN,cAAc,SAAS;AAAA,QACvB,UAAU,SAAS;AAAA,QACnB,YAAY,SAAS;AAAA,QACrB,SAAS,SAAS;AAAA,QAClB,WAAW,SAAS;AAAA,QACpB,QAAQ,SAAS;AAAA,QACjB,iBAAiB,SAAS;AAAA,QAC1B,WAAW,SAAS;AAAA,MACtB,CAAC;AACD;AAAA,IACF;AAGA,UAAM,KAAK,aAAa;AAAA,MACtB,MAAM;AAAA,MACN,iBAAiB,SAAS;AAAA,MAC1B,cAAc,SAAS;AAAA,MACvB,UAAU,SAAS;AAAA,MACnB,YAAY,SAAS;AAAA,MACrB,SAAS,SAAS;AAAA,MAClB,WAAW,SAAS;AAAA,MACpB,QAAQ,SAAS;AAAA,MACjB,SAAS,SAAS,gBAAgB,UAAU;AAAA,MAC5C,WAAW,SAAS;AAAA,IACtB,CAAC;AAKD,QACE,SAAS,cAAc,wBACvB,UACA,OAAO,WAAW,YAClB,uBAAuB,QACvB;AACA,YAAM,sBAAsB;AAI5B,YAAM,uBAA6C;AAAA,QACjD,GAAG;AAAA,QACH,mBAAmB,oBAAoB;AAAA,QACvC,iBAAiB,oBAAoB;AAAA,QACrC,kBAAkB,oBAAoB;AAAA,MACxC;AAEA,YAAM,KAAK,OAAO,iCAAiC,qBAAqB,oBAAoB;AAC5F;AAAA,IACF;AAIA,UAAM,KAAK,iBAAiB,SAAS,WAAW,QAAQ,QAAQ;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBACZ,UACA,QACA,UACe;AACf,QAAI;AAGJ,YAAQ,UAAU;AAAA,MAChB,KAAK;AACH,kBAAU,KAAK,OAAO;AACtB;AAAA,MAEF,KAAK;AACH,kBAAU,KAAK,OAAO;AACtB;AAAA,MAEF,KAAK;AACH,kBAAU,KAAK,OAAO;AACtB;AAAA,MAEF,KAAK;AACH,kBAAU,KAAK,OAAO;AACtB;AAAA,MAEF,KAAK;AACH,kBAAU,KAAK,OAAO;AACtB;AAAA,MAEF,KAAK;AACH,kBAAU,KAAK,OAAO;AACtB;AAAA,MAEF,KAAK;AACH,kBAAU,KAAK,OAAO;AACtB;AAAA,MAEF,KAAK;AACH,kBAAU,KAAK,OAAO;AACtB;AAAA,MAEF,KAAK;AACH,kBAAU,KAAK,OAAO;AACtB;AAAA,MAEF,KAAK;AACH,kBAAU,KAAK,OAAO;AACtB;AAAA,MAEF,KAAK;AACH,kBAAU,KAAK,OAAO;AACtB;AAAA,MAEF,KAAK;AACH,kBAAU,KAAK,OAAO;AACtB;AAAA,MAEF,KAAK;AACH,kBAAU,KAAK,OAAO;AACtB;AAAA,MAEF,KAAK;AACH,kBAAU,KAAK,OAAO;AACtB;AAAA,MAEF,KAAK;AACH,kBAAU,KAAK,OAAO;AACtB;AAAA,MAEF,KAAK;AACH,kBAAU,KAAK,OAAO;AACtB;AAAA,MAEF,KAAK;AACH,kBAAU,KAAK,OAAO;AACtB;AAAA,MAEF,KAAK;AACH,kBAAU,KAAK,OAAO;AACtB;AAAA,IACJ;AAGA,UAAM,gBAAgB,WAAW,KAAK,OAAO;AAE7C,QAAI,eAAe;AACjB,UAAI;AACF,cAAM,cAAc,QAAQ,QAAQ;AAAA,MACtC,SAAS,OAAO;AAEd,gBAAQ;AAAA,UACN,6BAA6B,QAAQ;AAAA,UACrC,iBAAiB,QAAQ,MAAM,UAAU;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,aAAa,UAAmC;AAC5D,UAAM,KAAK,OAAO,aAAa,QAAQ;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAc,YAAY,UAA6C;AACrE,UAAM,QAAQ,KAAK,OAAO;AAC1B,QAAI,CAAC,MAAO,QAAO;AAEnB,UAAM,MAAM,SAAS;AACrB,QAAI,CAAC,OAAO,CAAC,wBAAwB,KAAK,GAAG,GAAG;AAK9C,UAAI,SAAS,aAAa,OAAO;AAC/B,gBAAQ;AAAA,UACN,sDAAsD,SAAS,QAAQ,SAAS,SAAS,OAAO,QAC9F,MAAM,eAAe,IACvB,sCAAsC,wBAAwB,MAAM;AAAA,QAGtE;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,MAAM,cAAc;AAMvC,UAAM,YAAY,mBAAkC,SAAS,QAAQ,IAAS,GAAG;AACjF,UAAM,YAAY,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,IAAI;AAElD,UAAM,UAAU,MAAM,MAAM,QAAQ,YAAY,WAAW;AAAA,MACzD,aAAa;AAAA,MACb,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AACD,WAAO,CAAC;AAAA,EACV;AACF;AAKA,MAAM,0BAA0B;AAKzB,SAAS,mBAAmB,QAA0C;AAC3E,SAAO,IAAI,aAAa,MAAM;AAChC;","names":[]}
@@ -161,8 +161,12 @@ export interface TaskState {
161
161
  taskId: string;
162
162
  /** Task name (tool name) */
163
163
  taskName: string;
164
- /** Original parameters */
165
- params: any;
164
+ /**
165
+ * Original parameters while the SDK is actively dispatching or resolving
166
+ * input. Redacted after a task becomes working, submitted, or terminal so
167
+ * lifecycle inspection does not retain request assets or credentials.
168
+ */
169
+ params?: any;
166
170
  /** Current status */
167
171
  status: TaskStatus;
168
172
  /** Message history */
@@ -161,8 +161,12 @@ export interface TaskState {
161
161
  taskId: string;
162
162
  /** Task name (tool name) */
163
163
  taskName: string;
164
- /** Original parameters */
165
- params: any;
164
+ /**
165
+ * Original parameters while the SDK is actively dispatching or resolving
166
+ * input. Redacted after a task becomes working, submitted, or terminal so
167
+ * lifecycle inspection does not retain request assets or credentials.
168
+ */
169
+ params?: any;
166
170
  /** Current status */
167
171
  status: TaskStatus;
168
172
  /** Message history */
@@ -1 +1 @@
1
- {"version":3,"file":"ConversationTypes.d.ts","sourceRoot":"","sources":["../../../src/lib/core/ConversationTypes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ConversationTypes.d.ts","sourceRoot":"","sources":["../../../src/lib/core/ConversationTypes.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/core/ConversationTypes.ts"],"sourcesContent":["// Core conversation types for ADCP client library\n// These types support the conversation and clarification pattern\n\nimport type { ProductPropertyPolicyDiagnostic, ProductPropertyPolicyMode } from '../media-buy/property-policy';\n\n/**\n * Represents a single message in a conversation with an agent\n */\nexport interface Message {\n /** Unique identifier for this message */\n id: string;\n /** Role of the message sender */\n role: 'user' | 'agent' | 'system';\n /** Message content - can be structured or text */\n content: any;\n /** Timestamp when message was created */\n timestamp: string;\n /** Optional metadata about the message */\n metadata?: {\n /** Tool/task name if this message is tool-related */\n toolName?: string;\n /** Message type (request, response, clarification, etc.) */\n type?: string;\n /** Additional context data */\n [key: string]: any;\n };\n}\n\n/**\n * Request for input from the agent - sent when clarification is needed\n */\nexport interface InputRequest {\n /** Human-readable question or prompt */\n question: string;\n /** Specific field being requested (if applicable) */\n field?: string;\n /** Expected type of response */\n expectedType?: 'string' | 'number' | 'boolean' | 'object' | 'array';\n /** Suggested values or options */\n suggestions?: any[];\n /** Whether this input is required */\n required?: boolean;\n /** Validation rules for the input */\n validation?: {\n min?: number;\n max?: number;\n pattern?: string;\n enum?: any[];\n };\n /** Additional context about why this input is needed */\n context?: string;\n}\n\n/**\n * Different types of responses an input handler can provide\n */\nexport type InputHandlerResponse =\n | any // Direct answer\n | Promise<any> // Async answer\n | { defer: true; token: string } // Defer to human\n | { abort: true; reason?: string } // Abort task\n | never; // For control flow (abort() helper)\n\n/**\n * Function signature for input handlers\n */\nexport type InputHandler = (context: ConversationContext) => InputHandlerResponse;\n\n/**\n * Complete conversation context provided to input handlers\n */\nexport interface ConversationContext {\n /** Full conversation history for this task */\n messages: Message[];\n /** Current input request from the agent */\n inputRequest: InputRequest;\n /** Unique task identifier */\n taskId: string;\n /** Agent configuration */\n agent: {\n id: string;\n name: string;\n protocol: 'mcp' | 'a2a';\n };\n /** Current clarification attempt number (1-based) */\n attempt: number;\n /** Maximum allowed clarification attempts */\n maxAttempts: number;\n\n /** Helper method to defer task to human */\n deferToHuman(): Promise<{ defer: true; token: string }>;\n\n /** Helper method to abort the task */\n abort(reason?: string): never;\n\n /** Get conversation summary for context */\n getSummary(): string;\n\n /** Check if a field was previously discussed */\n wasFieldDiscussed(field: string): boolean;\n\n /** Get previous response for a field */\n getPreviousResponse(field: string): any;\n}\n\n/**\n * Status of a task execution\n */\nexport type TaskStatus =\n | 'pending'\n | 'running'\n | 'working'\n | 'needs_input'\n | 'input-required'\n | 'auth-required'\n | 'completed'\n | 'failed'\n | 'rejected'\n | 'canceled'\n | 'deferred'\n | 'aborted'\n | 'submitted'\n | 'governance-denied';\n\n/**\n * Predicate used by scoped webhook URL templates to decide which operations\n * receive protocol-level webhook URLs.\n */\nexport type WebhookToolPredicate = (toolName: string) => boolean;\n\n/**\n * Webhook URL template with macro substitution. A bare string preserves the\n * legacy behavior: every operation receives a generated webhook URL. The\n * object form scopes webhook URL generation to a tool allowlist or predicate.\n */\nexport type WebhookUrlTemplate =\n | string\n | {\n template: string;\n tools?: string[] | WebhookToolPredicate;\n };\n\n/**\n * Options for task execution\n */\nexport interface TaskOptions {\n /** Timeout for entire task (ms) */\n timeout?: number;\n /**\n * Caller-owned cancellation signal for the read path and in-flight protocol\n * call. Aborting this signal cancels discovery probes (`getAgentInfo`,\n * `getCapabilities`, feature/version preflight) and the tool request where\n * the underlying official protocol client supports it.\n */\n signal?: AbortSignal;\n /** Maximum clarification rounds before failing */\n maxClarifications?: number;\n /**\n * A2A `contextId` that binds this call to a server-side conversation.\n * When set, the client sends it on the A2A Message envelope so the server\n * can route to the existing session instead of starting a new one.\n * Retained automatically across calls on the same `AgentClient`.\n */\n contextId?: string;\n /**\n * A2A `taskId` of a non-terminal task to resume (HITL / approval flows).\n * When set, the client sends it on the A2A Message envelope so the server\n * continues the same task rather than opening a new one.\n */\n taskId?: string;\n /** Enable debug logging for this task */\n debug?: boolean;\n /** Suppress automatic webhook URL generation for this call. */\n disableWebhook?: boolean;\n /** Additional metadata to include */\n metadata?: Record<string, any>;\n /**\n * INTERNAL — compliance-test-only escape hatch.\n *\n * Suppresses the client's automatic `idempotency_key` generation on\n * mutating requests. The sole caller is the storyboard runner, which\n * needs to exercise servers' missing-key validation. Auto-injection\n * is the retry-safety contract for every real buyer — bypassing it\n * in production breaks at-most-once semantics on network retries.\n *\n * @internal Do not set in production buyer code.\n */\n skipIdempotencyAutoInject?: boolean;\n /**\n * INTERNAL — compliance-test-only escape hatch.\n *\n * Suppresses the client's `account`-required validation on\n * `create_media_buy` requests. The sole caller is the storyboard runner,\n * which needs to exercise servers' missing-account validation without the\n * SDK throwing client-side before the wire call.\n *\n * @internal Do not set in production buyer code.\n */\n skipAccountValidation?: boolean;\n /**\n * Transport-level safeguards for this call. Overrides the matching field\n * on the client constructor's `transport` option. Use to lift or tighten\n * `maxResponseBytes` per call when an agent legitimately publishes large\n * catalogs (e.g., `list_creative_formats` on a generative seller).\n */\n transport?: import('../protocols').TransportOptions;\n}\n\n/**\n * Internal task state for tracking execution\n */\nexport interface TaskState {\n /** Unique task identifier */\n taskId: string;\n /** Task name (tool name) */\n taskName: string;\n /** Original parameters */\n params: any;\n /** Current status */\n status: TaskStatus;\n /** Message history */\n messages: Message[];\n /** Current input request (if waiting for input) */\n pendingInput?: InputRequest;\n /** Start time */\n startTime: number;\n /** Current attempt number */\n attempt: number;\n /** Maximum attempts allowed */\n maxAttempts: number;\n /** Task options */\n options: TaskOptions;\n /** Agent configuration */\n agent: {\n id: string;\n name: string;\n protocol: 'mcp' | 'a2a';\n };\n /**\n * Idempotency key for this task, when the tool is mutating. Tracked on\n * state so internal retries reuse the same key (the whole point of the\n * envelope — a re-generated key defeats retry safety).\n */\n idempotencyKey?: string;\n}\n\n/**\n * Task tracking information from tasks/get endpoint (PR #78)\n */\nexport interface TaskInfo {\n /** Task ID */\n taskId: string;\n /** Current status */\n status: string;\n /** Task type/name */\n taskType: string;\n /** Creation timestamp */\n createdAt: number;\n /** Last update timestamp */\n updatedAt: number;\n /** Task result (if completed) */\n result?: any;\n /** Error message (if failed) */\n error?: string;\n /** Human-readable message from agent (alternative to error field) */\n message?: string;\n /** Webhook URL (if applicable) */\n webhookUrl?: string;\n}\n\n/**\n * Continuation for deferred client tasks (client needs time)\n */\nexport interface DeferredContinuation<T> {\n /** Token for resuming the task */\n token: string;\n /** Question that triggered the deferral */\n question?: string;\n /** Resume the task with user input */\n resume: (input: any) => Promise<TaskResult<T>>;\n}\n\n/**\n * Continuation for submitted server tasks (server needs time).\n *\n * Returned in `TaskResult.submitted` when the seller signals an AdCP\n * `submitted` arm (long-running work that won't complete inside the\n * transport call). The buyer either polls via {@link waitForCompletion}\n * / {@link track} or waits for the seller's webhook callback at\n * {@link webhookUrl}.\n */\nexport interface SubmittedContinuation<T> {\n /**\n * Server-assigned task handle — the value the seller emitted in\n * `response.task_id` (AdCP submitted-arm wire field) or surfaced via\n * the A2A response Task. This is the identifier the seller knows; it\n * is what the SDK passes to subsequent `tasks/get` polling calls.\n *\n * NOT the same as the SDK's runner-side correlation id (`TaskState.taskId`,\n * a local UUID generated at request time and used internally for\n * `activeTasks` map indexing and the `{operation_id}` webhook URL macro).\n * The runner-side id never reaches the seller.\n *\n * If the seller violated the spec and didn't include a task handle on\n * the submitted-arm response, this falls back to the runner-side\n * correlation id — pollers won't be able to locate the work, but\n * callers at least get a non-undefined value to log.\n */\n taskId: string;\n /** Webhook URL where server will notify completion */\n webhookUrl?: string;\n /** Get current task status. Pass `transport` to override the executor-constructor cap for this poll. */\n track: (transport?: import('../protocols').TransportOptions) => Promise<TaskInfo>;\n /**\n * Wait for completion with polling. Transport cap is fixed at task-submission time; use `track` for per-poll override.\n * Pass `signal` to cancel the polling loop early (e.g. `AbortSignal.timeout(ms)`); the loop exits cleanly on abort\n * rather than continuing to issue `tasks/get` requests after the caller has moved on. (adcp-client#1612)\n * On abort with an A2A seller, a `tasks/cancel` is also dispatched as a protocol courtesy (A2A 0.3.0 §7.4)\n * — fire-and-forget; the buyer does not wait for acknowledgment and the outcome does not affect the returned `TaskResult`.\n */\n waitForCompletion: (pollInterval?: number, signal?: AbortSignal) => Promise<TaskResult<T>>;\n}\n\n/**\n * A single validation failure from an AdCP VALIDATION_ERROR response.\n *\n * `pointer` uses RFC 6901 JSON Pointer format (e.g. `/packages/0/targeting`),\n * which differs from the top-level `AdcpErrorInfo.field` that uses JSONPath-lite\n * (`packages[0].targeting`). For LLM self-correction: read `keyword` first —\n * `'required'` means add the missing field, `'enum'` means pick a valid value,\n * `'type'` means fix the value type.\n */\nexport interface AdcpValidationIssue {\n /** RFC 6901 JSON Pointer to the offending field (e.g. `/packages/0/targeting`). */\n pointer: string;\n /** Human-readable reason this field was rejected. */\n message: string;\n /** JSON Schema keyword that caused rejection (e.g. `'required'`, `'type'`, `'enum'`). */\n keyword: string;\n /**\n * Path inside the schema that rejected the payload. Sellers SHOULD NOT emit on\n * production endpoints — it leaks oneOf branch selection and is a fingerprinting\n * oracle for adversarial callers. May appear in dev/sandbox mode.\n */\n schemaPath?: string;\n}\n\n/**\n * Structured AdCP error information extracted from a failed task response.\n * Present on `TaskResult.adcpError` when the agent returns a recognized error.\n */\nexport interface AdcpErrorInfo {\n /** AdCP error code (e.g., 'RATE_LIMITED', 'PRODUCT_NOT_FOUND') */\n code: string;\n /** Human-readable error message. **Sellers:** do not embed tokens, account IDs, or internal paths — this field is forwarded to `ComplianceResult.failures[].adcp_error` and is grader-visible beyond the request lifetime. */\n message: string;\n /** Recovery classification: retry, fix the request, or give up */\n recovery?: 'transient' | 'correctable' | 'terminal';\n /** Field that caused the error */\n field?: string;\n /** Suggested fix from the agent. Untrusted — sanitize before rendering in HTML. */\n suggestion?: string;\n /** Seconds to wait before retrying (transient errors). See also `retryAfterMs`. */\n retry_after?: number;\n /** Milliseconds to wait before retrying — convenience conversion of `retry_after * 1000`. */\n retryAfterMs?: number;\n /** Additional error details. Untrusted agent-controlled content — sanitize before rendering. **Sellers:** do not embed tokens, account IDs, or internal paths — this field is forwarded to `ComplianceResult.failures[].adcp_error` and is grader-visible beyond the request lifetime. */\n details?: Record<string, unknown>;\n /**\n * Structured validation failures. Present on `VALIDATION_ERROR` when the seller\n * identifies multiple offending fields. Each item's `pointer` is RFC 6901 format\n * (e.g. `/packages/0/targeting`) — differs from the top-level `field` which uses\n * JSONPath-lite. For LLM self-correction, read `keyword` first: `'required'` → add\n * the field, `'enum'` → pick a valid value, `'type'` → fix the value type.\n */\n issues?: AdcpValidationIssue[];\n /** True when the SDK inferred this error from unstructured text (L1 compliance) */\n synthetic?: boolean;\n}\n\n/**\n * Task execution metadata, shared across all result variants.\n */\nexport interface TaskResultMetadata {\n /**\n * Client-minted correlation id for this specific request attempt. Used\n * for internal tracking (activeTasks map, webhook URL macros, debug\n * logs) and retried/refired across attempts — NOT the A2A task id the\n * server is tracking. For the server-side id, use {@link serverTaskId}.\n */\n taskId: string;\n /**\n * Server-returned A2A `contextId` / AdCP `context_id` that binds this\n * response to a server-side conversation. Present when the server surfaced\n * one; `undefined` otherwise (e.g., fire-and-forget MCP completions).\n *\n * Buyers who persist conversation across process restarts should save this\n * and seed it into `AgentClient.resetContext(id)` on rehydration.\n */\n contextId?: string;\n /**\n * A2A `taskId` of the server-tracked task for this response. Populated\n * from A2A Task / Message responses; `undefined` for MCP and for A2A\n * responses that carry no task binding. Distinct from {@link taskId},\n * which is the client-minted correlation id.\n */\n serverTaskId?: string;\n taskName: string;\n agent: { id: string; name: string; protocol: 'mcp' | 'a2a' };\n /** Total execution time in milliseconds */\n responseTimeMs: number;\n /** ISO timestamp of completion */\n timestamp: string;\n /** Number of clarification rounds */\n clarificationRounds: number;\n /** Final status */\n status: TaskStatus;\n /** Input request details (for input-required status) */\n inputRequest?: InputRequest;\n /**\n * Idempotency key used for this request, when the tool is mutating. Auto-\n * generated by the SDK when the caller doesn't supply one. Surfaced for\n * logging, correlation, and BYOK flows where the caller persists the key\n * alongside the resource it creates.\n */\n idempotency_key?: string;\n /**\n * True when the response was a cached replay from the seller's idempotency\n * store (i.e., an earlier request with the same key already succeeded).\n *\n * Callers with side effects on response — \"campaign created!\" notifications,\n * LLM memory writes, downstream tool calls — MUST check this flag before\n * acting, or retries will re-fire side effects.\n */\n replayed?: boolean;\n /**\n * Seller-served, release-precision AdCP version echoed on the response\n * envelope. Present when the seller emits `adcp_version` (3.1+). Compare\n * with the request's wire-normalized version, not a raw full-semver\n * configuration pin, when detecting same-major downshift.\n */\n adcpVersion?: string;\n /**\n * Buyer-side product property policy enforcement summary for `get_products`.\n * Present when the client evaluates a configured product property policy or\n * enforces the request's `property_list` reference against the response.\n */\n productPropertyPolicy?: {\n mode: ProductPropertyPolicyMode;\n ok: boolean;\n accepted_count: number;\n rejected_count: number;\n flagged_count: number;\n message?: string;\n request_property_list?: {\n list_id: string;\n agent_url: string;\n identifier_count?: number;\n cache_valid_until?: string;\n resolution_error?: string;\n };\n diagnostics: ProductPropertyPolicyDiagnostic[];\n };\n /**\n * Buyer-side pricing-options enforcement summary for `get_products`. Present\n * when the client drops one or more products that arrived without a usable\n * `pricing_options[]` array (a required, non-empty field in AdCP 3.1).\n */\n productPricingPolicy?: {\n ok: boolean;\n accepted_count: number;\n rejected_count: number;\n rejected_products: Array<{ index: number; product_id?: string }>;\n };\n}\n\n/** Fields shared across all TaskResult variants. */\ninterface TaskResultBase<T = any> {\n metadata: TaskResultMetadata;\n /** Governance check result (present when governance is configured) */\n governance?: import('./GovernanceTypes').GovernanceCheckResult;\n /** Governance outcome (present after successful execution with governance) */\n governanceOutcome?: import('./GovernanceTypes').GovernanceOutcome;\n /** Error message when governance outcome reporting failed */\n governanceOutcomeError?: string;\n /** Full conversation history */\n conversation?: Message[];\n /** Debug logs (if debug enabled) */\n debug_logs?: any[];\n /**\n * Exhaustive pattern match on the result's `status`. Prefer this method\n * form — it autocompletes alongside the other `TaskResult` accessors.\n *\n * The free function {@link import('./match').match} is also exported for\n * compositional use (e.g., point-free style or when the result type is\n * not yet narrowed).\n *\n * Attached non-enumerably by the client when the result is returned\n * from `executeTask`. Results constructed by hand (e.g., in test\n * fixtures or custom middleware) will not have this method — use the\n * free function, or call `attachMatch(result)` first.\n */\n match?: <R>(handlers: import('./match').MatchHandlers<T, R> | import('./match').PartialMatchHandlers<T, R>) => R;\n}\n\n/** Successful completion — `data` is always present. */\nexport interface TaskResultCompleted<T> extends TaskResultBase<T> {\n success: true;\n status: 'completed';\n data: T;\n error?: undefined;\n adcpError?: undefined;\n errorInstance?: undefined;\n correlationId?: undefined;\n deferred?: undefined;\n submitted?: undefined;\n}\n\n/** Task is still progressing (working, submitted, input-required, deferred). */\nexport interface TaskResultIntermediate<T> extends TaskResultBase<T> {\n success: true;\n /**\n * Task is progressing but not yet final. `'auth-required'` and\n * `'input-required'` are paused states surfaced by the polling\n * cycle (`pollTaskCompletion`) — the buyer must satisfy the\n * paused condition (refresh auth / supply input) and retry the\n * original tool call. Polling alone won't advance them.\n */\n status: 'working' | 'submitted' | 'input-required' | 'auth-required' | 'deferred';\n data?: T;\n error?: undefined;\n adcpError?: undefined;\n errorInstance?: undefined;\n correlationId?: undefined;\n /** Deferred continuation (client needs time for input) */\n deferred?: DeferredContinuation<T>;\n /** Submitted continuation (server needs time for processing) */\n submitted?: SubmittedContinuation<T>;\n}\n\n/** Task failed — `error` is always present. */\nexport interface TaskResultFailure<T> extends TaskResultBase<T> {\n success: false;\n status: 'failed' | 'governance-denied';\n /** Response payload with structured error details (adcp_error, context, ext) */\n data?: T;\n /** Human-readable error message */\n error: string;\n /** Structured AdCP error (code, recovery, suggestion, retryAfterMs) */\n adcpError?: AdcpErrorInfo;\n /**\n * Typed `ADCPError` subclass instance when the seller's error code has a\n * dedicated class — currently `IdempotencyConflictError` and\n * `IdempotencyExpiredError`. Lets callers write\n * `if (result.errorInstance instanceof IdempotencyConflictError)` instead of\n * switching on `adcpError.code` strings. Absent for codes without a typed\n * mapping.\n */\n errorInstance?: import('../errors').ADCPError;\n /** Correlation ID from the error response context, for tracing across agents */\n correlationId?: string;\n deferred?: undefined;\n submitted?: undefined;\n}\n\n/**\n * Result of a task execution.\n *\n * Discriminated union on `success`:\n * - `success: true` + `status: 'completed'` → `data` is `T`\n * - `success: true` + intermediate status → task is progressing, `data` may be partial\n * - `success: false` → `error` is always a string, `adcpError` has structured details\n */\nexport type TaskResult<T = any> = TaskResultCompleted<T> | TaskResultIntermediate<T> | TaskResultFailure<T>;\n\n/**\n * Configuration for conversation management\n */\nexport interface ConversationConfig {\n /** Maximum messages to keep in history */\n maxHistorySize?: number;\n /** Whether to persist conversations */\n persistConversations?: boolean;\n /** Timeout for 'working' status (max 120s per PR #78) */\n workingTimeout?: number;\n /** Default max clarifications */\n defaultMaxClarifications?: number;\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/core/ConversationTypes.ts"],"sourcesContent":["// Core conversation types for ADCP client library\n// These types support the conversation and clarification pattern\n\nimport type { ProductPropertyPolicyDiagnostic, ProductPropertyPolicyMode } from '../media-buy/property-policy';\n\n/**\n * Represents a single message in a conversation with an agent\n */\nexport interface Message {\n /** Unique identifier for this message */\n id: string;\n /** Role of the message sender */\n role: 'user' | 'agent' | 'system';\n /** Message content - can be structured or text */\n content: any;\n /** Timestamp when message was created */\n timestamp: string;\n /** Optional metadata about the message */\n metadata?: {\n /** Tool/task name if this message is tool-related */\n toolName?: string;\n /** Message type (request, response, clarification, etc.) */\n type?: string;\n /** Additional context data */\n [key: string]: any;\n };\n}\n\n/**\n * Request for input from the agent - sent when clarification is needed\n */\nexport interface InputRequest {\n /** Human-readable question or prompt */\n question: string;\n /** Specific field being requested (if applicable) */\n field?: string;\n /** Expected type of response */\n expectedType?: 'string' | 'number' | 'boolean' | 'object' | 'array';\n /** Suggested values or options */\n suggestions?: any[];\n /** Whether this input is required */\n required?: boolean;\n /** Validation rules for the input */\n validation?: {\n min?: number;\n max?: number;\n pattern?: string;\n enum?: any[];\n };\n /** Additional context about why this input is needed */\n context?: string;\n}\n\n/**\n * Different types of responses an input handler can provide\n */\nexport type InputHandlerResponse =\n | any // Direct answer\n | Promise<any> // Async answer\n | { defer: true; token: string } // Defer to human\n | { abort: true; reason?: string } // Abort task\n | never; // For control flow (abort() helper)\n\n/**\n * Function signature for input handlers\n */\nexport type InputHandler = (context: ConversationContext) => InputHandlerResponse;\n\n/**\n * Complete conversation context provided to input handlers\n */\nexport interface ConversationContext {\n /** Full conversation history for this task */\n messages: Message[];\n /** Current input request from the agent */\n inputRequest: InputRequest;\n /** Unique task identifier */\n taskId: string;\n /** Agent configuration */\n agent: {\n id: string;\n name: string;\n protocol: 'mcp' | 'a2a';\n };\n /** Current clarification attempt number (1-based) */\n attempt: number;\n /** Maximum allowed clarification attempts */\n maxAttempts: number;\n\n /** Helper method to defer task to human */\n deferToHuman(): Promise<{ defer: true; token: string }>;\n\n /** Helper method to abort the task */\n abort(reason?: string): never;\n\n /** Get conversation summary for context */\n getSummary(): string;\n\n /** Check if a field was previously discussed */\n wasFieldDiscussed(field: string): boolean;\n\n /** Get previous response for a field */\n getPreviousResponse(field: string): any;\n}\n\n/**\n * Status of a task execution\n */\nexport type TaskStatus =\n | 'pending'\n | 'running'\n | 'working'\n | 'needs_input'\n | 'input-required'\n | 'auth-required'\n | 'completed'\n | 'failed'\n | 'rejected'\n | 'canceled'\n | 'deferred'\n | 'aborted'\n | 'submitted'\n | 'governance-denied';\n\n/**\n * Predicate used by scoped webhook URL templates to decide which operations\n * receive protocol-level webhook URLs.\n */\nexport type WebhookToolPredicate = (toolName: string) => boolean;\n\n/**\n * Webhook URL template with macro substitution. A bare string preserves the\n * legacy behavior: every operation receives a generated webhook URL. The\n * object form scopes webhook URL generation to a tool allowlist or predicate.\n */\nexport type WebhookUrlTemplate =\n | string\n | {\n template: string;\n tools?: string[] | WebhookToolPredicate;\n };\n\n/**\n * Options for task execution\n */\nexport interface TaskOptions {\n /** Timeout for entire task (ms) */\n timeout?: number;\n /**\n * Caller-owned cancellation signal for the read path and in-flight protocol\n * call. Aborting this signal cancels discovery probes (`getAgentInfo`,\n * `getCapabilities`, feature/version preflight) and the tool request where\n * the underlying official protocol client supports it.\n */\n signal?: AbortSignal;\n /** Maximum clarification rounds before failing */\n maxClarifications?: number;\n /**\n * A2A `contextId` that binds this call to a server-side conversation.\n * When set, the client sends it on the A2A Message envelope so the server\n * can route to the existing session instead of starting a new one.\n * Retained automatically across calls on the same `AgentClient`.\n */\n contextId?: string;\n /**\n * A2A `taskId` of a non-terminal task to resume (HITL / approval flows).\n * When set, the client sends it on the A2A Message envelope so the server\n * continues the same task rather than opening a new one.\n */\n taskId?: string;\n /** Enable debug logging for this task */\n debug?: boolean;\n /** Suppress automatic webhook URL generation for this call. */\n disableWebhook?: boolean;\n /** Additional metadata to include */\n metadata?: Record<string, any>;\n /**\n * INTERNAL — compliance-test-only escape hatch.\n *\n * Suppresses the client's automatic `idempotency_key` generation on\n * mutating requests. The sole caller is the storyboard runner, which\n * needs to exercise servers' missing-key validation. Auto-injection\n * is the retry-safety contract for every real buyer — bypassing it\n * in production breaks at-most-once semantics on network retries.\n *\n * @internal Do not set in production buyer code.\n */\n skipIdempotencyAutoInject?: boolean;\n /**\n * INTERNAL — compliance-test-only escape hatch.\n *\n * Suppresses the client's `account`-required validation on\n * `create_media_buy` requests. The sole caller is the storyboard runner,\n * which needs to exercise servers' missing-account validation without the\n * SDK throwing client-side before the wire call.\n *\n * @internal Do not set in production buyer code.\n */\n skipAccountValidation?: boolean;\n /**\n * Transport-level safeguards for this call. Overrides the matching field\n * on the client constructor's `transport` option. Use to lift or tighten\n * `maxResponseBytes` per call when an agent legitimately publishes large\n * catalogs (e.g., `list_creative_formats` on a generative seller).\n */\n transport?: import('../protocols').TransportOptions;\n}\n\n/**\n * Internal task state for tracking execution\n */\nexport interface TaskState {\n /** Unique task identifier */\n taskId: string;\n /** Task name (tool name) */\n taskName: string;\n /**\n * Original parameters while the SDK is actively dispatching or resolving\n * input. Redacted after a task becomes working, submitted, or terminal so\n * lifecycle inspection does not retain request assets or credentials.\n */\n params?: any;\n /** Current status */\n status: TaskStatus;\n /** Message history */\n messages: Message[];\n /** Current input request (if waiting for input) */\n pendingInput?: InputRequest;\n /** Start time */\n startTime: number;\n /** Current attempt number */\n attempt: number;\n /** Maximum attempts allowed */\n maxAttempts: number;\n /** Task options */\n options: TaskOptions;\n /** Agent configuration */\n agent: {\n id: string;\n name: string;\n protocol: 'mcp' | 'a2a';\n };\n /**\n * Idempotency key for this task, when the tool is mutating. Tracked on\n * state so internal retries reuse the same key (the whole point of the\n * envelope — a re-generated key defeats retry safety).\n */\n idempotencyKey?: string;\n}\n\n/**\n * Task tracking information from tasks/get endpoint (PR #78)\n */\nexport interface TaskInfo {\n /** Task ID */\n taskId: string;\n /** Current status */\n status: string;\n /** Task type/name */\n taskType: string;\n /** Creation timestamp */\n createdAt: number;\n /** Last update timestamp */\n updatedAt: number;\n /** Task result (if completed) */\n result?: any;\n /** Error message (if failed) */\n error?: string;\n /** Human-readable message from agent (alternative to error field) */\n message?: string;\n /** Webhook URL (if applicable) */\n webhookUrl?: string;\n}\n\n/**\n * Continuation for deferred client tasks (client needs time)\n */\nexport interface DeferredContinuation<T> {\n /** Token for resuming the task */\n token: string;\n /** Question that triggered the deferral */\n question?: string;\n /** Resume the task with user input */\n resume: (input: any) => Promise<TaskResult<T>>;\n}\n\n/**\n * Continuation for submitted server tasks (server needs time).\n *\n * Returned in `TaskResult.submitted` when the seller signals an AdCP\n * `submitted` arm (long-running work that won't complete inside the\n * transport call). The buyer either polls via {@link waitForCompletion}\n * / {@link track} or waits for the seller's webhook callback at\n * {@link webhookUrl}.\n */\nexport interface SubmittedContinuation<T> {\n /**\n * Server-assigned task handle — the value the seller emitted in\n * `response.task_id` (AdCP submitted-arm wire field) or surfaced via\n * the A2A response Task. This is the identifier the seller knows; it\n * is what the SDK passes to subsequent `tasks/get` polling calls.\n *\n * NOT the same as the SDK's runner-side correlation id (`TaskState.taskId`,\n * a local UUID generated at request time and used internally for\n * `activeTasks` map indexing and the `{operation_id}` webhook URL macro).\n * The runner-side id never reaches the seller.\n *\n * If the seller violated the spec and didn't include a task handle on\n * the submitted-arm response, this falls back to the runner-side\n * correlation id — pollers won't be able to locate the work, but\n * callers at least get a non-undefined value to log.\n */\n taskId: string;\n /** Webhook URL where server will notify completion */\n webhookUrl?: string;\n /** Get current task status. Pass `transport` to override the executor-constructor cap for this poll. */\n track: (transport?: import('../protocols').TransportOptions) => Promise<TaskInfo>;\n /**\n * Wait for completion with polling. Transport cap is fixed at task-submission time; use `track` for per-poll override.\n * Pass `signal` to cancel the polling loop early (e.g. `AbortSignal.timeout(ms)`); the loop exits cleanly on abort\n * rather than continuing to issue `tasks/get` requests after the caller has moved on. (adcp-client#1612)\n * On abort with an A2A seller, a `tasks/cancel` is also dispatched as a protocol courtesy (A2A 0.3.0 §7.4)\n * — fire-and-forget; the buyer does not wait for acknowledgment and the outcome does not affect the returned `TaskResult`.\n */\n waitForCompletion: (pollInterval?: number, signal?: AbortSignal) => Promise<TaskResult<T>>;\n}\n\n/**\n * A single validation failure from an AdCP VALIDATION_ERROR response.\n *\n * `pointer` uses RFC 6901 JSON Pointer format (e.g. `/packages/0/targeting`),\n * which differs from the top-level `AdcpErrorInfo.field` that uses JSONPath-lite\n * (`packages[0].targeting`). For LLM self-correction: read `keyword` first —\n * `'required'` means add the missing field, `'enum'` means pick a valid value,\n * `'type'` means fix the value type.\n */\nexport interface AdcpValidationIssue {\n /** RFC 6901 JSON Pointer to the offending field (e.g. `/packages/0/targeting`). */\n pointer: string;\n /** Human-readable reason this field was rejected. */\n message: string;\n /** JSON Schema keyword that caused rejection (e.g. `'required'`, `'type'`, `'enum'`). */\n keyword: string;\n /**\n * Path inside the schema that rejected the payload. Sellers SHOULD NOT emit on\n * production endpoints — it leaks oneOf branch selection and is a fingerprinting\n * oracle for adversarial callers. May appear in dev/sandbox mode.\n */\n schemaPath?: string;\n}\n\n/**\n * Structured AdCP error information extracted from a failed task response.\n * Present on `TaskResult.adcpError` when the agent returns a recognized error.\n */\nexport interface AdcpErrorInfo {\n /** AdCP error code (e.g., 'RATE_LIMITED', 'PRODUCT_NOT_FOUND') */\n code: string;\n /** Human-readable error message. **Sellers:** do not embed tokens, account IDs, or internal paths — this field is forwarded to `ComplianceResult.failures[].adcp_error` and is grader-visible beyond the request lifetime. */\n message: string;\n /** Recovery classification: retry, fix the request, or give up */\n recovery?: 'transient' | 'correctable' | 'terminal';\n /** Field that caused the error */\n field?: string;\n /** Suggested fix from the agent. Untrusted — sanitize before rendering in HTML. */\n suggestion?: string;\n /** Seconds to wait before retrying (transient errors). See also `retryAfterMs`. */\n retry_after?: number;\n /** Milliseconds to wait before retrying — convenience conversion of `retry_after * 1000`. */\n retryAfterMs?: number;\n /** Additional error details. Untrusted agent-controlled content — sanitize before rendering. **Sellers:** do not embed tokens, account IDs, or internal paths — this field is forwarded to `ComplianceResult.failures[].adcp_error` and is grader-visible beyond the request lifetime. */\n details?: Record<string, unknown>;\n /**\n * Structured validation failures. Present on `VALIDATION_ERROR` when the seller\n * identifies multiple offending fields. Each item's `pointer` is RFC 6901 format\n * (e.g. `/packages/0/targeting`) — differs from the top-level `field` which uses\n * JSONPath-lite. For LLM self-correction, read `keyword` first: `'required'` → add\n * the field, `'enum'` → pick a valid value, `'type'` → fix the value type.\n */\n issues?: AdcpValidationIssue[];\n /** True when the SDK inferred this error from unstructured text (L1 compliance) */\n synthetic?: boolean;\n}\n\n/**\n * Task execution metadata, shared across all result variants.\n */\nexport interface TaskResultMetadata {\n /**\n * Client-minted correlation id for this specific request attempt. Used\n * for internal tracking (activeTasks map, webhook URL macros, debug\n * logs) and retried/refired across attempts — NOT the A2A task id the\n * server is tracking. For the server-side id, use {@link serverTaskId}.\n */\n taskId: string;\n /**\n * Server-returned A2A `contextId` / AdCP `context_id` that binds this\n * response to a server-side conversation. Present when the server surfaced\n * one; `undefined` otherwise (e.g., fire-and-forget MCP completions).\n *\n * Buyers who persist conversation across process restarts should save this\n * and seed it into `AgentClient.resetContext(id)` on rehydration.\n */\n contextId?: string;\n /**\n * A2A `taskId` of the server-tracked task for this response. Populated\n * from A2A Task / Message responses; `undefined` for MCP and for A2A\n * responses that carry no task binding. Distinct from {@link taskId},\n * which is the client-minted correlation id.\n */\n serverTaskId?: string;\n taskName: string;\n agent: { id: string; name: string; protocol: 'mcp' | 'a2a' };\n /** Total execution time in milliseconds */\n responseTimeMs: number;\n /** ISO timestamp of completion */\n timestamp: string;\n /** Number of clarification rounds */\n clarificationRounds: number;\n /** Final status */\n status: TaskStatus;\n /** Input request details (for input-required status) */\n inputRequest?: InputRequest;\n /**\n * Idempotency key used for this request, when the tool is mutating. Auto-\n * generated by the SDK when the caller doesn't supply one. Surfaced for\n * logging, correlation, and BYOK flows where the caller persists the key\n * alongside the resource it creates.\n */\n idempotency_key?: string;\n /**\n * True when the response was a cached replay from the seller's idempotency\n * store (i.e., an earlier request with the same key already succeeded).\n *\n * Callers with side effects on response — \"campaign created!\" notifications,\n * LLM memory writes, downstream tool calls — MUST check this flag before\n * acting, or retries will re-fire side effects.\n */\n replayed?: boolean;\n /**\n * Seller-served, release-precision AdCP version echoed on the response\n * envelope. Present when the seller emits `adcp_version` (3.1+). Compare\n * with the request's wire-normalized version, not a raw full-semver\n * configuration pin, when detecting same-major downshift.\n */\n adcpVersion?: string;\n /**\n * Buyer-side product property policy enforcement summary for `get_products`.\n * Present when the client evaluates a configured product property policy or\n * enforces the request's `property_list` reference against the response.\n */\n productPropertyPolicy?: {\n mode: ProductPropertyPolicyMode;\n ok: boolean;\n accepted_count: number;\n rejected_count: number;\n flagged_count: number;\n message?: string;\n request_property_list?: {\n list_id: string;\n agent_url: string;\n identifier_count?: number;\n cache_valid_until?: string;\n resolution_error?: string;\n };\n diagnostics: ProductPropertyPolicyDiagnostic[];\n };\n /**\n * Buyer-side pricing-options enforcement summary for `get_products`. Present\n * when the client drops one or more products that arrived without a usable\n * `pricing_options[]` array (a required, non-empty field in AdCP 3.1).\n */\n productPricingPolicy?: {\n ok: boolean;\n accepted_count: number;\n rejected_count: number;\n rejected_products: Array<{ index: number; product_id?: string }>;\n };\n}\n\n/** Fields shared across all TaskResult variants. */\ninterface TaskResultBase<T = any> {\n metadata: TaskResultMetadata;\n /** Governance check result (present when governance is configured) */\n governance?: import('./GovernanceTypes').GovernanceCheckResult;\n /** Governance outcome (present after successful execution with governance) */\n governanceOutcome?: import('./GovernanceTypes').GovernanceOutcome;\n /** Error message when governance outcome reporting failed */\n governanceOutcomeError?: string;\n /** Full conversation history */\n conversation?: Message[];\n /** Debug logs (if debug enabled) */\n debug_logs?: any[];\n /**\n * Exhaustive pattern match on the result's `status`. Prefer this method\n * form — it autocompletes alongside the other `TaskResult` accessors.\n *\n * The free function {@link import('./match').match} is also exported for\n * compositional use (e.g., point-free style or when the result type is\n * not yet narrowed).\n *\n * Attached non-enumerably by the client when the result is returned\n * from `executeTask`. Results constructed by hand (e.g., in test\n * fixtures or custom middleware) will not have this method — use the\n * free function, or call `attachMatch(result)` first.\n */\n match?: <R>(handlers: import('./match').MatchHandlers<T, R> | import('./match').PartialMatchHandlers<T, R>) => R;\n}\n\n/** Successful completion — `data` is always present. */\nexport interface TaskResultCompleted<T> extends TaskResultBase<T> {\n success: true;\n status: 'completed';\n data: T;\n error?: undefined;\n adcpError?: undefined;\n errorInstance?: undefined;\n correlationId?: undefined;\n deferred?: undefined;\n submitted?: undefined;\n}\n\n/** Task is still progressing (working, submitted, input-required, deferred). */\nexport interface TaskResultIntermediate<T> extends TaskResultBase<T> {\n success: true;\n /**\n * Task is progressing but not yet final. `'auth-required'` and\n * `'input-required'` are paused states surfaced by the polling\n * cycle (`pollTaskCompletion`) — the buyer must satisfy the\n * paused condition (refresh auth / supply input) and retry the\n * original tool call. Polling alone won't advance them.\n */\n status: 'working' | 'submitted' | 'input-required' | 'auth-required' | 'deferred';\n data?: T;\n error?: undefined;\n adcpError?: undefined;\n errorInstance?: undefined;\n correlationId?: undefined;\n /** Deferred continuation (client needs time for input) */\n deferred?: DeferredContinuation<T>;\n /** Submitted continuation (server needs time for processing) */\n submitted?: SubmittedContinuation<T>;\n}\n\n/** Task failed — `error` is always present. */\nexport interface TaskResultFailure<T> extends TaskResultBase<T> {\n success: false;\n status: 'failed' | 'governance-denied';\n /** Response payload with structured error details (adcp_error, context, ext) */\n data?: T;\n /** Human-readable error message */\n error: string;\n /** Structured AdCP error (code, recovery, suggestion, retryAfterMs) */\n adcpError?: AdcpErrorInfo;\n /**\n * Typed `ADCPError` subclass instance when the seller's error code has a\n * dedicated class — currently `IdempotencyConflictError` and\n * `IdempotencyExpiredError`. Lets callers write\n * `if (result.errorInstance instanceof IdempotencyConflictError)` instead of\n * switching on `adcpError.code` strings. Absent for codes without a typed\n * mapping.\n */\n errorInstance?: import('../errors').ADCPError;\n /** Correlation ID from the error response context, for tracing across agents */\n correlationId?: string;\n deferred?: undefined;\n submitted?: undefined;\n}\n\n/**\n * Result of a task execution.\n *\n * Discriminated union on `success`:\n * - `success: true` + `status: 'completed'` → `data` is `T`\n * - `success: true` + intermediate status → task is progressing, `data` may be partial\n * - `success: false` → `error` is always a string, `adcpError` has structured details\n */\nexport type TaskResult<T = any> = TaskResultCompleted<T> | TaskResultIntermediate<T> | TaskResultFailure<T>;\n\n/**\n * Configuration for conversation management\n */\nexport interface ConversationConfig {\n /** Maximum messages to keep in history */\n maxHistorySize?: number;\n /** Whether to persist conversations */\n persistConversations?: boolean;\n /** Timeout for 'working' status (max 120s per PR #78) */\n workingTimeout?: number;\n /** Default max clarifications */\n defaultMaxClarifications?: number;\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA;AAAA;","names":[]}