@adcp/sdk 12.1.0 → 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 (464) 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/authorization-required.d.mts +3 -0
  18. package/dist/lib/auth/oauth/authorization-required.d.ts +3 -0
  19. package/dist/lib/auth/oauth/authorization-required.d.ts.map +1 -1
  20. package/dist/lib/auth/oauth/authorization-required.js +12 -9
  21. package/dist/lib/auth/oauth/authorization-required.js.map +1 -1
  22. package/dist/lib/auth/oauth/authorization-required.mjs +12 -9
  23. package/dist/lib/auth/oauth/authorization-required.mjs.map +1 -1
  24. package/dist/lib/auth/oauth/provider-cache.d.mts +7 -0
  25. package/dist/lib/auth/oauth/provider-cache.d.ts +8 -0
  26. package/dist/lib/auth/oauth/provider-cache.d.ts.map +1 -0
  27. package/dist/lib/auth/oauth/provider-cache.js +44 -0
  28. package/dist/lib/auth/oauth/provider-cache.js.map +1 -0
  29. package/dist/lib/auth/oauth/provider-cache.mjs +19 -0
  30. package/dist/lib/auth/oauth/provider-cache.mjs.map +1 -0
  31. package/dist/lib/conformance/invariants/uniformError.js +1 -1
  32. package/dist/lib/conformance/invariants/uniformError.js.map +1 -1
  33. package/dist/lib/conformance/invariants/uniformError.mjs +1 -1
  34. package/dist/lib/conformance/invariants/uniformError.mjs.map +1 -1
  35. package/dist/lib/conformance/runners.js +1 -1
  36. package/dist/lib/conformance/runners.js.map +1 -1
  37. package/dist/lib/conformance/runners.mjs +1 -1
  38. package/dist/lib/conformance/runners.mjs.map +1 -1
  39. package/dist/lib/conformance/seeder.js +5 -5
  40. package/dist/lib/conformance/seeder.js.map +1 -1
  41. package/dist/lib/conformance/seeder.mjs +5 -5
  42. package/dist/lib/conformance/seeder.mjs.map +1 -1
  43. package/dist/lib/core/ADCPMultiAgentClient.d.mts +26 -29
  44. package/dist/lib/core/ADCPMultiAgentClient.d.ts +26 -29
  45. package/dist/lib/core/ADCPMultiAgentClient.d.ts.map +1 -1
  46. package/dist/lib/core/ADCPMultiAgentClient.js +27 -19
  47. package/dist/lib/core/ADCPMultiAgentClient.js.map +1 -1
  48. package/dist/lib/core/ADCPMultiAgentClient.mjs +27 -19
  49. package/dist/lib/core/ADCPMultiAgentClient.mjs.map +1 -1
  50. package/dist/lib/core/AgentClient.d.mts +148 -138
  51. package/dist/lib/core/AgentClient.d.ts +148 -138
  52. package/dist/lib/core/AgentClient.d.ts.map +1 -1
  53. package/dist/lib/core/AgentClient.js +174 -85
  54. package/dist/lib/core/AgentClient.js.map +1 -1
  55. package/dist/lib/core/AgentClient.mjs +174 -85
  56. package/dist/lib/core/AgentClient.mjs.map +1 -1
  57. package/dist/lib/core/AsyncHandler.d.mts +18 -16
  58. package/dist/lib/core/AsyncHandler.d.ts +18 -16
  59. package/dist/lib/core/AsyncHandler.d.ts.map +1 -1
  60. package/dist/lib/core/AsyncHandler.js +22 -1
  61. package/dist/lib/core/AsyncHandler.js.map +1 -1
  62. package/dist/lib/core/AsyncHandler.mjs +22 -1
  63. package/dist/lib/core/AsyncHandler.mjs.map +1 -1
  64. package/dist/lib/core/ConversationTypes.d.mts +6 -2
  65. package/dist/lib/core/ConversationTypes.d.ts +6 -2
  66. package/dist/lib/core/ConversationTypes.d.ts.map +1 -1
  67. package/dist/lib/core/ConversationTypes.js.map +1 -1
  68. package/dist/lib/core/CreativeAgentClient.d.mts +41 -17
  69. package/dist/lib/core/CreativeAgentClient.d.ts +41 -17
  70. package/dist/lib/core/CreativeAgentClient.d.ts.map +1 -1
  71. package/dist/lib/core/CreativeAgentClient.js +39 -12
  72. package/dist/lib/core/CreativeAgentClient.js.map +1 -1
  73. package/dist/lib/core/CreativeAgentClient.mjs +39 -12
  74. package/dist/lib/core/CreativeAgentClient.mjs.map +1 -1
  75. package/dist/lib/core/SingleAgentClient.d.mts +129 -52
  76. package/dist/lib/core/SingleAgentClient.d.ts +129 -52
  77. package/dist/lib/core/SingleAgentClient.d.ts.map +1 -1
  78. package/dist/lib/core/SingleAgentClient.js +1748 -218
  79. package/dist/lib/core/SingleAgentClient.js.map +1 -1
  80. package/dist/lib/core/SingleAgentClient.mjs +1758 -218
  81. package/dist/lib/core/SingleAgentClient.mjs.map +1 -1
  82. package/dist/lib/core/TaskExecutor.d.mts +9 -0
  83. package/dist/lib/core/TaskExecutor.d.ts +9 -0
  84. package/dist/lib/core/TaskExecutor.d.ts.map +1 -1
  85. package/dist/lib/core/TaskExecutor.js +137 -44
  86. package/dist/lib/core/TaskExecutor.js.map +1 -1
  87. package/dist/lib/core/TaskExecutor.mjs +137 -44
  88. package/dist/lib/core/TaskExecutor.mjs.map +1 -1
  89. package/dist/lib/index.d.mts +111 -17
  90. package/dist/lib/index.d.ts +111 -17
  91. package/dist/lib/index.d.ts.map +1 -1
  92. package/dist/lib/index.js +94 -94
  93. package/dist/lib/index.js.map +1 -1
  94. package/dist/lib/index.mjs +93 -94
  95. package/dist/lib/index.mjs.map +1 -1
  96. package/dist/lib/net/ssrf-fetch.d.mts +13 -1
  97. package/dist/lib/net/ssrf-fetch.d.ts +13 -1
  98. package/dist/lib/net/ssrf-fetch.d.ts.map +1 -1
  99. package/dist/lib/net/ssrf-fetch.js +14 -7
  100. package/dist/lib/net/ssrf-fetch.js.map +1 -1
  101. package/dist/lib/net/ssrf-fetch.mjs +14 -7
  102. package/dist/lib/net/ssrf-fetch.mjs.map +1 -1
  103. package/dist/lib/protocols/a2a.d.mts +2 -2
  104. package/dist/lib/protocols/a2a.d.ts +2 -2
  105. package/dist/lib/protocols/a2a.d.ts.map +1 -1
  106. package/dist/lib/protocols/a2a.js +14 -9
  107. package/dist/lib/protocols/a2a.js.map +1 -1
  108. package/dist/lib/protocols/a2a.mjs +14 -9
  109. package/dist/lib/protocols/a2a.mjs.map +1 -1
  110. package/dist/lib/protocols/index.d.mts +20 -3
  111. package/dist/lib/protocols/index.d.ts +20 -3
  112. package/dist/lib/protocols/index.d.ts.map +1 -1
  113. package/dist/lib/protocols/index.js +44 -31
  114. package/dist/lib/protocols/index.js.map +1 -1
  115. package/dist/lib/protocols/index.mjs +44 -32
  116. package/dist/lib/protocols/index.mjs.map +1 -1
  117. package/dist/lib/protocols/mcp-modern.d.ts.map +1 -1
  118. package/dist/lib/protocols/mcp-modern.js +87 -12
  119. package/dist/lib/protocols/mcp-modern.js.map +1 -1
  120. package/dist/lib/protocols/mcp-modern.mjs +89 -12
  121. package/dist/lib/protocols/mcp-modern.mjs.map +1 -1
  122. package/dist/lib/protocols/mcp-tasks.d.mts +3 -0
  123. package/dist/lib/protocols/mcp-tasks.d.ts +3 -0
  124. package/dist/lib/protocols/mcp-tasks.d.ts.map +1 -1
  125. package/dist/lib/protocols/mcp-tasks.js +21 -11
  126. package/dist/lib/protocols/mcp-tasks.js.map +1 -1
  127. package/dist/lib/protocols/mcp-tasks.mjs +21 -11
  128. package/dist/lib/protocols/mcp-tasks.mjs.map +1 -1
  129. package/dist/lib/schemas-data/v2.5/_provenance.json +1 -1
  130. package/dist/lib/server/create-adcp-server.d.mts +6 -0
  131. package/dist/lib/server/create-adcp-server.d.ts +6 -0
  132. package/dist/lib/server/create-adcp-server.d.ts.map +1 -1
  133. package/dist/lib/server/create-adcp-server.js +295 -48
  134. package/dist/lib/server/create-adcp-server.js.map +1 -1
  135. package/dist/lib/server/create-adcp-server.mjs +301 -50
  136. package/dist/lib/server/create-adcp-server.mjs.map +1 -1
  137. package/dist/lib/server/decisioning/assembly-helpers.d.mts +27 -13
  138. package/dist/lib/server/decisioning/assembly-helpers.d.ts +27 -13
  139. package/dist/lib/server/decisioning/assembly-helpers.d.ts.map +1 -1
  140. package/dist/lib/server/decisioning/assembly-helpers.js +136 -14
  141. package/dist/lib/server/decisioning/assembly-helpers.js.map +1 -1
  142. package/dist/lib/server/decisioning/assembly-helpers.mjs +134 -13
  143. package/dist/lib/server/decisioning/assembly-helpers.mjs.map +1 -1
  144. package/dist/lib/server/decisioning/index.d.mts +13 -12
  145. package/dist/lib/server/decisioning/index.d.ts +13 -12
  146. package/dist/lib/server/decisioning/index.d.ts.map +1 -1
  147. package/dist/lib/server/decisioning/index.js +6 -0
  148. package/dist/lib/server/decisioning/index.js.map +1 -1
  149. package/dist/lib/server/decisioning/index.mjs +9 -3
  150. package/dist/lib/server/decisioning/index.mjs.map +1 -1
  151. package/dist/lib/server/decisioning/list-helpers.d.mts +13 -3
  152. package/dist/lib/server/decisioning/list-helpers.d.ts +13 -3
  153. package/dist/lib/server/decisioning/list-helpers.d.ts.map +1 -1
  154. package/dist/lib/server/decisioning/list-helpers.js +13 -3
  155. package/dist/lib/server/decisioning/list-helpers.js.map +1 -1
  156. package/dist/lib/server/decisioning/list-helpers.mjs +11 -2
  157. package/dist/lib/server/decisioning/list-helpers.mjs.map +1 -1
  158. package/dist/lib/server/decisioning/manifest-helpers.d.mts +5 -3
  159. package/dist/lib/server/decisioning/manifest-helpers.d.ts +5 -3
  160. package/dist/lib/server/decisioning/manifest-helpers.d.ts.map +1 -1
  161. package/dist/lib/server/decisioning/manifest-helpers.js.map +1 -1
  162. package/dist/lib/server/decisioning/manifest-helpers.mjs.map +1 -1
  163. package/dist/lib/server/decisioning/proposal/dispatch.d.mts +2 -2
  164. package/dist/lib/server/decisioning/proposal/dispatch.d.ts +2 -2
  165. package/dist/lib/server/decisioning/proposal/dispatch.d.ts.map +1 -1
  166. package/dist/lib/server/decisioning/proposal/dispatch.js.map +1 -1
  167. package/dist/lib/server/decisioning/proposal/dispatch.mjs.map +1 -1
  168. package/dist/lib/server/decisioning/proposal/index.d.mts +1 -1
  169. package/dist/lib/server/decisioning/proposal/index.d.ts +1 -1
  170. package/dist/lib/server/decisioning/proposal/index.d.ts.map +1 -1
  171. package/dist/lib/server/decisioning/proposal/index.js.map +1 -1
  172. package/dist/lib/server/decisioning/proposal/index.mjs.map +1 -1
  173. package/dist/lib/server/decisioning/proposal/lifecycle.d.mts +3 -2
  174. package/dist/lib/server/decisioning/proposal/lifecycle.d.ts +3 -2
  175. package/dist/lib/server/decisioning/proposal/lifecycle.d.ts.map +1 -1
  176. package/dist/lib/server/decisioning/proposal/lifecycle.js.map +1 -1
  177. package/dist/lib/server/decisioning/proposal/lifecycle.mjs.map +1 -1
  178. package/dist/lib/server/decisioning/proposal/mock-manager.d.mts +3 -3
  179. package/dist/lib/server/decisioning/proposal/mock-manager.d.ts +3 -3
  180. package/dist/lib/server/decisioning/proposal/mock-manager.d.ts.map +1 -1
  181. package/dist/lib/server/decisioning/proposal/mock-manager.js.map +1 -1
  182. package/dist/lib/server/decisioning/proposal/mock-manager.mjs.map +1 -1
  183. package/dist/lib/server/decisioning/proposal/types.d.mts +10 -6
  184. package/dist/lib/server/decisioning/proposal/types.d.ts +10 -6
  185. package/dist/lib/server/decisioning/proposal/types.d.ts.map +1 -1
  186. package/dist/lib/server/decisioning/proposal/types.js.map +1 -1
  187. package/dist/lib/server/decisioning/proposal/types.mjs.map +1 -1
  188. package/dist/lib/server/decisioning/runtime/from-platform.d.mts +21 -2
  189. package/dist/lib/server/decisioning/runtime/from-platform.d.ts +21 -2
  190. package/dist/lib/server/decisioning/runtime/from-platform.d.ts.map +1 -1
  191. package/dist/lib/server/decisioning/runtime/from-platform.js +754 -81
  192. package/dist/lib/server/decisioning/runtime/from-platform.js.map +1 -1
  193. package/dist/lib/server/decisioning/runtime/from-platform.mjs +763 -81
  194. package/dist/lib/server/decisioning/runtime/from-platform.mjs.map +1 -1
  195. package/dist/lib/server/decisioning/specialisms/brand-rights.d.mts +9 -9
  196. package/dist/lib/server/decisioning/specialisms/brand-rights.d.ts +9 -9
  197. package/dist/lib/server/decisioning/specialisms/brand-rights.d.ts.map +1 -1
  198. package/dist/lib/server/decisioning/specialisms/brand-rights.js.map +1 -1
  199. package/dist/lib/server/decisioning/specialisms/content-standards.d.mts +16 -16
  200. package/dist/lib/server/decisioning/specialisms/content-standards.d.ts +16 -16
  201. package/dist/lib/server/decisioning/specialisms/content-standards.d.ts.map +1 -1
  202. package/dist/lib/server/decisioning/specialisms/content-standards.js.map +1 -1
  203. package/dist/lib/server/decisioning/specialisms/creative-ad-server.d.mts +15 -13
  204. package/dist/lib/server/decisioning/specialisms/creative-ad-server.d.ts +15 -13
  205. package/dist/lib/server/decisioning/specialisms/creative-ad-server.d.ts.map +1 -1
  206. package/dist/lib/server/decisioning/specialisms/creative-ad-server.js.map +1 -1
  207. package/dist/lib/server/decisioning/specialisms/creative.d.mts +12 -11
  208. package/dist/lib/server/decisioning/specialisms/creative.d.ts +12 -11
  209. package/dist/lib/server/decisioning/specialisms/creative.d.ts.map +1 -1
  210. package/dist/lib/server/decisioning/specialisms/creative.js.map +1 -1
  211. package/dist/lib/server/decisioning/specialisms/sales.d.mts +25 -15
  212. package/dist/lib/server/decisioning/specialisms/sales.d.ts +25 -15
  213. package/dist/lib/server/decisioning/specialisms/sales.d.ts.map +1 -1
  214. package/dist/lib/server/decisioning/specialisms/sales.js.map +1 -1
  215. package/dist/lib/server/index.d.mts +3 -3
  216. package/dist/lib/server/index.d.ts +3 -3
  217. package/dist/lib/server/index.d.ts.map +1 -1
  218. package/dist/lib/server/index.js +72 -72
  219. package/dist/lib/server/index.js.map +1 -1
  220. package/dist/lib/server/index.mjs +36 -36
  221. package/dist/lib/server/index.mjs.map +1 -1
  222. package/dist/lib/server/legacy/v5/index.d.mts +1 -0
  223. package/dist/lib/server/legacy/v5/index.d.ts +1 -0
  224. package/dist/lib/server/legacy/v5/index.d.ts.map +1 -1
  225. package/dist/lib/server/legacy/v5/index.js +74 -1
  226. package/dist/lib/server/legacy/v5/index.js.map +1 -1
  227. package/dist/lib/server/legacy/v5/index.mjs +75 -1
  228. package/dist/lib/server/legacy/v5/index.mjs.map +1 -1
  229. package/dist/lib/server/responses.d.mts +2 -2
  230. package/dist/lib/server/responses.d.ts +2 -2
  231. package/dist/lib/server/responses.js.map +1 -1
  232. package/dist/lib/server/responses.mjs.map +1 -1
  233. package/dist/lib/testing/client.d.ts.map +1 -1
  234. package/dist/lib/testing/client.js +13 -5
  235. package/dist/lib/testing/client.js.map +1 -1
  236. package/dist/lib/testing/client.mjs +13 -5
  237. package/dist/lib/testing/client.mjs.map +1 -1
  238. package/dist/lib/testing/compliance/comply.d.mts +1 -1
  239. package/dist/lib/testing/compliance/comply.d.ts +1 -1
  240. package/dist/lib/testing/compliance/comply.d.ts.map +1 -1
  241. package/dist/lib/testing/compliance/comply.js +16 -6
  242. package/dist/lib/testing/compliance/comply.js.map +1 -1
  243. package/dist/lib/testing/compliance/comply.mjs +16 -6
  244. package/dist/lib/testing/compliance/comply.mjs.map +1 -1
  245. package/dist/lib/testing/scenarios/brand-rights.js +6 -6
  246. package/dist/lib/testing/scenarios/brand-rights.js.map +1 -1
  247. package/dist/lib/testing/scenarios/brand-rights.mjs +6 -6
  248. package/dist/lib/testing/scenarios/brand-rights.mjs.map +1 -1
  249. package/dist/lib/testing/scenarios/creative.js +7 -7
  250. package/dist/lib/testing/scenarios/creative.js.map +1 -1
  251. package/dist/lib/testing/scenarios/creative.mjs +7 -7
  252. package/dist/lib/testing/scenarios/creative.mjs.map +1 -1
  253. package/dist/lib/testing/scenarios/discovery.js +2 -2
  254. package/dist/lib/testing/scenarios/discovery.js.map +1 -1
  255. package/dist/lib/testing/scenarios/discovery.mjs +2 -2
  256. package/dist/lib/testing/scenarios/discovery.mjs.map +1 -1
  257. package/dist/lib/testing/scenarios/edge-cases.js +11 -11
  258. package/dist/lib/testing/scenarios/edge-cases.js.map +1 -1
  259. package/dist/lib/testing/scenarios/edge-cases.mjs +11 -11
  260. package/dist/lib/testing/scenarios/edge-cases.mjs.map +1 -1
  261. package/dist/lib/testing/scenarios/governance.d.ts.map +1 -1
  262. package/dist/lib/testing/scenarios/governance.js +16 -22
  263. package/dist/lib/testing/scenarios/governance.js.map +1 -1
  264. package/dist/lib/testing/scenarios/governance.mjs +16 -22
  265. package/dist/lib/testing/scenarios/governance.mjs.map +1 -1
  266. package/dist/lib/testing/scenarios/media-buy.js +5 -5
  267. package/dist/lib/testing/scenarios/media-buy.js.map +1 -1
  268. package/dist/lib/testing/scenarios/media-buy.mjs +5 -5
  269. package/dist/lib/testing/scenarios/media-buy.mjs.map +1 -1
  270. package/dist/lib/testing/scenarios/schema-compliance.js +1 -1
  271. package/dist/lib/testing/scenarios/schema-compliance.js.map +1 -1
  272. package/dist/lib/testing/scenarios/schema-compliance.mjs +1 -1
  273. package/dist/lib/testing/scenarios/schema-compliance.mjs.map +1 -1
  274. package/dist/lib/testing/scenarios/trusted-match.d.ts.map +1 -1
  275. package/dist/lib/testing/scenarios/trusted-match.js +4 -3
  276. package/dist/lib/testing/scenarios/trusted-match.js.map +1 -1
  277. package/dist/lib/testing/scenarios/trusted-match.mjs +4 -3
  278. package/dist/lib/testing/scenarios/trusted-match.mjs.map +1 -1
  279. package/dist/lib/testing/storyboard/probes.d.mts +6 -0
  280. package/dist/lib/testing/storyboard/probes.d.ts +6 -0
  281. package/dist/lib/testing/storyboard/probes.d.ts.map +1 -1
  282. package/dist/lib/testing/storyboard/probes.js +16 -5
  283. package/dist/lib/testing/storyboard/probes.js.map +1 -1
  284. package/dist/lib/testing/storyboard/probes.mjs +16 -5
  285. package/dist/lib/testing/storyboard/probes.mjs.map +1 -1
  286. package/dist/lib/testing/storyboard/runner.d.ts.map +1 -1
  287. package/dist/lib/testing/storyboard/runner.js +6 -2
  288. package/dist/lib/testing/storyboard/runner.js.map +1 -1
  289. package/dist/lib/testing/storyboard/runner.mjs +6 -2
  290. package/dist/lib/testing/storyboard/runner.mjs.map +1 -1
  291. package/dist/lib/testing/storyboard/shape-drift-hints.d.mts +3 -4
  292. package/dist/lib/testing/storyboard/shape-drift-hints.d.ts +3 -4
  293. package/dist/lib/testing/storyboard/shape-drift-hints.d.ts.map +1 -1
  294. package/dist/lib/testing/storyboard/shape-drift-hints.js +27 -27
  295. package/dist/lib/testing/storyboard/shape-drift-hints.js.map +1 -1
  296. package/dist/lib/testing/storyboard/shape-drift-hints.mjs +27 -27
  297. package/dist/lib/testing/storyboard/shape-drift-hints.mjs.map +1 -1
  298. package/dist/lib/testing/storyboard/task-map.d.ts.map +1 -1
  299. package/dist/lib/testing/storyboard/task-map.js +43 -5
  300. package/dist/lib/testing/storyboard/task-map.js.map +1 -1
  301. package/dist/lib/testing/storyboard/task-map.mjs +43 -5
  302. package/dist/lib/testing/storyboard/task-map.mjs.map +1 -1
  303. package/dist/lib/testing/test-helpers.d.mts +2 -2
  304. package/dist/lib/testing/test-helpers.d.ts +2 -2
  305. package/dist/lib/testing/test-helpers.js.map +1 -1
  306. package/dist/lib/testing/test-helpers.mjs.map +1 -1
  307. package/dist/lib/testing/types.d.mts +7 -1
  308. package/dist/lib/testing/types.d.ts +7 -1
  309. package/dist/lib/testing/types.d.ts.map +1 -1
  310. package/dist/lib/testing/types.js.map +1 -1
  311. package/dist/lib/types/adcp.d.mts +14 -14
  312. package/dist/lib/types/adcp.d.ts +14 -14
  313. package/dist/lib/types/adcp.d.ts.map +1 -1
  314. package/dist/lib/types/adcp.js.map +1 -1
  315. package/dist/lib/types/adcp.mjs.map +1 -1
  316. package/dist/lib/types/index.d.mts +2 -2
  317. package/dist/lib/types/index.d.ts +2 -2
  318. package/dist/lib/types/index.d.ts.map +1 -1
  319. package/dist/lib/types/index.js.map +1 -1
  320. package/dist/lib/types/index.mjs.map +1 -1
  321. package/dist/lib/utils/capabilities.d.mts +6 -0
  322. package/dist/lib/utils/capabilities.d.ts +6 -0
  323. package/dist/lib/utils/capabilities.d.ts.map +1 -1
  324. package/dist/lib/utils/capabilities.js +4 -0
  325. package/dist/lib/utils/capabilities.js.map +1 -1
  326. package/dist/lib/utils/capabilities.mjs +4 -0
  327. package/dist/lib/utils/capabilities.mjs.map +1 -1
  328. package/dist/lib/utils/creative-delivery.d.mts +52 -10
  329. package/dist/lib/utils/creative-delivery.d.ts +52 -10
  330. package/dist/lib/utils/creative-delivery.d.ts.map +1 -1
  331. package/dist/lib/utils/creative-delivery.js +104 -9
  332. package/dist/lib/utils/creative-delivery.js.map +1 -1
  333. package/dist/lib/utils/creative-delivery.mjs +104 -8
  334. package/dist/lib/utils/creative-delivery.mjs.map +1 -1
  335. package/dist/lib/utils/format-assets.d.mts +41 -38
  336. package/dist/lib/utils/format-assets.d.ts +41 -38
  337. package/dist/lib/utils/format-assets.d.ts.map +1 -1
  338. package/dist/lib/utils/format-assets.js +3 -1
  339. package/dist/lib/utils/format-assets.js.map +1 -1
  340. package/dist/lib/utils/format-assets.mjs +3 -1
  341. package/dist/lib/utils/format-assets.mjs.map +1 -1
  342. package/dist/lib/utils/index.d.mts +8 -8
  343. package/dist/lib/utils/index.d.ts +8 -8
  344. package/dist/lib/utils/index.d.ts.map +1 -1
  345. package/dist/lib/utils/index.js +11 -9
  346. package/dist/lib/utils/index.js.map +1 -1
  347. package/dist/lib/utils/index.mjs +9 -8
  348. package/dist/lib/utils/index.mjs.map +1 -1
  349. package/dist/lib/utils/preview-utils.d.mts +11 -8
  350. package/dist/lib/utils/preview-utils.d.ts +11 -8
  351. package/dist/lib/utils/preview-utils.d.ts.map +1 -1
  352. package/dist/lib/utils/preview-utils.js +4 -4
  353. package/dist/lib/utils/preview-utils.js.map +1 -1
  354. package/dist/lib/utils/preview-utils.mjs +3 -3
  355. package/dist/lib/utils/preview-utils.mjs.map +1 -1
  356. package/dist/lib/utils/tool-request-schemas.d.mts +2 -2
  357. package/dist/lib/utils/tool-request-schemas.d.ts +2 -2
  358. package/dist/lib/v2/projection/aao-reference-formats.json +492 -0
  359. package/dist/lib/v2/projection/augment-response.d.mts +31 -11
  360. package/dist/lib/v2/projection/augment-response.d.ts +31 -11
  361. package/dist/lib/v2/projection/augment-response.d.ts.map +1 -1
  362. package/dist/lib/v2/projection/augment-response.js +233 -27
  363. package/dist/lib/v2/projection/augment-response.js.map +1 -1
  364. package/dist/lib/v2/projection/augment-response.mjs +232 -27
  365. package/dist/lib/v2/projection/augment-response.mjs.map +1 -1
  366. package/dist/lib/v2/projection/builders.d.mts +7 -6
  367. package/dist/lib/v2/projection/builders.d.ts +7 -6
  368. package/dist/lib/v2/projection/builders.d.ts.map +1 -1
  369. package/dist/lib/v2/projection/builders.js +11 -8
  370. package/dist/lib/v2/projection/builders.js.map +1 -1
  371. package/dist/lib/v2/projection/builders.mjs +9 -6
  372. package/dist/lib/v2/projection/builders.mjs.map +1 -1
  373. package/dist/lib/v2/projection/catalog-snapshot.d.mts +47 -0
  374. package/dist/lib/v2/projection/catalog-snapshot.d.ts +48 -0
  375. package/dist/lib/v2/projection/catalog-snapshot.d.ts.map +1 -0
  376. package/dist/lib/v2/projection/catalog-snapshot.js +291 -0
  377. package/dist/lib/v2/projection/catalog-snapshot.js.map +1 -0
  378. package/dist/lib/v2/projection/catalog-snapshot.mjs +265 -0
  379. package/dist/lib/v2/projection/catalog-snapshot.mjs.map +1 -0
  380. package/dist/lib/v2/projection/catalog.d.mts +23 -2
  381. package/dist/lib/v2/projection/catalog.d.ts +23 -2
  382. package/dist/lib/v2/projection/catalog.d.ts.map +1 -1
  383. package/dist/lib/v2/projection/catalog.js +34 -10
  384. package/dist/lib/v2/projection/catalog.js.map +1 -1
  385. package/dist/lib/v2/projection/catalog.mjs +33 -10
  386. package/dist/lib/v2/projection/catalog.mjs.map +1 -1
  387. package/dist/lib/v2/projection/creative-delivery.d.mts +157 -0
  388. package/dist/lib/v2/projection/creative-delivery.d.ts +158 -0
  389. package/dist/lib/v2/projection/creative-delivery.d.ts.map +1 -0
  390. package/dist/lib/v2/projection/creative-delivery.js +967 -0
  391. package/dist/lib/v2/projection/creative-delivery.js.map +1 -0
  392. package/dist/lib/v2/projection/creative-delivery.mjs +941 -0
  393. package/dist/lib/v2/projection/creative-delivery.mjs.map +1 -0
  394. package/dist/lib/v2/projection/index.d.mts +8 -6
  395. package/dist/lib/v2/projection/index.d.ts +8 -6
  396. package/dist/lib/v2/projection/index.d.ts.map +1 -1
  397. package/dist/lib/v2/projection/index.js +26 -4
  398. package/dist/lib/v2/projection/index.js.map +1 -1
  399. package/dist/lib/v2/projection/index.mjs +28 -4
  400. package/dist/lib/v2/projection/index.mjs.map +1 -1
  401. package/dist/lib/v2/projection/legacy-metadata.d.mts +21 -0
  402. package/dist/lib/v2/projection/legacy-metadata.d.ts +22 -0
  403. package/dist/lib/v2/projection/legacy-metadata.d.ts.map +1 -0
  404. package/dist/lib/v2/projection/legacy-metadata.js +73 -0
  405. package/dist/lib/v2/projection/legacy-metadata.js.map +1 -0
  406. package/dist/lib/v2/projection/legacy-metadata.mjs +45 -0
  407. package/dist/lib/v2/projection/legacy-metadata.mjs.map +1 -0
  408. package/dist/lib/v2/projection/types.d.mts +29 -23
  409. package/dist/lib/v2/projection/types.d.ts +29 -23
  410. package/dist/lib/v2/projection/types.d.ts.map +1 -1
  411. package/dist/lib/v2/projection/types.js.map +1 -1
  412. package/dist/lib/v2/projection/v1-to-v2.d.mts +29 -6
  413. package/dist/lib/v2/projection/v1-to-v2.d.ts +29 -6
  414. package/dist/lib/v2/projection/v1-to-v2.d.ts.map +1 -1
  415. package/dist/lib/v2/projection/v1-to-v2.js +218 -9
  416. package/dist/lib/v2/projection/v1-to-v2.js.map +1 -1
  417. package/dist/lib/v2/projection/v1-to-v2.mjs +219 -10
  418. package/dist/lib/v2/projection/v1-to-v2.mjs.map +1 -1
  419. package/dist/lib/v2/projection/v2-to-v1.d.mts +31 -2
  420. package/dist/lib/v2/projection/v2-to-v1.d.ts +31 -2
  421. package/dist/lib/v2/projection/v2-to-v1.d.ts.map +1 -1
  422. package/dist/lib/v2/projection/v2-to-v1.js +138 -7
  423. package/dist/lib/v2/projection/v2-to-v1.js.map +1 -1
  424. package/dist/lib/v2/projection/v2-to-v1.mjs +135 -6
  425. package/dist/lib/v2/projection/v2-to-v1.mjs.map +1 -1
  426. package/dist/lib/v2/projection/write-side.d.mts +12 -13
  427. package/dist/lib/v2/projection/write-side.d.ts +12 -13
  428. package/dist/lib/v2/projection/write-side.d.ts.map +1 -1
  429. package/dist/lib/v2/projection/write-side.js +16 -12
  430. package/dist/lib/v2/projection/write-side.js.map +1 -1
  431. package/dist/lib/v2/projection/write-side.mjs +16 -12
  432. package/dist/lib/v2/projection/write-side.mjs.map +1 -1
  433. package/dist/lib/version.d.mts +3 -3
  434. package/dist/lib/version.d.ts +3 -3
  435. package/dist/lib/version.d.ts.map +1 -1
  436. package/dist/lib/version.js +3 -3
  437. package/dist/lib/version.js.map +1 -1
  438. package/dist/lib/version.mjs +3 -3
  439. package/dist/lib/version.mjs.map +1 -1
  440. package/docs/guides/BUILD-AN-AGENT.md +7 -2
  441. package/docs/guides/PREVIEW-ASSET-DURABILITY.md +6 -2
  442. package/docs/llms.txt +1 -0
  443. package/examples/README.md +1 -1
  444. package/examples/batch-preview-test.ts +3 -3
  445. package/examples/conversation-client.ts +2 -2
  446. package/examples/debug-preview-response.ts +1 -1
  447. package/examples/decisioning-platform-broadcast-tv.ts +10 -4
  448. package/examples/decisioning-platform-mock-seller.ts +16 -9
  449. package/examples/decisioning-platform-programmatic.ts +18 -7
  450. package/examples/error-compliant-server.ts +26 -16
  451. package/examples/generative-creative-demo.ts +7 -19
  452. package/examples/hello_creative_adapter_ad_server.ts +37 -16
  453. package/examples/hello_creative_adapter_template.ts +12 -10
  454. package/examples/hello_seller_adapter_guaranteed.ts +52 -23
  455. package/examples/hello_seller_adapter_multi_tenant.ts +6 -3
  456. package/examples/hello_seller_adapter_non_guaranteed.ts +54 -26
  457. package/examples/hello_seller_adapter_proposal_mode.ts +40 -14
  458. package/examples/hello_seller_adapter_social.ts +2 -7
  459. package/examples/inspect-card-formats.ts +1 -1
  460. package/examples/simple-getting-started.ts +1 -1
  461. package/examples/test-helpers-demo.ts +1 -1
  462. package/package.json +2 -2
  463. package/skills/build-decisioning-creative-template/SKILL.md +11 -11
  464. package/skills/build-decisioning-platform/advanced/REFERENCE.md +8 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/protocols/mcp-modern.ts"],"sourcesContent":["import { fileURLToPath as __adcpFileURLToPath } from 'node:url';\nimport { dirname as __adcpDirname } from 'node:path';\nimport { createRequire as __adcpCreateRequire } from 'node:module';\nconst __dirname = __adcpDirname(__adcpFileURLToPath(import.meta.url));\nconst require = __adcpCreateRequire(import.meta.url);\n/**\n * MCP 2026-07-28 client path.\n *\n * The v2 SDK removed the experimental 2025 Tasks interception API. During the\n * migration window we therefore negotiate with the v2 client first and use it\n * only when the peer selects the modern protocol era. Legacy peers fall back\n * to mcp-tasks.ts, which keeps the existing v1 Tasks behavior intact.\n */\n\nimport {\n Client,\n StreamableHTTPClientTransport,\n type OAuthClientProvider as ModernOAuthClientProvider,\n type Tool,\n} from '@modelcontextprotocol/client';\nimport { createHmac } from 'node:crypto';\nimport { createMCPAuthHeaders } from '../auth';\nimport { is401Error } from '../errors';\nimport { withSpan, injectTraceHeaders } from '../observability/tracing';\nimport { buildAgentSigningFetch, signingContextStorage, type AgentSigningContext } from '../signing/client';\nimport type { DebugLogEntry } from '../types/adcp';\nimport {\n isAbortOrTimeoutError,\n resolveClientRequestTimeoutMs,\n resolveRequestTimeoutMs,\n withAbortSignal,\n} from './abort';\nimport { wrapFetchWithCapture } from './rawResponseCapture';\nimport { wrapFetchWithSizeLimit } from './responseSizeLimit';\nimport { wrapFetchWithTransportDiagnostics } from './transportDiagnostics';\n\ntype CallToolResponse = {\n isError?: boolean;\n content?: Array<{ type: string; text?: string }>;\n [key: string]: unknown;\n};\n\nexport type ModernMCPAttempt = { handled: false } | { handled: true; response: CallToolResponse };\nexport type ModernMCPListAttempt = { handled: false } | { handled: true; tools: Tool[] };\n\nexport interface ModernMCPConnectionOptions {\n signingContext?: AgentSigningContext;\n authProvider?: object;\n signal?: AbortSignal;\n requestTimeoutMs?: number;\n fetchFn?: typeof fetch;\n /** Use the v2 SDK's negotiated legacy client instead of handing off to v1. */\n handleLegacy?: boolean;\n}\n\ninterface ModernConnectionOptions {\n agentUrl: string;\n authToken?: string;\n customHeaders?: Record<string, string>;\n debugLogs: DebugLogEntry[];\n signingContext?: AgentSigningContext;\n authProvider?: object;\n signal?: AbortSignal;\n requestTimeoutMs?: number;\n fetchFn?: typeof fetch;\n handleLegacy?: boolean;\n}\n\nconst modernConnections = new Map<string, Client>();\nconst legacyConnectionExpiresAt = new Map<string, number>();\nconst pendingModernConnections = new Map<string, Promise<Client>>();\nconst knownLegacyConnections = new Map<string, number>();\nconst MAX_CACHED_CONNECTIONS = 20;\nconst LEGACY_CLASSIFICATION_TTL_MS = 5 * 60 * 1000;\nconst modernOAuthProviderIds = new WeakMap<object, string>();\nconst modernFetchFnIds = new WeakMap<typeof fetch, string>();\nlet nextModernOAuthProviderId = 0;\nlet nextModernFetchFnId = 0;\nlet connectionGeneration = 0;\n\nfunction cacheDisambiguator(value: string): string {\n return createHmac('sha256', '').update(value).digest('hex');\n}\n\nfunction buildAuthHeaders(\n authToken: string | undefined,\n customHeaders: Record<string, string> | undefined,\n authProvider?: object\n): Record<string, string> {\n const filteredHeaders =\n authProvider || authToken\n ? Object.fromEntries(\n Object.entries(customHeaders ?? {}).filter(keyValue => {\n const key = keyValue[0].toLowerCase();\n return key !== 'authorization' && key !== 'x-adcp-auth';\n })\n )\n : customHeaders;\n return {\n ...filteredHeaders,\n ...(!authProvider && authToken ? createMCPAuthHeaders(authToken) : {}),\n };\n}\n\nfunction oauthProviderCacheKey(provider: object | undefined): string | undefined {\n if (!provider) return undefined;\n let key = modernOAuthProviderIds.get(provider);\n if (!key) {\n key = `oauth-provider:${++nextModernOAuthProviderId}`;\n modernOAuthProviderIds.set(provider, key);\n }\n return key;\n}\n\nfunction fetchFnCacheKey(fetchFn: typeof fetch | undefined): string | undefined {\n if (!fetchFn) return undefined;\n let key = modernFetchFnIds.get(fetchFn);\n if (!key) {\n key = `fetch:${++nextModernFetchFnId}`;\n modernFetchFnIds.set(fetchFn, key);\n }\n return key;\n}\n\nfunction connectionCacheKey(\n agentUrl: string,\n headers: Record<string, string>,\n signingCacheKey?: string,\n authProvider?: object,\n fetchFn?: typeof fetch\n): string {\n const normalizedHeaders = Object.entries(headers)\n .map(([key, value]) => [key.toLowerCase(), value] as const)\n .sort(([left], [right]) => left.localeCompare(right));\n const parts = [agentUrl, `headers:${cacheDisambiguator(JSON.stringify(normalizedHeaders))}`];\n if (signingCacheKey) parts.push(signingCacheKey);\n const providerKey = oauthProviderCacheKey(authProvider);\n if (providerKey) parts.push(providerKey);\n const fetchKey = fetchFnCacheKey(fetchFn);\n if (fetchKey) parts.push(fetchKey);\n return parts.join('::');\n}\n\nfunction isKnownLegacy(cacheKey: string): boolean {\n const classifiedAt = knownLegacyConnections.get(cacheKey);\n if (classifiedAt === undefined) return false;\n if (Date.now() - classifiedAt > LEGACY_CLASSIFICATION_TTL_MS) {\n knownLegacyConnections.delete(cacheKey);\n return false;\n }\n knownLegacyConnections.delete(cacheKey);\n knownLegacyConnections.set(cacheKey, classifiedAt);\n return true;\n}\n\nfunction markKnownLegacy(cacheKey: string): void {\n knownLegacyConnections.delete(cacheKey);\n knownLegacyConnections.set(cacheKey, Date.now());\n while (knownLegacyConnections.size > MAX_CACHED_CONNECTIONS) {\n const oldest = knownLegacyConnections.keys().next().value;\n if (!oldest) break;\n knownLegacyConnections.delete(oldest);\n }\n}\n\nfunction httpStatusOf(error: unknown, depth = 0): number | undefined {\n if (!error || typeof error !== 'object' || depth > 4) return undefined;\n const candidate = error as { status?: unknown; code?: unknown; cause?: unknown; response?: { status?: unknown } };\n if (typeof candidate.status === 'number') return candidate.status;\n if (typeof candidate.response?.status === 'number') return candidate.response.status;\n if (typeof candidate.code === 'number' && candidate.code >= 100 && candidate.code <= 599) return candidate.code;\n return httpStatusOf(candidate.cause, depth + 1);\n}\n\nfunction withPerRequestTraceHeaders(fetchImpl: typeof fetch): typeof fetch {\n return (input, init) => {\n const headers = new Headers(input instanceof Request ? input.headers : undefined);\n new Headers(init?.headers).forEach((value, key) => headers.set(key, value));\n for (const [key, value] of Object.entries(injectTraceHeaders())) headers.set(key, value);\n return fetchImpl(input, { ...init, headers });\n };\n}\n\nfunction getCachedConnection(cacheKey: string): Client | undefined {\n const client = modernConnections.get(cacheKey);\n if (client) {\n const legacyExpiry = legacyConnectionExpiresAt.get(cacheKey);\n if (legacyExpiry !== undefined && legacyExpiry <= Date.now()) {\n modernConnections.delete(cacheKey);\n legacyConnectionExpiresAt.delete(cacheKey);\n void client.close().catch(() => {});\n return undefined;\n }\n modernConnections.delete(cacheKey);\n modernConnections.set(cacheKey, client);\n }\n return client;\n}\n\nfunction evictLeastRecentlyUsed(): void {\n if (modernConnections.size <= MAX_CACHED_CONNECTIONS) return;\n const oldestKey = modernConnections.keys().next().value;\n if (!oldestKey) return;\n const client = modernConnections.get(oldestKey);\n modernConnections.delete(oldestKey);\n legacyConnectionExpiresAt.delete(oldestKey);\n void client?.close().catch(() => {});\n}\n\nasync function createNegotiatedClient(\n options: ModernConnectionOptions,\n authHeaders: Record<string, string>\n): Promise<Client> {\n const requestTimeoutMs = resolveRequestTimeoutMs(options.requestTimeoutMs);\n const clientRequestTimeoutMs = resolveClientRequestTimeoutMs(options.requestTimeoutMs);\n const rawNetworkFetch: typeof fetch = options.fetchFn ?? ((input, init) => fetch(input, init));\n const networkFetch: typeof fetch = (input, init) =>\n withAbortSignal<Response>([options.signal, init?.signal], requestTimeoutMs, signal =>\n rawNetworkFetch(input, { ...init, signal })\n );\n const diagnosticFetch = wrapFetchWithTransportDiagnostics(wrapFetchWithSizeLimit(networkFetch));\n const signedFetch: typeof fetch = options.signingContext\n ? (buildAgentSigningFetch({\n upstream: diagnosticFetch,\n signing: options.signingContext.signing,\n getCapability: options.signingContext.getCapability,\n }) as typeof fetch)\n : diagnosticFetch;\n const transport = new StreamableHTTPClientTransport(new URL(options.agentUrl), {\n requestInit: { headers: authHeaders, redirect: 'manual' },\n fetch: wrapFetchWithCapture(withPerRequestTraceHeaders(signedFetch)),\n ...(options.authProvider && {\n authProvider: options.authProvider as ModernOAuthClientProvider,\n }),\n });\n const client = new Client(\n { name: 'AdCP-Client', version: '1.0.0' },\n {\n versionNegotiation: {\n mode: 'auto',\n ...(clientRequestTimeoutMs !== undefined && { probe: { timeoutMs: clientRequestTimeoutMs } }),\n },\n }\n );\n\n try {\n await client.connect(transport, {\n ...(options.signal && { signal: options.signal }),\n ...(clientRequestTimeoutMs !== undefined && { timeout: clientRequestTimeoutMs }),\n });\n return client;\n } catch (error) {\n try {\n await client.close();\n } catch {\n /* ignore close errors */\n }\n throw error;\n }\n}\n\nasync function getOrCreateModernConnection(\n cacheKey: string,\n options: ModernConnectionOptions,\n authHeaders: Record<string, string>\n): Promise<Client> {\n const cached = getCachedConnection(cacheKey);\n if (cached) return cached;\n\n const pending = pendingModernConnections.get(cacheKey);\n if (pending) return pending;\n\n const generation = connectionGeneration;\n const promise = createNegotiatedClient(options, authHeaders)\n .then(client => {\n if (\n (client.getProtocolEra() === 'modern' || options.handleLegacy === true) &&\n generation === connectionGeneration\n ) {\n modernConnections.set(cacheKey, client);\n if (client.getProtocolEra() === 'legacy') {\n legacyConnectionExpiresAt.set(cacheKey, Date.now() + LEGACY_CLASSIFICATION_TTL_MS);\n } else {\n legacyConnectionExpiresAt.delete(cacheKey);\n }\n evictLeastRecentlyUsed();\n } else if (generation !== connectionGeneration) {\n void client.close().catch(() => {});\n }\n return client;\n })\n .finally(() => {\n if (pendingModernConnections.get(cacheKey) === promise) pendingModernConnections.delete(cacheKey);\n });\n pendingModernConnections.set(cacheKey, promise);\n return promise;\n}\n\nasync function callOnModernClient(\n client: Client,\n toolName: string,\n args: Record<string, unknown>,\n signal?: AbortSignal,\n requestTimeoutMs?: number\n): Promise<CallToolResponse> {\n const resolvedRequestTimeoutMs = resolveClientRequestTimeoutMs(requestTimeoutMs);\n return (await client.callTool(\n { name: toolName, arguments: args },\n {\n ...(signal && { signal }),\n ...(resolvedRequestTimeoutMs !== undefined && { timeout: resolvedRequestTimeoutMs }),\n }\n )) as CallToolResponse;\n}\n\nasync function attemptModernCall(\n options: ModernConnectionOptions,\n toolName: string,\n args: Record<string, unknown>\n): Promise<ModernMCPAttempt> {\n const authHeaders = buildAuthHeaders(options.authToken, options.customHeaders, options.authProvider);\n const cacheKey = connectionCacheKey(\n options.agentUrl,\n authHeaders,\n options.signingContext?.cacheKey,\n options.authProvider,\n options.fetchFn\n );\n if (isKnownLegacy(cacheKey)) return { handled: false };\n\n const guardedConnection =\n options.signal !== undefined || options.requestTimeoutMs !== undefined || options.fetchFn !== undefined;\n let client: Client;\n try {\n client = guardedConnection\n ? await createNegotiatedClient(options, authHeaders)\n : await getOrCreateModernConnection(cacheKey, options, authHeaders);\n } catch (error) {\n const status = httpStatusOf(error);\n if (status === 404 || status === 405) {\n markKnownLegacy(cacheKey);\n options.debugLogs.push({\n type: 'info',\n message: `MCP: Modern Streamable HTTP is unavailable (HTTP ${status}); preserving the v1 transport path`,\n timestamp: new Date().toISOString(),\n });\n return { handled: false };\n }\n throw error;\n }\n\n if (client.getProtocolEra() !== 'modern') {\n if (options.handleLegacy === true) {\n options.debugLogs.push({\n type: 'info',\n message: `MCP: v2 client selected the legacy protocol era for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n } else {\n markKnownLegacy(cacheKey);\n try {\n await client.close();\n } catch {\n /* ignore close errors */\n }\n options.debugLogs.push({\n type: 'info',\n message: `MCP: Server selected the legacy protocol era for ${toolName}; preserving the v1 Tasks path`,\n timestamp: new Date().toISOString(),\n });\n return { handled: false };\n }\n }\n\n options.debugLogs.push({\n type: 'success',\n message: `MCP: Negotiated protocol ${client.getNegotiatedProtocolVersion()} for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n\n try {\n const response = await callOnModernClient(client, toolName, args, options.signal, options.requestTimeoutMs);\n return { handled: true, response };\n } catch (error) {\n // A tool request may have reached the server even when its response was\n // lost. Never replay automatically: mutating AdCP tools depend on the\n // caller's explicit idempotency policy, not transport guesswork.\n modernConnections.delete(cacheKey);\n legacyConnectionExpiresAt.delete(cacheKey);\n try {\n await client.close();\n } catch {\n /* ignore close errors */\n }\n throw error;\n } finally {\n if (guardedConnection) {\n try {\n await client.close();\n } catch {\n /* ignore close errors */\n }\n }\n }\n}\n\n/**\n * Try a tool call using the MCP 2026-07-28 protocol era.\n *\n * `handled: false` means the caller must use the existing v1 client. This is\n * deliberately a result rather than an exception because legacy negotiation\n * is normal during the transition window.\n */\nexport async function tryCallModernMCPTool(\n agentUrl: string,\n toolName: string,\n args: Record<string, unknown>,\n authToken?: string,\n debugLogs: DebugLogEntry[] = [],\n customHeaders?: Record<string, string>,\n options: ModernMCPConnectionOptions = {}\n): Promise<ModernMCPAttempt> {\n return withSpan('adcp.mcp.negotiate', { 'adcp.tool': toolName, 'http.url': agentUrl }, () =>\n signingContextStorage.run(options.signingContext, () =>\n attemptModernCall(\n {\n agentUrl,\n authToken,\n customHeaders,\n debugLogs,\n signingContext: options.signingContext,\n authProvider: options.authProvider,\n signal: options.signal,\n requestTimeoutMs: options.requestTimeoutMs,\n fetchFn: options.fetchFn,\n handleLegacy: options.handleLegacy,\n },\n toolName,\n args\n )\n )\n );\n}\n\n/**\n * Probe an endpoint with the official v2 client's auto negotiation.\n * `connected: false` lets endpoint discovery retain its v1 SSE fallback.\n */\nexport async function probeModernMCPConnection(\n agentUrl: string,\n authToken?: string,\n customHeaders?: Record<string, string>,\n options: ModernMCPConnectionOptions = {}\n): Promise<{ connected: boolean; era?: 'legacy' | 'modern' }> {\n const connectionOptions: ModernConnectionOptions = {\n agentUrl,\n authToken,\n customHeaders,\n debugLogs: [],\n signingContext: options.signingContext,\n authProvider: options.authProvider,\n signal: options.signal,\n requestTimeoutMs: options.requestTimeoutMs,\n fetchFn: options.fetchFn,\n handleLegacy: options.handleLegacy,\n };\n const authHeaders = buildAuthHeaders(authToken, customHeaders, options.authProvider);\n let client: Client | undefined;\n try {\n client = await createNegotiatedClient(connectionOptions, authHeaders);\n return { connected: true, era: client.getProtocolEra() };\n } catch (error) {\n if (is401Error(error) || isAbortOrTimeoutError(error)) throw error;\n const status = httpStatusOf(error);\n if (status === 404 || status === 405) return { connected: false };\n throw error;\n } finally {\n await client?.close().catch(() => {});\n }\n}\n\n/** List tools when the endpoint selected the modern era; otherwise let the v1 caller continue. */\nexport async function tryListModernMCPTools(\n agentUrl: string,\n authToken?: string,\n customHeaders?: Record<string, string>,\n options: ModernMCPConnectionOptions = {}\n): Promise<ModernMCPListAttempt> {\n const connectionOptions: ModernConnectionOptions = {\n agentUrl,\n authToken,\n customHeaders,\n debugLogs: [],\n signingContext: options.signingContext,\n authProvider: options.authProvider,\n signal: options.signal,\n requestTimeoutMs: options.requestTimeoutMs,\n fetchFn: options.fetchFn,\n };\n const authHeaders = buildAuthHeaders(authToken, customHeaders, options.authProvider);\n let client: Client | undefined;\n try {\n client = await createNegotiatedClient(connectionOptions, authHeaders);\n if (client.getProtocolEra() !== 'modern') return { handled: false };\n const resolvedRequestTimeoutMs = resolveClientRequestTimeoutMs(options.requestTimeoutMs);\n const result = await client.listTools(undefined, {\n ...(options.signal && { signal: options.signal }),\n ...(resolvedRequestTimeoutMs !== undefined && { timeout: resolvedRequestTimeoutMs }),\n });\n return { handled: true, tools: result.tools };\n } catch (error) {\n if (is401Error(error) || isAbortOrTimeoutError(error)) throw error;\n const status = httpStatusOf(error);\n if (status === 404 || status === 405) return { handled: false };\n throw error;\n } finally {\n await client?.close().catch(() => {});\n }\n}\n\nexport async function closeModernMCPConnections(): Promise<void> {\n connectionGeneration++;\n const pending = [...pendingModernConnections.values()];\n pendingModernConnections.clear();\n const settled = await Promise.allSettled(pending);\n const clients = new Set(modernConnections.values());\n for (const result of settled) {\n if (result.status === 'fulfilled') clients.add(result.value);\n }\n modernConnections.clear();\n legacyConnectionExpiresAt.clear();\n knownLegacyConnections.clear();\n for (const client of clients) {\n try {\n await client.close();\n } catch {\n /* ignore close errors */\n }\n }\n}\n"],"mappings":"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","names":["require"]}
1
+ {"version":3,"sources":["../../../src/lib/protocols/mcp-modern.ts"],"sourcesContent":["import { fileURLToPath as __adcpFileURLToPath } from 'node:url';\nimport { dirname as __adcpDirname } from 'node:path';\nimport { createRequire as __adcpCreateRequire } from 'node:module';\nconst __dirname = __adcpDirname(__adcpFileURLToPath(import.meta.url));\nconst require = __adcpCreateRequire(import.meta.url);\n/**\n * MCP 2026-07-28 client path.\n *\n * The v2 SDK removed the experimental 2025 Tasks interception API. During the\n * migration window we therefore negotiate with the v2 client first and use it\n * only when the peer selects the modern protocol era. Legacy peers fall back\n * to mcp-tasks.ts, which keeps the existing v1 Tasks behavior intact.\n */\n\nimport {\n Client,\n SdkError,\n SdkErrorCode,\n StreamableHTTPClientTransport,\n type DiscoverResult,\n type OAuthClientProvider as ModernOAuthClientProvider,\n type PriorDiscovery,\n type Tool,\n} from '@modelcontextprotocol/client';\nimport { createHmac } from 'node:crypto';\nimport { createMCPAuthHeaders } from '../auth';\nimport { is401Error } from '../errors';\nimport { withSpan, injectTraceHeaders } from '../observability/tracing';\nimport { buildAgentSigningFetch, signingContextStorage, type AgentSigningContext } from '../signing/client';\nimport type { DebugLogEntry } from '../types/adcp';\nimport {\n isAbortOrTimeoutError,\n resolveClientRequestTimeoutMs,\n resolveRequestTimeoutMs,\n withAbortSignal,\n} from './abort';\nimport { wrapFetchWithCapture } from './rawResponseCapture';\nimport { wrapFetchWithSizeLimit } from './responseSizeLimit';\nimport { wrapFetchWithTransportDiagnostics } from './transportDiagnostics';\n\ntype CallToolResponse = {\n isError?: boolean;\n content?: Array<{ type: string; text?: string }>;\n [key: string]: unknown;\n};\n\nexport type ModernMCPAttempt = { handled: false } | { handled: true; response: CallToolResponse };\nexport type ModernMCPListAttempt = { handled: false } | { handled: true; tools: Tool[] };\n\nexport interface ModernMCPConnectionOptions {\n signingContext?: AgentSigningContext;\n authProvider?: object;\n signal?: AbortSignal;\n requestTimeoutMs?: number;\n fetchFn?: typeof fetch;\n /** Use the v2 SDK's negotiated legacy client instead of handing off to v1. */\n handleLegacy?: boolean;\n}\n\ninterface ModernConnectionOptions {\n agentUrl: string;\n authToken?: string;\n customHeaders?: Record<string, string>;\n debugLogs: DebugLogEntry[];\n signingContext?: AgentSigningContext;\n authProvider?: object;\n signal?: AbortSignal;\n requestTimeoutMs?: number;\n fetchFn?: typeof fetch;\n handleLegacy?: boolean;\n}\n\nconst modernConnections = new Map<string, Client>();\nconst legacyConnectionExpiresAt = new Map<string, number>();\nconst pendingModernConnections = new Map<string, Promise<Client>>();\nconst knownLegacyConnections = new Map<string, number>();\nconst modernDiscoveries = new Map<string, { discover: DiscoverResult; expiresAt: number }>();\nconst clientsUsingCachedDiscovery = new WeakSet<Client>();\nconst MAX_CACHED_CONNECTIONS = 20;\nconst LEGACY_CLASSIFICATION_TTL_MS = 5 * 60 * 1000;\nconst MODERN_DISCOVERY_TTL_MS = 5 * 60 * 1000;\nconst modernOAuthProviderIds = new WeakMap<object, string>();\nconst modernFetchFnIds = new WeakMap<typeof fetch, string>();\nlet nextModernOAuthProviderId = 0;\nlet nextModernFetchFnId = 0;\nlet connectionGeneration = 0;\n\nfunction cacheDisambiguator(value: string): string {\n return createHmac('sha256', '').update(value).digest('hex');\n}\n\nfunction buildAuthHeaders(\n authToken: string | undefined,\n customHeaders: Record<string, string> | undefined,\n authProvider?: object\n): Record<string, string> {\n const filteredHeaders =\n authProvider || authToken\n ? Object.fromEntries(\n Object.entries(customHeaders ?? {}).filter(keyValue => {\n const key = keyValue[0].toLowerCase();\n return key !== 'authorization' && key !== 'x-adcp-auth';\n })\n )\n : customHeaders;\n return {\n ...filteredHeaders,\n ...(!authProvider && authToken ? createMCPAuthHeaders(authToken) : {}),\n };\n}\n\nfunction oauthProviderCacheKey(provider: object | undefined): string | undefined {\n if (!provider) return undefined;\n let key = modernOAuthProviderIds.get(provider);\n if (!key) {\n key = `oauth-provider:${++nextModernOAuthProviderId}`;\n modernOAuthProviderIds.set(provider, key);\n }\n return key;\n}\n\nfunction fetchFnCacheKey(fetchFn: typeof fetch | undefined): string | undefined {\n if (!fetchFn) return undefined;\n let key = modernFetchFnIds.get(fetchFn);\n if (!key) {\n key = `fetch:${++nextModernFetchFnId}`;\n modernFetchFnIds.set(fetchFn, key);\n }\n return key;\n}\n\nfunction connectionCacheKey(\n agentUrl: string,\n headers: Record<string, string>,\n signingCacheKey?: string,\n authProvider?: object,\n fetchFn?: typeof fetch\n): string {\n const normalizedHeaders = Object.entries(headers)\n .map(([key, value]) => [key.toLowerCase(), value] as const)\n .sort(([left], [right]) => left.localeCompare(right));\n const parts = [agentUrl, `headers:${cacheDisambiguator(JSON.stringify(normalizedHeaders))}`];\n if (signingCacheKey) parts.push(signingCacheKey);\n const providerKey = oauthProviderCacheKey(authProvider);\n if (providerKey) parts.push(providerKey);\n const fetchKey = fetchFnCacheKey(fetchFn);\n if (fetchKey) parts.push(fetchKey);\n return parts.join('::');\n}\n\nfunction isKnownLegacy(cacheKey: string): boolean {\n const classifiedAt = knownLegacyConnections.get(cacheKey);\n if (classifiedAt === undefined) return false;\n if (Date.now() - classifiedAt > LEGACY_CLASSIFICATION_TTL_MS) {\n knownLegacyConnections.delete(cacheKey);\n return false;\n }\n knownLegacyConnections.delete(cacheKey);\n knownLegacyConnections.set(cacheKey, classifiedAt);\n return true;\n}\n\nfunction markKnownLegacy(cacheKey: string): void {\n modernDiscoveries.delete(cacheKey);\n knownLegacyConnections.delete(cacheKey);\n knownLegacyConnections.set(cacheKey, Date.now());\n while (knownLegacyConnections.size > MAX_CACHED_CONNECTIONS) {\n const oldest = knownLegacyConnections.keys().next().value;\n if (!oldest) break;\n knownLegacyConnections.delete(oldest);\n }\n}\n\nfunction getCachedModernDiscovery(cacheKey: string): PriorDiscovery | undefined {\n const cached = modernDiscoveries.get(cacheKey);\n if (!cached) return undefined;\n if (cached.expiresAt <= Date.now()) {\n modernDiscoveries.delete(cacheKey);\n return undefined;\n }\n modernDiscoveries.delete(cacheKey);\n modernDiscoveries.set(cacheKey, cached);\n return { kind: 'modern', discover: cached.discover };\n}\n\nfunction cacheModernDiscovery(cacheKey: string, discover: DiscoverResult): void {\n modernDiscoveries.delete(cacheKey);\n modernDiscoveries.set(cacheKey, {\n discover,\n expiresAt: Date.now() + MODERN_DISCOVERY_TTL_MS,\n });\n while (modernDiscoveries.size > MAX_CACHED_CONNECTIONS) {\n const oldest = modernDiscoveries.keys().next().value;\n if (!oldest) break;\n modernDiscoveries.delete(oldest);\n }\n}\n\nfunction httpStatusOf(error: unknown, depth = 0): number | undefined {\n if (!error || typeof error !== 'object' || depth > 4) return undefined;\n const candidate = error as { status?: unknown; code?: unknown; cause?: unknown; response?: { status?: unknown } };\n if (typeof candidate.status === 'number') return candidate.status;\n if (typeof candidate.response?.status === 'number') return candidate.response.status;\n if (typeof candidate.code === 'number' && candidate.code >= 100 && candidate.code <= 599) return candidate.code;\n return httpStatusOf(candidate.cause, depth + 1);\n}\n\nfunction withPerRequestTraceHeaders(fetchImpl: typeof fetch): typeof fetch {\n return (input, init) => {\n const headers = new Headers(input instanceof Request ? input.headers : undefined);\n new Headers(init?.headers).forEach((value, key) => headers.set(key, value));\n for (const [key, value] of Object.entries(injectTraceHeaders())) headers.set(key, value);\n return fetchImpl(input, { ...init, headers });\n };\n}\n\nfunction getCachedConnection(cacheKey: string): Client | undefined {\n const client = modernConnections.get(cacheKey);\n if (client) {\n const legacyExpiry = legacyConnectionExpiresAt.get(cacheKey);\n if (legacyExpiry !== undefined && legacyExpiry <= Date.now()) {\n modernConnections.delete(cacheKey);\n legacyConnectionExpiresAt.delete(cacheKey);\n void client.close().catch(() => {});\n return undefined;\n }\n modernConnections.delete(cacheKey);\n modernConnections.set(cacheKey, client);\n }\n return client;\n}\n\nfunction evictLeastRecentlyUsed(): void {\n if (modernConnections.size <= MAX_CACHED_CONNECTIONS) return;\n const oldestKey = modernConnections.keys().next().value;\n if (!oldestKey) return;\n const client = modernConnections.get(oldestKey);\n modernConnections.delete(oldestKey);\n legacyConnectionExpiresAt.delete(oldestKey);\n void client?.close().catch(() => {});\n}\n\nasync function createNegotiatedClient(\n cacheKey: string,\n options: ModernConnectionOptions,\n authHeaders: Record<string, string>,\n useCachedDiscovery = true\n): Promise<Client> {\n const generation = connectionGeneration;\n const requestTimeoutMs = resolveRequestTimeoutMs(options.requestTimeoutMs);\n const clientRequestTimeoutMs = resolveClientRequestTimeoutMs(options.requestTimeoutMs);\n const rawNetworkFetch: typeof fetch = options.fetchFn ?? ((input, init) => fetch(input, init));\n const networkFetch: typeof fetch = (input, init) =>\n withAbortSignal<Response>([options.signal, init?.signal], requestTimeoutMs, signal =>\n rawNetworkFetch(input, { ...init, signal })\n );\n const diagnosticFetch = wrapFetchWithTransportDiagnostics(wrapFetchWithSizeLimit(networkFetch));\n const signedFetch: typeof fetch = options.signingContext\n ? (buildAgentSigningFetch({\n upstream: diagnosticFetch,\n signing: options.signingContext.signing,\n getCapability: options.signingContext.getCapability,\n }) as typeof fetch)\n : diagnosticFetch;\n const transport = new StreamableHTTPClientTransport(new URL(options.agentUrl), {\n requestInit: { headers: authHeaders, redirect: 'manual' },\n fetch: wrapFetchWithCapture(withPerRequestTraceHeaders(signedFetch)),\n ...(options.authProvider && {\n authProvider: options.authProvider as ModernOAuthClientProvider,\n }),\n });\n const client = new Client(\n { name: 'AdCP-Client', version: '1.0.0' },\n {\n versionNegotiation: {\n mode: 'auto',\n ...(clientRequestTimeoutMs !== undefined && { probe: { timeoutMs: clientRequestTimeoutMs } }),\n },\n }\n );\n\n const prior = useCachedDiscovery ? getCachedModernDiscovery(cacheKey) : undefined;\n try {\n await client.connect(transport, {\n ...(options.signal && { signal: options.signal }),\n ...(clientRequestTimeoutMs !== undefined && { timeout: clientRequestTimeoutMs }),\n ...(prior && { prior }),\n });\n if (prior) clientsUsingCachedDiscovery.add(client);\n if (!prior) {\n const discover = client.getDiscoverResult();\n if (generation === connectionGeneration) {\n if (client.getProtocolEra() === 'modern' && discover) cacheModernDiscovery(cacheKey, discover);\n else modernDiscoveries.delete(cacheKey);\n }\n }\n return client;\n } catch (error) {\n if (prior) modernDiscoveries.delete(cacheKey);\n try {\n await client.close();\n } catch {\n /* ignore close errors */\n }\n if (prior && SdkError.isInstance(error) && error.code === SdkErrorCode.EraNegotiationFailed) {\n return createNegotiatedClient(cacheKey, options, authHeaders, false);\n }\n throw error;\n }\n}\n\nasync function getOrCreateModernConnection(\n cacheKey: string,\n options: ModernConnectionOptions,\n authHeaders: Record<string, string>\n): Promise<Client> {\n const cached = getCachedConnection(cacheKey);\n if (cached) return cached;\n\n const pending = pendingModernConnections.get(cacheKey);\n if (pending) return pending;\n\n const generation = connectionGeneration;\n const promise = createNegotiatedClient(cacheKey, options, authHeaders)\n .then(client => {\n if (\n (client.getProtocolEra() === 'modern' || options.handleLegacy === true) &&\n generation === connectionGeneration\n ) {\n modernConnections.set(cacheKey, client);\n if (client.getProtocolEra() === 'legacy') {\n legacyConnectionExpiresAt.set(cacheKey, Date.now() + LEGACY_CLASSIFICATION_TTL_MS);\n } else {\n legacyConnectionExpiresAt.delete(cacheKey);\n }\n evictLeastRecentlyUsed();\n } else if (generation !== connectionGeneration) {\n void client.close().catch(() => {});\n }\n return client;\n })\n .finally(() => {\n if (pendingModernConnections.get(cacheKey) === promise) pendingModernConnections.delete(cacheKey);\n });\n pendingModernConnections.set(cacheKey, promise);\n return promise;\n}\n\nasync function callOnModernClient(\n client: Client,\n toolName: string,\n args: Record<string, unknown>,\n signal?: AbortSignal,\n requestTimeoutMs?: number\n): Promise<CallToolResponse> {\n const resolvedRequestTimeoutMs = resolveClientRequestTimeoutMs(requestTimeoutMs);\n return (await client.callTool(\n { name: toolName, arguments: args },\n {\n ...(signal && { signal }),\n ...(resolvedRequestTimeoutMs !== undefined && { timeout: resolvedRequestTimeoutMs }),\n }\n )) as CallToolResponse;\n}\n\nasync function attemptModernCall(\n options: ModernConnectionOptions,\n toolName: string,\n args: Record<string, unknown>\n): Promise<ModernMCPAttempt> {\n const authHeaders = buildAuthHeaders(options.authToken, options.customHeaders, options.authProvider);\n const cacheKey = connectionCacheKey(\n options.agentUrl,\n authHeaders,\n options.signingContext?.cacheKey,\n options.authProvider,\n options.fetchFn\n );\n if (isKnownLegacy(cacheKey)) return { handled: false };\n\n const guardedConnection =\n options.signal !== undefined || options.requestTimeoutMs !== undefined || options.fetchFn !== undefined;\n let client: Client;\n try {\n client = guardedConnection\n ? await createNegotiatedClient(cacheKey, options, authHeaders)\n : await getOrCreateModernConnection(cacheKey, options, authHeaders);\n } catch (error) {\n const status = httpStatusOf(error);\n if (status === 404 || status === 405) {\n markKnownLegacy(cacheKey);\n options.debugLogs.push({\n type: 'info',\n message: `MCP: Modern Streamable HTTP is unavailable (HTTP ${status}); preserving the v1 transport path`,\n timestamp: new Date().toISOString(),\n });\n return { handled: false };\n }\n throw error;\n }\n\n if (client.getProtocolEra() !== 'modern') {\n if (options.handleLegacy === true) {\n options.debugLogs.push({\n type: 'info',\n message: `MCP: v2 client selected the legacy protocol era for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n } else {\n markKnownLegacy(cacheKey);\n try {\n await client.close();\n } catch {\n /* ignore close errors */\n }\n options.debugLogs.push({\n type: 'info',\n message: `MCP: Server selected the legacy protocol era for ${toolName}; preserving the v1 Tasks path`,\n timestamp: new Date().toISOString(),\n });\n return { handled: false };\n }\n }\n\n options.debugLogs.push({\n type: 'success',\n message: `MCP: Negotiated protocol ${client.getNegotiatedProtocolVersion()} for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n\n try {\n const response = await callOnModernClient(client, toolName, args, options.signal, options.requestTimeoutMs);\n return { handled: true, response };\n } catch (error) {\n // A tool request may have reached the server even when its response was\n // lost. Never replay automatically: mutating AdCP tools depend on the\n // caller's explicit idempotency policy, not transport guesswork.\n modernConnections.delete(cacheKey);\n legacyConnectionExpiresAt.delete(cacheKey);\n modernDiscoveries.delete(cacheKey);\n try {\n await client.close();\n } catch {\n /* ignore close errors */\n }\n throw error;\n } finally {\n if (guardedConnection) {\n try {\n await client.close();\n } catch {\n /* ignore close errors */\n }\n }\n }\n}\n\n/**\n * Try a tool call using the MCP 2026-07-28 protocol era.\n *\n * `handled: false` means the caller must use the existing v1 client. This is\n * deliberately a result rather than an exception because legacy negotiation\n * is normal during the transition window.\n */\nexport async function tryCallModernMCPTool(\n agentUrl: string,\n toolName: string,\n args: Record<string, unknown>,\n authToken?: string,\n debugLogs: DebugLogEntry[] = [],\n customHeaders?: Record<string, string>,\n options: ModernMCPConnectionOptions = {}\n): Promise<ModernMCPAttempt> {\n return withSpan('adcp.mcp.negotiate', { 'adcp.tool': toolName, 'http.url': agentUrl }, () =>\n signingContextStorage.run(options.signingContext, () =>\n attemptModernCall(\n {\n agentUrl,\n authToken,\n customHeaders,\n debugLogs,\n signingContext: options.signingContext,\n authProvider: options.authProvider,\n signal: options.signal,\n requestTimeoutMs: options.requestTimeoutMs,\n fetchFn: options.fetchFn,\n handleLegacy: options.handleLegacy,\n },\n toolName,\n args\n )\n )\n );\n}\n\n/**\n * Probe an endpoint with the official v2 client's auto negotiation.\n * `connected: false` lets endpoint discovery retain its v1 SSE fallback.\n */\nexport async function probeModernMCPConnection(\n agentUrl: string,\n authToken?: string,\n customHeaders?: Record<string, string>,\n options: ModernMCPConnectionOptions = {}\n): Promise<{ connected: boolean; era?: 'legacy' | 'modern' }> {\n const connectionOptions: ModernConnectionOptions = {\n agentUrl,\n authToken,\n customHeaders,\n debugLogs: [],\n signingContext: options.signingContext,\n authProvider: options.authProvider,\n signal: options.signal,\n requestTimeoutMs: options.requestTimeoutMs,\n fetchFn: options.fetchFn,\n handleLegacy: options.handleLegacy,\n };\n const authHeaders = buildAuthHeaders(authToken, customHeaders, options.authProvider);\n const cacheKey = connectionCacheKey(\n agentUrl,\n authHeaders,\n options.signingContext?.cacheKey,\n options.authProvider,\n options.fetchFn\n );\n let client: Client | undefined;\n try {\n client = await createNegotiatedClient(cacheKey, connectionOptions, authHeaders, false);\n return { connected: true, era: client.getProtocolEra() };\n } catch (error) {\n modernDiscoveries.delete(cacheKey);\n if (is401Error(error) || isAbortOrTimeoutError(error)) throw error;\n const status = httpStatusOf(error);\n if (status === 404 || status === 405) return { connected: false };\n throw error;\n } finally {\n await client?.close().catch(() => {});\n }\n}\n\n/** List tools when the endpoint selected the modern era; otherwise let the v1 caller continue. */\nexport async function tryListModernMCPTools(\n agentUrl: string,\n authToken?: string,\n customHeaders?: Record<string, string>,\n options: ModernMCPConnectionOptions = {}\n): Promise<ModernMCPListAttempt> {\n const connectionOptions: ModernConnectionOptions = {\n agentUrl,\n authToken,\n customHeaders,\n debugLogs: [],\n signingContext: options.signingContext,\n authProvider: options.authProvider,\n signal: options.signal,\n requestTimeoutMs: options.requestTimeoutMs,\n fetchFn: options.fetchFn,\n };\n const authHeaders = buildAuthHeaders(authToken, customHeaders, options.authProvider);\n const cacheKey = connectionCacheKey(\n agentUrl,\n authHeaders,\n options.signingContext?.cacheKey,\n options.authProvider,\n options.fetchFn\n );\n let client: Client | undefined;\n const listTools = async (connectedClient: Client): Promise<ModernMCPListAttempt> => {\n if (connectedClient.getProtocolEra() !== 'modern') return { handled: false };\n const resolvedRequestTimeoutMs = resolveClientRequestTimeoutMs(options.requestTimeoutMs);\n const result = await connectedClient.listTools(undefined, {\n ...(options.signal && { signal: options.signal }),\n ...(resolvedRequestTimeoutMs !== undefined && { timeout: resolvedRequestTimeoutMs }),\n });\n return { handled: true, tools: result.tools };\n };\n try {\n client = await createNegotiatedClient(cacheKey, connectionOptions, authHeaders);\n return await listTools(client);\n } catch (error) {\n let failure = error;\n modernDiscoveries.delete(cacheKey);\n if (!is401Error(failure) && !isAbortOrTimeoutError(failure) && client && clientsUsingCachedDiscovery.has(client)) {\n await client.close().catch(() => {});\n try {\n client = await createNegotiatedClient(cacheKey, connectionOptions, authHeaders, false);\n return await listTools(client);\n } catch (retryError) {\n failure = retryError;\n modernDiscoveries.delete(cacheKey);\n }\n }\n if (is401Error(failure) || isAbortOrTimeoutError(failure)) throw failure;\n const status = httpStatusOf(failure);\n if (status === 404 || status === 405) return { handled: false };\n throw failure;\n } finally {\n await client?.close().catch(() => {});\n }\n}\n\nexport async function closeModernMCPConnections(): Promise<void> {\n connectionGeneration++;\n const pending = [...pendingModernConnections.values()];\n pendingModernConnections.clear();\n const settled = await Promise.allSettled(pending);\n const clients = new Set(modernConnections.values());\n for (const result of settled) {\n if (result.status === 'fulfilled') clients.add(result.value);\n }\n modernConnections.clear();\n legacyConnectionExpiresAt.clear();\n knownLegacyConnections.clear();\n modernDiscoveries.clear();\n for (const client of clients) {\n try {\n await client.close();\n } catch {\n /* ignore close errors */\n }\n }\n}\n"],"mappings":"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","names":["require"]}
@@ -16,6 +16,8 @@ import { type TransportActivityHandler } from './transportDiagnostics.mjs';
16
16
  interface MCPTaskProtocolOptions {
17
17
  transport?: {
18
18
  maxResponseBytes?: number;
19
+ fetchFn?: typeof fetch;
20
+ requestTimeoutMs?: number;
19
21
  };
20
22
  onTransportActivity?: TransportActivityHandler;
21
23
  transportActivityContext?: {
@@ -52,6 +54,7 @@ export declare function callMCPToolWithTasks(agentUrl: string, toolName: string,
52
54
  signingContext?: AgentSigningContext;
53
55
  signal?: AbortSignal;
54
56
  requestTimeoutMs?: number;
57
+ fetchFn?: typeof fetch;
55
58
  }): Promise<unknown>;
56
59
  /**
57
60
  * Call a tool on a pre-connected MCP `Client` without HTTP transport or connection caching.
@@ -16,6 +16,8 @@ import { type TransportActivityHandler } from './transportDiagnostics';
16
16
  interface MCPTaskProtocolOptions {
17
17
  transport?: {
18
18
  maxResponseBytes?: number;
19
+ fetchFn?: typeof fetch;
20
+ requestTimeoutMs?: number;
19
21
  };
20
22
  onTransportActivity?: TransportActivityHandler;
21
23
  transportActivityContext?: {
@@ -52,6 +54,7 @@ export declare function callMCPToolWithTasks(agentUrl: string, toolName: string,
52
54
  signingContext?: AgentSigningContext;
53
55
  signal?: AbortSignal;
54
56
  requestTimeoutMs?: number;
57
+ fetchFn?: typeof fetch;
55
58
  }): Promise<unknown>;
56
59
  /**
57
60
  * Call a tool on a pre-connected MCP `Client` without HTTP transport or connection caching.
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-tasks.d.ts","sourceRoot":"","sources":["../../../src/lib/protocols/mcp-tasks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp-tasks.d.ts","sourceRoot":"","sources":["../../../src/lib/protocols/mcp-tasks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,2CAA2C,CAAC;AACrF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAI1D,OAAO,EAAyB,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAGpF,OAAO,EAA4B,KAAK,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAWjG,UAAU,sBAAsB;IAC9B,SAAS,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7F,mBAAmB,CAAC,EAAE,wBAAwB,CAAC;IAC/C,wBAAwB,CAAC,EAAE;QACzB,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;CACH;AAuBD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAG9D;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAe1D;AA+ED;;;;;;;;;;GAUG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,SAAS,CAAC,EAAE,MAAM,EAClB,SAAS,GAAE,aAAa,EAAO,EAC/B,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACtC,OAAO,CAAC,EAAE;IACR,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,mBAAmB,CAAC;IACrC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB,GACA,OAAO,CAAC,OAAO,CAAC,CA2ElB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,SAAS,GAAE,aAAa,EAAO,EAC/B,OAAO,CAAC,EAAE;IAAE,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE,GACrF,OAAO,CAAC,OAAO,CAAC,CAelB;AA2LD;;;;;;;;;;;GAWG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,EAClB,SAAS,GAAE,aAAa,EAAO,EAC/B,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,QAAQ,CAAC,CAuBnB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,EAClB,SAAS,GAAE,aAAa,EAAO,GAC9B,OAAO,CAAC,OAAO,CAAC,CAalB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,EAClB,SAAS,GAAE,aAAa,EAAO,EAC/B,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAkCrB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,EAClB,SAAS,GAAE,aAAa,EAAO,GAC9B,OAAO,CAAC,IAAI,CAAC,CAYf"}
@@ -128,7 +128,8 @@ async function callMCPToolWithTasks(agentUrl, toolName, args, authToken, debugLo
128
128
  const modernAttempt = await (0, import_mcp_modern.tryCallModernMCPTool)(agentUrl, toolName, args, authToken, debugLogs, customHeaders, {
129
129
  ...options?.signingContext && { signingContext: options.signingContext },
130
130
  ...options?.signal && { signal: options.signal },
131
- ...options?.requestTimeoutMs !== void 0 && { requestTimeoutMs: options.requestTimeoutMs }
131
+ ...options?.requestTimeoutMs !== void 0 && { requestTimeoutMs: options.requestTimeoutMs },
132
+ ...options?.fetchFn && { fetchFn: options.fetchFn }
132
133
  });
133
134
  if (modernAttempt.handled) {
134
135
  debugLogs.push({
@@ -163,7 +164,7 @@ async function callMCPToolWithTasks(agentUrl, toolName, args, authToken, debugLo
163
164
  options?.signal,
164
165
  options?.requestTimeoutMs
165
166
  ),
166
- void 0,
167
+ options?.fetchFn,
167
168
  { signal: options?.signal, requestTimeoutMs: options?.requestTimeoutMs }
168
169
  );
169
170
  })
@@ -369,15 +370,24 @@ async function listMCPTasks(agentUrl, authToken, debugLogs = [], options = {}) {
369
370
  ...options.transportActivityContext,
370
371
  onTransportActivity: options.onTransportActivity
371
372
  },
372
- () => (0, import_mcp.withCachedConnection)(agentUrl, authToken, authHeaders, debugLogs, "tasks/list", async (client) => {
373
- const result = await client.experimental.tasks.listTasks();
374
- debugLogs.push({
375
- type: "info",
376
- message: `MCP Tasks: listTasks returned ${result.tasks.length} tasks`,
377
- timestamp: (/* @__PURE__ */ new Date()).toISOString()
378
- });
379
- return result.tasks.map((task) => mapMCPTaskToTaskInfo(task));
380
- })
373
+ () => (0, import_mcp.withCachedConnection)(
374
+ agentUrl,
375
+ authToken,
376
+ authHeaders,
377
+ debugLogs,
378
+ "tasks/list",
379
+ async (client) => {
380
+ const result = await client.experimental.tasks.listTasks();
381
+ debugLogs.push({
382
+ type: "info",
383
+ message: `MCP Tasks: listTasks returned ${result.tasks.length} tasks`,
384
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
385
+ });
386
+ return result.tasks.map((task) => mapMCPTaskToTaskInfo(task));
387
+ },
388
+ options.transport?.fetchFn,
389
+ { requestTimeoutMs: options.transport?.requestTimeoutMs }
390
+ )
381
391
  )
382
392
  );
