mppx 0.6.31 → 0.8.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 (616) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/README.md +20 -11
  3. package/dist/Challenge.d.ts.map +1 -1
  4. package/dist/Challenge.js +27 -13
  5. package/dist/Challenge.js.map +1 -1
  6. package/dist/Constants.d.ts +46 -0
  7. package/dist/Constants.d.ts.map +1 -0
  8. package/dist/Constants.js +46 -0
  9. package/dist/Constants.js.map +1 -0
  10. package/dist/Credential.d.ts.map +1 -1
  11. package/dist/Credential.js +5 -4
  12. package/dist/Credential.js.map +1 -1
  13. package/dist/Mcp.d.ts +3 -0
  14. package/dist/Mcp.d.ts.map +1 -1
  15. package/dist/Mcp.js +2 -0
  16. package/dist/Mcp.js.map +1 -1
  17. package/dist/Method.d.ts +32 -4
  18. package/dist/Method.d.ts.map +1 -1
  19. package/dist/Method.js +5 -2
  20. package/dist/Method.js.map +1 -1
  21. package/dist/PaymentRequest.d.ts +10 -10
  22. package/dist/PaymentRequest.js +8 -8
  23. package/dist/Receipt.d.ts.map +1 -1
  24. package/dist/Receipt.js +3 -2
  25. package/dist/Receipt.js.map +1 -1
  26. package/dist/cli/cli.d.ts.map +1 -1
  27. package/dist/cli/cli.js +19 -11
  28. package/dist/cli/cli.js.map +1 -1
  29. package/dist/cli/plugins/tempo.d.ts.map +1 -1
  30. package/dist/cli/plugins/tempo.js +17 -6
  31. package/dist/cli/plugins/tempo.js.map +1 -1
  32. package/dist/cli/utils.d.ts +5 -0
  33. package/dist/cli/utils.d.ts.map +1 -1
  34. package/dist/cli/utils.js +10 -0
  35. package/dist/cli/utils.js.map +1 -1
  36. package/dist/client/Methods.d.ts +5 -2
  37. package/dist/client/Methods.d.ts.map +1 -1
  38. package/dist/client/Methods.js +5 -2
  39. package/dist/client/Methods.js.map +1 -1
  40. package/dist/client/Mppx.js +2 -2
  41. package/dist/client/Mppx.js.map +1 -1
  42. package/dist/client/Transport.d.ts +11 -16
  43. package/dist/client/Transport.d.ts.map +1 -1
  44. package/dist/client/Transport.js +55 -76
  45. package/dist/client/Transport.js.map +1 -1
  46. package/dist/client/index.d.ts +5 -1
  47. package/dist/client/index.d.ts.map +1 -1
  48. package/dist/client/index.js +3 -1
  49. package/dist/client/index.js.map +1 -1
  50. package/dist/client/internal/Fetch.d.ts.map +1 -1
  51. package/dist/client/internal/Fetch.js +60 -13
  52. package/dist/client/internal/Fetch.js.map +1 -1
  53. package/dist/client/internal/protocols/Mcp.d.ts +7 -0
  54. package/dist/client/internal/protocols/Mcp.d.ts.map +1 -0
  55. package/dist/client/internal/protocols/Mcp.js +159 -0
  56. package/dist/client/internal/protocols/Mcp.js.map +1 -0
  57. package/dist/client/internal/protocols/Mpp.d.ts +4 -0
  58. package/dist/client/internal/protocols/Mpp.d.ts.map +1 -0
  59. package/dist/client/internal/protocols/Mpp.js +18 -0
  60. package/dist/client/internal/protocols/Mpp.js.map +1 -0
  61. package/dist/client/internal/protocols/Protocol.d.ts +10 -0
  62. package/dist/client/internal/protocols/Protocol.d.ts.map +1 -0
  63. package/dist/client/internal/protocols/Protocol.js +2 -0
  64. package/dist/client/internal/protocols/Protocol.js.map +1 -0
  65. package/dist/client/internal/protocols/Shared.d.ts +5 -0
  66. package/dist/client/internal/protocols/Shared.d.ts.map +1 -0
  67. package/dist/client/internal/protocols/Shared.js +20 -0
  68. package/dist/client/internal/protocols/Shared.js.map +1 -0
  69. package/dist/client/internal/protocols/X402.d.ts +8 -0
  70. package/dist/client/internal/protocols/X402.d.ts.map +1 -0
  71. package/dist/client/internal/protocols/X402.js +39 -0
  72. package/dist/client/internal/protocols/X402.js.map +1 -0
  73. package/dist/evm/client/index.d.ts +1 -0
  74. package/dist/evm/client/index.d.ts.map +1 -1
  75. package/dist/evm/client/index.js +1 -0
  76. package/dist/evm/client/index.js.map +1 -1
  77. package/dist/evm/index.d.ts +2 -0
  78. package/dist/evm/index.d.ts.map +1 -1
  79. package/dist/evm/index.js +2 -0
  80. package/dist/evm/index.js.map +1 -1
  81. package/dist/evm/server/Methods.d.ts +1 -1
  82. package/dist/evm/server/Methods.d.ts.map +1 -1
  83. package/dist/evm/server/index.d.ts +1 -0
  84. package/dist/evm/server/index.d.ts.map +1 -1
  85. package/dist/evm/server/index.js +1 -0
  86. package/dist/evm/server/index.js.map +1 -1
  87. package/dist/index.d.ts +1 -0
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/index.js +1 -0
  90. package/dist/index.js.map +1 -1
  91. package/dist/internal/AcceptPayment.d.ts +3 -0
  92. package/dist/internal/AcceptPayment.d.ts.map +1 -1
  93. package/dist/internal/AcceptPayment.js +15 -11
  94. package/dist/internal/AcceptPayment.js.map +1 -1
  95. package/dist/mcp/client/McpClient.d.ts +101 -0
  96. package/dist/mcp/client/McpClient.d.ts.map +1 -0
  97. package/dist/mcp/client/McpClient.js +162 -0
  98. package/dist/mcp/client/McpClient.js.map +1 -0
  99. package/dist/mcp/client/index.d.ts.map +1 -0
  100. package/dist/mcp/client/index.js.map +1 -0
  101. package/dist/mcp/server/Transport.d.ts.map +1 -0
  102. package/dist/mcp/server/Transport.js.map +1 -0
  103. package/dist/mcp/server/index.d.ts.map +1 -0
  104. package/dist/mcp/server/index.js.map +1 -0
  105. package/dist/server/Mppx.d.ts +12 -4
  106. package/dist/server/Mppx.d.ts.map +1 -1
  107. package/dist/server/Mppx.js +85 -27
  108. package/dist/server/Mppx.js.map +1 -1
  109. package/dist/server/Response.d.ts.map +1 -1
  110. package/dist/server/Response.js +2 -1
  111. package/dist/server/Response.js.map +1 -1
  112. package/dist/server/Transport.d.ts +1 -1
  113. package/dist/server/Transport.d.ts.map +1 -1
  114. package/dist/server/Transport.js +5 -4
  115. package/dist/server/Transport.js.map +1 -1
  116. package/dist/server/index.d.ts +1 -0
  117. package/dist/server/index.d.ts.map +1 -1
  118. package/dist/server/index.js +1 -0
  119. package/dist/server/index.js.map +1 -1
  120. package/dist/stripe/client/Charge.d.ts +1 -1
  121. package/dist/stripe/client/Charge.d.ts.map +1 -1
  122. package/dist/stripe/client/Charge.js +3 -1
  123. package/dist/stripe/client/Charge.js.map +1 -1
  124. package/dist/stripe/server/Charge.d.ts +1 -1
  125. package/dist/stripe/server/Charge.d.ts.map +1 -1
  126. package/dist/stripe/server/Charge.js +9 -2
  127. package/dist/stripe/server/Charge.js.map +1 -1
  128. package/dist/stripe/server/Methods.d.ts +1 -1
  129. package/dist/stripe/server/Methods.d.ts.map +1 -1
  130. package/dist/stripe/server/internal/html.gen.d.ts +1 -1
  131. package/dist/stripe/server/internal/html.gen.d.ts.map +1 -1
  132. package/dist/stripe/server/internal/html.gen.js +1 -1
  133. package/dist/stripe/server/internal/html.gen.js.map +1 -1
  134. package/dist/tempo/Methods.d.ts +18 -0
  135. package/dist/tempo/Methods.d.ts.map +1 -1
  136. package/dist/tempo/Methods.js +16 -1
  137. package/dist/tempo/Methods.js.map +1 -1
  138. package/dist/tempo/Proof.d.ts +85 -1
  139. package/dist/tempo/Proof.d.ts.map +1 -1
  140. package/dist/tempo/Proof.js +35 -0
  141. package/dist/tempo/Proof.js.map +1 -1
  142. package/dist/tempo/client/Charge.d.ts +19 -1
  143. package/dist/tempo/client/Charge.d.ts.map +1 -1
  144. package/dist/tempo/client/Charge.js +47 -27
  145. package/dist/tempo/client/Charge.js.map +1 -1
  146. package/dist/tempo/client/Methods.d.ts +41 -10
  147. package/dist/tempo/client/Methods.d.ts.map +1 -1
  148. package/dist/tempo/client/Methods.js +16 -7
  149. package/dist/tempo/client/Methods.js.map +1 -1
  150. package/dist/tempo/client/ResolveAccount.d.ts +40 -0
  151. package/dist/tempo/client/ResolveAccount.d.ts.map +1 -0
  152. package/dist/tempo/client/ResolveAccount.js +2 -0
  153. package/dist/tempo/client/ResolveAccount.js.map +1 -0
  154. package/dist/tempo/client/index.d.ts +7 -4
  155. package/dist/tempo/client/index.d.ts.map +1 -1
  156. package/dist/tempo/client/index.js +5 -3
  157. package/dist/tempo/client/index.js.map +1 -1
  158. package/dist/tempo/index.d.ts +1 -0
  159. package/dist/tempo/index.d.ts.map +1 -1
  160. package/dist/tempo/index.js +1 -0
  161. package/dist/tempo/index.js.map +1 -1
  162. package/dist/tempo/internal/fee-payer.d.ts +29 -1
  163. package/dist/tempo/internal/fee-payer.d.ts.map +1 -1
  164. package/dist/tempo/internal/fee-payer.js +138 -4
  165. package/dist/tempo/internal/fee-payer.js.map +1 -1
  166. package/dist/tempo/internal/proof.d.ts +71 -5
  167. package/dist/tempo/internal/proof.d.ts.map +1 -1
  168. package/dist/tempo/internal/proof.js +42 -6
  169. package/dist/tempo/internal/proof.js.map +1 -1
  170. package/dist/tempo/{client → legacy/client}/ChannelOps.d.ts +19 -6
  171. package/dist/tempo/legacy/client/ChannelOps.d.ts.map +1 -0
  172. package/dist/tempo/{client → legacy/client}/ChannelOps.js +9 -3
  173. package/dist/tempo/legacy/client/ChannelOps.js.map +1 -0
  174. package/dist/tempo/{client → legacy/client}/Session.d.ts +23 -4
  175. package/dist/tempo/legacy/client/Session.d.ts.map +1 -0
  176. package/dist/tempo/{client → legacy/client}/Session.js +14 -7
  177. package/dist/tempo/legacy/client/Session.js.map +1 -0
  178. package/dist/tempo/{client → legacy/client}/SessionManager.d.ts +20 -5
  179. package/dist/tempo/legacy/client/SessionManager.d.ts.map +1 -0
  180. package/dist/tempo/{client → legacy/client}/SessionManager.js +30 -19
  181. package/dist/tempo/legacy/client/SessionManager.js.map +1 -0
  182. package/dist/tempo/legacy/client/index.d.ts +7 -0
  183. package/dist/tempo/legacy/client/index.d.ts.map +1 -0
  184. package/dist/tempo/legacy/client/index.js +5 -0
  185. package/dist/tempo/legacy/client/index.js.map +1 -0
  186. package/dist/tempo/legacy/index.d.ts +7 -0
  187. package/dist/tempo/legacy/index.d.ts.map +1 -0
  188. package/dist/tempo/legacy/index.js +7 -0
  189. package/dist/tempo/legacy/index.js.map +1 -0
  190. package/dist/tempo/{server → legacy/server}/Session.d.ts +28 -11
  191. package/dist/tempo/legacy/server/Session.d.ts.map +1 -0
  192. package/dist/tempo/{server → legacy/server}/Session.js +12 -10
  193. package/dist/tempo/legacy/server/Session.js.map +1 -0
  194. package/dist/tempo/legacy/server/index.d.ts +5 -0
  195. package/dist/tempo/legacy/server/index.d.ts.map +1 -0
  196. package/dist/tempo/legacy/server/index.js +5 -0
  197. package/dist/tempo/legacy/server/index.js.map +1 -0
  198. package/dist/tempo/{session → legacy/session}/Chain.d.ts +30 -23
  199. package/dist/tempo/legacy/session/Chain.d.ts.map +1 -0
  200. package/dist/tempo/{session → legacy/session}/Chain.js +12 -11
  201. package/dist/tempo/legacy/session/Chain.js.map +1 -0
  202. package/dist/tempo/{session → legacy/session}/Channel.d.ts +1 -0
  203. package/dist/tempo/legacy/session/Channel.d.ts.map +1 -0
  204. package/dist/tempo/legacy/session/Channel.js.map +1 -0
  205. package/dist/tempo/legacy/session/ChannelStore.d.ts +22 -0
  206. package/dist/tempo/legacy/session/ChannelStore.d.ts.map +1 -0
  207. package/dist/tempo/legacy/session/ChannelStore.js +6 -0
  208. package/dist/tempo/legacy/session/ChannelStore.js.map +1 -0
  209. package/dist/tempo/legacy/session/Types.d.ts +73 -0
  210. package/dist/tempo/legacy/session/Types.d.ts.map +1 -0
  211. package/dist/tempo/legacy/session/Types.js.map +1 -0
  212. package/dist/tempo/{session → legacy/session}/Voucher.d.ts +4 -4
  213. package/dist/tempo/legacy/session/Voucher.d.ts.map +1 -0
  214. package/dist/tempo/{session → legacy/session}/Voucher.js +1 -1
  215. package/dist/tempo/legacy/session/Voucher.js.map +1 -0
  216. package/dist/tempo/{session → legacy/session}/escrow.abi.d.ts +1 -0
  217. package/dist/tempo/{session → legacy/session}/escrow.abi.d.ts.map +1 -1
  218. package/dist/tempo/{session → legacy/session}/escrow.abi.js +1 -0
  219. package/dist/tempo/legacy/session/escrow.abi.js.map +1 -0
  220. package/dist/tempo/legacy/session/index.d.ts +9 -0
  221. package/dist/tempo/legacy/session/index.d.ts.map +1 -0
  222. package/dist/tempo/legacy/session/index.js +9 -0
  223. package/dist/tempo/legacy/session/index.js.map +1 -0
  224. package/dist/tempo/server/Charge.d.ts +1 -1
  225. package/dist/tempo/server/Charge.d.ts.map +1 -1
  226. package/dist/tempo/server/Charge.js +51 -30
  227. package/dist/tempo/server/Charge.js.map +1 -1
  228. package/dist/tempo/server/Methods.d.ts +67 -8
  229. package/dist/tempo/server/Methods.d.ts.map +1 -1
  230. package/dist/tempo/server/Methods.js +40 -10
  231. package/dist/tempo/server/Methods.js.map +1 -1
  232. package/dist/tempo/server/Subscription.d.ts +11 -1
  233. package/dist/tempo/server/Subscription.d.ts.map +1 -1
  234. package/dist/tempo/server/Subscription.js +135 -23
  235. package/dist/tempo/server/Subscription.js.map +1 -1
  236. package/dist/tempo/server/index.d.ts +6 -5
  237. package/dist/tempo/server/index.d.ts.map +1 -1
  238. package/dist/tempo/server/index.js +5 -5
  239. package/dist/tempo/server/index.js.map +1 -1
  240. package/dist/tempo/server/internal/html.gen.d.ts +1 -1
  241. package/dist/tempo/server/internal/html.gen.d.ts.map +1 -1
  242. package/dist/tempo/server/internal/html.gen.js +1 -1
  243. package/dist/tempo/server/internal/html.gen.js.map +1 -1
  244. package/dist/tempo/server/internal/request-body.d.ts +7 -2
  245. package/dist/tempo/server/internal/request-body.d.ts.map +1 -1
  246. package/dist/tempo/server/internal/request-body.js +20 -3
  247. package/dist/tempo/server/internal/request-body.js.map +1 -1
  248. package/dist/tempo/server/internal/transport.d.ts +8 -4
  249. package/dist/tempo/server/internal/transport.d.ts.map +1 -1
  250. package/dist/tempo/server/internal/transport.js +8 -7
  251. package/dist/tempo/server/internal/transport.js.map +1 -1
  252. package/dist/tempo/session/Snapshot.d.ts +32 -0
  253. package/dist/tempo/session/Snapshot.d.ts.map +1 -0
  254. package/dist/tempo/session/Snapshot.js +37 -0
  255. package/dist/tempo/session/Snapshot.js.map +1 -0
  256. package/dist/tempo/session/client/ChannelOps.d.ts +81 -0
  257. package/dist/tempo/session/client/ChannelOps.d.ts.map +1 -0
  258. package/dist/tempo/session/client/ChannelOps.js +201 -0
  259. package/dist/tempo/session/client/ChannelOps.js.map +1 -0
  260. package/dist/tempo/session/client/ChannelStore.d.ts +51 -0
  261. package/dist/tempo/session/client/ChannelStore.d.ts.map +1 -0
  262. package/dist/tempo/session/client/ChannelStore.js +63 -0
  263. package/dist/tempo/session/client/ChannelStore.js.map +1 -0
  264. package/dist/tempo/session/client/CredentialState.d.ts +245 -0
  265. package/dist/tempo/session/client/CredentialState.d.ts.map +1 -0
  266. package/dist/tempo/session/client/CredentialState.js +419 -0
  267. package/dist/tempo/session/client/CredentialState.js.map +1 -0
  268. package/dist/tempo/session/client/ReceiptCoordinator.d.ts +26 -0
  269. package/dist/tempo/session/client/ReceiptCoordinator.d.ts.map +1 -0
  270. package/dist/tempo/session/client/ReceiptCoordinator.js +61 -0
  271. package/dist/tempo/session/client/ReceiptCoordinator.js.map +1 -0
  272. package/dist/tempo/session/client/Runtime.d.ts +464 -0
  273. package/dist/tempo/session/client/Runtime.d.ts.map +1 -0
  274. package/dist/tempo/session/client/Runtime.js +499 -0
  275. package/dist/tempo/session/client/Runtime.js.map +1 -0
  276. package/dist/tempo/session/client/Session.d.ts +138 -0
  277. package/dist/tempo/session/client/Session.d.ts.map +1 -0
  278. package/dist/tempo/session/client/Session.js +69 -0
  279. package/dist/tempo/session/client/Session.js.map +1 -0
  280. package/dist/tempo/session/client/SessionManager.d.ts +84 -0
  281. package/dist/tempo/session/client/SessionManager.d.ts.map +1 -0
  282. package/dist/tempo/session/client/SessionManager.js +577 -0
  283. package/dist/tempo/session/client/SessionManager.js.map +1 -0
  284. package/dist/tempo/session/client/Transports.d.ts +449 -0
  285. package/dist/tempo/session/client/Transports.d.ts.map +1 -0
  286. package/dist/tempo/session/client/Transports.js +721 -0
  287. package/dist/tempo/session/client/Transports.js.map +1 -0
  288. package/dist/tempo/session/client/index.d.ts +11 -0
  289. package/dist/tempo/session/client/index.d.ts.map +1 -0
  290. package/dist/tempo/session/client/index.js +6 -0
  291. package/dist/tempo/session/client/index.js.map +1 -0
  292. package/dist/tempo/session/index.d.ts +7 -8
  293. package/dist/tempo/session/index.d.ts.map +1 -1
  294. package/dist/tempo/session/index.js +7 -8
  295. package/dist/tempo/session/index.js.map +1 -1
  296. package/dist/tempo/session/precompile/Chain.d.ts +319 -0
  297. package/dist/tempo/session/precompile/Chain.d.ts.map +1 -0
  298. package/dist/tempo/session/precompile/Chain.js +492 -0
  299. package/dist/tempo/session/precompile/Chain.js.map +1 -0
  300. package/dist/tempo/session/precompile/Channel.d.ts +46 -0
  301. package/dist/tempo/session/precompile/Channel.d.ts.map +1 -0
  302. package/dist/tempo/session/precompile/Channel.js +56 -0
  303. package/dist/tempo/session/precompile/Channel.js.map +1 -0
  304. package/dist/tempo/session/precompile/Protocol.d.ts +308 -0
  305. package/dist/tempo/session/precompile/Protocol.d.ts.map +1 -0
  306. package/dist/tempo/session/precompile/Protocol.js +264 -0
  307. package/dist/tempo/session/precompile/Protocol.js.map +1 -0
  308. package/dist/tempo/session/precompile/Voucher.d.ts +40 -0
  309. package/dist/tempo/session/precompile/Voucher.d.ts.map +1 -0
  310. package/dist/tempo/session/precompile/Voucher.js +125 -0
  311. package/dist/tempo/session/precompile/Voucher.js.map +1 -0
  312. package/dist/tempo/session/precompile/escrow.abi.d.ts +522 -0
  313. package/dist/tempo/session/precompile/escrow.abi.d.ts.map +1 -0
  314. package/dist/tempo/session/precompile/escrow.abi.js +224 -0
  315. package/dist/tempo/session/precompile/escrow.abi.js.map +1 -0
  316. package/dist/tempo/session/precompile/index.d.ts +24 -0
  317. package/dist/tempo/session/precompile/index.d.ts.map +1 -0
  318. package/dist/tempo/session/precompile/index.js +22 -0
  319. package/dist/tempo/session/precompile/index.js.map +1 -0
  320. package/dist/tempo/session/server/ChannelOps.d.ts +56 -0
  321. package/dist/tempo/session/server/ChannelOps.d.ts.map +1 -0
  322. package/dist/tempo/session/server/ChannelOps.js +91 -0
  323. package/dist/tempo/session/server/ChannelOps.js.map +1 -0
  324. package/dist/tempo/session/server/ChannelStore.d.ts +347 -0
  325. package/dist/tempo/session/server/ChannelStore.d.ts.map +1 -0
  326. package/dist/tempo/session/server/ChannelStore.js +404 -0
  327. package/dist/tempo/session/server/ChannelStore.js.map +1 -0
  328. package/dist/tempo/session/server/CredentialVerification.d.ts +85 -0
  329. package/dist/tempo/session/server/CredentialVerification.d.ts.map +1 -0
  330. package/dist/tempo/session/server/CredentialVerification.js +494 -0
  331. package/dist/tempo/session/server/CredentialVerification.js.map +1 -0
  332. package/dist/tempo/session/server/MeteredStream.d.ts +40 -0
  333. package/dist/tempo/session/server/MeteredStream.d.ts.map +1 -0
  334. package/dist/tempo/session/server/MeteredStream.js +42 -0
  335. package/dist/tempo/session/server/MeteredStream.js.map +1 -0
  336. package/dist/tempo/session/server/RequestState.d.ts +208 -0
  337. package/dist/tempo/session/server/RequestState.d.ts.map +1 -0
  338. package/dist/tempo/session/server/RequestState.js +252 -0
  339. package/dist/tempo/session/server/RequestState.js.map +1 -0
  340. package/dist/tempo/session/server/Session.d.ts +169 -0
  341. package/dist/tempo/session/server/Session.d.ts.map +1 -0
  342. package/dist/tempo/session/server/Session.js +351 -0
  343. package/dist/tempo/session/server/Session.js.map +1 -0
  344. package/dist/tempo/session/server/Settlement.d.ts +185 -0
  345. package/dist/tempo/session/server/Settlement.d.ts.map +1 -0
  346. package/dist/tempo/session/server/Settlement.js +252 -0
  347. package/dist/tempo/session/server/Settlement.js.map +1 -0
  348. package/dist/tempo/session/{Sse.d.ts → server/Sse.d.ts} +9 -56
  349. package/dist/tempo/session/server/Sse.d.ts.map +1 -0
  350. package/dist/tempo/session/server/Sse.js +184 -0
  351. package/dist/tempo/session/server/Sse.js.map +1 -0
  352. package/dist/tempo/session/server/Transports.d.ts +89 -0
  353. package/dist/tempo/session/server/Transports.d.ts.map +1 -0
  354. package/dist/tempo/session/server/Transports.js +149 -0
  355. package/dist/tempo/session/server/Transports.js.map +1 -0
  356. package/dist/tempo/session/server/Ws.d.ts +48 -0
  357. package/dist/tempo/session/server/Ws.d.ts.map +1 -0
  358. package/dist/tempo/session/server/Ws.js +244 -0
  359. package/dist/tempo/session/server/Ws.js.map +1 -0
  360. package/dist/tempo/session/server/index.d.ts +4 -0
  361. package/dist/tempo/session/server/index.d.ts.map +1 -0
  362. package/dist/tempo/session/server/index.js +2 -0
  363. package/dist/tempo/session/server/index.js.map +1 -0
  364. package/dist/tempo/subscription/KeyAuthorization.d.ts +712 -1
  365. package/dist/tempo/subscription/KeyAuthorization.d.ts.map +1 -1
  366. package/dist/tempo/subscription/Store.d.ts +2 -0
  367. package/dist/tempo/subscription/Store.d.ts.map +1 -1
  368. package/dist/tempo/subscription/Store.js +16 -1
  369. package/dist/tempo/subscription/Store.js.map +1 -1
  370. package/dist/x402/index.d.ts +1 -0
  371. package/dist/x402/index.d.ts.map +1 -1
  372. package/dist/x402/index.js +1 -0
  373. package/dist/x402/index.js.map +1 -1
  374. package/package.json +25 -9
  375. package/src/Challenge.test.ts +40 -0
  376. package/src/Challenge.ts +28 -13
  377. package/src/Constants.ts +58 -0
  378. package/src/Credential.ts +5 -4
  379. package/src/Mcp.ts +4 -0
  380. package/src/Method.ts +46 -5
  381. package/src/PaymentRequest.ts +10 -10
  382. package/src/Receipt.ts +3 -2
  383. package/src/cli/cli.test.ts +38 -43
  384. package/src/cli/cli.ts +23 -10
  385. package/src/cli/mcp.test.ts +21 -7
  386. package/src/cli/plugins/tempo.ts +21 -8
  387. package/src/cli/utils.test.ts +25 -1
  388. package/src/cli/utils.ts +10 -0
  389. package/src/client/Methods.ts +5 -2
  390. package/src/client/Mppx.test-d.ts +31 -1
  391. package/src/client/Mppx.test.ts +76 -1
  392. package/src/client/Mppx.ts +2 -2
  393. package/src/client/Transport.test.ts +225 -178
  394. package/src/client/Transport.ts +77 -84
  395. package/src/client/index.ts +25 -1
  396. package/src/client/internal/Fetch.test.ts +236 -6
  397. package/src/client/internal/Fetch.ts +69 -11
  398. package/src/client/internal/protocols/Mcp.test.ts +220 -0
  399. package/src/client/internal/protocols/Mcp.ts +162 -0
  400. package/src/client/internal/protocols/Mpp.ts +21 -0
  401. package/src/client/internal/protocols/Protocol.ts +10 -0
  402. package/src/client/internal/protocols/Shared.ts +25 -0
  403. package/src/client/internal/protocols/X402.ts +42 -0
  404. package/src/discovery/OpenApi.test.ts +1 -1
  405. package/src/env.d.ts +1 -1
  406. package/src/evm/PublicInterface.test-d.ts +1 -1
  407. package/src/evm/client/index.ts +1 -0
  408. package/src/evm/index.ts +2 -0
  409. package/src/evm/server/Charge.test.ts +1 -1
  410. package/src/evm/server/index.ts +1 -0
  411. package/src/index.ts +1 -0
  412. package/src/internal/AcceptPayment.test.ts +61 -0
  413. package/src/internal/AcceptPayment.ts +21 -14
  414. package/src/{mcp-sdk → mcp}/client/McpClient.integration.test.ts +18 -11
  415. package/src/{mcp-sdk → mcp}/client/McpClient.test-d.ts +45 -11
  416. package/src/{mcp-sdk → mcp}/client/McpClient.test.ts +211 -5
  417. package/src/mcp/client/McpClient.ts +307 -0
  418. package/src/mcp/client/McpClient.unit.test.ts +135 -0
  419. package/src/middlewares/elysia.test.ts +9 -5
  420. package/src/middlewares/express.test.ts +9 -5
  421. package/src/middlewares/hono.test.ts +5 -5
  422. package/src/middlewares/internal/mppx.test.ts +1 -1
  423. package/src/middlewares/nextjs.test.ts +9 -5
  424. package/src/proxy/Proxy.test.ts +9 -9
  425. package/src/proxy/services/anthropic.test.ts +1 -1
  426. package/src/proxy/services/openai.test.ts +1 -1
  427. package/src/proxy/services/stripe.test.ts +1 -1
  428. package/src/server/Mppx.authorize.test.ts +1 -1
  429. package/src/server/Mppx.test-d.ts +55 -1
  430. package/src/server/Mppx.test.ts +220 -9
  431. package/src/server/Mppx.ts +501 -407
  432. package/src/server/Response.ts +2 -1
  433. package/src/server/Transport.test.ts +6 -6
  434. package/src/server/Transport.ts +5 -4
  435. package/src/server/index.ts +1 -0
  436. package/src/stripe/Charge.integration.test.ts +1 -1
  437. package/src/stripe/client/Charge.test.ts +21 -6
  438. package/src/stripe/client/Charge.ts +6 -2
  439. package/src/stripe/server/Charge.test.ts +115 -2
  440. package/src/stripe/server/Charge.ts +13 -2
  441. package/src/stripe/server/internal/html/package.json +1 -1
  442. package/src/stripe/server/internal/html.gen.ts +1 -1
  443. package/src/tempo/AccessKeyAuthorization.test.ts +4 -94
  444. package/src/tempo/Methods.test.ts +45 -17
  445. package/src/tempo/Methods.ts +22 -0
  446. package/src/tempo/Proof.conformance.test.ts +146 -0
  447. package/src/tempo/Proof.test-d.ts +15 -0
  448. package/src/tempo/Proof.ts +52 -1
  449. package/src/tempo/PublicExports.test-d.ts +105 -0
  450. package/src/tempo/Subscription.integration.test.ts +1 -1
  451. package/src/tempo/client/Charge.test.ts +258 -0
  452. package/src/tempo/client/Charge.ts +84 -38
  453. package/src/tempo/client/Methods.ts +22 -8
  454. package/src/tempo/client/ResolveAccount.ts +46 -0
  455. package/src/tempo/client/index.ts +15 -4
  456. package/src/tempo/index.ts +1 -0
  457. package/src/tempo/internal/fee-payer.test.ts +296 -17
  458. package/src/tempo/internal/fee-payer.ts +186 -4
  459. package/src/tempo/internal/fee-token.test.ts +14 -9
  460. package/src/tempo/internal/proof.test.ts +12 -4
  461. package/src/tempo/internal/proof.ts +55 -6
  462. package/src/tempo/legacy/AccessKeyAuthorization.test.ts +162 -0
  463. package/src/tempo/legacy/README.md +9 -0
  464. package/src/tempo/{client → legacy/client}/ChannelOps.test.ts +6 -7
  465. package/src/tempo/{client → legacy/client}/ChannelOps.ts +22 -9
  466. package/src/tempo/{client → legacy/client}/Session.test.ts +51 -9
  467. package/src/tempo/{client → legacy/client}/Session.ts +25 -11
  468. package/src/tempo/{client → legacy/client}/SessionManager.test.ts +81 -9
  469. package/src/tempo/{client → legacy/client}/SessionManager.ts +52 -23
  470. package/src/tempo/legacy/client/index.ts +6 -0
  471. package/src/tempo/legacy/index.ts +6 -0
  472. package/src/tempo/{server → legacy/server}/Session.test.ts +136 -71
  473. package/src/tempo/{server → legacy/server}/Session.ts +32 -23
  474. package/src/tempo/legacy/server/index.ts +4 -0
  475. package/src/tempo/{session → legacy/session}/Chain.test.ts +3 -4
  476. package/src/tempo/{session → legacy/session}/Chain.ts +94 -63
  477. package/src/tempo/{session → legacy/session}/Channel.ts +1 -0
  478. package/src/tempo/legacy/session/ChannelStore.test.ts +58 -0
  479. package/src/tempo/legacy/session/ChannelStore.ts +39 -0
  480. package/src/tempo/legacy/session/Types.ts +91 -0
  481. package/src/tempo/{session → legacy/session}/Voucher.ts +12 -8
  482. package/src/tempo/{session → legacy/session}/escrow.abi.ts +1 -0
  483. package/src/tempo/legacy/session/index.ts +8 -0
  484. package/src/tempo/server/AtomicStore.test-d.ts +16 -11
  485. package/src/tempo/server/Charge.test.ts +480 -31
  486. package/src/tempo/server/Charge.ts +54 -30
  487. package/src/tempo/server/Methods.ts +58 -10
  488. package/src/tempo/server/Sse.test.ts +2 -2
  489. package/src/tempo/server/Subscription.test.ts +465 -3
  490. package/src/tempo/server/Subscription.ts +174 -19
  491. package/src/tempo/server/index.ts +6 -5
  492. package/src/tempo/server/internal/html/package.json +2 -2
  493. package/src/tempo/server/internal/html.gen.ts +1 -1
  494. package/src/tempo/server/internal/request-body.test.ts +37 -4
  495. package/src/tempo/server/internal/request-body.ts +25 -6
  496. package/src/tempo/server/internal/transport.test.ts +4 -4
  497. package/src/tempo/server/internal/transport.ts +19 -10
  498. package/src/tempo/session/Snapshot.test.ts +41 -0
  499. package/src/tempo/session/Snapshot.ts +74 -0
  500. package/src/tempo/session/client/ChannelOps.test.ts +163 -0
  501. package/src/tempo/session/client/ChannelOps.ts +330 -0
  502. package/src/tempo/session/client/ChannelStore.ts +111 -0
  503. package/src/tempo/session/client/CredentialState.test.ts +789 -0
  504. package/src/tempo/session/client/CredentialState.ts +799 -0
  505. package/src/tempo/session/client/ReceiptCoordinator.ts +95 -0
  506. package/src/tempo/session/client/Runtime.test.ts +1092 -0
  507. package/src/tempo/session/client/Runtime.ts +986 -0
  508. package/src/tempo/session/client/Session.test.ts +774 -0
  509. package/src/tempo/session/client/Session.ts +123 -0
  510. package/src/tempo/session/client/SessionManager.test.ts +1397 -0
  511. package/src/tempo/session/client/SessionManager.ts +751 -0
  512. package/src/tempo/session/client/Transports.test.ts +837 -0
  513. package/src/tempo/session/client/Transports.ts +1292 -0
  514. package/src/tempo/session/client/index.ts +40 -0
  515. package/src/tempo/session/index.ts +7 -8
  516. package/src/tempo/session/precompile/Chain.integration.test.ts +321 -0
  517. package/src/tempo/session/precompile/Chain.test.ts +1258 -0
  518. package/src/tempo/session/precompile/Chain.ts +979 -0
  519. package/src/tempo/session/precompile/Channel.test.ts +138 -0
  520. package/src/tempo/session/precompile/Channel.ts +103 -0
  521. package/src/tempo/session/precompile/Protocol.test.ts +358 -0
  522. package/src/tempo/session/precompile/Protocol.ts +520 -0
  523. package/src/tempo/session/precompile/Voucher.test.ts +354 -0
  524. package/src/tempo/session/precompile/Voucher.ts +162 -0
  525. package/src/tempo/session/precompile/escrow.abi.ts +226 -0
  526. package/src/tempo/session/precompile/index.ts +33 -0
  527. package/src/tempo/session/server/ChannelOps.test.ts +129 -0
  528. package/src/tempo/session/server/ChannelOps.ts +157 -0
  529. package/src/tempo/session/{ChannelStore.test.ts → server/ChannelStore.test.ts} +536 -29
  530. package/src/tempo/session/server/ChannelStore.ts +835 -0
  531. package/src/tempo/session/server/CredentialVerification.test.ts +146 -0
  532. package/src/tempo/session/server/CredentialVerification.ts +710 -0
  533. package/src/tempo/session/server/MeteredStream.ts +88 -0
  534. package/src/tempo/session/server/RequestState.test.ts +531 -0
  535. package/src/tempo/session/server/RequestState.ts +499 -0
  536. package/src/tempo/session/server/Session.integration.test.ts +444 -0
  537. package/src/tempo/session/server/Session.test.ts +3253 -0
  538. package/src/tempo/session/server/Session.ts +543 -0
  539. package/src/tempo/session/server/Settlement.test.ts +329 -0
  540. package/src/tempo/session/server/Settlement.ts +471 -0
  541. package/src/tempo/session/{Sse.test.ts → server/Sse.test.ts} +37 -3
  542. package/src/tempo/session/server/Sse.ts +254 -0
  543. package/src/tempo/session/server/Transports.test.ts +346 -0
  544. package/src/tempo/session/server/Transports.ts +255 -0
  545. package/src/tempo/session/{Ws.test.ts → server/Ws.test.ts} +4 -4
  546. package/src/tempo/session/server/Ws.ts +380 -0
  547. package/src/tempo/session/server/index.ts +8 -0
  548. package/src/tempo/subscription/Store.ts +27 -9
  549. package/src/x402/Exact.e2e.test.ts +1 -1
  550. package/src/x402/PublicInterface.test-d.ts +1 -1
  551. package/src/x402/index.ts +1 -0
  552. package/dist/mcp-sdk/client/McpClient.d.ts +0 -78
  553. package/dist/mcp-sdk/client/McpClient.d.ts.map +0 -1
  554. package/dist/mcp-sdk/client/McpClient.js +0 -105
  555. package/dist/mcp-sdk/client/McpClient.js.map +0 -1
  556. package/dist/mcp-sdk/client/index.d.ts.map +0 -1
  557. package/dist/mcp-sdk/client/index.js.map +0 -1
  558. package/dist/mcp-sdk/server/Transport.d.ts.map +0 -1
  559. package/dist/mcp-sdk/server/Transport.js.map +0 -1
  560. package/dist/mcp-sdk/server/index.d.ts.map +0 -1
  561. package/dist/mcp-sdk/server/index.js.map +0 -1
  562. package/dist/tempo/client/ChannelOps.d.ts.map +0 -1
  563. package/dist/tempo/client/ChannelOps.js.map +0 -1
  564. package/dist/tempo/client/Session.d.ts.map +0 -1
  565. package/dist/tempo/client/Session.js.map +0 -1
  566. package/dist/tempo/client/SessionManager.d.ts.map +0 -1
  567. package/dist/tempo/client/SessionManager.js.map +0 -1
  568. package/dist/tempo/server/Session.d.ts.map +0 -1
  569. package/dist/tempo/server/Session.js.map +0 -1
  570. package/dist/tempo/session/Chain.d.ts.map +0 -1
  571. package/dist/tempo/session/Chain.js.map +0 -1
  572. package/dist/tempo/session/Channel.d.ts.map +0 -1
  573. package/dist/tempo/session/Channel.js.map +0 -1
  574. package/dist/tempo/session/ChannelStore.d.ts +0 -117
  575. package/dist/tempo/session/ChannelStore.d.ts.map +0 -1
  576. package/dist/tempo/session/ChannelStore.js +0 -172
  577. package/dist/tempo/session/ChannelStore.js.map +0 -1
  578. package/dist/tempo/session/Receipt.d.ts +0 -22
  579. package/dist/tempo/session/Receipt.d.ts.map +0 -1
  580. package/dist/tempo/session/Receipt.js +0 -34
  581. package/dist/tempo/session/Receipt.js.map +0 -1
  582. package/dist/tempo/session/Sse.d.ts.map +0 -1
  583. package/dist/tempo/session/Sse.js +0 -363
  584. package/dist/tempo/session/Sse.js.map +0 -1
  585. package/dist/tempo/session/Types.d.ts +0 -78
  586. package/dist/tempo/session/Types.d.ts.map +0 -1
  587. package/dist/tempo/session/Types.js.map +0 -1
  588. package/dist/tempo/session/Voucher.d.ts.map +0 -1
  589. package/dist/tempo/session/Voucher.js.map +0 -1
  590. package/dist/tempo/session/Ws.d.ts +0 -87
  591. package/dist/tempo/session/Ws.d.ts.map +0 -1
  592. package/dist/tempo/session/Ws.js +0 -443
  593. package/dist/tempo/session/Ws.js.map +0 -1
  594. package/dist/tempo/session/escrow.abi.js.map +0 -1
  595. package/src/mcp-sdk/client/McpClient.ts +0 -196
  596. package/src/tempo/session/ChannelStore.ts +0 -308
  597. package/src/tempo/session/Receipt.test.ts +0 -89
  598. package/src/tempo/session/Receipt.ts +0 -46
  599. package/src/tempo/session/Sse.ts +0 -462
  600. package/src/tempo/session/Types.ts +0 -86
  601. package/src/tempo/session/Ws.ts +0 -576
  602. /package/dist/{mcp-sdk → mcp}/client/index.d.ts +0 -0
  603. /package/dist/{mcp-sdk → mcp}/client/index.js +0 -0
  604. /package/dist/{mcp-sdk → mcp}/server/Transport.d.ts +0 -0
  605. /package/dist/{mcp-sdk → mcp}/server/Transport.js +0 -0
  606. /package/dist/{mcp-sdk → mcp}/server/index.d.ts +0 -0
  607. /package/dist/{mcp-sdk → mcp}/server/index.js +0 -0
  608. /package/dist/tempo/{session → legacy/session}/Channel.js +0 -0
  609. /package/dist/tempo/{session → legacy/session}/Types.js +0 -0
  610. /package/src/{mcp-sdk → mcp}/client/index.ts +0 -0
  611. /package/src/{mcp-sdk → mcp}/server/Transport.test.ts +0 -0
  612. /package/src/{mcp-sdk → mcp}/server/Transport.ts +0 -0
  613. /package/src/{mcp-sdk → mcp}/server/index.ts +0 -0
  614. /package/src/tempo/{session → legacy/session}/Channel.test.ts +0 -0
  615. /package/src/tempo/{session → legacy/session}/Voucher.test.ts +0 -0
  616. /package/src/tempo/session/{Sse.fuzz.test.ts → server/Sse.fuzz.test.ts} +0 -0
@@ -0,0 +1,220 @@
1
+ import { Challenge, Mcp } from 'mppx'
2
+ import { Methods } from 'mppx/tempo'
3
+ import { describe, expect, test } from 'vp/test'
4
+
5
+ import { mcp } from './Mcp.js'
6
+
7
+ const challenge = Challenge.fromMethod(Methods.charge, {
8
+ realm: 'api.example.com',
9
+ secretKey: 'test-secret-key',
10
+ expires: '2025-01-01T00:00:00.000Z',
11
+ request: {
12
+ amount: '0.001',
13
+ currency: '0x20c0000000000000000000000000000000000001',
14
+ decimals: 6,
15
+ recipient: '0x742d35Cc6634C0532925a3b844Bc9e7595f8fE00',
16
+ },
17
+ })
18
+
19
+ const paymentRequired = {
20
+ jsonrpc: '2.0',
21
+ id: 1,
22
+ error: {
23
+ code: Mcp.paymentRequiredCode,
24
+ message: 'Payment Required',
25
+ data: { challenges: [challenge] },
26
+ },
27
+ }
28
+
29
+ const request = (overrides: Partial<RequestInit> = {}) =>
30
+ ({
31
+ headers: { accept: 'application/json, text/event-stream' },
32
+ body: JSON.stringify({ jsonrpc: '2.0', id: 1, method: 'tools/call', params: {} }),
33
+ ...overrides,
34
+ }) satisfies RequestInit
35
+
36
+ const jsonResponse = (body: unknown, contentType = 'application/json') =>
37
+ new Response(typeof body === 'string' ? body : JSON.stringify(body), {
38
+ headers: { 'content-type': contentType },
39
+ })
40
+
41
+ const sseResponse = (body: string) =>
42
+ new Response(body, { headers: { 'content-type': 'text/event-stream' } })
43
+
44
+ const sseEvent = (data: unknown, event = 'message') =>
45
+ `${event ? `event: ${event}\n` : ''}data: ${
46
+ typeof data === 'string' ? data : JSON.stringify(data)
47
+ }\n\n`
48
+
49
+ async function getChallengeIds(response: Response, requestInit = request()) {
50
+ return (await mcp().getChallenges(response, requestInit)).map((entry) => entry.id)
51
+ }
52
+
53
+ describe('mcp HTTP protocol', () => {
54
+ test('extracts payment challenges from JSON-RPC error JSON', async () => {
55
+ expect(await getChallengeIds(jsonResponse(paymentRequired))).toEqual([challenge.id])
56
+ })
57
+
58
+ test('extracts all valid payment challenges', async () => {
59
+ const alternate = { ...challenge, id: 'alternate' }
60
+ const response = jsonResponse({
61
+ ...paymentRequired,
62
+ error: {
63
+ ...paymentRequired.error,
64
+ data: { challenges: [challenge, alternate] },
65
+ },
66
+ })
67
+
68
+ expect(await getChallengeIds(response)).toEqual([challenge.id, alternate.id])
69
+ })
70
+
71
+ test('parses JSON content types case-insensitively', async () => {
72
+ const response = jsonResponse(paymentRequired, 'Application/JSON; charset=utf-8')
73
+
74
+ expect(await getChallengeIds(response)).toEqual([challenge.id])
75
+ })
76
+
77
+ test.each([
78
+ { body: '[', name: 'invalid JSON' },
79
+ { body: [paymentRequired], name: 'JSON-RPC batch' },
80
+ {
81
+ body: { jsonrpc: '2.0', method: 'notifications/progress', params: {} },
82
+ name: 'notification',
83
+ },
84
+ { body: { jsonrpc: '2.0', id: 1, method: 'tools/call', params: {} }, name: 'request' },
85
+ { body: { ...paymentRequired, jsonrpc: '2.1' }, name: 'wrong JSON-RPC version' },
86
+ { body: { ...paymentRequired, id: null }, name: 'null id' },
87
+ { body: { ...paymentRequired, id: 2 }, name: 'different id' },
88
+ { body: { ...paymentRequired, result: {} }, name: 'result and error together' },
89
+ { body: { jsonrpc: '2.0', id: 1, result: {} }, name: 'successful result' },
90
+ {
91
+ body: {
92
+ jsonrpc: '2.0',
93
+ id: 1,
94
+ error: { code: -32600, message: 'Invalid Request' },
95
+ },
96
+ name: 'non-payment error',
97
+ },
98
+ {
99
+ body: {
100
+ jsonrpc: '2.0',
101
+ id: 1,
102
+ error: { code: `${Mcp.paymentRequiredCode}`, message: 'Payment Required' },
103
+ },
104
+ name: 'string error code',
105
+ },
106
+ {
107
+ body: {
108
+ jsonrpc: '2.0',
109
+ id: 1,
110
+ error: { code: Mcp.paymentRequiredCode, message: 402 },
111
+ },
112
+ name: 'non-string error message',
113
+ },
114
+ ])('ignores $name message shapes', async ({ body }) => {
115
+ expect(await getChallengeIds(jsonResponse(body))).toEqual([])
116
+ })
117
+
118
+ test.each([
119
+ { challenges: undefined, name: 'missing challenges' },
120
+ { challenges: [], name: 'empty challenges' },
121
+ { challenges: challenge, name: 'non-array challenges' },
122
+ { challenges: [{ ...challenge, realm: undefined }], name: 'invalid challenge' },
123
+ {
124
+ challenges: [challenge, { ...challenge, realm: undefined }],
125
+ name: 'partially invalid challenges',
126
+ },
127
+ ])('ignores $name', async ({ challenges }) => {
128
+ const response = jsonResponse({
129
+ ...paymentRequired,
130
+ error: {
131
+ ...paymentRequired.error,
132
+ data: challenges === undefined ? undefined : { challenges },
133
+ },
134
+ })
135
+
136
+ expect(await getChallengeIds(response)).toEqual([])
137
+ })
138
+
139
+ test('matches string request and response ids without coercion', async () => {
140
+ const stringRequest = request({
141
+ body: JSON.stringify({ jsonrpc: '2.0', id: '1', method: 'tools/call', params: {} }),
142
+ })
143
+ const response = jsonResponse({ ...paymentRequired, id: '1' })
144
+
145
+ expect(await getChallengeIds(response, stringRequest)).toEqual([challenge.id])
146
+ expect(await getChallengeIds(jsonResponse(paymentRequired), stringRequest)).toEqual([])
147
+ })
148
+
149
+ test.each([
150
+ {
151
+ body: '{',
152
+ headers: { accept: 'application/json, text/event-stream' },
153
+ name: 'malformed request JSON',
154
+ },
155
+ {
156
+ body: JSON.stringify({ jsonrpc: '2.0', method: 'notifications/initialized' }),
157
+ headers: { accept: 'application/json, text/event-stream' },
158
+ name: 'request without id',
159
+ },
160
+ {
161
+ body: JSON.stringify({ jsonrpc: '2.0', id: 1, params: {} }),
162
+ headers: { accept: 'application/json, text/event-stream' },
163
+ name: 'request without method',
164
+ },
165
+ {
166
+ body: JSON.stringify({ jsonrpc: '2.0', id: 1, method: 'tools/call', params: {} }),
167
+ headers: { accept: 'application/json' },
168
+ name: 'request without Streamable HTTP accept',
169
+ },
170
+ ])('does not inspect responses for $name', async ({ body, headers }) => {
171
+ expect(
172
+ await getChallengeIds(jsonResponse(paymentRequired), request({ body, headers })),
173
+ ).toEqual([])
174
+ })
175
+
176
+ test('accepts the mcp-method header as MCP request provenance', async () => {
177
+ const requestInit = request({
178
+ headers: { 'mcp-method': 'tools/call' },
179
+ })
180
+
181
+ expect(await getChallengeIds(jsonResponse(paymentRequired), requestInit)).toEqual([
182
+ challenge.id,
183
+ ])
184
+ })
185
+
186
+ test('does not inspect native HTTP 402 responses', async () => {
187
+ expect(await getChallengeIds(jsonResponse(paymentRequired), request({}))).toEqual([
188
+ challenge.id,
189
+ ])
190
+ expect(
191
+ await getChallengeIds(
192
+ new Response(JSON.stringify(paymentRequired), {
193
+ status: 402,
194
+ headers: { 'content-type': 'application/json' },
195
+ }),
196
+ ),
197
+ ).toEqual([])
198
+ })
199
+
200
+ test.each([
201
+ { body: sseEvent(paymentRequired), name: 'message event' },
202
+ { body: sseEvent(paymentRequired, ''), name: 'event without explicit type' },
203
+ { body: `: keepalive\n\n${sseEvent(paymentRequired)}`, name: 'message after SSE comment' },
204
+ ])('extracts payment challenges from SSE $name', async ({ body }) => {
205
+ expect(await getChallengeIds(sseResponse(body))).toEqual([challenge.id])
206
+ })
207
+
208
+ test.each([
209
+ { body: sseEvent('{'), name: 'invalid JSON' },
210
+ { body: sseEvent({ jsonrpc: '2.0', method: 'notifications/progress' }), name: 'notification' },
211
+ { body: sseEvent(paymentRequired, 'progress'), name: 'non-message event' },
212
+ {
213
+ body:
214
+ sseEvent({ jsonrpc: '2.0', method: 'notifications/progress' }) + sseEvent(paymentRequired),
215
+ name: 'payment challenge after first data event',
216
+ },
217
+ ])('ignores SSE $name', async ({ body }) => {
218
+ expect(await getChallengeIds(sseResponse(body))).toEqual([])
219
+ })
220
+ })
@@ -0,0 +1,162 @@
1
+ import { createParser } from 'eventsource-parser'
2
+
3
+ import * as Challenge from '../../../Challenge.js'
4
+ import * as Credential from '../../../Credential.js'
5
+ import * as Mcp from '../../../Mcp.js'
6
+ import type { Protocol } from './Protocol.js'
7
+ import { paymentRequiredStatus } from './Shared.js'
8
+
9
+ /** Returns the JSON-RPC request id — only requests can receive a `-32042` response. */
10
+ function jsonRpcRequestId(body: unknown): number | string | undefined {
11
+ if (typeof body !== 'string') return undefined
12
+ try {
13
+ const message = JSON.parse(body)
14
+ const id = message?.id
15
+ if (message?.jsonrpc !== '2.0' || typeof message?.method !== 'string') return undefined
16
+ return typeof id === 'string' || typeof id === 'number' ? id : undefined
17
+ } catch {
18
+ return undefined
19
+ }
20
+ }
21
+
22
+ const responseCache = new WeakMap<Response, Promise<Mcp.Response | undefined>>()
23
+
24
+ function mcpHttpRequestId(request?: RequestInit): number | string | undefined {
25
+ const id = jsonRpcRequestId(request?.body)
26
+ if (id === undefined) return undefined
27
+ const headers = new Headers(request?.headers)
28
+ if (headers.has('mcp-method')) return id
29
+ const accept = headers.get('accept')?.toLowerCase() ?? ''
30
+ return accept.includes('application/json') && accept.includes('text/event-stream')
31
+ ? id
32
+ : undefined
33
+ }
34
+
35
+ function parseMessage(value: unknown): Mcp.Response | undefined {
36
+ if (!value || typeof value !== 'object') return undefined
37
+ const message = value as {
38
+ error?: { code?: unknown; message?: unknown }
39
+ id?: unknown
40
+ jsonrpc?: unknown
41
+ result?: unknown
42
+ }
43
+ const id = message.id
44
+ if (message.jsonrpc !== '2.0') return undefined
45
+ if (id !== undefined && typeof id !== 'string' && typeof id !== 'number') return undefined
46
+ const hasError = 'error' in message
47
+ const hasResult = 'result' in message
48
+ if (hasError === hasResult) return undefined
49
+ if (hasError)
50
+ return Number.isInteger(message.error?.code) && typeof message.error?.message === 'string'
51
+ ? (value as Mcp.Response)
52
+ : undefined
53
+ return id !== undefined && typeof message.result === 'object'
54
+ ? (value as Mcp.Response)
55
+ : undefined
56
+ }
57
+
58
+ function paymentRequiredChallenges(
59
+ message: Mcp.Response | undefined,
60
+ id: number | string,
61
+ ): Challenge.Challenge[] {
62
+ if (
63
+ !message ||
64
+ message.id !== id ||
65
+ !('error' in message) ||
66
+ message.error?.code !== Mcp.paymentRequiredCode
67
+ )
68
+ return []
69
+ const challenges = message.error?.data?.challenges
70
+ if (!Array.isArray(challenges) || challenges.length === 0) return []
71
+ const parsed: Challenge.Challenge[] = []
72
+ for (const challenge of challenges) {
73
+ const result = Challenge.Schema.safeParse(challenge)
74
+ if (!result.success) return []
75
+ parsed.push(result.data as Challenge.Challenge)
76
+ }
77
+ return parsed
78
+ }
79
+
80
+ async function parseSseJsonRpcResponse(response: Response): Promise<Mcp.Response | undefined> {
81
+ const reader = response.clone().body?.getReader()
82
+ if (!reader) return undefined
83
+
84
+ const decoder = new TextDecoder()
85
+ let dataEventSeen = false
86
+ let message: Mcp.Response | undefined
87
+ const parser = createParser({
88
+ onEvent(event) {
89
+ if (dataEventSeen || !event.data) return
90
+ dataEventSeen = true
91
+ if (event.event && event.event !== 'message') return
92
+ try {
93
+ message = parseMessage(JSON.parse(event.data))
94
+ } catch {}
95
+ },
96
+ })
97
+
98
+ try {
99
+ for (;;) {
100
+ if (dataEventSeen) return message
101
+ const { done, value } = await reader.read()
102
+ if (done) {
103
+ parser.feed(decoder.decode())
104
+ parser.reset({ consume: true })
105
+ return message
106
+ }
107
+ parser.feed(decoder.decode(value, { stream: true }))
108
+ }
109
+ } finally {
110
+ void reader.cancel().catch(() => {})
111
+ }
112
+ }
113
+
114
+ /** Reads a cloned HTTP body into the first JSON-RPC response message, if any. */
115
+ function parseJsonRpcResponse(response: Response): Promise<Mcp.Response | undefined> {
116
+ const cached = responseCache.get(response)
117
+ if (cached) return cached
118
+ const promise = (async (): Promise<Mcp.Response | undefined> => {
119
+ const contentType = response.headers.get('content-type')?.toLowerCase() ?? ''
120
+ if (contentType.includes('application/json'))
121
+ return response
122
+ .clone()
123
+ .json()
124
+ .then(parseMessage)
125
+ .catch(() => undefined)
126
+ if (contentType.includes('text/event-stream')) return parseSseJsonRpcResponse(response)
127
+ return undefined
128
+ })()
129
+ responseCache.set(response, promise)
130
+ return promise
131
+ }
132
+
133
+ /**
134
+ * MCP-over-HTTP — remote MCP rides Streamable HTTP, so its challenge is a JSON-RPC `-32042` error
135
+ * in a normal 200 body (often `text/event-stream`), and the credential rides back in `_meta`.
136
+ */
137
+ export function mcp(): Protocol {
138
+ return {
139
+ getChallenges(response, request) {
140
+ // The 402 schemes own status 402; MCP challenges arrive in a normal 200 body.
141
+ const id = mcpHttpRequestId(request)
142
+ if (response.status === paymentRequiredStatus || id === undefined) return []
143
+ return parseJsonRpcResponse(response).then((message) =>
144
+ paymentRequiredChallenges(message, id),
145
+ )
146
+ },
147
+ setCredential(request, credential) {
148
+ const message = JSON.parse(request.body as string) as Mcp.Request
149
+ const parsed = Credential.deserialize(credential)
150
+ return {
151
+ ...request,
152
+ body: JSON.stringify({
153
+ ...message,
154
+ params: {
155
+ ...message.params,
156
+ ['_meta']: { ...message.params?.['_meta'], [Mcp.credentialMetaKey]: parsed },
157
+ },
158
+ }),
159
+ }
160
+ },
161
+ }
162
+ }
@@ -0,0 +1,21 @@
1
+ import * as Challenge from '../../../Challenge.js'
2
+ import * as Constants from '../../../Constants.js'
3
+ import type { Protocol } from './Protocol.js'
4
+ import { paymentRequiredStatus, setCredentialHeader } from './Shared.js'
5
+
6
+ /** MPP — the native HTTP scheme: a 402 carrying a `WWW-Authenticate` challenge, paid back in `Authorization`. */
7
+ export function mpp(): Protocol {
8
+ return {
9
+ getChallenges(response) {
10
+ if (
11
+ response.status !== paymentRequiredStatus ||
12
+ !response.headers.has(Constants.Headers.wwwAuthenticate)
13
+ )
14
+ return []
15
+ return Challenge.fromResponseList(response)
16
+ },
17
+ setCredential(request, credential) {
18
+ return setCredentialHeader(request, Constants.Headers.authorization, credential)
19
+ },
20
+ }
21
+ }
@@ -0,0 +1,10 @@
1
+ import type * as Challenge from '../../../Challenge.js'
2
+ import type { MaybePromise } from '../../../internal/types.js'
3
+
4
+ /** One payment protocol over the `http` transport. */
5
+ export type Protocol = {
6
+ /** This protocol's challenges from a response; `[]` when the response isn't its concern. */
7
+ getChallenges: (response: Response, request?: RequestInit) => MaybePromise<Challenge.Challenge[]>
8
+ /** Attaches this protocol's credential to a retry request. */
9
+ setCredential: (request: RequestInit, credential: string) => RequestInit
10
+ }
@@ -0,0 +1,25 @@
1
+ import * as Constants from '../../../Constants.js'
2
+ import * as x402_Types from '../../../x402/Types.js'
3
+
4
+ /** HTTP status that signals a native payment challenge. */
5
+ export const paymentRequiredStatus = 402
6
+
7
+ /** Credential headers purged before a fresh credential is attached. */
8
+ const credentialHeaders = [
9
+ Constants.Headers.authorization,
10
+ x402_Types.paymentRequiredHeader,
11
+ x402_Types.paymentResponseHeader,
12
+ x402_Types.paymentSignatureHeader,
13
+ ]
14
+
15
+ /** Attaches `credential` under `header`, clearing any stale credential headers first. */
16
+ export function setCredentialHeader(
17
+ request: RequestInit,
18
+ header: string,
19
+ credential: string,
20
+ ): RequestInit {
21
+ const headers = new Headers(request.headers)
22
+ for (const stale of credentialHeaders) headers.delete(stale)
23
+ headers.set(header, credential)
24
+ return { ...request, headers }
25
+ }
@@ -0,0 +1,42 @@
1
+ import * as Challenge from '../../../Challenge.js'
2
+ import * as x402_Header from '../../../x402/Header.js'
3
+ import * as x402_ChallengeBrand from '../../../x402/internal/ChallengeBrand.js'
4
+ import * as x402_Types from '../../../x402/Types.js'
5
+ import type { Protocol } from './Protocol.js'
6
+ import { paymentRequiredStatus, setCredentialHeader } from './Shared.js'
7
+
8
+ /**
9
+ * x402 — a 402 carrying a `PAYMENT-REQUIRED` header, paid back in `PAYMENT-SIGNATURE`. Synthesized
10
+ * challenges are branded for `evm/client/Charge.ts`, keeping them distinct from native `evm`
11
+ * charges with the same method/intent.
12
+ */
13
+ export function x402(): Protocol {
14
+ return {
15
+ getChallenges(response) {
16
+ if (response.status !== paymentRequiredStatus) return []
17
+ const header = response.headers.get(x402_Types.paymentRequiredHeader)
18
+ if (!header) return []
19
+ const paymentRequired = x402_Header.decodePaymentRequired(header)
20
+ if (response.url && paymentRequired.resource.url !== response.url)
21
+ throw new Error('x402 payment-required resource does not match response URL.')
22
+ return paymentRequired.accepts.map((accepted, index) =>
23
+ x402_ChallengeBrand.mark(
24
+ Challenge.from({
25
+ id: `${x402_Types.syntheticChallengeIdPrefix}${index}`,
26
+ intent: x402_Types.exactIntent,
27
+ method: x402_Types.paymentMethod,
28
+ realm: new URL(paymentRequired.resource.url).host,
29
+ request: {
30
+ ...accepted,
31
+ ...(paymentRequired.extensions ? { extensions: paymentRequired.extensions } : {}),
32
+ resource: paymentRequired.resource,
33
+ },
34
+ }),
35
+ ),
36
+ )
37
+ },
38
+ setCredential(request, credential) {
39
+ return setCredentialHeader(request, x402_Types.paymentSignatureHeader, credential)
40
+ },
41
+ }
42
+ }
@@ -73,7 +73,7 @@ function createMppx<const methods extends Mppx.Methods>(methods: methods) {
73
73
  return Mppx.create({
74
74
  methods,
75
75
  realm: 'test-realm',
76
- secretKey: 'test-secret',
76
+ secretKey: 'test-secret-key-test-secret-key-32',
77
77
  })
78
78
  }