383
393
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/protocols/mcp-tasks.ts"],"sourcesContent":["/**\n * MCP Tasks protocol integration for async tool calls.\n *\n * When an MCP server declares `capabilities.tasks.requests.tools.call`, this module\n * uses the SDK's experimental tasks API instead of custom AdCP tool calls for async\n * lifecycle management. This removes the LLM from the polling path.\n *\n * Detection: check `client.getServerCapabilities()?.tasks?.requests?.tools?.call`\n * after connection. The SDK's `isToolTask()` auto-detects per-tool `taskSupport`.\n */\n\nimport type { Client as MCPClient } from '@modelcontextprotocol/sdk/client/index.js';\nimport type { DebugLogEntry } from '../types/adcp';\nimport type { TaskInfo } from '../core/ConversationTypes';\nimport { withCachedConnection } from './mcp';\nimport { createMCPAuthHeaders } from '../auth';\nimport { withSpan, injectTraceHeaders } from '../observability/tracing';\nimport { signingContextStorage, type AgentSigningContext } from '../signing/client';\nimport { redactIdempotencyKeyInArgs } from '../utils/idempotency';\nimport { withResponseSizeLimit } from './responseSizeLimit';\nimport { withTransportDiagnostics, type TransportActivityHandler } from './transportDiagnostics';\nimport { isAbortOrTimeoutError, resolveClientRequestTimeoutMs } from './abort';\nimport { tryCallModernMCPTool } from './mcp-modern';\n\n/** Response shape returned by MCPClient.callTool(). */\ntype CallToolResponse = {\n isError?: boolean;\n content?: Array<{ type: string; text?: string }>;\n [key: string]: unknown;\n};\n\ninterface MCPTaskProtocolOptions {\n transport?: { maxResponseBytes?: number };\n onTransportActivity?: TransportActivityHandler;\n transportActivityContext?: {\n agentId: string;\n operationId?: string;\n taskId?: string;\n contextId?: string;\n idempotencyKey?: string;\n };\n}\n\n/**\n * Track which MCP clients have had listTools() called.\n * The SDK's isToolTask() needs tool metadata from listTools() to determine\n * per-tool taskSupport. Without this, callToolStream silently degrades to\n * a synchronous tools/call (no task creation).\n */\nconst toolsListedClients = new WeakSet<MCPClient>();\n\n/**\n * Ensure tool metadata is cached in the SDK so isToolTask() works.\n * Called once per client connection when tasks are supported.\n */\nasync function ensureToolsListed(client: MCPClient, signal?: AbortSignal, requestTimeoutMs?: number): Promise<void> {\n if (toolsListedClients.has(client)) return;\n await client.listTools(undefined, {\n ...(signal && { signal }),\n ...(requestTimeoutMs !== undefined && { timeout: requestTimeoutMs }),\n });\n toolsListedClients.add(client);\n}\n\n/**\n * Check if an MCP server supports the Tasks protocol for tool calls.\n */\nexport function serverSupportsTasks(client: MCPClient): boolean {\n const caps = client.getServerCapabilities();\n return !!(caps as Record<string, any>)?.tasks?.requests?.tools?.call;\n}\n\n/**\n * Map MCP Tasks status to AdCP status.\n *\n * MCP Tasks uses underscores and British spelling; AdCP uses hyphens and American spelling.\n */\nexport function mapMCPTaskStatus(mcpStatus: string): string {\n switch (mcpStatus) {\n case 'working':\n return 'working';\n case 'input_required':\n return 'input-required';\n case 'completed':\n return 'completed';\n case 'failed':\n return 'failed';\n case 'cancelled':\n return 'canceled';\n default:\n return mcpStatus;\n }\n}\n\n/**\n * Map an MCP Task object to an AdCP TaskInfo.\n */\nfunction mapMCPTaskToTaskInfo(\n task: {\n taskId: string;\n status: string;\n createdAt: string;\n lastUpdatedAt: string;\n statusMessage?: string;\n pollInterval?: number;\n },\n toolName?: string\n): TaskInfo {\n // Project `statusMessage → TaskInfo.error` against the\n // POST-MAPPING AdCP status (not the raw MCP-side status). MCP\n // Tasks emits `'cancelled'` (British) and never `'rejected'` as a\n // standard status; checking against the AdCP set after mapping\n // catches all terminal failures uniformly. Sellers that extend\n // MCP with custom statuses (e.g. emit `'rejected'` via spec\n // extension) flow through unchanged via the `default` arm of\n // {@link mapMCPTaskStatus}.\n const adcpStatus = mapMCPTaskStatus(task.status);\n const isTerminalFailure = adcpStatus === 'failed' || adcpStatus === 'rejected' || adcpStatus === 'canceled';\n return {\n taskId: task.taskId,\n status: adcpStatus,\n taskType: toolName ?? 'unknown',\n createdAt: new Date(task.createdAt).getTime(),\n updatedAt: new Date(task.lastUpdatedAt).getTime(),\n error: isTerminalFailure ? task.statusMessage : undefined,\n };\n}\n\n/**\n * Build auth headers for MCP connections.\n */\nfunction buildAuthHeaders(authToken?: string, customHeaders?: Record<string, string>): Record<string, string> {\n const traceHeaders = injectTraceHeaders();\n return {\n ...customHeaders,\n ...traceHeaders,\n ...(authToken ? createMCPAuthHeaders(authToken) : {}),\n };\n}\n\n/**\n * Redact sensitive fields from tool args before logging.\n *\n * Redacts:\n * - `push_notification_config.authentication` — webhook signing secret\n * - `idempotency_key` — retry-pattern oracle within the seller's TTL; opt-in\n * full logging via `ADCP_LOG_IDEMPOTENCY_KEYS=1`\n */\nfunction redactArgsForLog(args: Record<string, unknown>): Record<string, unknown> {\n let redacted: Record<string, unknown> = args;\n if (redacted.push_notification_config) {\n redacted = {\n ...redacted,\n push_notification_config: {\n ...(redacted.push_notification_config as object),\n authentication: '***',\n },\n };\n }\n return redactIdempotencyKeyInArgs(redacted);\n}\n\n/**\n * Validate taskId before passing to protocol methods.\n */\nfunction validateTaskId(taskId: string): void {\n if (!taskId || typeof taskId !== 'string' || taskId.length > 256) {\n throw new Error(`Invalid taskId: expected non-empty string (max 256 chars)`);\n }\n}\n\n/**\n * Call an MCP tool with Tasks protocol support.\n *\n * If the server supports MCP Tasks and the tool has `taskSupport: 'optional' | 'required'`,\n * uses `callToolStream()` which handles task creation, polling, and result retrieval.\n *\n * If the server doesn't support tasks, falls back to regular `client.callTool()`.\n *\n * The stream is consumed with a timeout. If the task doesn't complete within the timeout,\n * returns a working-status response with the MCP task_id for follow-up polling.\n */\nexport async function callMCPToolWithTasks(\n agentUrl: string,\n toolName: string,\n args: Record<string, unknown>,\n authToken?: string,\n debugLogs: DebugLogEntry[] = [],\n customHeaders?: Record<string, string>,\n options?: {\n workingTimeout?: number;\n signingContext?: AgentSigningContext;\n signal?: AbortSignal;\n requestTimeoutMs?: number;\n }\n): Promise<unknown> {\n // Keep the public debug-log contract identical across modern and legacy\n // protocol eras. Era negotiation happens after these common entries; the\n // selected transport appends its own connection diagnostics.\n debugLogs.push({\n type: 'info',\n message: `MCP: Auth configuration`,\n timestamp: new Date().toISOString(),\n hasAuth: !!authToken,\n headers: authToken ? { 'x-adcp-auth': '***' } : {},\n customHeaderKeys: customHeaders ? Object.keys(customHeaders) : [],\n });\n\n debugLogs.push({\n type: 'info',\n message: `MCP: Calling tool ${toolName} with args: ${JSON.stringify(redactArgsForLog(args))}`,\n timestamp: new Date().toISOString(),\n });\n\n if (authToken) {\n debugLogs.push({\n type: 'info',\n message: `MCP: Transport configured with x-adcp-auth header for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n }\n\n const modernAttempt = await tryCallModernMCPTool(agentUrl, toolName, args, authToken, debugLogs, customHeaders, {\n ...(options?.signingContext && { signingContext: options.signingContext }),\n ...(options?.signal && { signal: options.signal }),\n ...(options?.requestTimeoutMs !== undefined && { requestTimeoutMs: options.requestTimeoutMs }),\n });\n if (modernAttempt.handled) {\n debugLogs.push({\n type: modernAttempt.response?.isError ? 'error' : 'success',\n message: `MCP: Tool ${toolName} response received (${modernAttempt.response?.isError ? 'error' : 'success'})`,\n timestamp: new Date().toISOString(),\n response: modernAttempt.response,\n });\n return modernAttempt.response;\n }\n\n return withSpan(\n 'adcp.mcp.call_tool',\n {\n 'adcp.tool': toolName,\n 'http.url': agentUrl,\n },\n async () =>\n signingContextStorage.run(options?.signingContext, async () => {\n const authHeaders = buildAuthHeaders(authToken, customHeaders);\n const workingTimeout = options?.workingTimeout ?? 120_000;\n\n return withCachedConnection(\n agentUrl,\n authToken,\n authHeaders,\n debugLogs,\n toolName,\n client =>\n callToolOnClient(\n client,\n toolName,\n args,\n debugLogs,\n workingTimeout,\n options?.signal,\n options?.requestTimeoutMs\n ),\n undefined,\n { signal: options?.signal, requestTimeoutMs: options?.requestTimeoutMs }\n );\n })\n );\n}\n\n/**\n * Call a tool on a pre-connected MCP `Client` without HTTP transport or connection caching.\n *\n * This is the in-process companion to `callMCPToolWithTasks`. It skips URL validation,\n * connection setup, OAuth refresh, and the reconnect-retry path — the caller owns the\n * client lifecycle. All other semantics (tasks protocol detection, stream handling,\n * timeout surfacing) are identical to the URL-based path.\n *\n * Use via `AgentClient.fromMCPClient()`. Not intended for direct import outside the\n * protocols directory.\n */\nexport async function callMCPToolWithClient(\n mcpClient: MCPClient,\n toolName: string,\n args: Record<string, unknown>,\n debugLogs: DebugLogEntry[] = [],\n options?: { workingTimeout?: number; signal?: AbortSignal; requestTimeoutMs?: number }\n): Promise<unknown> {\n debugLogs.push({\n type: 'info',\n message: `MCP: Calling tool ${toolName} (in-process) with args: ${JSON.stringify(redactArgsForLog(args))}`,\n timestamp: new Date().toISOString(),\n });\n return callToolOnClient(\n mcpClient,\n toolName,\n args,\n debugLogs,\n options?.workingTimeout ?? 120_000,\n options?.signal,\n options?.requestTimeoutMs\n );\n}\n\n/**\n * Inner dispatch logic shared by `callMCPToolWithTasks` (URL path) and\n * `callMCPToolWithClient` (in-process path). Both paths converge here once\n * a connected `MCPClient` is in hand.\n */\nasync function callToolOnClient(\n client: MCPClient,\n toolName: string,\n args: Record<string, unknown>,\n debugLogs: DebugLogEntry[],\n workingTimeout: number,\n signal?: AbortSignal,\n requestTimeoutMs?: number\n): Promise<unknown> {\n const resolvedRequestTimeoutMs = resolveClientRequestTimeoutMs(requestTimeoutMs);\n const requestOptions = {\n ...(signal && { signal }),\n ...(resolvedRequestTimeoutMs !== undefined && { timeout: resolvedRequestTimeoutMs }),\n };\n if (!serverSupportsTasks(client)) {\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Server does not support tasks, using standard callTool for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n const response = (await client.callTool(\n { name: toolName, arguments: args },\n undefined,\n requestOptions\n )) as CallToolResponse;\n\n debugLogs.push({\n type: response?.isError ? 'error' : 'success',\n message: `MCP: Tool ${toolName} response received (${response?.isError ? 'error' : 'success'})`,\n timestamp: new Date().toISOString(),\n response: response,\n });\n\n return response;\n }\n\n // Ensure tool metadata is cached so the SDK's isToolTask() works correctly.\n // Without this, callToolStream silently skips task creation for tools that\n // declare taskSupport: 'optional' | 'required'.\n await ensureToolsListed(client, signal, resolvedRequestTimeoutMs);\n\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Server supports tasks, using callToolStream for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n\n // Use callToolStream which handles the full task lifecycle\n const stream = client.experimental.tasks.callToolStream({ name: toolName, arguments: args }, undefined, {\n timeout: resolvedRequestTimeoutMs ?? workingTimeout,\n resetTimeoutOnProgress: true,\n ...(signal && { signal }),\n });\n\n let capturedTaskId: string | undefined;\n let capturedTask: { taskId: string; status: string; pollInterval?: number } | undefined;\n\n try {\n for await (const message of stream) {\n switch (message.type) {\n case 'taskCreated':\n capturedTaskId = message.task.taskId;\n capturedTask = message.task;\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Task created ${capturedTaskId} for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n break;\n\n case 'taskStatus':\n capturedTask = message.task;\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Status update for ${capturedTaskId}: ${message.task.status}`,\n timestamp: new Date().toISOString(),\n });\n break;\n\n case 'result': {\n debugLogs.push({\n type: 'success',\n message: `MCP: Tool ${toolName} response received (success)`,\n timestamp: new Date().toISOString(),\n response: message.result,\n });\n return message.result as CallToolResponse;\n }\n\n case 'error': {\n debugLogs.push({\n type: 'error',\n message: `MCP Tasks: Error for ${toolName}: ${message.error.message}`,\n timestamp: new Date().toISOString(),\n });\n // The MCP Tasks SDK error event may strip structured content.\n // If we have a taskId, fetch the full result to recover adcp_error data\n // and return it as a proper isError response for downstream unwrapping.\n if (capturedTaskId) {\n try {\n const taskResult = await client.experimental.tasks.getTaskResult(\n capturedTaskId,\n undefined,\n requestOptions\n );\n const content = taskResult?.content as Array<{ type: string; text?: string }> | undefined;\n if (content) {\n return {\n isError: true,\n content,\n structuredContent: taskResult?.structuredContent,\n } as unknown as CallToolResponse;\n }\n } catch {\n // Failed to fetch task result — fall through to throw\n }\n }\n throw message.error;\n }\n }\n }\n } catch (error) {\n if (signal?.aborted && isAbortOrTimeoutError(error)) {\n throw error;\n }\n // If we timed out but have a taskId, return a working status\n // so the caller can poll via getMCPTaskStatus/getMCPTaskResult\n if (capturedTaskId && error instanceof Error && /timeout|timed out/i.test(error.message)) {\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Timeout for ${toolName}, returning working status with taskId ${capturedTaskId}`,\n timestamp: new Date().toISOString(),\n });\n\n return {\n structuredContent: {\n status: 'working',\n task_id: capturedTaskId,\n poll_interval: capturedTask?.pollInterval,\n },\n };\n }\n if (isAbortOrTimeoutError(error)) {\n throw error;\n }\n // Servers may return a synchronous tool error (e.g. VERSION_UNSUPPORTED)\n // rather than creating a task. The Tasks SDK rejects these with a Zod\n // validation error about a missing `task` field. When no task was\n // captured, fall back to standard callTool so the error response\n // reaches the caller intact.\n const msg = error instanceof Error ? error.message : String(error);\n if (!capturedTaskId && /Invalid task creation result/i.test(msg)) {\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Server returned synchronous response for ${toolName}, falling back to callTool`,\n timestamp: new Date().toISOString(),\n });\n return (await client.callTool(\n { name: toolName, arguments: args },\n undefined,\n requestOptions\n )) as CallToolResponse;\n }\n throw error;\n }\n\n // Stream ended without result — shouldn't happen with well-behaved servers\n if (capturedTaskId) {\n return {\n structuredContent: {\n status: 'working',\n task_id: capturedTaskId,\n poll_interval: capturedTask?.pollInterval,\n },\n };\n }\n\n throw new Error(`MCP Tasks: callToolStream for ${toolName} ended without result or task`);\n}\n\n/**\n * Get task status via MCP Tasks protocol method (not tool call).\n *\n * Task lifecycle methods (`tasks/get`, `tasks/result`, `tasks/list`,\n * `tasks/cancel`) are MCP protocol methods, not AdCP operations.\n * `extractAdcpOperation` returns `undefined` for them, so the signing fetch\n * passes them through unsigned regardless of whether an `AgentSigningContext`\n * is present in ALS. That matches the RFC 9421 signing profile, which only\n * covers AdCP tool calls (`tools/call` / `message/send`).\n *\n * Re-throws auth errors (401) — only catches protocol capability errors.\n */\nexport async function getMCPTaskStatus(\n agentUrl: string,\n taskId: string,\n authToken?: string,\n debugLogs: DebugLogEntry[] = [],\n toolName?: string\n): Promise<TaskInfo> {\n validateTaskId(taskId);\n const authHeaders = buildAuthHeaders(authToken);\n\n return withCachedConnection(agentUrl, authToken, authHeaders, debugLogs, `tasks/get:${taskId}`, async client => {\n const result = await client.experimental.tasks.getTask(taskId);\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: getTask ${taskId} → ${result.status}`,\n timestamp: new Date().toISOString(),\n });\n return mapMCPTaskToTaskInfo(\n result as {\n taskId: string;\n status: string;\n createdAt: string;\n lastUpdatedAt: string;\n statusMessage?: string;\n pollInterval?: number;\n },\n toolName\n );\n });\n}\n\n/**\n * Get task result via MCP Tasks protocol method (blocks until terminal).\n */\nexport async function getMCPTaskResult(\n agentUrl: string,\n taskId: string,\n authToken?: string,\n debugLogs: DebugLogEntry[] = []\n): Promise<unknown> {\n validateTaskId(taskId);\n const authHeaders = buildAuthHeaders(authToken);\n\n return withCachedConnection(agentUrl, authToken, authHeaders, debugLogs, `tasks/result:${taskId}`, async client => {\n const result = await client.experimental.tasks.getTaskResult(taskId);\n debugLogs.push({\n type: 'success',\n message: `MCP Tasks: getTaskResult ${taskId} received`,\n timestamp: new Date().toISOString(),\n });\n return result;\n });\n}\n\n/**\n * List tasks via MCP Tasks protocol method.\n */\nexport async function listMCPTasks(\n agentUrl: string,\n authToken?: string,\n debugLogs: DebugLogEntry[] = [],\n options: MCPTaskProtocolOptions = {}\n): Promise<TaskInfo[]> {\n const authHeaders = buildAuthHeaders(authToken);\n\n return withResponseSizeLimit(options.transport?.maxResponseBytes, () =>\n withTransportDiagnostics(\n {\n agentId: options.transportActivityContext?.agentId ?? 'unknown-agent',\n protocol: 'mcp',\n tool: 'tasks/list',\n taskType: 'tasks/list',\n ...options.transportActivityContext,\n onTransportActivity: options.onTransportActivity,\n },\n () =>\n withCachedConnection(agentUrl, authToken, authHeaders, debugLogs, 'tasks/list', async client => {\n const result = await client.experimental.tasks.listTasks();\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: listTasks returned ${result.tasks.length} tasks`,\n timestamp: new Date().toISOString(),\n });\n return result.tasks.map((task: any) => mapMCPTaskToTaskInfo(task));\n })\n )\n );\n}\n\n/**\n * Cancel a task via MCP Tasks protocol method.\n */\nexport async function cancelMCPTask(\n agentUrl: string,\n taskId: string,\n authToken?: string,\n debugLogs: DebugLogEntry[] = []\n): Promise<void> {\n validateTaskId(taskId);\n const authHeaders = buildAuthHeaders(authToken);\n\n await withCachedConnection(agentUrl, authToken, authHeaders, debugLogs, `tasks/cancel:${taskId}`, async client => {\n await client.experimental.tasks.cancelTask(taskId);\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: cancelTask ${taskId} succeeded`,\n timestamp: new Date().toISOString(),\n });\n });\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/protocols/mcp-tasks.ts"],"sourcesContent":["/**\n * MCP Tasks protocol integration for async tool calls.\n *\n * When an MCP server declares `capabilities.tasks.requests.tools.call`, this module\n * uses the SDK's experimental tasks API instead of custom AdCP tool calls for async\n * lifecycle management. This removes the LLM from the polling path.\n *\n * Detection: check `client.getServerCapabilities()?.tasks?.requests?.tools?.call`\n * after connection. The SDK's `isToolTask()` auto-detects per-tool `taskSupport`.\n */\n\nimport type { Client as MCPClient } from '@modelcontextprotocol/sdk/client/index.js';\nimport type { DebugLogEntry } from '../types/adcp';\nimport type { TaskInfo } from '../core/ConversationTypes';\nimport { withCachedConnection } from './mcp';\nimport { createMCPAuthHeaders } from '../auth';\nimport { withSpan, injectTraceHeaders } from '../observability/tracing';\nimport { signingContextStorage, type AgentSigningContext } from '../signing/client';\nimport { redactIdempotencyKeyInArgs } from '../utils/idempotency';\nimport { withResponseSizeLimit } from './responseSizeLimit';\nimport { withTransportDiagnostics, type TransportActivityHandler } from './transportDiagnostics';\nimport { isAbortOrTimeoutError, resolveClientRequestTimeoutMs } from './abort';\nimport { tryCallModernMCPTool } from './mcp-modern';\n\n/** Response shape returned by MCPClient.callTool(). */\ntype CallToolResponse = {\n isError?: boolean;\n content?: Array<{ type: string; text?: string }>;\n [key: string]: unknown;\n};\n\ninterface MCPTaskProtocolOptions {\n transport?: { maxResponseBytes?: number; fetchFn?: typeof fetch; requestTimeoutMs?: number };\n onTransportActivity?: TransportActivityHandler;\n transportActivityContext?: {\n agentId: string;\n operationId?: string;\n taskId?: string;\n contextId?: string;\n idempotencyKey?: string;\n };\n}\n\n/**\n * Track which MCP clients have had listTools() called.\n * The SDK's isToolTask() needs tool metadata from listTools() to determine\n * per-tool taskSupport. Without this, callToolStream silently degrades to\n * a synchronous tools/call (no task creation).\n */\nconst toolsListedClients = new WeakSet<MCPClient>();\n\n/**\n * Ensure tool metadata is cached in the SDK so isToolTask() works.\n * Called once per client connection when tasks are supported.\n */\nasync function ensureToolsListed(client: MCPClient, signal?: AbortSignal, requestTimeoutMs?: number): Promise<void> {\n if (toolsListedClients.has(client)) return;\n await client.listTools(undefined, {\n ...(signal && { signal }),\n ...(requestTimeoutMs !== undefined && { timeout: requestTimeoutMs }),\n });\n toolsListedClients.add(client);\n}\n\n/**\n * Check if an MCP server supports the Tasks protocol for tool calls.\n */\nexport function serverSupportsTasks(client: MCPClient): boolean {\n const caps = client.getServerCapabilities();\n return !!(caps as Record<string, any>)?.tasks?.requests?.tools?.call;\n}\n\n/**\n * Map MCP Tasks status to AdCP status.\n *\n * MCP Tasks uses underscores and British spelling; AdCP uses hyphens and American spelling.\n */\nexport function mapMCPTaskStatus(mcpStatus: string): string {\n switch (mcpStatus) {\n case 'working':\n return 'working';\n case 'input_required':\n return 'input-required';\n case 'completed':\n return 'completed';\n case 'failed':\n return 'failed';\n case 'cancelled':\n return 'canceled';\n default:\n return mcpStatus;\n }\n}\n\n/**\n * Map an MCP Task object to an AdCP TaskInfo.\n */\nfunction mapMCPTaskToTaskInfo(\n task: {\n taskId: string;\n status: string;\n createdAt: string;\n lastUpdatedAt: string;\n statusMessage?: string;\n pollInterval?: number;\n },\n toolName?: string\n): TaskInfo {\n // Project `statusMessage → TaskInfo.error` against the\n // POST-MAPPING AdCP status (not the raw MCP-side status). MCP\n // Tasks emits `'cancelled'` (British) and never `'rejected'` as a\n // standard status; checking against the AdCP set after mapping\n // catches all terminal failures uniformly. Sellers that extend\n // MCP with custom statuses (e.g. emit `'rejected'` via spec\n // extension) flow through unchanged via the `default` arm of\n // {@link mapMCPTaskStatus}.\n const adcpStatus = mapMCPTaskStatus(task.status);\n const isTerminalFailure = adcpStatus === 'failed' || adcpStatus === 'rejected' || adcpStatus === 'canceled';\n return {\n taskId: task.taskId,\n status: adcpStatus,\n taskType: toolName ?? 'unknown',\n createdAt: new Date(task.createdAt).getTime(),\n updatedAt: new Date(task.lastUpdatedAt).getTime(),\n error: isTerminalFailure ? task.statusMessage : undefined,\n };\n}\n\n/**\n * Build auth headers for MCP connections.\n */\nfunction buildAuthHeaders(authToken?: string, customHeaders?: Record<string, string>): Record<string, string> {\n const traceHeaders = injectTraceHeaders();\n return {\n ...customHeaders,\n ...traceHeaders,\n ...(authToken ? createMCPAuthHeaders(authToken) : {}),\n };\n}\n\n/**\n * Redact sensitive fields from tool args before logging.\n *\n * Redacts:\n * - `push_notification_config.authentication` — webhook signing secret\n * - `idempotency_key` — retry-pattern oracle within the seller's TTL; opt-in\n * full logging via `ADCP_LOG_IDEMPOTENCY_KEYS=1`\n */\nfunction redactArgsForLog(args: Record<string, unknown>): Record<string, unknown> {\n let redacted: Record<string, unknown> = args;\n if (redacted.push_notification_config) {\n redacted = {\n ...redacted,\n push_notification_config: {\n ...(redacted.push_notification_config as object),\n authentication: '***',\n },\n };\n }\n return redactIdempotencyKeyInArgs(redacted);\n}\n\n/**\n * Validate taskId before passing to protocol methods.\n */\nfunction validateTaskId(taskId: string): void {\n if (!taskId || typeof taskId !== 'string' || taskId.length > 256) {\n throw new Error(`Invalid taskId: expected non-empty string (max 256 chars)`);\n }\n}\n\n/**\n * Call an MCP tool with Tasks protocol support.\n *\n * If the server supports MCP Tasks and the tool has `taskSupport: 'optional' | 'required'`,\n * uses `callToolStream()` which handles task creation, polling, and result retrieval.\n *\n * If the server doesn't support tasks, falls back to regular `client.callTool()`.\n *\n * The stream is consumed with a timeout. If the task doesn't complete within the timeout,\n * returns a working-status response with the MCP task_id for follow-up polling.\n */\nexport async function callMCPToolWithTasks(\n agentUrl: string,\n toolName: string,\n args: Record<string, unknown>,\n authToken?: string,\n debugLogs: DebugLogEntry[] = [],\n customHeaders?: Record<string, string>,\n options?: {\n workingTimeout?: number;\n signingContext?: AgentSigningContext;\n signal?: AbortSignal;\n requestTimeoutMs?: number;\n fetchFn?: typeof fetch;\n }\n): Promise<unknown> {\n // Keep the public debug-log contract identical across modern and legacy\n // protocol eras. Era negotiation happens after these common entries; the\n // selected transport appends its own connection diagnostics.\n debugLogs.push({\n type: 'info',\n message: `MCP: Auth configuration`,\n timestamp: new Date().toISOString(),\n hasAuth: !!authToken,\n headers: authToken ? { 'x-adcp-auth': '***' } : {},\n customHeaderKeys: customHeaders ? Object.keys(customHeaders) : [],\n });\n\n debugLogs.push({\n type: 'info',\n message: `MCP: Calling tool ${toolName} with args: ${JSON.stringify(redactArgsForLog(args))}`,\n timestamp: new Date().toISOString(),\n });\n\n if (authToken) {\n debugLogs.push({\n type: 'info',\n message: `MCP: Transport configured with x-adcp-auth header for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n }\n\n const modernAttempt = await tryCallModernMCPTool(agentUrl, toolName, args, authToken, debugLogs, customHeaders, {\n ...(options?.signingContext && { signingContext: options.signingContext }),\n ...(options?.signal && { signal: options.signal }),\n ...(options?.requestTimeoutMs !== undefined && { requestTimeoutMs: options.requestTimeoutMs }),\n ...(options?.fetchFn && { fetchFn: options.fetchFn }),\n });\n if (modernAttempt.handled) {\n debugLogs.push({\n type: modernAttempt.response?.isError ? 'error' : 'success',\n message: `MCP: Tool ${toolName} response received (${modernAttempt.response?.isError ? 'error' : 'success'})`,\n timestamp: new Date().toISOString(),\n response: modernAttempt.response,\n });\n return modernAttempt.response;\n }\n\n return withSpan(\n 'adcp.mcp.call_tool',\n {\n 'adcp.tool': toolName,\n 'http.url': agentUrl,\n },\n async () =>\n signingContextStorage.run(options?.signingContext, async () => {\n const authHeaders = buildAuthHeaders(authToken, customHeaders);\n const workingTimeout = options?.workingTimeout ?? 120_000;\n\n return withCachedConnection(\n agentUrl,\n authToken,\n authHeaders,\n debugLogs,\n toolName,\n client =>\n callToolOnClient(\n client,\n toolName,\n args,\n debugLogs,\n workingTimeout,\n options?.signal,\n options?.requestTimeoutMs\n ),\n options?.fetchFn,\n { signal: options?.signal, requestTimeoutMs: options?.requestTimeoutMs }\n );\n })\n );\n}\n\n/**\n * Call a tool on a pre-connected MCP `Client` without HTTP transport or connection caching.\n *\n * This is the in-process companion to `callMCPToolWithTasks`. It skips URL validation,\n * connection setup, OAuth refresh, and the reconnect-retry path — the caller owns the\n * client lifecycle. All other semantics (tasks protocol detection, stream handling,\n * timeout surfacing) are identical to the URL-based path.\n *\n * Use via `AgentClient.fromMCPClient()`. Not intended for direct import outside the\n * protocols directory.\n */\nexport async function callMCPToolWithClient(\n mcpClient: MCPClient,\n toolName: string,\n args: Record<string, unknown>,\n debugLogs: DebugLogEntry[] = [],\n options?: { workingTimeout?: number; signal?: AbortSignal; requestTimeoutMs?: number }\n): Promise<unknown> {\n debugLogs.push({\n type: 'info',\n message: `MCP: Calling tool ${toolName} (in-process) with args: ${JSON.stringify(redactArgsForLog(args))}`,\n timestamp: new Date().toISOString(),\n });\n return callToolOnClient(\n mcpClient,\n toolName,\n args,\n debugLogs,\n options?.workingTimeout ?? 120_000,\n options?.signal,\n options?.requestTimeoutMs\n );\n}\n\n/**\n * Inner dispatch logic shared by `callMCPToolWithTasks` (URL path) and\n * `callMCPToolWithClient` (in-process path). Both paths converge here once\n * a connected `MCPClient` is in hand.\n */\nasync function callToolOnClient(\n client: MCPClient,\n toolName: string,\n args: Record<string, unknown>,\n debugLogs: DebugLogEntry[],\n workingTimeout: number,\n signal?: AbortSignal,\n requestTimeoutMs?: number\n): Promise<unknown> {\n const resolvedRequestTimeoutMs = resolveClientRequestTimeoutMs(requestTimeoutMs);\n const requestOptions = {\n ...(signal && { signal }),\n ...(resolvedRequestTimeoutMs !== undefined && { timeout: resolvedRequestTimeoutMs }),\n };\n if (!serverSupportsTasks(client)) {\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Server does not support tasks, using standard callTool for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n const response = (await client.callTool(\n { name: toolName, arguments: args },\n undefined,\n requestOptions\n )) as CallToolResponse;\n\n debugLogs.push({\n type: response?.isError ? 'error' : 'success',\n message: `MCP: Tool ${toolName} response received (${response?.isError ? 'error' : 'success'})`,\n timestamp: new Date().toISOString(),\n response: response,\n });\n\n return response;\n }\n\n // Ensure tool metadata is cached so the SDK's isToolTask() works correctly.\n // Without this, callToolStream silently skips task creation for tools that\n // declare taskSupport: 'optional' | 'required'.\n await ensureToolsListed(client, signal, resolvedRequestTimeoutMs);\n\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Server supports tasks, using callToolStream for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n\n // Use callToolStream which handles the full task lifecycle\n const stream = client.experimental.tasks.callToolStream({ name: toolName, arguments: args }, undefined, {\n timeout: resolvedRequestTimeoutMs ?? workingTimeout,\n resetTimeoutOnProgress: true,\n ...(signal && { signal }),\n });\n\n let capturedTaskId: string | undefined;\n let capturedTask: { taskId: string; status: string; pollInterval?: number } | undefined;\n\n try {\n for await (const message of stream) {\n switch (message.type) {\n case 'taskCreated':\n capturedTaskId = message.task.taskId;\n capturedTask = message.task;\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Task created ${capturedTaskId} for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n break;\n\n case 'taskStatus':\n capturedTask = message.task;\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Status update for ${capturedTaskId}: ${message.task.status}`,\n timestamp: new Date().toISOString(),\n });\n break;\n\n case 'result': {\n debugLogs.push({\n type: 'success',\n message: `MCP: Tool ${toolName} response received (success)`,\n timestamp: new Date().toISOString(),\n response: message.result,\n });\n return message.result as CallToolResponse;\n }\n\n case 'error': {\n debugLogs.push({\n type: 'error',\n message: `MCP Tasks: Error for ${toolName}: ${message.error.message}`,\n timestamp: new Date().toISOString(),\n });\n // The MCP Tasks SDK error event may strip structured content.\n // If we have a taskId, fetch the full result to recover adcp_error data\n // and return it as a proper isError response for downstream unwrapping.\n if (capturedTaskId) {\n try {\n const taskResult = await client.experimental.tasks.getTaskResult(\n capturedTaskId,\n undefined,\n requestOptions\n );\n const content = taskResult?.content as Array<{ type: string; text?: string }> | undefined;\n if (content) {\n return {\n isError: true,\n content,\n structuredContent: taskResult?.structuredContent,\n } as unknown as CallToolResponse;\n }\n } catch {\n // Failed to fetch task result — fall through to throw\n }\n }\n throw message.error;\n }\n }\n }\n } catch (error) {\n if (signal?.aborted && isAbortOrTimeoutError(error)) {\n throw error;\n }\n // If we timed out but have a taskId, return a working status\n // so the caller can poll via getMCPTaskStatus/getMCPTaskResult\n if (capturedTaskId && error instanceof Error && /timeout|timed out/i.test(error.message)) {\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Timeout for ${toolName}, returning working status with taskId ${capturedTaskId}`,\n timestamp: new Date().toISOString(),\n });\n\n return {\n structuredContent: {\n status: 'working',\n task_id: capturedTaskId,\n poll_interval: capturedTask?.pollInterval,\n },\n };\n }\n if (isAbortOrTimeoutError(error)) {\n throw error;\n }\n // Servers may return a synchronous tool error (e.g. VERSION_UNSUPPORTED)\n // rather than creating a task. The Tasks SDK rejects these with a Zod\n // validation error about a missing `task` field. When no task was\n // captured, fall back to standard callTool so the error response\n // reaches the caller intact.\n const msg = error instanceof Error ? error.message : String(error);\n if (!capturedTaskId && /Invalid task creation result/i.test(msg)) {\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Server returned synchronous response for ${toolName}, falling back to callTool`,\n timestamp: new Date().toISOString(),\n });\n return (await client.callTool(\n { name: toolName, arguments: args },\n undefined,\n requestOptions\n )) as CallToolResponse;\n }\n throw error;\n }\n\n // Stream ended without result — shouldn't happen with well-behaved servers\n if (capturedTaskId) {\n return {\n structuredContent: {\n status: 'working',\n task_id: capturedTaskId,\n poll_interval: capturedTask?.pollInterval,\n },\n };\n }\n\n throw new Error(`MCP Tasks: callToolStream for ${toolName} ended without result or task`);\n}\n\n/**\n * Get task status via MCP Tasks protocol method (not tool call).\n *\n * Task lifecycle methods (`tasks/get`, `tasks/result`, `tasks/list`,\n * `tasks/cancel`) are MCP protocol methods, not AdCP operations.\n * `extractAdcpOperation` returns `undefined` for them, so the signing fetch\n * passes them through unsigned regardless of whether an `AgentSigningContext`\n * is present in ALS. That matches the RFC 9421 signing profile, which only\n * covers AdCP tool calls (`tools/call` / `message/send`).\n *\n * Re-throws auth errors (401) — only catches protocol capability errors.\n */\nexport async function getMCPTaskStatus(\n agentUrl: string,\n taskId: string,\n authToken?: string,\n debugLogs: DebugLogEntry[] = [],\n toolName?: string\n): Promise<TaskInfo> {\n validateTaskId(taskId);\n const authHeaders = buildAuthHeaders(authToken);\n\n return withCachedConnection(agentUrl, authToken, authHeaders, debugLogs, `tasks/get:${taskId}`, async client => {\n const result = await client.experimental.tasks.getTask(taskId);\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: getTask ${taskId} → ${result.status}`,\n timestamp: new Date().toISOString(),\n });\n return mapMCPTaskToTaskInfo(\n result as {\n taskId: string;\n status: string;\n createdAt: string;\n lastUpdatedAt: string;\n statusMessage?: string;\n pollInterval?: number;\n },\n toolName\n );\n });\n}\n\n/**\n * Get task result via MCP Tasks protocol method (blocks until terminal).\n */\nexport async function getMCPTaskResult(\n agentUrl: string,\n taskId: string,\n authToken?: string,\n debugLogs: DebugLogEntry[] = []\n): Promise<unknown> {\n validateTaskId(taskId);\n const authHeaders = buildAuthHeaders(authToken);\n\n return withCachedConnection(agentUrl, authToken, authHeaders, debugLogs, `tasks/result:${taskId}`, async client => {\n const result = await client.experimental.tasks.getTaskResult(taskId);\n debugLogs.push({\n type: 'success',\n message: `MCP Tasks: getTaskResult ${taskId} received`,\n timestamp: new Date().toISOString(),\n });\n return result;\n });\n}\n\n/**\n * List tasks via MCP Tasks protocol method.\n */\nexport async function listMCPTasks(\n agentUrl: string,\n authToken?: string,\n debugLogs: DebugLogEntry[] = [],\n options: MCPTaskProtocolOptions = {}\n): Promise<TaskInfo[]> {\n const authHeaders = buildAuthHeaders(authToken);\n\n return withResponseSizeLimit(options.transport?.maxResponseBytes, () =>\n withTransportDiagnostics(\n {\n agentId: options.transportActivityContext?.agentId ?? 'unknown-agent',\n protocol: 'mcp',\n tool: 'tasks/list',\n taskType: 'tasks/list',\n ...options.transportActivityContext,\n onTransportActivity: options.onTransportActivity,\n },\n () =>\n withCachedConnection(\n agentUrl,\n authToken,\n authHeaders,\n debugLogs,\n 'tasks/list',\n async client => {\n const result = await client.experimental.tasks.listTasks();\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: listTasks returned ${result.tasks.length} tasks`,\n timestamp: new Date().toISOString(),\n });\n return result.tasks.map((task: any) => mapMCPTaskToTaskInfo(task));\n },\n options.transport?.fetchFn,\n { requestTimeoutMs: options.transport?.requestTimeoutMs }\n )\n )\n );\n}\n\n/**\n * Cancel a task via MCP Tasks protocol method.\n */\nexport async function cancelMCPTask(\n agentUrl: string,\n taskId: string,\n authToken?: string,\n debugLogs: DebugLogEntry[] = []\n): Promise<void> {\n validateTaskId(taskId);\n const authHeaders = buildAuthHeaders(authToken);\n\n await withCachedConnection(agentUrl, authToken, authHeaders, debugLogs, `tasks/cancel:${taskId}`, async client => {\n await client.experimental.tasks.cancelTask(taskId);\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: cancelTask ${taskId} succeeded`,\n timestamp: new Date().toISOString(),\n });\n });\n}\n"],"mappings":"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","names":[]}
@@ -103,7 +103,8 @@ async function callMCPToolWithTasks(agentUrl, toolName, args, authToken, debugLo
103
103
  const modernAttempt = await tryCallModernMCPTool(agentUrl, toolName, args, authToken, debugLogs, customHeaders, {
104
104
  ...options?.signingContext && { signingContext: options.signingContext },
105
105
  ...options?.signal && { signal: options.signal },
106
- ...options?.requestTimeoutMs !== void 0 && { requestTimeoutMs: options.requestTimeoutMs }
106
+ ...options?.requestTimeoutMs !== void 0 && { requestTimeoutMs: options.requestTimeoutMs },
107
+ ...options?.fetchFn && { fetchFn: options.fetchFn }
107
108
  });
108
109
  if (modernAttempt.handled) {
109
110
  debugLogs.push({
@@ -138,7 +139,7 @@ async function callMCPToolWithTasks(agentUrl, toolName, args, authToken, debugLo
138
139
  options?.signal,
139
140
  options?.requestTimeoutMs
140
141
  ),
141
- void 0,
142
+ options?.fetchFn,
142
143
  { signal: options?.signal, requestTimeoutMs: options?.requestTimeoutMs }
143
144
  );
144
145
  })
@@ -344,15 +345,24 @@ async function listMCPTasks(agentUrl, authToken, debugLogs = [], options = {}) {
344
345
  ...options.transportActivityContext,
345
346
  onTransportActivity: options.onTransportActivity
346
347
  },
347
- () => withCachedConnection(agentUrl, authToken, authHeaders, debugLogs, "tasks/list", async (client) => {
348
- const result = await client.experimental.tasks.listTasks();
349
- debugLogs.push({
350
- type: "info",
351
- message: `MCP Tasks: listTasks returned ${result.tasks.length} tasks`,
352
- timestamp: (/* @__PURE__ */ new Date()).toISOString()
353
- });
354
- return result.tasks.map((task) => mapMCPTaskToTaskInfo(task));
355
- })
348
+ () => withCachedConnection(
349
+ agentUrl,
350
+ authToken,
351
+ authHeaders,
352
+ debugLogs,
353
+ "tasks/list",
354
+ async (client) => {
355
+ const result = await client.experimental.tasks.listTasks();
356
+ debugLogs.push({
357
+ type: "info",
358
+ message: `MCP Tasks: listTasks returned ${result.tasks.length} tasks`,
359
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
360
+ });
361
+ return result.tasks.map((task) => mapMCPTaskToTaskInfo(task));
362
+ },
363
+ options.transport?.fetchFn,
364
+ { requestTimeoutMs: options.transport?.requestTimeoutMs }
365
+ )
356
366
  )
357
367
  );