79
79
 
package/src/env.d.ts CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  interface ImportMetaEnv {
4
4
  readonly MODE: 'test' | 'production'
5
- readonly VITE_NODE_ENV: 'localnet' | 'testnet' | 'mainnet'
5
+ readonly VITE_TEMPO_NETWORK: 'localnet' | 'moderato' | 'devnet'
6
6
  readonly VITE_HTTP_LOG: 'true' | 'false'
7
7
  readonly VITE_RPC_CREDENTIALS: string
8
8
  }
@@ -14,7 +14,7 @@ import { Mppx as ServerMppx } from '../server/index.js'
14
14
 
15
15
  const account = {} as Account
16
16
  const recipient = '0x209693Bc6afc0C5328bA36FaF03C514EF312287C'
17
- const secretKey = 'test-secret'
17
+ const secretKey = 'test-secret-key-test-secret-key-32'
18
18
  const settle = async () => ({
19
19
  reference: `0x${'1'.repeat(64)}` as `0x${string}`,
20
20
  })
@@ -1,4 +1,5 @@
1
1
  export * as assets from '../Assets.js'
2
+ /** @deprecated Use `chains` instead. */
2
3
  export * as Chains from '../Chains.js'
3
4
  export * as chains from '../Chains.js'
4
5
  export { charge } from './Charge.js'
package/src/evm/index.ts CHANGED
@@ -1,4 +1,6 @@
1
+ /** @deprecated Use `assets` instead. */
1
2
  export * as Assets from './Assets.js'
3
+ /** @deprecated Use `chains` instead. */
2
4
  export * as Chains from './Chains.js'
3
5
  export * as Methods from './Methods.js'
4
6
  export * as Types from './Types.js'
@@ -45,7 +45,7 @@ describe('evm charge server', () => {
45
45
  },
46
46
  }),
47
47
  ],
48
- secretKey: 'test-secret',
48
+ secretKey: 'test-secret-key-test-secret-key-32',
49
49
  })
50
50
  const client = ClientMppx.create({
51
51
  methods: [
@@ -1,4 +1,5 @@
1
1
  export * as assets from '../Assets.js'
2
+ /** @deprecated Use `chains` instead. */
2
3
  export * as Chains from '../Chains.js'
3
4
  export * as chains from '../Chains.js'
4
5
  export { charge } from './Charge.js'
package/src/index.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export * as BodyDigest from './BodyDigest.js'
2
2
  export * as Challenge from './Challenge.js'
3
+ export * as Constants from './Constants.js'
3
4
  export * as Credential from './Credential.js'
4
5
  export * as Errors from './Errors.js'
5
6
  export * as Expires from './Expires.js'
@@ -178,6 +178,67 @@ describe('AcceptPayment', () => {
178
178
  ])
179
179
  })
180
180
 
181
+ test('selectChallengeCandidates supports duplicate method keys with challenge predicates', () => {
182
+ const challenges = [
183
+ {
184
+ id: 'v2',
185
+ intent: 'session',
186
+ method: 'tempo',
187
+ realm: 'test',
188
+ request: { methodDetails: { sessionProtocol: 'v2' } },
189
+ },
190
+ {
191
+ id: 'v1',
192
+ intent: 'session',
193
+ method: 'tempo',
194
+ realm: 'test',
195
+ request: { methodDetails: { sessionProtocol: 'v1' } },
196
+ },
197
+ {
198
+ id: 'old-server',
199
+ intent: 'session',
200
+ method: 'tempo',
201
+ realm: 'test',
202
+ request: {},
203
+ },
204
+ ]
205
+ const methods = [
206
+ {
207
+ name: 'tempo',
208
+ intent: 'session',
209
+ canHandleChallenge: ({
210
+ challenge,
211
+ }: {
212
+ challenge: AcceptPayment.ChallengeCandidate['challenge']
213
+ }) =>
214
+ (challenge.request.methodDetails as { sessionProtocol?: string } | undefined)
215
+ ?.sessionProtocol === 'v2',
216
+ },
217
+ {
218
+ name: 'tempo',
219
+ intent: 'session',
220
+ canHandleChallenge: ({
221
+ challenge,
222
+ }: {
223
+ challenge: AcceptPayment.ChallengeCandidate['challenge']
224
+ }) => {
225
+ const sessionProtocol = (
226
+ challenge.request.methodDetails as { sessionProtocol?: string } | undefined
227
+ )?.sessionProtocol
228
+ return sessionProtocol === undefined || sessionProtocol === 'v1'
229
+ },
230
+ },
231
+ ] as const
232
+
233
+ const candidates = AcceptPayment.selectChallengeCandidates(
234
+ challenges,
235
+ methods,
236
+ AcceptPayment.parse('tempo/session'),
237
+ )
238
+
239
+ expect(candidates.map(({ challenge }) => challenge.id)).toEqual(['v2', 'v1', 'old-server'])
240
+ })
241
+
181
242
  test('selectChallenge honors a specific opt-out over a broader wildcard', () => {
182
243
  const selected = AcceptPayment.selectChallenge(
183
244
  [
@@ -2,6 +2,7 @@ import type * as Challenge from '../Challenge.js'
2
2
  import type { MaybePromise } from './types.js'
3
3
 
4
4
  type MethodLike = {
5
+ canHandleChallenge?: ((parameters: { challenge: Challenge.Challenge }) => boolean) | undefined
5
6
  intent: string
6
7
  name: string
7
8
  }
@@ -179,28 +180,34 @@ export function selectChallengeCandidates<const methods extends readonly MethodL
179
180
  methods: methods,
180
181
  preferences: readonly Entry[],
181
182
  ): ChallengeCandidate<methods[number]>[] {
182
- const methodByKey = new Map<string, methods[number]>()
183
+ const methodsByKey = new Map<string, methods[number][]>()
183
184
  for (const method of methods) {
184
185
  const key = keyOf(method)
185
- if (!methodByKey.has(key)) methodByKey.set(key, method)
186
+ const matchingMethods = methodsByKey.get(key)
187
+ if (matchingMethods) matchingMethods.push(method)
188
+ else methodsByKey.set(key, [method])
186
189
  }
187
190
 
188
191
  return challenges
189
- .map((challenge, index) => {
190
- const method = methodByKey.get(keyOf(challenge))
191
- if (!method) return undefined
192
+ .flatMap((challenge, index) => {
193
+ const matchingMethods = methodsByKey.get(keyOf(challenge))
194
+ if (!matchingMethods) return []
192
195
 
193
196
  const match = bestMatch(challenge, preferences)
194
- if (!match || match.q <= 0) return undefined
195
-
196
- return {
197
- challenge,
198
- index,
199
- match,
200
- method,
201
- } as ChallengeCandidate<methods[number]> & { match: Match }
197
+ if (!match || match.q <= 0) return []
198
+
199
+ return matchingMethods
200
+ .filter((method) => method.canHandleChallenge?.({ challenge }) ?? true)
201
+ .map(
202
+ (method) =>
203
+ ({
204
+ challenge,
205
+ index,
206
+ match,
207
+ method,
208
+ }) as ChallengeCandidate<methods[number]> & { match: Match },
209
+ )
202
210
  })
203
- .filter((candidate): candidate is NonNullable<typeof candidate> => Boolean(candidate))
204
211
  .sort((left, right) => right.match.q - left.match.q || left.index - right.index)
205
212
  .map((candidate) => {
206
213
  const { match: _match, ...rest } = candidate