358
368
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/protocols/mcp-tasks.ts"],"sourcesContent":["import { fileURLToPath as __adcpFileURLToPath } from 'node:url';\nimport { dirname as __adcpDirname } from 'node:path';\nimport { createRequire as __adcpCreateRequire } from 'node:module';\nconst __dirname = __adcpDirname(__adcpFileURLToPath(import.meta.url));\nconst require = __adcpCreateRequire(import.meta.url);\n/**\n * MCP Tasks protocol integration for async tool calls.\n *\n * When an MCP server declares `capabilities.tasks.requests.tools.call`, this module\n * uses the SDK's experimental tasks API instead of custom AdCP tool calls for async\n * lifecycle management. This removes the LLM from the polling path.\n *\n * Detection: check `client.getServerCapabilities()?.tasks?.requests?.tools?.call`\n * after connection. The SDK's `isToolTask()` auto-detects per-tool `taskSupport`.\n */\n\nimport type { Client as MCPClient } from '@modelcontextprotocol/sdk/client/index.js';\nimport type { DebugLogEntry } from '../types/adcp';\nimport type { TaskInfo } from '../core/ConversationTypes';\nimport { withCachedConnection } from './mcp';\nimport { createMCPAuthHeaders } from '../auth';\nimport { withSpan, injectTraceHeaders } from '../observability/tracing';\nimport { signingContextStorage, type AgentSigningContext } from '../signing/client';\nimport { redactIdempotencyKeyInArgs } from '../utils/idempotency';\nimport { withResponseSizeLimit } from './responseSizeLimit';\nimport { withTransportDiagnostics, type TransportActivityHandler } from './transportDiagnostics';\nimport { isAbortOrTimeoutError, resolveClientRequestTimeoutMs } from './abort';\nimport { tryCallModernMCPTool } from './mcp-modern';\n\n/** Response shape returned by MCPClient.callTool(). */\ntype CallToolResponse = {\n isError?: boolean;\n content?: Array<{ type: string; text?: string }>;\n [key: string]: unknown;\n};\n\ninterface MCPTaskProtocolOptions {\n transport?: { maxResponseBytes?: number };\n onTransportActivity?: TransportActivityHandler;\n transportActivityContext?: {\n agentId: string;\n operationId?: string;\n taskId?: string;\n contextId?: string;\n idempotencyKey?: string;\n };\n}\n\n/**\n * Track which MCP clients have had listTools() called.\n * The SDK's isToolTask() needs tool metadata from listTools() to determine\n * per-tool taskSupport. Without this, callToolStream silently degrades to\n * a synchronous tools/call (no task creation).\n */\nconst toolsListedClients = new WeakSet<MCPClient>();\n\n/**\n * Ensure tool metadata is cached in the SDK so isToolTask() works.\n * Called once per client connection when tasks are supported.\n */\nasync function ensureToolsListed(client: MCPClient, signal?: AbortSignal, requestTimeoutMs?: number): Promise<void> {\n if (toolsListedClients.has(client)) return;\n await client.listTools(undefined, {\n ...(signal && { signal }),\n ...(requestTimeoutMs !== undefined && { timeout: requestTimeoutMs }),\n });\n toolsListedClients.add(client);\n}\n\n/**\n * Check if an MCP server supports the Tasks protocol for tool calls.\n */\nexport function serverSupportsTasks(client: MCPClient): boolean {\n const caps = client.getServerCapabilities();\n return !!(caps as Record<string, any>)?.tasks?.requests?.tools?.call;\n}\n\n/**\n * Map MCP Tasks status to AdCP status.\n *\n * MCP Tasks uses underscores and British spelling; AdCP uses hyphens and American spelling.\n */\nexport function mapMCPTaskStatus(mcpStatus: string): string {\n switch (mcpStatus) {\n case 'working':\n return 'working';\n case 'input_required':\n return 'input-required';\n case 'completed':\n return 'completed';\n case 'failed':\n return 'failed';\n case 'cancelled':\n return 'canceled';\n default:\n return mcpStatus;\n }\n}\n\n/**\n * Map an MCP Task object to an AdCP TaskInfo.\n */\nfunction mapMCPTaskToTaskInfo(\n task: {\n taskId: string;\n status: string;\n createdAt: string;\n lastUpdatedAt: string;\n statusMessage?: string;\n pollInterval?: number;\n },\n toolName?: string\n): TaskInfo {\n // Project `statusMessage → TaskInfo.error` against the\n // POST-MAPPING AdCP status (not the raw MCP-side status). MCP\n // Tasks emits `'cancelled'` (British) and never `'rejected'` as a\n // standard status; checking against the AdCP set after mapping\n // catches all terminal failures uniformly. Sellers that extend\n // MCP with custom statuses (e.g. emit `'rejected'` via spec\n // extension) flow through unchanged via the `default` arm of\n // {@link mapMCPTaskStatus}.\n const adcpStatus = mapMCPTaskStatus(task.status);\n const isTerminalFailure = adcpStatus === 'failed' || adcpStatus === 'rejected' || adcpStatus === 'canceled';\n return {\n taskId: task.taskId,\n status: adcpStatus,\n taskType: toolName ?? 'unknown',\n createdAt: new Date(task.createdAt).getTime(),\n updatedAt: new Date(task.lastUpdatedAt).getTime(),\n error: isTerminalFailure ? task.statusMessage : undefined,\n };\n}\n\n/**\n * Build auth headers for MCP connections.\n */\nfunction buildAuthHeaders(authToken?: string, customHeaders?: Record<string, string>): Record<string, string> {\n const traceHeaders = injectTraceHeaders();\n return {\n ...customHeaders,\n ...traceHeaders,\n ...(authToken ? createMCPAuthHeaders(authToken) : {}),\n };\n}\n\n/**\n * Redact sensitive fields from tool args before logging.\n *\n * Redacts:\n * - `push_notification_config.authentication` — webhook signing secret\n * - `idempotency_key` — retry-pattern oracle within the seller's TTL; opt-in\n * full logging via `ADCP_LOG_IDEMPOTENCY_KEYS=1`\n */\nfunction redactArgsForLog(args: Record<string, unknown>): Record<string, unknown> {\n let redacted: Record<string, unknown> = args;\n if (redacted.push_notification_config) {\n redacted = {\n ...redacted,\n push_notification_config: {\n ...(redacted.push_notification_config as object),\n authentication: '***',\n },\n };\n }\n return redactIdempotencyKeyInArgs(redacted);\n}\n\n/**\n * Validate taskId before passing to protocol methods.\n */\nfunction validateTaskId(taskId: string): void {\n if (!taskId || typeof taskId !== 'string' || taskId.length > 256) {\n throw new Error(`Invalid taskId: expected non-empty string (max 256 chars)`);\n }\n}\n\n/**\n * Call an MCP tool with Tasks protocol support.\n *\n * If the server supports MCP Tasks and the tool has `taskSupport: 'optional' | 'required'`,\n * uses `callToolStream()` which handles task creation, polling, and result retrieval.\n *\n * If the server doesn't support tasks, falls back to regular `client.callTool()`.\n *\n * The stream is consumed with a timeout. If the task doesn't complete within the timeout,\n * returns a working-status response with the MCP task_id for follow-up polling.\n */\nexport async function callMCPToolWithTasks(\n agentUrl: string,\n toolName: string,\n args: Record<string, unknown>,\n authToken?: string,\n debugLogs: DebugLogEntry[] = [],\n customHeaders?: Record<string, string>,\n options?: {\n workingTimeout?: number;\n signingContext?: AgentSigningContext;\n signal?: AbortSignal;\n requestTimeoutMs?: number;\n }\n): Promise<unknown> {\n // Keep the public debug-log contract identical across modern and legacy\n // protocol eras. Era negotiation happens after these common entries; the\n // selected transport appends its own connection diagnostics.\n debugLogs.push({\n type: 'info',\n message: `MCP: Auth configuration`,\n timestamp: new Date().toISOString(),\n hasAuth: !!authToken,\n headers: authToken ? { 'x-adcp-auth': '***' } : {},\n customHeaderKeys: customHeaders ? Object.keys(customHeaders) : [],\n });\n\n debugLogs.push({\n type: 'info',\n message: `MCP: Calling tool ${toolName} with args: ${JSON.stringify(redactArgsForLog(args))}`,\n timestamp: new Date().toISOString(),\n });\n\n if (authToken) {\n debugLogs.push({\n type: 'info',\n message: `MCP: Transport configured with x-adcp-auth header for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n }\n\n const modernAttempt = await tryCallModernMCPTool(agentUrl, toolName, args, authToken, debugLogs, customHeaders, {\n ...(options?.signingContext && { signingContext: options.signingContext }),\n ...(options?.signal && { signal: options.signal }),\n ...(options?.requestTimeoutMs !== undefined && { requestTimeoutMs: options.requestTimeoutMs }),\n });\n if (modernAttempt.handled) {\n debugLogs.push({\n type: modernAttempt.response?.isError ? 'error' : 'success',\n message: `MCP: Tool ${toolName} response received (${modernAttempt.response?.isError ? 'error' : 'success'})`,\n timestamp: new Date().toISOString(),\n response: modernAttempt.response,\n });\n return modernAttempt.response;\n }\n\n return withSpan(\n 'adcp.mcp.call_tool',\n {\n 'adcp.tool': toolName,\n 'http.url': agentUrl,\n },\n async () =>\n signingContextStorage.run(options?.signingContext, async () => {\n const authHeaders = buildAuthHeaders(authToken, customHeaders);\n const workingTimeout = options?.workingTimeout ?? 120_000;\n\n return withCachedConnection(\n agentUrl,\n authToken,\n authHeaders,\n debugLogs,\n toolName,\n client =>\n callToolOnClient(\n client,\n toolName,\n args,\n debugLogs,\n workingTimeout,\n options?.signal,\n options?.requestTimeoutMs\n ),\n undefined,\n { signal: options?.signal, requestTimeoutMs: options?.requestTimeoutMs }\n );\n })\n );\n}\n\n/**\n * Call a tool on a pre-connected MCP `Client` without HTTP transport or connection caching.\n *\n * This is the in-process companion to `callMCPToolWithTasks`. It skips URL validation,\n * connection setup, OAuth refresh, and the reconnect-retry path — the caller owns the\n * client lifecycle. All other semantics (tasks protocol detection, stream handling,\n * timeout surfacing) are identical to the URL-based path.\n *\n * Use via `AgentClient.fromMCPClient()`. Not intended for direct import outside the\n * protocols directory.\n */\nexport async function callMCPToolWithClient(\n mcpClient: MCPClient,\n toolName: string,\n args: Record<string, unknown>,\n debugLogs: DebugLogEntry[] = [],\n options?: { workingTimeout?: number; signal?: AbortSignal; requestTimeoutMs?: number }\n): Promise<unknown> {\n debugLogs.push({\n type: 'info',\n message: `MCP: Calling tool ${toolName} (in-process) with args: ${JSON.stringify(redactArgsForLog(args))}`,\n timestamp: new Date().toISOString(),\n });\n return callToolOnClient(\n mcpClient,\n toolName,\n args,\n debugLogs,\n options?.workingTimeout ?? 120_000,\n options?.signal,\n options?.requestTimeoutMs\n );\n}\n\n/**\n * Inner dispatch logic shared by `callMCPToolWithTasks` (URL path) and\n * `callMCPToolWithClient` (in-process path). Both paths converge here once\n * a connected `MCPClient` is in hand.\n */\nasync function callToolOnClient(\n client: MCPClient,\n toolName: string,\n args: Record<string, unknown>,\n debugLogs: DebugLogEntry[],\n workingTimeout: number,\n signal?: AbortSignal,\n requestTimeoutMs?: number\n): Promise<unknown> {\n const resolvedRequestTimeoutMs = resolveClientRequestTimeoutMs(requestTimeoutMs);\n const requestOptions = {\n ...(signal && { signal }),\n ...(resolvedRequestTimeoutMs !== undefined && { timeout: resolvedRequestTimeoutMs }),\n };\n if (!serverSupportsTasks(client)) {\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Server does not support tasks, using standard callTool for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n const response = (await client.callTool(\n { name: toolName, arguments: args },\n undefined,\n requestOptions\n )) as CallToolResponse;\n\n debugLogs.push({\n type: response?.isError ? 'error' : 'success',\n message: `MCP: Tool ${toolName} response received (${response?.isError ? 'error' : 'success'})`,\n timestamp: new Date().toISOString(),\n response: response,\n });\n\n return response;\n }\n\n // Ensure tool metadata is cached so the SDK's isToolTask() works correctly.\n // Without this, callToolStream silently skips task creation for tools that\n // declare taskSupport: 'optional' | 'required'.\n await ensureToolsListed(client, signal, resolvedRequestTimeoutMs);\n\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Server supports tasks, using callToolStream for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n\n // Use callToolStream which handles the full task lifecycle\n const stream = client.experimental.tasks.callToolStream({ name: toolName, arguments: args }, undefined, {\n timeout: resolvedRequestTimeoutMs ?? workingTimeout,\n resetTimeoutOnProgress: true,\n ...(signal && { signal }),\n });\n\n let capturedTaskId: string | undefined;\n let capturedTask: { taskId: string; status: string; pollInterval?: number } | undefined;\n\n try {\n for await (const message of stream) {\n switch (message.type) {\n case 'taskCreated':\n capturedTaskId = message.task.taskId;\n capturedTask = message.task;\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Task created ${capturedTaskId} for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n break;\n\n case 'taskStatus':\n capturedTask = message.task;\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Status update for ${capturedTaskId}: ${message.task.status}`,\n timestamp: new Date().toISOString(),\n });\n break;\n\n case 'result': {\n debugLogs.push({\n type: 'success',\n message: `MCP: Tool ${toolName} response received (success)`,\n timestamp: new Date().toISOString(),\n response: message.result,\n });\n return message.result as CallToolResponse;\n }\n\n case 'error': {\n debugLogs.push({\n type: 'error',\n message: `MCP Tasks: Error for ${toolName}: ${message.error.message}`,\n timestamp: new Date().toISOString(),\n });\n // The MCP Tasks SDK error event may strip structured content.\n // If we have a taskId, fetch the full result to recover adcp_error data\n // and return it as a proper isError response for downstream unwrapping.\n if (capturedTaskId) {\n try {\n const taskResult = await client.experimental.tasks.getTaskResult(\n capturedTaskId,\n undefined,\n requestOptions\n );\n const content = taskResult?.content as Array<{ type: string; text?: string }> | undefined;\n if (content) {\n return {\n isError: true,\n content,\n structuredContent: taskResult?.structuredContent,\n } as unknown as CallToolResponse;\n }\n } catch {\n // Failed to fetch task result — fall through to throw\n }\n }\n throw message.error;\n }\n }\n }\n } catch (error) {\n if (signal?.aborted && isAbortOrTimeoutError(error)) {\n throw error;\n }\n // If we timed out but have a taskId, return a working status\n // so the caller can poll via getMCPTaskStatus/getMCPTaskResult\n if (capturedTaskId && error instanceof Error && /timeout|timed out/i.test(error.message)) {\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Timeout for ${toolName}, returning working status with taskId ${capturedTaskId}`,\n timestamp: new Date().toISOString(),\n });\n\n return {\n structuredContent: {\n status: 'working',\n task_id: capturedTaskId,\n poll_interval: capturedTask?.pollInterval,\n },\n };\n }\n if (isAbortOrTimeoutError(error)) {\n throw error;\n }\n // Servers may return a synchronous tool error (e.g. VERSION_UNSUPPORTED)\n // rather than creating a task. The Tasks SDK rejects these with a Zod\n // validation error about a missing `task` field. When no task was\n // captured, fall back to standard callTool so the error response\n // reaches the caller intact.\n const msg = error instanceof Error ? error.message : String(error);\n if (!capturedTaskId && /Invalid task creation result/i.test(msg)) {\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Server returned synchronous response for ${toolName}, falling back to callTool`,\n timestamp: new Date().toISOString(),\n });\n return (await client.callTool(\n { name: toolName, arguments: args },\n undefined,\n requestOptions\n )) as CallToolResponse;\n }\n throw error;\n }\n\n // Stream ended without result — shouldn't happen with well-behaved servers\n if (capturedTaskId) {\n return {\n structuredContent: {\n status: 'working',\n task_id: capturedTaskId,\n poll_interval: capturedTask?.pollInterval,\n },\n };\n }\n\n throw new Error(`MCP Tasks: callToolStream for ${toolName} ended without result or task`);\n}\n\n/**\n * Get task status via MCP Tasks protocol method (not tool call).\n *\n * Task lifecycle methods (`tasks/get`, `tasks/result`, `tasks/list`,\n * `tasks/cancel`) are MCP protocol methods, not AdCP operations.\n * `extractAdcpOperation` returns `undefined` for them, so the signing fetch\n * passes them through unsigned regardless of whether an `AgentSigningContext`\n * is present in ALS. That matches the RFC 9421 signing profile, which only\n * covers AdCP tool calls (`tools/call` / `message/send`).\n *\n * Re-throws auth errors (401) — only catches protocol capability errors.\n */\nexport async function getMCPTaskStatus(\n agentUrl: string,\n taskId: string,\n authToken?: string,\n debugLogs: DebugLogEntry[] = [],\n toolName?: string\n): Promise<TaskInfo> {\n validateTaskId(taskId);\n const authHeaders = buildAuthHeaders(authToken);\n\n return withCachedConnection(agentUrl, authToken, authHeaders, debugLogs, `tasks/get:${taskId}`, async client => {\n const result = await client.experimental.tasks.getTask(taskId);\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: getTask ${taskId} → ${result.status}`,\n timestamp: new Date().toISOString(),\n });\n return mapMCPTaskToTaskInfo(\n result as {\n taskId: string;\n status: string;\n createdAt: string;\n lastUpdatedAt: string;\n statusMessage?: string;\n pollInterval?: number;\n },\n toolName\n );\n });\n}\n\n/**\n * Get task result via MCP Tasks protocol method (blocks until terminal).\n */\nexport async function getMCPTaskResult(\n agentUrl: string,\n taskId: string,\n authToken?: string,\n debugLogs: DebugLogEntry[] = []\n): Promise<unknown> {\n validateTaskId(taskId);\n const authHeaders = buildAuthHeaders(authToken);\n\n return withCachedConnection(agentUrl, authToken, authHeaders, debugLogs, `tasks/result:${taskId}`, async client => {\n const result = await client.experimental.tasks.getTaskResult(taskId);\n debugLogs.push({\n type: 'success',\n message: `MCP Tasks: getTaskResult ${taskId} received`,\n timestamp: new Date().toISOString(),\n });\n return result;\n });\n}\n\n/**\n * List tasks via MCP Tasks protocol method.\n */\nexport async function listMCPTasks(\n agentUrl: string,\n authToken?: string,\n debugLogs: DebugLogEntry[] = [],\n options: MCPTaskProtocolOptions = {}\n): Promise<TaskInfo[]> {\n const authHeaders = buildAuthHeaders(authToken);\n\n return withResponseSizeLimit(options.transport?.maxResponseBytes, () =>\n withTransportDiagnostics(\n {\n agentId: options.transportActivityContext?.agentId ?? 'unknown-agent',\n protocol: 'mcp',\n tool: 'tasks/list',\n taskType: 'tasks/list',\n ...options.transportActivityContext,\n onTransportActivity: options.onTransportActivity,\n },\n () =>\n withCachedConnection(agentUrl, authToken, authHeaders, debugLogs, 'tasks/list', async client => {\n const result = await client.experimental.tasks.listTasks();\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: listTasks returned ${result.tasks.length} tasks`,\n timestamp: new Date().toISOString(),\n });\n return result.tasks.map((task: any) => mapMCPTaskToTaskInfo(task));\n })\n )\n );\n}\n\n/**\n * Cancel a task via MCP Tasks protocol method.\n */\nexport async function cancelMCPTask(\n agentUrl: string,\n taskId: string,\n authToken?: string,\n debugLogs: DebugLogEntry[] = []\n): Promise<void> {\n validateTaskId(taskId);\n const authHeaders = buildAuthHeaders(authToken);\n\n await withCachedConnection(agentUrl, authToken, authHeaders, debugLogs, `tasks/cancel:${taskId}`, async client => {\n await client.experimental.tasks.cancelTask(taskId);\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: cancelTask ${taskId} succeeded`,\n timestamp: new Date().toISOString(),\n });\n });\n}\n"],"mappings":"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","names":["require"]}
1
+ {"version":3,"sources":["../../../src/lib/protocols/mcp-tasks.ts"],"sourcesContent":["import { fileURLToPath as __adcpFileURLToPath } from 'node:url';\nimport { dirname as __adcpDirname } from 'node:path';\nimport { createRequire as __adcpCreateRequire } from 'node:module';\nconst __dirname = __adcpDirname(__adcpFileURLToPath(import.meta.url));\nconst require = __adcpCreateRequire(import.meta.url);\n/**\n * MCP Tasks protocol integration for async tool calls.\n *\n * When an MCP server declares `capabilities.tasks.requests.tools.call`, this module\n * uses the SDK's experimental tasks API instead of custom AdCP tool calls for async\n * lifecycle management. This removes the LLM from the polling path.\n *\n * Detection: check `client.getServerCapabilities()?.tasks?.requests?.tools?.call`\n * after connection. The SDK's `isToolTask()` auto-detects per-tool `taskSupport`.\n */\n\nimport type { Client as MCPClient } from '@modelcontextprotocol/sdk/client/index.js';\nimport type { DebugLogEntry } from '../types/adcp';\nimport type { TaskInfo } from '../core/ConversationTypes';\nimport { withCachedConnection } from './mcp';\nimport { createMCPAuthHeaders } from '../auth';\nimport { withSpan, injectTraceHeaders } from '../observability/tracing';\nimport { signingContextStorage, type AgentSigningContext } from '../signing/client';\nimport { redactIdempotencyKeyInArgs } from '../utils/idempotency';\nimport { withResponseSizeLimit } from './responseSizeLimit';\nimport { withTransportDiagnostics, type TransportActivityHandler } from './transportDiagnostics';\nimport { isAbortOrTimeoutError, resolveClientRequestTimeoutMs } from './abort';\nimport { tryCallModernMCPTool } from './mcp-modern';\n\n/** Response shape returned by MCPClient.callTool(). */\ntype CallToolResponse = {\n isError?: boolean;\n content?: Array<{ type: string; text?: string }>;\n [key: string]: unknown;\n};\n\ninterface MCPTaskProtocolOptions {\n transport?: { maxResponseBytes?: number; fetchFn?: typeof fetch; requestTimeoutMs?: number };\n onTransportActivity?: TransportActivityHandler;\n transportActivityContext?: {\n agentId: string;\n operationId?: string;\n taskId?: string;\n contextId?: string;\n idempotencyKey?: string;\n };\n}\n\n/**\n * Track which MCP clients have had listTools() called.\n * The SDK's isToolTask() needs tool metadata from listTools() to determine\n * per-tool taskSupport. Without this, callToolStream silently degrades to\n * a synchronous tools/call (no task creation).\n */\nconst toolsListedClients = new WeakSet<MCPClient>();\n\n/**\n * Ensure tool metadata is cached in the SDK so isToolTask() works.\n * Called once per client connection when tasks are supported.\n */\nasync function ensureToolsListed(client: MCPClient, signal?: AbortSignal, requestTimeoutMs?: number): Promise<void> {\n if (toolsListedClients.has(client)) return;\n await client.listTools(undefined, {\n ...(signal && { signal }),\n ...(requestTimeoutMs !== undefined && { timeout: requestTimeoutMs }),\n });\n toolsListedClients.add(client);\n}\n\n/**\n * Check if an MCP server supports the Tasks protocol for tool calls.\n */\nexport function serverSupportsTasks(client: MCPClient): boolean {\n const caps = client.getServerCapabilities();\n return !!(caps as Record<string, any>)?.tasks?.requests?.tools?.call;\n}\n\n/**\n * Map MCP Tasks status to AdCP status.\n *\n * MCP Tasks uses underscores and British spelling; AdCP uses hyphens and American spelling.\n */\nexport function mapMCPTaskStatus(mcpStatus: string): string {\n switch (mcpStatus) {\n case 'working':\n return 'working';\n case 'input_required':\n return 'input-required';\n case 'completed':\n return 'completed';\n case 'failed':\n return 'failed';\n case 'cancelled':\n return 'canceled';\n default:\n return mcpStatus;\n }\n}\n\n/**\n * Map an MCP Task object to an AdCP TaskInfo.\n */\nfunction mapMCPTaskToTaskInfo(\n task: {\n taskId: string;\n status: string;\n createdAt: string;\n lastUpdatedAt: string;\n statusMessage?: string;\n pollInterval?: number;\n },\n toolName?: string\n): TaskInfo {\n // Project `statusMessage → TaskInfo.error` against the\n // POST-MAPPING AdCP status (not the raw MCP-side status). MCP\n // Tasks emits `'cancelled'` (British) and never `'rejected'` as a\n // standard status; checking against the AdCP set after mapping\n // catches all terminal failures uniformly. Sellers that extend\n // MCP with custom statuses (e.g. emit `'rejected'` via spec\n // extension) flow through unchanged via the `default` arm of\n // {@link mapMCPTaskStatus}.\n const adcpStatus = mapMCPTaskStatus(task.status);\n const isTerminalFailure = adcpStatus === 'failed' || adcpStatus === 'rejected' || adcpStatus === 'canceled';\n return {\n taskId: task.taskId,\n status: adcpStatus,\n taskType: toolName ?? 'unknown',\n createdAt: new Date(task.createdAt).getTime(),\n updatedAt: new Date(task.lastUpdatedAt).getTime(),\n error: isTerminalFailure ? task.statusMessage : undefined,\n };\n}\n\n/**\n * Build auth headers for MCP connections.\n */\nfunction buildAuthHeaders(authToken?: string, customHeaders?: Record<string, string>): Record<string, string> {\n const traceHeaders = injectTraceHeaders();\n return {\n ...customHeaders,\n ...traceHeaders,\n ...(authToken ? createMCPAuthHeaders(authToken) : {}),\n };\n}\n\n/**\n * Redact sensitive fields from tool args before logging.\n *\n * Redacts:\n * - `push_notification_config.authentication` — webhook signing secret\n * - `idempotency_key` — retry-pattern oracle within the seller's TTL; opt-in\n * full logging via `ADCP_LOG_IDEMPOTENCY_KEYS=1`\n */\nfunction redactArgsForLog(args: Record<string, unknown>): Record<string, unknown> {\n let redacted: Record<string, unknown> = args;\n if (redacted.push_notification_config) {\n redacted = {\n ...redacted,\n push_notification_config: {\n ...(redacted.push_notification_config as object),\n authentication: '***',\n },\n };\n }\n return redactIdempotencyKeyInArgs(redacted);\n}\n\n/**\n * Validate taskId before passing to protocol methods.\n */\nfunction validateTaskId(taskId: string): void {\n if (!taskId || typeof taskId !== 'string' || taskId.length > 256) {\n throw new Error(`Invalid taskId: expected non-empty string (max 256 chars)`);\n }\n}\n\n/**\n * Call an MCP tool with Tasks protocol support.\n *\n * If the server supports MCP Tasks and the tool has `taskSupport: 'optional' | 'required'`,\n * uses `callToolStream()` which handles task creation, polling, and result retrieval.\n *\n * If the server doesn't support tasks, falls back to regular `client.callTool()`.\n *\n * The stream is consumed with a timeout. If the task doesn't complete within the timeout,\n * returns a working-status response with the MCP task_id for follow-up polling.\n */\nexport async function callMCPToolWithTasks(\n agentUrl: string,\n toolName: string,\n args: Record<string, unknown>,\n authToken?: string,\n debugLogs: DebugLogEntry[] = [],\n customHeaders?: Record<string, string>,\n options?: {\n workingTimeout?: number;\n signingContext?: AgentSigningContext;\n signal?: AbortSignal;\n requestTimeoutMs?: number;\n fetchFn?: typeof fetch;\n }\n): Promise<unknown> {\n // Keep the public debug-log contract identical across modern and legacy\n // protocol eras. Era negotiation happens after these common entries; the\n // selected transport appends its own connection diagnostics.\n debugLogs.push({\n type: 'info',\n message: `MCP: Auth configuration`,\n timestamp: new Date().toISOString(),\n hasAuth: !!authToken,\n headers: authToken ? { 'x-adcp-auth': '***' } : {},\n customHeaderKeys: customHeaders ? Object.keys(customHeaders) : [],\n });\n\n debugLogs.push({\n type: 'info',\n message: `MCP: Calling tool ${toolName} with args: ${JSON.stringify(redactArgsForLog(args))}`,\n timestamp: new Date().toISOString(),\n });\n\n if (authToken) {\n debugLogs.push({\n type: 'info',\n message: `MCP: Transport configured with x-adcp-auth header for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n }\n\n const modernAttempt = await tryCallModernMCPTool(agentUrl, toolName, args, authToken, debugLogs, customHeaders, {\n ...(options?.signingContext && { signingContext: options.signingContext }),\n ...(options?.signal && { signal: options.signal }),\n ...(options?.requestTimeoutMs !== undefined && { requestTimeoutMs: options.requestTimeoutMs }),\n ...(options?.fetchFn && { fetchFn: options.fetchFn }),\n });\n if (modernAttempt.handled) {\n debugLogs.push({\n type: modernAttempt.response?.isError ? 'error' : 'success',\n message: `MCP: Tool ${toolName} response received (${modernAttempt.response?.isError ? 'error' : 'success'})`,\n timestamp: new Date().toISOString(),\n response: modernAttempt.response,\n });\n return modernAttempt.response;\n }\n\n return withSpan(\n 'adcp.mcp.call_tool',\n {\n 'adcp.tool': toolName,\n 'http.url': agentUrl,\n },\n async () =>\n signingContextStorage.run(options?.signingContext, async () => {\n const authHeaders = buildAuthHeaders(authToken, customHeaders);\n const workingTimeout = options?.workingTimeout ?? 120_000;\n\n return withCachedConnection(\n agentUrl,\n authToken,\n authHeaders,\n debugLogs,\n toolName,\n client =>\n callToolOnClient(\n client,\n toolName,\n args,\n debugLogs,\n workingTimeout,\n options?.signal,\n options?.requestTimeoutMs\n ),\n options?.fetchFn,\n { signal: options?.signal, requestTimeoutMs: options?.requestTimeoutMs }\n );\n })\n );\n}\n\n/**\n * Call a tool on a pre-connected MCP `Client` without HTTP transport or connection caching.\n *\n * This is the in-process companion to `callMCPToolWithTasks`. It skips URL validation,\n * connection setup, OAuth refresh, and the reconnect-retry path — the caller owns the\n * client lifecycle. All other semantics (tasks protocol detection, stream handling,\n * timeout surfacing) are identical to the URL-based path.\n *\n * Use via `AgentClient.fromMCPClient()`. Not intended for direct import outside the\n * protocols directory.\n */\nexport async function callMCPToolWithClient(\n mcpClient: MCPClient,\n toolName: string,\n args: Record<string, unknown>,\n debugLogs: DebugLogEntry[] = [],\n options?: { workingTimeout?: number; signal?: AbortSignal; requestTimeoutMs?: number }\n): Promise<unknown> {\n debugLogs.push({\n type: 'info',\n message: `MCP: Calling tool ${toolName} (in-process) with args: ${JSON.stringify(redactArgsForLog(args))}`,\n timestamp: new Date().toISOString(),\n });\n return callToolOnClient(\n mcpClient,\n toolName,\n args,\n debugLogs,\n options?.workingTimeout ?? 120_000,\n options?.signal,\n options?.requestTimeoutMs\n );\n}\n\n/**\n * Inner dispatch logic shared by `callMCPToolWithTasks` (URL path) and\n * `callMCPToolWithClient` (in-process path). Both paths converge here once\n * a connected `MCPClient` is in hand.\n */\nasync function callToolOnClient(\n client: MCPClient,\n toolName: string,\n args: Record<string, unknown>,\n debugLogs: DebugLogEntry[],\n workingTimeout: number,\n signal?: AbortSignal,\n requestTimeoutMs?: number\n): Promise<unknown> {\n const resolvedRequestTimeoutMs = resolveClientRequestTimeoutMs(requestTimeoutMs);\n const requestOptions = {\n ...(signal && { signal }),\n ...(resolvedRequestTimeoutMs !== undefined && { timeout: resolvedRequestTimeoutMs }),\n };\n if (!serverSupportsTasks(client)) {\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Server does not support tasks, using standard callTool for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n const response = (await client.callTool(\n { name: toolName, arguments: args },\n undefined,\n requestOptions\n )) as CallToolResponse;\n\n debugLogs.push({\n type: response?.isError ? 'error' : 'success',\n message: `MCP: Tool ${toolName} response received (${response?.isError ? 'error' : 'success'})`,\n timestamp: new Date().toISOString(),\n response: response,\n });\n\n return response;\n }\n\n // Ensure tool metadata is cached so the SDK's isToolTask() works correctly.\n // Without this, callToolStream silently skips task creation for tools that\n // declare taskSupport: 'optional' | 'required'.\n await ensureToolsListed(client, signal, resolvedRequestTimeoutMs);\n\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Server supports tasks, using callToolStream for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n\n // Use callToolStream which handles the full task lifecycle\n const stream = client.experimental.tasks.callToolStream({ name: toolName, arguments: args }, undefined, {\n timeout: resolvedRequestTimeoutMs ?? workingTimeout,\n resetTimeoutOnProgress: true,\n ...(signal && { signal }),\n });\n\n let capturedTaskId: string | undefined;\n let capturedTask: { taskId: string; status: string; pollInterval?: number } | undefined;\n\n try {\n for await (const message of stream) {\n switch (message.type) {\n case 'taskCreated':\n capturedTaskId = message.task.taskId;\n capturedTask = message.task;\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Task created ${capturedTaskId} for ${toolName}`,\n timestamp: new Date().toISOString(),\n });\n break;\n\n case 'taskStatus':\n capturedTask = message.task;\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Status update for ${capturedTaskId}: ${message.task.status}`,\n timestamp: new Date().toISOString(),\n });\n break;\n\n case 'result': {\n debugLogs.push({\n type: 'success',\n message: `MCP: Tool ${toolName} response received (success)`,\n timestamp: new Date().toISOString(),\n response: message.result,\n });\n return message.result as CallToolResponse;\n }\n\n case 'error': {\n debugLogs.push({\n type: 'error',\n message: `MCP Tasks: Error for ${toolName}: ${message.error.message}`,\n timestamp: new Date().toISOString(),\n });\n // The MCP Tasks SDK error event may strip structured content.\n // If we have a taskId, fetch the full result to recover adcp_error data\n // and return it as a proper isError response for downstream unwrapping.\n if (capturedTaskId) {\n try {\n const taskResult = await client.experimental.tasks.getTaskResult(\n capturedTaskId,\n undefined,\n requestOptions\n );\n const content = taskResult?.content as Array<{ type: string; text?: string }> | undefined;\n if (content) {\n return {\n isError: true,\n content,\n structuredContent: taskResult?.structuredContent,\n } as unknown as CallToolResponse;\n }\n } catch {\n // Failed to fetch task result — fall through to throw\n }\n }\n throw message.error;\n }\n }\n }\n } catch (error) {\n if (signal?.aborted && isAbortOrTimeoutError(error)) {\n throw error;\n }\n // If we timed out but have a taskId, return a working status\n // so the caller can poll via getMCPTaskStatus/getMCPTaskResult\n if (capturedTaskId && error instanceof Error && /timeout|timed out/i.test(error.message)) {\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Timeout for ${toolName}, returning working status with taskId ${capturedTaskId}`,\n timestamp: new Date().toISOString(),\n });\n\n return {\n structuredContent: {\n status: 'working',\n task_id: capturedTaskId,\n poll_interval: capturedTask?.pollInterval,\n },\n };\n }\n if (isAbortOrTimeoutError(error)) {\n throw error;\n }\n // Servers may return a synchronous tool error (e.g. VERSION_UNSUPPORTED)\n // rather than creating a task. The Tasks SDK rejects these with a Zod\n // validation error about a missing `task` field. When no task was\n // captured, fall back to standard callTool so the error response\n // reaches the caller intact.\n const msg = error instanceof Error ? error.message : String(error);\n if (!capturedTaskId && /Invalid task creation result/i.test(msg)) {\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: Server returned synchronous response for ${toolName}, falling back to callTool`,\n timestamp: new Date().toISOString(),\n });\n return (await client.callTool(\n { name: toolName, arguments: args },\n undefined,\n requestOptions\n )) as CallToolResponse;\n }\n throw error;\n }\n\n // Stream ended without result — shouldn't happen with well-behaved servers\n if (capturedTaskId) {\n return {\n structuredContent: {\n status: 'working',\n task_id: capturedTaskId,\n poll_interval: capturedTask?.pollInterval,\n },\n };\n }\n\n throw new Error(`MCP Tasks: callToolStream for ${toolName} ended without result or task`);\n}\n\n/**\n * Get task status via MCP Tasks protocol method (not tool call).\n *\n * Task lifecycle methods (`tasks/get`, `tasks/result`, `tasks/list`,\n * `tasks/cancel`) are MCP protocol methods, not AdCP operations.\n * `extractAdcpOperation` returns `undefined` for them, so the signing fetch\n * passes them through unsigned regardless of whether an `AgentSigningContext`\n * is present in ALS. That matches the RFC 9421 signing profile, which only\n * covers AdCP tool calls (`tools/call` / `message/send`).\n *\n * Re-throws auth errors (401) — only catches protocol capability errors.\n */\nexport async function getMCPTaskStatus(\n agentUrl: string,\n taskId: string,\n authToken?: string,\n debugLogs: DebugLogEntry[] = [],\n toolName?: string\n): Promise<TaskInfo> {\n validateTaskId(taskId);\n const authHeaders = buildAuthHeaders(authToken);\n\n return withCachedConnection(agentUrl, authToken, authHeaders, debugLogs, `tasks/get:${taskId}`, async client => {\n const result = await client.experimental.tasks.getTask(taskId);\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: getTask ${taskId} → ${result.status}`,\n timestamp: new Date().toISOString(),\n });\n return mapMCPTaskToTaskInfo(\n result as {\n taskId: string;\n status: string;\n createdAt: string;\n lastUpdatedAt: string;\n statusMessage?: string;\n pollInterval?: number;\n },\n toolName\n );\n });\n}\n\n/**\n * Get task result via MCP Tasks protocol method (blocks until terminal).\n */\nexport async function getMCPTaskResult(\n agentUrl: string,\n taskId: string,\n authToken?: string,\n debugLogs: DebugLogEntry[] = []\n): Promise<unknown> {\n validateTaskId(taskId);\n const authHeaders = buildAuthHeaders(authToken);\n\n return withCachedConnection(agentUrl, authToken, authHeaders, debugLogs, `tasks/result:${taskId}`, async client => {\n const result = await client.experimental.tasks.getTaskResult(taskId);\n debugLogs.push({\n type: 'success',\n message: `MCP Tasks: getTaskResult ${taskId} received`,\n timestamp: new Date().toISOString(),\n });\n return result;\n });\n}\n\n/**\n * List tasks via MCP Tasks protocol method.\n */\nexport async function listMCPTasks(\n agentUrl: string,\n authToken?: string,\n debugLogs: DebugLogEntry[] = [],\n options: MCPTaskProtocolOptions = {}\n): Promise<TaskInfo[]> {\n const authHeaders = buildAuthHeaders(authToken);\n\n return withResponseSizeLimit(options.transport?.maxResponseBytes, () =>\n withTransportDiagnostics(\n {\n agentId: options.transportActivityContext?.agentId ?? 'unknown-agent',\n protocol: 'mcp',\n tool: 'tasks/list',\n taskType: 'tasks/list',\n ...options.transportActivityContext,\n onTransportActivity: options.onTransportActivity,\n },\n () =>\n withCachedConnection(\n agentUrl,\n authToken,\n authHeaders,\n debugLogs,\n 'tasks/list',\n async client => {\n const result = await client.experimental.tasks.listTasks();\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: listTasks returned ${result.tasks.length} tasks`,\n timestamp: new Date().toISOString(),\n });\n return result.tasks.map((task: any) => mapMCPTaskToTaskInfo(task));\n },\n options.transport?.fetchFn,\n { requestTimeoutMs: options.transport?.requestTimeoutMs }\n )\n )\n );\n}\n\n/**\n * Cancel a task via MCP Tasks protocol method.\n */\nexport async function cancelMCPTask(\n agentUrl: string,\n taskId: string,\n authToken?: string,\n debugLogs: DebugLogEntry[] = []\n): Promise<void> {\n validateTaskId(taskId);\n const authHeaders = buildAuthHeaders(authToken);\n\n await withCachedConnection(agentUrl, authToken, authHeaders, debugLogs, `tasks/cancel:${taskId}`, async client => {\n await client.experimental.tasks.cancelTask(taskId);\n debugLogs.push({\n type: 'info',\n message: `MCP Tasks: cancelTask ${taskId} succeeded`,\n timestamp: new Date().toISOString(),\n });\n });\n}\n"],"mappings":"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","names":["require"]}