mppx 0.8.14 → 0.8.17

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 (507) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/dist/Challenge.d.ts.map +1 -1
  3. package/dist/Challenge.js +40 -35
  4. package/dist/Challenge.js.map +1 -1
  5. package/dist/Constants.d.ts +17 -17
  6. package/dist/Constants.d.ts.map +1 -1
  7. package/dist/Credential.d.ts.map +1 -1
  8. package/dist/Errors.d.ts +3 -3
  9. package/dist/Errors.d.ts.map +1 -1
  10. package/dist/Errors.js.map +1 -1
  11. package/dist/Method.d.ts +35 -5
  12. package/dist/Method.d.ts.map +1 -1
  13. package/dist/Method.js +7 -22
  14. package/dist/Method.js.map +1 -1
  15. package/dist/Store.d.ts +19 -0
  16. package/dist/Store.d.ts.map +1 -1
  17. package/dist/Store.js +43 -0
  18. package/dist/Store.js.map +1 -1
  19. package/dist/attestation/Client.d.ts +17 -0
  20. package/dist/attestation/Client.d.ts.map +1 -0
  21. package/dist/attestation/Client.js +28 -0
  22. package/dist/attestation/Client.js.map +1 -0
  23. package/dist/attestation/Constants.d.ts +15 -0
  24. package/dist/attestation/Constants.d.ts.map +1 -0
  25. package/dist/attestation/Constants.js +15 -0
  26. package/dist/attestation/Constants.js.map +1 -0
  27. package/dist/attestation/Server.d.ts +4 -0
  28. package/dist/attestation/Server.d.ts.map +1 -0
  29. package/dist/attestation/Server.js +8 -0
  30. package/dist/attestation/Server.js.map +1 -0
  31. package/dist/attestation/Types.d.ts +76 -0
  32. package/dist/attestation/Types.d.ts.map +1 -0
  33. package/dist/attestation/Types.js +2 -0
  34. package/dist/attestation/Types.js.map +1 -0
  35. package/dist/attestation/index.d.ts +6 -0
  36. package/dist/attestation/index.d.ts.map +1 -0
  37. package/dist/attestation/index.js +6 -0
  38. package/dist/attestation/index.js.map +1 -0
  39. package/dist/attestation/internal/HttpMessageSignature.d.ts +73 -0
  40. package/dist/attestation/internal/HttpMessageSignature.d.ts.map +1 -0
  41. package/dist/attestation/internal/HttpMessageSignature.js +320 -0
  42. package/dist/attestation/internal/HttpMessageSignature.js.map +1 -0
  43. package/dist/attestation/internal/SigningContext.d.ts +4 -0
  44. package/dist/attestation/internal/SigningContext.d.ts.map +1 -0
  45. package/dist/attestation/internal/SigningContext.js +11 -0
  46. package/dist/attestation/internal/SigningContext.js.map +1 -0
  47. package/dist/cli/account.d.ts +14 -14
  48. package/dist/cli/account.d.ts.map +1 -1
  49. package/dist/cli/cli.d.ts +6 -6
  50. package/dist/cli/cli.d.ts.map +1 -1
  51. package/dist/cli/cli.js +1 -0
  52. package/dist/cli/cli.js.map +1 -1
  53. package/dist/cli/plugins/tempo.js.map +1 -1
  54. package/dist/cli/sessions/commands.d.ts +4 -4
  55. package/dist/cli/sessions/commands.d.ts.map +1 -1
  56. package/dist/cli/sessions/commands.js.map +1 -1
  57. package/dist/cli/sessions/store.d.ts.map +1 -1
  58. package/dist/cli/sessions/store.js.map +1 -1
  59. package/dist/cli/utils.d.ts +1 -1
  60. package/dist/cli/utils.d.ts.map +1 -1
  61. package/dist/cli/utils.js.map +1 -1
  62. package/dist/cli/validate/discovery.js.map +1 -1
  63. package/dist/cli/validate/index.d.ts +3 -3
  64. package/dist/cli/validate/index.d.ts.map +1 -1
  65. package/dist/cli/validate/payment.d.ts.map +1 -1
  66. package/dist/cli/validate/payment.js +18 -4
  67. package/dist/cli/validate/payment.js.map +1 -1
  68. package/dist/client/Mppx.d.ts +3 -0
  69. package/dist/client/Mppx.d.ts.map +1 -1
  70. package/dist/client/Mppx.js +13 -5
  71. package/dist/client/Mppx.js.map +1 -1
  72. package/dist/client/Transport.d.ts +3 -5
  73. package/dist/client/Transport.d.ts.map +1 -1
  74. package/dist/client/Transport.js +1 -17
  75. package/dist/client/Transport.js.map +1 -1
  76. package/dist/client/internal/Fetch.d.ts.map +1 -1
  77. package/dist/client/internal/Fetch.js +92 -13
  78. package/dist/client/internal/Fetch.js.map +1 -1
  79. package/dist/client/internal/MethodChallenge.d.ts +2 -0
  80. package/dist/client/internal/MethodChallenge.d.ts.map +1 -1
  81. package/dist/client/internal/MethodChallenge.js +4 -0
  82. package/dist/client/internal/MethodChallenge.js.map +1 -1
  83. package/dist/client/internal/MethodResponse.d.ts +15 -0
  84. package/dist/client/internal/MethodResponse.d.ts.map +1 -1
  85. package/dist/client/internal/MethodResponse.js +10 -0
  86. package/dist/client/internal/MethodResponse.js.map +1 -1
  87. package/dist/client/node.js.map +1 -1
  88. package/dist/discovery/OpenApi.d.ts +3 -5
  89. package/dist/discovery/OpenApi.d.ts.map +1 -1
  90. package/dist/discovery/OpenApi.js +13 -34
  91. package/dist/discovery/OpenApi.js.map +1 -1
  92. package/dist/discovery/internal/Metadata.d.ts +20 -0
  93. package/dist/discovery/internal/Metadata.d.ts.map +1 -0
  94. package/dist/discovery/internal/Metadata.js +36 -0
  95. package/dist/discovery/internal/Metadata.js.map +1 -0
  96. package/dist/evm/Methods.d.ts +11 -11
  97. package/dist/evm/Methods.d.ts.map +1 -1
  98. package/dist/evm/Types.d.ts +17 -17
  99. package/dist/evm/Types.d.ts.map +1 -1
  100. package/dist/evm/client/Charge.d.ts +11 -11
  101. package/dist/evm/client/Methods.d.ts +11 -11
  102. package/dist/evm/server/Charge.d.ts +1 -1
  103. package/dist/evm/server/Charge.d.ts.map +1 -1
  104. package/dist/evm/server/Charge.js +2 -0
  105. package/dist/evm/server/Charge.js.map +1 -1
  106. package/dist/evm/server/Methods.d.ts +11 -11
  107. package/dist/internal/HeaderCodec.d.ts +2 -2
  108. package/dist/internal/HeaderCodec.d.ts.map +1 -1
  109. package/dist/internal/types.d.ts +6 -0
  110. package/dist/internal/types.d.ts.map +1 -1
  111. package/dist/middlewares/elysia.js.map +1 -1
  112. package/dist/middlewares/express.js.map +1 -1
  113. package/dist/middlewares/hono.js.map +1 -1
  114. package/dist/middlewares/nextjs.js.map +1 -1
  115. package/dist/proxy/Proxy.d.ts +2 -0
  116. package/dist/proxy/Proxy.d.ts.map +1 -1
  117. package/dist/proxy/Proxy.js +117 -9
  118. package/dist/proxy/Proxy.js.map +1 -1
  119. package/dist/proxy/Service.d.ts +36 -1
  120. package/dist/proxy/Service.d.ts.map +1 -1
  121. package/dist/proxy/Service.js +9 -8
  122. package/dist/proxy/Service.js.map +1 -1
  123. package/dist/proxy/services/anthropic.d.ts.map +1 -1
  124. package/dist/proxy/services/anthropic.js +1 -0
  125. package/dist/proxy/services/anthropic.js.map +1 -1
  126. package/dist/proxy/services/openai.d.ts.map +1 -1
  127. package/dist/proxy/services/openai.js +1 -0
  128. package/dist/proxy/services/openai.js.map +1 -1
  129. package/dist/proxy/services/stripe.d.ts.map +1 -1
  130. package/dist/proxy/services/stripe.js +1 -0
  131. package/dist/proxy/services/stripe.js.map +1 -1
  132. package/dist/server/Mppx.d.ts +75 -13
  133. package/dist/server/Mppx.d.ts.map +1 -1
  134. package/dist/server/Mppx.js +201 -23
  135. package/dist/server/Mppx.js.map +1 -1
  136. package/dist/server/internal/html/config.d.ts +9 -9
  137. package/dist/server/internal/html/config.d.ts.map +1 -1
  138. package/dist/server/internal/html/constants.d.ts +17 -17
  139. package/dist/server/internal/html/constants.d.ts.map +1 -1
  140. package/dist/stripe/Methods.d.ts +10 -10
  141. package/dist/stripe/Methods.d.ts.map +1 -1
  142. package/dist/stripe/client/Charge.d.ts +10 -10
  143. package/dist/stripe/client/Methods.d.ts +10 -10
  144. package/dist/stripe/internal/constants.d.ts +1 -1
  145. package/dist/stripe/internal/constants.js +1 -1
  146. package/dist/stripe/internal/types.d.ts +1 -0
  147. package/dist/stripe/internal/types.d.ts.map +1 -1
  148. package/dist/stripe/server/Charge.d.ts +11 -11
  149. package/dist/stripe/server/Charge.d.ts.map +1 -1
  150. package/dist/stripe/server/Charge.js +49 -1
  151. package/dist/stripe/server/Charge.js.map +1 -1
  152. package/dist/stripe/server/Methods.d.ts +137 -48
  153. package/dist/stripe/server/Methods.d.ts.map +1 -1
  154. package/dist/stripe/server/Methods.js +259 -4
  155. package/dist/stripe/server/Methods.js.map +1 -1
  156. package/dist/stripe/server/internal/deposit-address.d.ts +13 -0
  157. package/dist/stripe/server/internal/deposit-address.d.ts.map +1 -0
  158. package/dist/stripe/server/internal/deposit-address.js +28 -0
  159. package/dist/stripe/server/internal/deposit-address.js.map +1 -0
  160. package/dist/stripe/server/internal/html.gen.d.ts +1 -1
  161. package/dist/stripe/server/internal/html.gen.d.ts.map +1 -1
  162. package/dist/stripe/server/internal/html.gen.js +1 -1
  163. package/dist/stripe/server/internal/html.gen.js.map +1 -1
  164. package/dist/stripe/server/internal/record-payment.d.ts +15 -0
  165. package/dist/stripe/server/internal/record-payment.d.ts.map +1 -0
  166. package/dist/stripe/server/internal/record-payment.js +42 -0
  167. package/dist/stripe/server/internal/record-payment.js.map +1 -0
  168. package/dist/stripe/server/internal/request.d.ts +25 -0
  169. package/dist/stripe/server/internal/request.d.ts.map +1 -0
  170. package/dist/stripe/server/internal/request.js +29 -0
  171. package/dist/stripe/server/internal/request.js.map +1 -0
  172. package/dist/tap/Constants.d.ts +28 -0
  173. package/dist/tap/Constants.d.ts.map +1 -0
  174. package/dist/tap/Constants.js +32 -0
  175. package/dist/tap/Constants.js.map +1 -0
  176. package/dist/tap/Types.d.ts +11 -0
  177. package/dist/tap/Types.d.ts.map +1 -0
  178. package/dist/tap/Types.js +2 -0
  179. package/dist/tap/Types.js.map +1 -0
  180. package/dist/tap/client/index.d.ts +26 -0
  181. package/dist/tap/client/index.d.ts.map +1 -0
  182. package/dist/tap/client/index.js +33 -0
  183. package/dist/tap/client/index.js.map +1 -0
  184. package/dist/tap/index.d.ts +5 -0
  185. package/dist/tap/index.d.ts.map +1 -0
  186. package/dist/tap/index.js +5 -0
  187. package/dist/tap/index.js.map +1 -0
  188. package/dist/tap/server/index.d.ts +20 -0
  189. package/dist/tap/server/index.d.ts.map +1 -0
  190. package/dist/tap/server/index.js +36 -0
  191. package/dist/tap/server/index.js.map +1 -0
  192. package/dist/tempo/Attribution.d.ts +1 -1
  193. package/dist/tempo/Methods.d.ts +60 -60
  194. package/dist/tempo/Methods.d.ts.map +1 -1
  195. package/dist/tempo/Proof.d.ts +16 -16
  196. package/dist/tempo/client/Charge.d.ts +19 -19
  197. package/dist/tempo/client/Charge.d.ts.map +1 -1
  198. package/dist/tempo/client/Charge.js +1 -7
  199. package/dist/tempo/client/Charge.js.map +1 -1
  200. package/dist/tempo/client/Methods.d.ts +38 -38
  201. package/dist/tempo/client/Methods.js.map +1 -1
  202. package/dist/tempo/client/Subscription.d.ts +23 -23
  203. package/dist/tempo/client/Subscription.js.map +1 -1
  204. package/dist/tempo/internal/address.d.ts +2 -1
  205. package/dist/tempo/internal/address.d.ts.map +1 -1
  206. package/dist/tempo/internal/address.js +3 -1
  207. package/dist/tempo/internal/address.js.map +1 -1
  208. package/dist/tempo/internal/auto-swap.d.ts.map +1 -1
  209. package/dist/tempo/internal/auto-swap.js +4 -19
  210. package/dist/tempo/internal/auto-swap.js.map +1 -1
  211. package/dist/tempo/internal/defaults.d.ts +6 -6
  212. package/dist/tempo/internal/defaults.d.ts.map +1 -1
  213. package/dist/tempo/internal/fee-payer.d.ts +12 -12
  214. package/dist/tempo/internal/fee-payer.d.ts.map +1 -1
  215. package/dist/tempo/internal/fee-payer.js.map +1 -1
  216. package/dist/tempo/internal/proof.d.ts +17 -17
  217. package/dist/tempo/internal/proof.d.ts.map +1 -1
  218. package/dist/tempo/legacy/client/Session.d.ts +20 -20
  219. package/dist/tempo/legacy/client/Session.js.map +1 -1
  220. package/dist/tempo/legacy/client/SessionManager.js.map +1 -1
  221. package/dist/tempo/legacy/index.d.ts +1 -3
  222. package/dist/tempo/legacy/index.d.ts.map +1 -1
  223. package/dist/tempo/legacy/index.js +1 -3
  224. package/dist/tempo/legacy/index.js.map +1 -1
  225. package/dist/tempo/legacy/session/escrow.abi.d.ts +374 -374
  226. package/dist/tempo/legacy/session/escrow.abi.d.ts.map +1 -1
  227. package/dist/tempo/server/Charge.d.ts +34 -12
  228. package/dist/tempo/server/Charge.d.ts.map +1 -1
  229. package/dist/tempo/server/Charge.js +44 -39
  230. package/dist/tempo/server/Charge.js.map +1 -1
  231. package/dist/tempo/server/Methods.d.ts +37 -52
  232. package/dist/tempo/server/Methods.d.ts.map +1 -1
  233. package/dist/tempo/server/Methods.js +0 -14
  234. package/dist/tempo/server/Methods.js.map +1 -1
  235. package/dist/tempo/server/Relay.d.ts +14 -5
  236. package/dist/tempo/server/Relay.d.ts.map +1 -1
  237. package/dist/tempo/server/Relay.js +6 -4
  238. package/dist/tempo/server/Relay.js.map +1 -1
  239. package/dist/tempo/server/SponsorBudget.d.ts.map +1 -1
  240. package/dist/tempo/server/SponsorBudget.js +7 -1
  241. package/dist/tempo/server/SponsorBudget.js.map +1 -1
  242. package/dist/tempo/server/Subscription.d.ts +25 -25
  243. package/dist/tempo/server/Subscription.d.ts.map +1 -1
  244. package/dist/tempo/server/Subscription.js +2 -0
  245. package/dist/tempo/server/Subscription.js.map +1 -1
  246. package/dist/tempo/server/index.d.ts +1 -1
  247. package/dist/tempo/server/index.d.ts.map +1 -1
  248. package/dist/tempo/server/index.js +1 -1
  249. package/dist/tempo/server/index.js.map +1 -1
  250. package/dist/tempo/server/internal/html.gen.d.ts +1 -1
  251. package/dist/tempo/server/internal/html.gen.d.ts.map +1 -1
  252. package/dist/tempo/server/internal/html.gen.js +1 -1
  253. package/dist/tempo/server/internal/html.gen.js.map +1 -1
  254. package/dist/tempo/server/internal/transport.d.ts +2 -0
  255. package/dist/tempo/server/internal/transport.d.ts.map +1 -1
  256. package/dist/tempo/server/internal/transport.js +9 -2
  257. package/dist/tempo/server/internal/transport.js.map +1 -1
  258. package/dist/tempo/session/client/ChannelOps.js.map +1 -1
  259. package/dist/tempo/session/client/CredentialState.d.ts +1 -1
  260. package/dist/tempo/session/client/CredentialState.js.map +1 -1
  261. package/dist/tempo/session/client/ReceiptCoordinator.js.map +1 -1
  262. package/dist/tempo/session/client/Runtime.js.map +1 -1
  263. package/dist/tempo/session/client/Session.d.ts +19 -19
  264. package/dist/tempo/session/client/Session.d.ts.map +1 -1
  265. package/dist/tempo/session/client/Session.js +128 -14
  266. package/dist/tempo/session/client/Session.js.map +1 -1
  267. package/dist/tempo/session/client/SessionManager.d.ts.map +1 -1
  268. package/dist/tempo/session/client/SessionManager.js +62 -20
  269. package/dist/tempo/session/client/SessionManager.js.map +1 -1
  270. package/dist/tempo/session/client/Transports.d.ts +9 -1
  271. package/dist/tempo/session/client/Transports.d.ts.map +1 -1
  272. package/dist/tempo/session/client/Transports.js +36 -13
  273. package/dist/tempo/session/client/Transports.js.map +1 -1
  274. package/dist/tempo/session/precompile/Chain.d.ts +27 -0
  275. package/dist/tempo/session/precompile/Chain.d.ts.map +1 -1
  276. package/dist/tempo/session/precompile/Chain.js +68 -7
  277. package/dist/tempo/session/precompile/Chain.js.map +1 -1
  278. package/dist/tempo/session/precompile/Protocol.js.map +1 -1
  279. package/dist/tempo/session/precompile/Voucher.d.ts +4 -4
  280. package/dist/tempo/session/precompile/Voucher.d.ts.map +1 -1
  281. package/dist/tempo/session/precompile/escrow.abi.d.ts +306 -306
  282. package/dist/tempo/session/precompile/escrow.abi.d.ts.map +1 -1
  283. package/dist/tempo/session/server/ChannelStore.d.ts +9 -0
  284. package/dist/tempo/session/server/ChannelStore.d.ts.map +1 -1
  285. package/dist/tempo/session/server/ChannelStore.js +16 -8
  286. package/dist/tempo/session/server/ChannelStore.js.map +1 -1
  287. package/dist/tempo/session/server/CredentialVerification.d.ts +30 -13
  288. package/dist/tempo/session/server/CredentialVerification.d.ts.map +1 -1
  289. package/dist/tempo/session/server/CredentialVerification.js +207 -13
  290. package/dist/tempo/session/server/CredentialVerification.js.map +1 -1
  291. package/dist/tempo/session/server/MeteredStream.d.ts +3 -0
  292. package/dist/tempo/session/server/MeteredStream.d.ts.map +1 -1
  293. package/dist/tempo/session/server/MeteredStream.js +3 -1
  294. package/dist/tempo/session/server/MeteredStream.js.map +1 -1
  295. package/dist/tempo/session/server/Session.d.ts +32 -21
  296. package/dist/tempo/session/server/Session.d.ts.map +1 -1
  297. package/dist/tempo/session/server/Session.js +116 -53
  298. package/dist/tempo/session/server/Session.js.map +1 -1
  299. package/dist/tempo/session/server/Sse.d.ts +3 -1
  300. package/dist/tempo/session/server/Sse.d.ts.map +1 -1
  301. package/dist/tempo/session/server/Sse.js +2 -1
  302. package/dist/tempo/session/server/Sse.js.map +1 -1
  303. package/dist/tempo/session/server/Transports.d.ts +1 -1
  304. package/dist/tempo/session/server/Transports.d.ts.map +1 -1
  305. package/dist/tempo/session/server/Transports.js +1 -0
  306. package/dist/tempo/session/server/Transports.js.map +1 -1
  307. package/dist/tempo/session/server/Ws.d.ts +6 -1
  308. package/dist/tempo/session/server/Ws.d.ts.map +1 -1
  309. package/dist/tempo/session/server/Ws.js +4 -0
  310. package/dist/tempo/session/server/Ws.js.map +1 -1
  311. package/dist/tempo/subscription/KeyAuthorization.d.ts +38 -866
  312. package/dist/tempo/subscription/KeyAuthorization.d.ts.map +1 -1
  313. package/dist/tempo/subscription/KeyAuthorization.js +14 -3
  314. package/dist/tempo/subscription/KeyAuthorization.js.map +1 -1
  315. package/dist/viem/Account.d.ts.map +1 -1
  316. package/dist/viem/Account.js.map +1 -1
  317. package/dist/viem/Client.d.ts.map +1 -1
  318. package/dist/viem/Client.js +6 -1
  319. package/dist/viem/Client.js.map +1 -1
  320. package/dist/web-bot-auth/Constants.d.ts +20 -0
  321. package/dist/web-bot-auth/Constants.d.ts.map +1 -0
  322. package/dist/web-bot-auth/Constants.js +24 -0
  323. package/dist/web-bot-auth/Constants.js.map +1 -0
  324. package/dist/web-bot-auth/Types.d.ts +10 -0
  325. package/dist/web-bot-auth/Types.d.ts.map +1 -0
  326. package/dist/web-bot-auth/Types.js +2 -0
  327. package/dist/web-bot-auth/Types.js.map +1 -0
  328. package/dist/web-bot-auth/client/index.d.ts +29 -0
  329. package/dist/web-bot-auth/client/index.d.ts.map +1 -0
  330. package/dist/web-bot-auth/client/index.js +64 -0
  331. package/dist/web-bot-auth/client/index.js.map +1 -0
  332. package/dist/web-bot-auth/index.d.ts +7 -0
  333. package/dist/web-bot-auth/index.d.ts.map +1 -0
  334. package/dist/web-bot-auth/index.js +7 -0
  335. package/dist/web-bot-auth/index.js.map +1 -0
  336. package/dist/web-bot-auth/internal/JwkThumbprint.d.ts +5 -0
  337. package/dist/web-bot-auth/internal/JwkThumbprint.d.ts.map +1 -0
  338. package/dist/web-bot-auth/internal/JwkThumbprint.js +20 -0
  339. package/dist/web-bot-auth/internal/JwkThumbprint.js.map +1 -0
  340. package/dist/web-bot-auth/internal/SignatureAgent.d.ts +3 -0
  341. package/dist/web-bot-auth/internal/SignatureAgent.d.ts.map +1 -0
  342. package/dist/web-bot-auth/internal/SignatureAgent.js +18 -0
  343. package/dist/web-bot-auth/internal/SignatureAgent.js.map +1 -0
  344. package/dist/web-bot-auth/server/index.d.ts +35 -0
  345. package/dist/web-bot-auth/server/index.d.ts.map +1 -0
  346. package/dist/web-bot-auth/server/index.js +88 -0
  347. package/dist/web-bot-auth/server/index.js.map +1 -0
  348. package/dist/x402/Assets.d.ts.map +1 -1
  349. package/dist/x402/Types.d.ts +6 -6
  350. package/dist/x402/Types.d.ts.map +1 -1
  351. package/dist/x402/server/EvmCharge.d.ts.map +1 -1
  352. package/dist/x402/server/EvmCharge.js +32 -20
  353. package/dist/x402/server/EvmCharge.js.map +1 -1
  354. package/package.json +20 -4
  355. package/src/Challenge.fuzz.test.ts +80 -47
  356. package/src/Challenge.test.ts +65 -0
  357. package/src/Challenge.ts +39 -35
  358. package/src/Method.ts +82 -68
  359. package/src/Store.test-d.ts +16 -0
  360. package/src/Store.test.ts +50 -0
  361. package/src/Store.ts +68 -0
  362. package/src/attestation/Attestation.integration.test.ts +208 -0
  363. package/src/attestation/Client.test.ts +83 -0
  364. package/src/attestation/Client.ts +34 -0
  365. package/src/attestation/Constants.ts +15 -0
  366. package/src/attestation/Server.test.ts +60 -0
  367. package/src/attestation/Server.ts +12 -0
  368. package/src/attestation/Types.test-d.ts +54 -0
  369. package/src/attestation/Types.ts +77 -0
  370. package/src/attestation/index.ts +5 -0
  371. package/src/attestation/internal/HttpMessageSignature.test.ts +101 -0
  372. package/src/attestation/internal/HttpMessageSignature.ts +429 -0
  373. package/src/attestation/internal/SigningContext.ts +13 -0
  374. package/src/bin.js +2 -0
  375. package/src/cli/cli.ts +1 -0
  376. package/src/cli/validate/payment.ts +18 -4
  377. package/src/cli/validate.test.ts +16 -0
  378. package/src/client/Mppx.test-d.ts +17 -0
  379. package/src/client/Mppx.test.ts +14 -14
  380. package/src/client/Mppx.ts +25 -4
  381. package/src/client/Transport.test.ts +12 -45
  382. package/src/client/Transport.ts +3 -24
  383. package/src/client/internal/Fetch.test.ts +77 -0
  384. package/src/client/internal/Fetch.ts +112 -14
  385. package/src/client/internal/MethodChallenge.ts +5 -0
  386. package/src/client/internal/MethodResponse.ts +28 -0
  387. package/src/discovery/OpenApi.test.ts +170 -0
  388. package/src/discovery/OpenApi.ts +16 -48
  389. package/src/discovery/internal/Metadata.ts +51 -0
  390. package/src/evm/server/Charge.ts +6 -1
  391. package/src/internal/AcceptPayment.test.ts +12 -8
  392. package/src/internal/types.ts +9 -0
  393. package/src/mcp/client/McpClient.integration.test.ts +19 -32
  394. package/src/middlewares/elysia.test.ts +2 -12
  395. package/src/middlewares/express.test.ts +2 -12
  396. package/src/middlewares/hono.test.ts +6 -9
  397. package/src/middlewares/nextjs.test.ts +2 -12
  398. package/src/proxy/Proxy.test.ts +26 -19
  399. package/src/proxy/Proxy.ts +147 -9
  400. package/src/proxy/Proxy.upstreamError.test.ts +364 -0
  401. package/src/proxy/Service.test.ts +73 -3
  402. package/src/proxy/Service.ts +50 -23
  403. package/src/proxy/services/anthropic.ts +1 -0
  404. package/src/proxy/services/hooks.test-d.ts +14 -0
  405. package/src/proxy/services/hooks.test.ts +44 -0
  406. package/src/proxy/services/openai.ts +1 -0
  407. package/src/proxy/services/stripe.ts +1 -0
  408. package/src/server/Methods.test-d.ts +88 -0
  409. package/src/server/Methods.test.ts +69 -0
  410. package/src/server/Mppx.test-d.ts +141 -7
  411. package/src/server/Mppx.test.ts +1017 -119
  412. package/src/server/Mppx.ts +350 -54
  413. package/src/stripe/internal/constants.ts +1 -1
  414. package/src/stripe/internal/types.ts +1 -0
  415. package/src/stripe/server/Charge.test-d.ts +16 -1
  416. package/src/stripe/server/Charge.test.ts +79 -0
  417. package/src/stripe/server/Charge.ts +54 -1
  418. package/src/stripe/server/Methods.test-d.ts +157 -0
  419. package/src/stripe/server/Methods.test.ts +403 -0
  420. package/src/stripe/server/Methods.ts +423 -6
  421. package/src/stripe/server/internal/deposit-address.ts +57 -0
  422. package/src/stripe/server/internal/html/node_modules/.bin/mppx +3 -3
  423. package/src/stripe/server/internal/html/package.json +1 -1
  424. package/src/stripe/server/internal/html.gen.ts +1 -1
  425. package/src/stripe/server/internal/record-payment.ts +66 -0
  426. package/src/stripe/server/internal/request.ts +49 -0
  427. package/src/tap/Constants.ts +32 -0
  428. package/src/tap/Tap.test.ts +125 -0
  429. package/src/tap/Types.ts +11 -0
  430. package/src/tap/client/index.ts +54 -0
  431. package/src/tap/index.ts +4 -0
  432. package/src/tap/server/index.ts +48 -0
  433. package/src/tempo/PublicExports.test-d.ts +3 -3
  434. package/src/tempo/client/Charge.ts +1 -19
  435. package/src/tempo/internal/address.test.ts +42 -0
  436. package/src/tempo/internal/address.ts +3 -3
  437. package/src/tempo/internal/auto-swap.test.ts +4 -4
  438. package/src/tempo/internal/auto-swap.ts +7 -50
  439. package/src/tempo/legacy/README.md +5 -5
  440. package/src/tempo/legacy/index.ts +1 -3
  441. package/src/tempo/server/AtomicStore.test-d.ts +13 -0
  442. package/src/tempo/server/Charge.test.ts +19 -84
  443. package/src/tempo/server/Charge.ts +92 -56
  444. package/src/tempo/server/Methods.ts +0 -20
  445. package/src/tempo/server/Relay.test.ts +161 -7
  446. package/src/tempo/server/Relay.ts +15 -6
  447. package/src/tempo/server/SponsorBudget.test.ts +29 -0
  448. package/src/tempo/server/SponsorBudget.ts +7 -1
  449. package/src/tempo/server/Subscription.ts +4 -1
  450. package/src/tempo/server/index.ts +1 -1
  451. package/src/tempo/server/internal/html/node_modules/.bin/mppx +3 -3
  452. package/src/tempo/server/internal/html/package.json +1 -1
  453. package/src/tempo/server/internal/html.gen.ts +1 -1
  454. package/src/tempo/server/internal/transport.test.ts +22 -3
  455. package/src/tempo/server/internal/transport.ts +15 -3
  456. package/src/tempo/session/README.md +119 -0
  457. package/src/tempo/session/client/Session.test.ts +299 -33
  458. package/src/tempo/session/client/Session.ts +152 -16
  459. package/src/tempo/session/client/SessionManager.test.ts +216 -9
  460. package/src/tempo/session/client/SessionManager.ts +63 -17
  461. package/src/tempo/session/client/Transports.test.ts +22 -0
  462. package/src/tempo/session/client/Transports.ts +58 -22
  463. package/src/tempo/session/precompile/Chain.ts +131 -11
  464. package/src/tempo/session/server/ChannelStore.ts +33 -12
  465. package/src/tempo/session/server/CredentialVerification.test.ts +4 -4
  466. package/src/tempo/session/server/CredentialVerification.ts +340 -28
  467. package/src/tempo/session/server/MeteredStream.ts +5 -1
  468. package/src/tempo/session/server/Session.test.ts +483 -36
  469. package/src/tempo/session/server/Session.ts +159 -60
  470. package/src/tempo/session/server/Sse.test.ts +77 -0
  471. package/src/tempo/session/server/Sse.ts +8 -1
  472. package/src/tempo/session/server/Transports.ts +2 -1
  473. package/src/tempo/session/server/Ws.test.ts +171 -0
  474. package/src/tempo/session/server/Ws.ts +10 -1
  475. package/src/tempo/subscription/KeyAuthorization.test.ts +70 -1
  476. package/src/tempo/subscription/KeyAuthorization.ts +14 -3
  477. package/src/viem/Client.test.ts +18 -1
  478. package/src/viem/Client.ts +7 -1
  479. package/src/web-bot-auth/Constants.ts +24 -0
  480. package/src/web-bot-auth/Types.ts +9 -0
  481. package/src/web-bot-auth/WebBotAuth.test.ts +182 -0
  482. package/src/web-bot-auth/client/index.ts +84 -0
  483. package/src/web-bot-auth/index.ts +6 -0
  484. package/src/web-bot-auth/internal/JwkThumbprint.ts +21 -0
  485. package/src/web-bot-auth/internal/SignatureAgent.ts +18 -0
  486. package/src/web-bot-auth/server/index.ts +113 -0
  487. package/src/x402/Exact.e2e.test.ts +121 -81
  488. package/src/x402/Exact.localnet.test.ts +1 -1
  489. package/src/x402/server/EvmCharge.ts +35 -19
  490. package/dist/tempo/legacy/server/Session.d.ts +0 -208
  491. package/dist/tempo/legacy/server/Session.d.ts.map +0 -1
  492. package/dist/tempo/legacy/server/Session.js +0 -698
  493. package/dist/tempo/legacy/server/Session.js.map +0 -1
  494. package/dist/tempo/legacy/server/index.d.ts +0 -5
  495. package/dist/tempo/legacy/server/index.d.ts.map +0 -1
  496. package/dist/tempo/legacy/server/index.js +0 -5
  497. package/dist/tempo/legacy/server/index.js.map +0 -1
  498. package/dist/tempo/legacy/session/ChannelStore.d.ts +0 -22
  499. package/dist/tempo/legacy/session/ChannelStore.d.ts.map +0 -1
  500. package/dist/tempo/legacy/session/ChannelStore.js +0 -6
  501. package/dist/tempo/legacy/session/ChannelStore.js.map +0 -1
  502. package/src/tempo/legacy/server/Defaults.test-d.ts +0 -9
  503. package/src/tempo/legacy/server/Session.test.ts +0 -6370
  504. package/src/tempo/legacy/server/Session.ts +0 -1024
  505. package/src/tempo/legacy/server/index.ts +0 -4
  506. package/src/tempo/legacy/session/ChannelStore.test.ts +0 -58
  507. package/src/tempo/legacy/session/ChannelStore.ts +0 -39
@@ -1,3 +1,4 @@
1
+ import * as Challenge from '../Challenge.js'
1
2
  import * as Method from '../Method.js'
2
3
  import * as Mppx from '../server/Mppx.js'
3
4
  import * as z from '../zod.js'
@@ -56,6 +57,8 @@ const subscribe = Method.toServer(
56
57
  credential: { payload: z.object({ signature: z.string() }) },
57
58
  request: z.object({
58
59
  amount: z.string(),
60
+ interval: z.string(),
61
+ recipient: z.string(),
59
62
  }),
60
63
  },
61
64
  }),
@@ -69,6 +72,38 @@ const subscribe = Method.toServer(
69
72
  },
70
73
  )
71
74
 
75
+ const transformedCharge = Method.toServer(
76
+ Method.from({
77
+ intent: 'charge',
78
+ name: 'transformed',
79
+ schema: {
80
+ credential: { payload: z.object({ signature: z.string() }) },
81
+ request: z.pipe(
82
+ z.object({
83
+ amount: z.string(),
84
+ asset: z.string(),
85
+ decimals: z.number(),
86
+ recipient: z.string(),
87
+ }),
88
+ z.transform(({ amount, asset, decimals, recipient }) => ({
89
+ amount: String(Number(amount) * 10 ** decimals),
90
+ currency: asset,
91
+ methodDetails: { decimals },
92
+ recipient,
93
+ })),
94
+ ),
95
+ },
96
+ }),
97
+ {
98
+ verify: async () => ({
99
+ method: 'transformed',
100
+ reference: '',
101
+ status: 'success' as const,
102
+ timestamp: '',
103
+ }),
104
+ },
105
+ )
106
+
72
107
  function createMppx<const methods extends Mppx.Methods>(methods: methods) {
73
108
  return Mppx.create({
74
109
  methods,
@@ -169,6 +204,7 @@ describe('generate', () => {
169
204
  {
170
205
  "amount": "50",
171
206
  "currency": "usd",
207
+ "description": "Search credits",
172
208
  "intent": "charge",
173
209
  "method": "tempo",
174
210
  "recipient": "0x1",
@@ -182,6 +218,140 @@ describe('generate', () => {
182
218
  `)
183
219
  })
184
220
 
221
+ test('matches handler discovery to its canonical runtime challenge', async () => {
222
+ const mppx = createMppx([transformedCharge])
223
+ const handler = mppx.charge({
224
+ amount: '2',
225
+ asset: '0xUSDC',
226
+ decimals: 6,
227
+ description: 'Canonical price',
228
+ recipient: '0x1',
229
+ })
230
+
231
+ const doc = generate(mppx, {
232
+ routes: [{ handler, method: 'post', path: '/api/resource' }],
233
+ }) as any
234
+ const result = await handler(new Request('https://example.com/api/resource'))
235
+ if (result.status !== 402) throw new Error('Expected payment challenge')
236
+ const challenge = Challenge.fromResponse(result.challenge)
237
+
238
+ expect(doc.paths['/api/resource'].post['x-payment-info'].offers[0]).toEqual({
239
+ amount: challenge.request.amount,
240
+ currency: challenge.request.currency,
241
+ description: challenge.description,
242
+ intent: challenge.intent,
243
+ method: challenge.method,
244
+ recipient: challenge.request.recipient,
245
+ })
246
+ })
247
+
248
+ test('applies method schema transforms to legacy route discovery', () => {
249
+ const mppx = createMppx([transformedCharge])
250
+ const doc = generate(mppx, {
251
+ routes: [
252
+ {
253
+ intent: 'charge',
254
+ method: 'post',
255
+ options: {
256
+ amount: '2',
257
+ asset: '0xUSDC',
258
+ decimals: 6,
259
+ description: 'Canonical price',
260
+ recipient: '0x1',
261
+ },
262
+ path: '/api/resource',
263
+ },
264
+ ],
265
+ }) as any
266
+
267
+ expect(doc.paths['/api/resource'].post['x-payment-info'].offers[0]).toEqual({
268
+ amount: '2000000',
269
+ currency: '0xUSDC',
270
+ description: 'Canonical price',
271
+ intent: 'charge',
272
+ method: 'transformed',
273
+ recipient: '0x1',
274
+ })
275
+ })
276
+
277
+ test('derives only explicitly composed payment offers from a handler', () => {
278
+ const mppx = createMppx([charge, session])
279
+ const handler = mppx.compose(
280
+ ['tempo/charge', { amount: '50', currency: '0xUSDC', description: 'USDC', recipient: '0x1' }],
281
+ [
282
+ 'tempo/charge',
283
+ { amount: '50', currency: '0xNANOUSD', description: 'NANOUSD', recipient: '0x1' },
284
+ ],
285
+ )
286
+
287
+ const doc = generate(mppx, {
288
+ routes: [{ handler, method: 'post', path: '/api/search' }],
289
+ }) as any
290
+
291
+ expect(doc.paths['/api/search'].post['x-payment-info'].offers).toEqual([
292
+ {
293
+ amount: '50',
294
+ currency: '0xUSDC',
295
+ description: 'USDC',
296
+ intent: 'charge',
297
+ method: 'tempo',
298
+ recipient: '0x1',
299
+ },
300
+ {
301
+ amount: '50',
302
+ currency: '0xNANOUSD',
303
+ description: 'NANOUSD',
304
+ intent: 'charge',
305
+ method: 'tempo',
306
+ recipient: '0x1',
307
+ },
308
+ ])
309
+ })
310
+
311
+ test('keeps nested composed discovery in runtime challenge order', async () => {
312
+ const mppx = createMppx([charge])
313
+ const handler = Mppx.compose(
314
+ mppx.charge({
315
+ amount: '1',
316
+ currency: '0xUSDC',
317
+ description: 'USDC',
318
+ recipient: '0x1',
319
+ }),
320
+ Mppx.compose(
321
+ mppx.charge({
322
+ amount: '2',
323
+ currency: '0xNANOUSD',
324
+ description: 'NANOUSD',
325
+ recipient: '0x1',
326
+ }),
327
+ mppx.charge({
328
+ amount: '3',
329
+ currency: 'usd',
330
+ description: 'Card',
331
+ recipient: '0x1',
332
+ }),
333
+ ),
334
+ )
335
+
336
+ const doc = generate(mppx, {
337
+ routes: [{ handler, method: 'post', path: '/api/search' }],
338
+ }) as any
339
+ const result = await handler(new Request('https://example.com/api/search'))
340
+ if (result.status !== 402) throw new Error('Expected payment challenge')
341
+
342
+ const discovered = doc.paths['/api/search'].post['x-payment-info'].offers
343
+ const challenged = Challenge.fromResponseList(result.challenge).map((challenge) => ({
344
+ amount: challenge.request.amount,
345
+ currency: challenge.request.currency,
346
+ description: challenge.description,
347
+ intent: challenge.intent,
348
+ method: challenge.method,
349
+ recipient: challenge.request.recipient,
350
+ }))
351
+
352
+ expect(discovered).toEqual(challenged)
353
+ })
354
+
185
355
  test('handles null amount for session intent', () => {
186
356
  const mppx = createMppx([session])
187
357
  const doc = generate(mppx, {
@@ -1,12 +1,11 @@
1
1
  import type * as Method from '../Method.js'
2
+ import * as PaymentRequest from '../PaymentRequest.js'
2
3
  import { PaymentInfo, type ServiceInfo } from './Discovery.js'
4
+ import * as Metadata from './internal/Metadata.js'
3
5
 
6
+ /** Payment handler carrying metadata used to generate discovery documents. */
4
7
  export type DiscoveryHandler = ((...args: any[]) => unknown) & {
5
- _internal?: {
6
- _canonicalRequest: Record<string, unknown>
7
- intent: string
8
- name: string
9
- }
8
+ _internal?: Metadata.Metadata
10
9
  }
11
10
 
12
11
  export type LegacyRouteConfig = {
@@ -151,11 +150,9 @@ function resolveRoute(
151
150
  return {
152
151
  method: route.method,
153
152
  path: route.path,
154
- payment: paymentInfoFromCanonical({
155
- canonicalRequest: internal._canonicalRequest,
156
- intent: internal.intent,
157
- method: internal.name,
158
- }),
153
+ payment: {
154
+ offers: Metadata.offers(internal).map(Metadata.paymentOffer),
155
+ },
159
156
  ...(route.requestBody ? { requestBody: route.requestBody } : {}),
160
157
  ...(route.summary ? { summary: route.summary } : {}),
161
158
  }
@@ -168,52 +165,23 @@ function resolveRoute(
168
165
  )
169
166
  }
170
167
 
168
+ const { description, ...options } = route.options
169
+ const metadata: Metadata.Offer = {
170
+ _canonicalRequest: PaymentRequest.fromMethod(mi, options as never),
171
+ ...(typeof description === 'string' ? { description } : {}),
172
+ intent: mi.intent,
173
+ name: mi.name,
174
+ }
175
+
171
176
  return {
172
177
  method: route.method,
173
178
  path: route.path,
174
- payment: paymentInfoFromCanonical({
175
- canonicalRequest: route.options,
176
- intent: mi.intent,
177
- method: mi.name,
178
- }),
179
+ payment: Metadata.paymentOffer(metadata),
179
180
  ...(route.requestBody ? { requestBody: route.requestBody } : {}),
180
181
  ...(route.summary ? { summary: route.summary } : {}),
181
182
  }
182
183
  }
183
184
 
184
- function paymentInfoFromCanonical(route: {
185
- canonicalRequest: Record<string, unknown>
186
- intent: string
187
- method: string
188
- }) {
189
- const { canonicalRequest, intent, method } = route
190
- const methodDetails = (canonicalRequest.methodDetails ?? {}) as Record<string, unknown>
191
-
192
- const amount = pickString(canonicalRequest.amount) ?? pickString(methodDetails.amount) ?? null
193
- const currency = pickString(canonicalRequest.currency) ?? pickString(methodDetails.currency)
194
- const description = pickString(canonicalRequest.description)
195
-
196
- const base: Record<string, unknown> = {
197
- amount,
198
- ...(currency ? { currency } : {}),
199
- ...(description ? { description } : {}),
200
- intent,
201
- method,
202
- }
203
-
204
- // Forward any extra canonical params that aren't already covered.
205
- const reserved = new Set(['amount', 'currency', 'description', 'methodDetails'])
206
- for (const [key, value] of Object.entries(canonicalRequest)) {
207
- if (!reserved.has(key) && value !== undefined) base[key] = value
208
- }
209
-
210
- return base
211
- }
212
-
213
- function pickString(value: unknown) {
214
- return typeof value === 'string' ? value : undefined
215
- }
216
-
217
185
  function withBasePath(basePath: string | undefined, path: string) {
218
186
  if (!basePath) return path
219
187
  const normalizedBasePath = basePath.startsWith('/') ? basePath : `/${basePath}`
@@ -0,0 +1,51 @@
1
+ /** Metadata retained by one explicitly configured payment handler. */
2
+ export type Offer = {
3
+ _canonicalRequest: Record<string, unknown>
4
+ description?: string | undefined
5
+ intent: string
6
+ name: string
7
+ }
8
+
9
+ /** Metadata retained by a single or composed payment handler. */
10
+ export type Metadata = Offer | { offers: readonly Offer[] }
11
+
12
+ /** Returns every explicitly configured offer from discovery metadata. */
13
+ export function offers(metadata: Metadata): readonly Offer[] {
14
+ if (isComposed(metadata)) return metadata.offers
15
+ return [metadata]
16
+ }
17
+
18
+ /** Converts configured handler metadata into a discovery payment offer. */
19
+ export function paymentOffer(metadata: Offer): Record<string, unknown> {
20
+ const { _canonicalRequest: request, intent, name: method } = metadata
21
+ const methodDetails = (request.methodDetails ?? {}) as Record<string, unknown>
22
+
23
+ const amount = pickString(request.amount) ?? pickString(methodDetails.amount) ?? null
24
+ const currency = pickString(request.currency) ?? pickString(methodDetails.currency)
25
+ const description = pickString(metadata.description) ?? pickString(request.description)
26
+
27
+ const offer: Record<string, unknown> = {
28
+ amount,
29
+ ...(currency ? { currency } : {}),
30
+ ...(description ? { description } : {}),
31
+ intent,
32
+ method,
33
+ }
34
+
35
+ // Preserve extension fields emitted by method request schemas.
36
+ const reserved = new Set(['amount', 'currency', 'description', 'methodDetails'])
37
+ for (const [key, value] of Object.entries(request)) {
38
+ if (!reserved.has(key) && value !== undefined) offer[key] = value
39
+ }
40
+
41
+ return offer
42
+ }
43
+
44
+ /** Returns whether metadata represents a composed handler. */
45
+ export function isComposed(metadata: Metadata): metadata is Extract<Metadata, { offers: unknown }> {
46
+ return 'offers' in metadata && !('_canonicalRequest' in metadata)
47
+ }
48
+
49
+ function pickString(value: unknown) {
50
+ return typeof value === 'string' ? value : undefined
51
+ }
@@ -24,6 +24,8 @@ export function charge(parameters: charge.NativeConfig): Method.AnyServer {
24
24
  const transport = httpTransport(paths)
25
25
 
26
26
  return Method.toServer<typeof Methods.charge, charge.Defaults, typeof transport>(Methods.charge, {
27
+ canOffer: parameters.canOffer,
28
+ onPaymentSuccess: parameters.onPaymentSuccess,
27
29
  defaults: {
28
30
  chainId: config.chainId,
29
31
  currency: config.currency,
@@ -107,7 +109,10 @@ export declare namespace charge {
107
109
  type Parameters = NativeConfig
108
110
  type Native = Method.Server<typeof Methods.charge, Defaults>
109
111
 
110
- type NativeConfig = BaseConfig & CurrencyConfig & RecipientConfig
112
+ type NativeConfig = BaseConfig &
113
+ CurrencyConfig &
114
+ RecipientConfig &
115
+ Method.ComposableHooks<typeof Methods.charge>
111
116
 
112
117
  type BaseConfig = {
113
118
  /** EIP-3009 token domain metadata. Required for raw addresses and viem tokens; inferred for known assets. */
@@ -226,21 +226,21 @@ describe('AcceptPayment', () => {
226
226
  test('selectChallengeCandidates supports duplicate method keys with challenge predicates', () => {
227
227
  const challenges = [
228
228
  {
229
- id: 'v2',
229
+ id: 'primary',
230
230
  intent: 'session',
231
231
  method: 'tempo',
232
232
  realm: 'test',
233
- request: { methodDetails: { sessionProtocol: 'v2' } },
233
+ request: { methodDetails: { sessionProtocol: 'primary' } },
234
234
  },
235
235
  {
236
- id: 'v1',
236
+ id: 'fallback',
237
237
  intent: 'session',
238
238
  method: 'tempo',
239
239
  realm: 'test',
240
- request: { methodDetails: { sessionProtocol: 'v1' } },
240
+ request: { methodDetails: { sessionProtocol: 'fallback' } },
241
241
  },
242
242
  {
243
- id: 'old-server',
243
+ id: 'unmarked',
244
244
  intent: 'session',
245
245
  method: 'tempo',
246
246
  realm: 'test',
@@ -257,7 +257,7 @@ describe('AcceptPayment', () => {
257
257
  challenge: AcceptPayment.ChallengeCandidate['challenge']
258
258
  }) =>
259
259
  (challenge.request.methodDetails as { sessionProtocol?: string } | undefined)
260
- ?.sessionProtocol === 'v2',
260
+ ?.sessionProtocol === 'primary',
261
261
  },
262
262
  {
263
263
  name: 'tempo',
@@ -270,7 +270,7 @@ describe('AcceptPayment', () => {
270
270
  const sessionProtocol = (
271
271
  challenge.request.methodDetails as { sessionProtocol?: string } | undefined
272
272
  )?.sessionProtocol
273
- return sessionProtocol === undefined || sessionProtocol === 'v1'
273
+ return sessionProtocol === undefined || sessionProtocol === 'fallback'
274
274
  },
275
275
  },
276
276
  ] as const
@@ -281,7 +281,11 @@ describe('AcceptPayment', () => {
281
281
  AcceptPayment.parse('tempo/session'),
282
282
  )
283
283
 
284
- expect(candidates.map(({ challenge }) => challenge.id)).toEqual(['v2', 'v1', 'old-server'])
284
+ expect(candidates.map(({ challenge }) => challenge.id)).toEqual([
285
+ 'primary',
286
+ 'fallback',
287
+ 'unmarked',
288
+ ])
285
289
  })
286
290
 
287
291
  test('selectChallenge honors a specific opt-out over a broader wildcard', () => {
@@ -2,6 +2,15 @@
2
2
  // https://twitter.com/mattpocockuk/status/1622730173446557697?s=20&t=NdpAcmEFXY01xkqU3KO0Mg
3
3
  export type Compute<type> = { [key in keyof type]: type[key] } & unknown
4
4
 
5
+ /** Recursively makes every property of a value readonly. */
6
+ export type DeepReadonly<type> = type extends (...args: infer _arguments) => infer _return
7
+ ? type
8
+ : type extends readonly unknown[]
9
+ ? { readonly [key in keyof type]: DeepReadonly<type[key]> }
10
+ : type extends object
11
+ ? { readonly [key in keyof type]: DeepReadonly<type[key]> }
12
+ : type
13
+
5
14
  declare const symbol: unique symbol
6
15
 
7
16
  /**
@@ -6,20 +6,22 @@ import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/
6
6
  import { createMcpExpressApp } from '@modelcontextprotocol/sdk/server/express.js'
7
7
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
8
8
  import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js'
9
- import { sessionLegacy as tempo_session_client, tempo as tempo_client } from 'mppx/client'
9
+ import { session as tempo_session_client, tempo as tempo_client } from 'mppx/client'
10
10
  import { Mppx as Mppx_server, tempo as tempo_server } from 'mppx/server'
11
11
  import type { Address } from 'viem'
12
12
  import { readContract } from 'viem/actions'
13
13
  import { Actions, Addresses } from 'viem/tempo'
14
14
  import { beforeAll, describe, expect, test } from 'vp/test'
15
15
  import { tempoNetwork } from '~test/config.js'
16
- import { deployEscrow, signTopUpChannel } from '~test/tempo/legacy/session.js'
17
16
  import { accounts, asset, client as testClient, fundAccount } from '~test/tempo/viem.js'
18
17
 
19
18
  import * as Credential from '../../Credential.js'
20
19
  import * as core_Mcp from '../../Mcp.js'
21
20
  import * as Store from '../../Store.js'
22
- import type { SessionReceipt } from '../../tempo/session/precompile/Protocol.js'
21
+ import type {
22
+ SessionCredentialPayload,
23
+ SessionReceipt,
24
+ } from '../../tempo/session/precompile/Protocol.js'
23
25
  import * as ChannelStore from '../../tempo/session/server/ChannelStore.js'
24
26
  import * as McpServer_transport from '../server/Transport.js'
25
27
  import * as McpClient from './McpClient.js'
@@ -31,21 +33,11 @@ const doubleSessionAmountRaw = chargeAmountRaw * 2n
31
33
  const topUpAmountRaw = chargeAmountRaw * 3n
32
34
  const isLocalnet = tempoNetwork === 'localnet'
33
35
 
34
- let escrowContract: Address
35
-
36
- // TODO: Remove once the minimum viem version is >=2.54.0, which uses client-first Tempo call builders.
37
36
  function tokenGetBalanceCall(parameters: { account: Address; token: Address }) {
38
- const call = Actions.token.getBalance.call as unknown as {
39
- length: number
40
- (parameters: { account: Address; token: Address }): unknown
41
- (client: unknown, parameters: { account: Address; token: Address }): unknown
42
- }
43
- if (call.length >= 2) return call(testClient, parameters)
44
- return call(parameters)
37
+ return Actions.token.getBalance.call(testClient, parameters)
45
38
  }
46
39
 
47
40
  beforeAll(async () => {
48
- escrowContract = await deployEscrow()
49
41
  await fundAccount({ address: accounts[4].address, token: Addresses.pathUsd })
50
42
  await fundAccount({ address: accounts[4].address, token: asset })
51
43
  await fundAccount({ address: accounts[2].address, token: Addresses.pathUsd })
@@ -171,6 +163,7 @@ describe.runIf(isLocalnet)('McpClient.wrap integration', () => {
171
163
  action: 'voucher',
172
164
  channelId: openReceipt!.channelId,
173
165
  cumulativeAmountRaw: replayedCumulativeRaw,
166
+ descriptor: credentialDescriptor(openCredential),
174
167
  },
175
168
  })
176
169
  const firstVoucher = await callToolWithCredential(
@@ -236,7 +229,7 @@ describe.runIf(isLocalnet)('McpClient.wrap integration', () => {
236
229
  {
237
230
  name: 'session intent can top up a live MCP channel and continue metering on the same channel',
238
231
  sessionFeePayer: true,
239
- sessionMaxDeposit: '2',
232
+ sessionMaxDeposit: '5',
240
233
  async run(harness: Harness) {
241
234
  const openChallenge = await getPaymentChallenge(harness.sdkClient, 'session_tool')
242
235
  const openCredential = await harness.sessionMethod.createCredential({
@@ -269,14 +262,6 @@ describe.runIf(isLocalnet)('McpClient.wrap integration', () => {
269
262
  expect(meteredReceipt?.channelId).toBe(openReceipt?.channelId)
270
263
  expect(meteredReceipt?.acceptedCumulative).toBe((chargeAmountRaw * 2n).toString())
271
264
 
272
- const { serializedTransaction } = await signTopUpChannel({
273
- escrow: escrowContract,
274
- feePayer: true,
275
- payer: accounts[2],
276
- channelId: openReceipt!.channelId,
277
- token: asset,
278
- amount: topUpAmountRaw,
279
- })
280
265
  const topUpChallenge = await getPaymentChallenge(harness.sdkClient, 'session_tool')
281
266
  const topUpCredential = await harness.sessionMethod.createCredential({
282
267
  challenge: topUpChallenge,
@@ -284,7 +269,7 @@ describe.runIf(isLocalnet)('McpClient.wrap integration', () => {
284
269
  action: 'topUp',
285
270
  additionalDepositRaw: topUpAmountRaw.toString(),
286
271
  channelId: openReceipt!.channelId,
287
- transaction: serializedTransaction,
272
+ descriptor: credentialDescriptor(openCredential),
288
273
  },
289
274
  })
290
275
  const toppedUp = await callToolWithCredential(
@@ -317,7 +302,7 @@ describe.runIf(isLocalnet)('McpClient.wrap integration', () => {
317
302
  expect(resumedReceipt?.acceptedCumulative).toBe((chargeAmountRaw * 3n).toString())
318
303
 
319
304
  const channel = await harness.sessionStore.getChannel(openReceipt!.channelId)
320
- expect(channel?.deposit).toBe(chargeAmountRaw * 2n + topUpAmountRaw)
305
+ expect(channel?.deposit).toBe(chargeAmountRaw * 5n + topUpAmountRaw)
321
306
  expect(channel?.highestVoucherAmount).toBe(chargeAmountRaw * 3n)
322
307
  expect(channel?.spent).toBeGreaterThanOrEqual(BigInt(topUpReceipt!.spent))
323
308
  expect(channel?.units).toBeGreaterThanOrEqual(topUpReceipt?.units ?? 0)
@@ -362,6 +347,7 @@ describe.runIf(isLocalnet)('McpClient.wrap integration', () => {
362
347
  action: 'close',
363
348
  channelId: openReceipt!.channelId,
364
349
  cumulativeAmountRaw: (chargeAmountRaw * 2n).toString(),
350
+ descriptor: credentialDescriptor(openCredential),
365
351
  },
366
352
  })
367
353
  const closed = await callToolWithCredential(
@@ -452,7 +438,6 @@ type Harness = {
452
438
 
453
439
  async function createHarness(options?: {
454
440
  sessionFeePayer?: boolean | undefined
455
- sessionDeposit?: string | undefined
456
441
  sessionMaxDeposit?: string | undefined
457
442
  }): Promise<Harness> {
458
443
  const sessionBackingStore = Store.memory()
@@ -463,11 +448,8 @@ async function createHarness(options?: {
463
448
  })
464
449
  const sessionMethod = tempo_session_client({
465
450
  account: accounts[2],
466
- escrowContract,
467
451
  getClient: () => testClient,
468
- ...(options?.sessionMaxDeposit
469
- ? { maxDeposit: options.sessionMaxDeposit }
470
- : { deposit: options?.sessionDeposit ?? '5' }),
452
+ ...(options?.sessionMaxDeposit ? { maxDeposit: options.sessionMaxDeposit } : {}),
471
453
  })
472
454
 
473
455
  const payment = Mppx_server.create({
@@ -477,10 +459,9 @@ async function createHarness(options?: {
477
459
  currency: asset,
478
460
  getClient: () => testClient,
479
461
  }),
480
- tempo_server.sessionLegacy({
462
+ tempo_server.session({
481
463
  account: accounts[0],
482
464
  currency: asset,
483
- escrowContract,
484
465
  getClient: () => testClient,
485
466
  store: sessionBackingStore,
486
467
  ...(options?.sessionFeePayer ? { feePayer: accounts[4] } : {}),
@@ -578,6 +559,12 @@ async function createHarness(options?: {
578
559
  }
579
560
  }
580
561
 
562
+ function credentialDescriptor(serializedCredential: string) {
563
+ const payload = Credential.deserialize<SessionCredentialPayload>(serializedCredential).payload
564
+ if (!payload.descriptor) throw new Error('Session credential is missing its channel descriptor.')
565
+ return payload.descriptor
566
+ }
567
+
581
568
  async function getPaymentChallenge(client: Client, toolName: string): Promise<SessionChallenge> {
582
569
  try {
583
570
  await client.callTool({ name: toolName, arguments: {} })
@@ -2,18 +2,12 @@ import * as http from 'node:http'
2
2
 
3
3
  import { Elysia } from 'elysia'
4
4
  import { Receipt } from 'mppx'
5
- import {
6
- Mppx as Mppx_client,
7
- sessionLegacy as sessionIntent,
8
- tempo as tempo_client,
9
- } from 'mppx/client'
5
+ import { Mppx as Mppx_client, session as sessionIntent, tempo as tempo_client } from 'mppx/client'
10
6
  import { Mppx, discovery, payment } from 'mppx/elysia'
11
7
  import { tempo as tempo_server } from 'mppx/server'
12
- import type { Address } from 'viem'
13
8
  import { Addresses } from 'viem/tempo'
14
9
  import { beforeAll, describe, expect, test } from 'vp/test'
15
10
  import * as TestHttp from '~test/Http.js'
16
- import { deployEscrow } from '~test/tempo/legacy/session.js'
17
11
  import { accounts, asset, client, fundAccount } from '~test/tempo/viem.js'
18
12
 
19
13
  function createServer(app: Elysia<any, any, any, any, any, any, any>) {
@@ -201,16 +195,13 @@ describe('charge', () => {
201
195
  })
202
196
 
203
197
  describe('session', () => {
204
- let escrowContract: Address
205
-
206
198
  function createSessionHarness(feePayer: boolean) {
207
199
  const mppx = Mppx.create({
208
200
  methods: [
209
- tempo_server.sessionLegacy({
201
+ tempo_server.session({
210
202
  getClient: () => client,
211
203
  account: accounts[0],
212
204
  currency: asset,
213
- escrowContract,
214
205
  ...(feePayer ? { feePayer: accounts[1] } : {}),
215
206
  } as any),
216
207
  ],
@@ -232,7 +223,6 @@ describe('session', () => {
232
223
  }
233
224
 
234
225
  beforeAll(async () => {
235
- escrowContract = await deployEscrow()
236
226
  await fundAccount({ address: accounts[1].address, token: Addresses.pathUsd })
237
227
  await fundAccount({ address: accounts[1].address, token: asset })
238
228
  await fundAccount({ address: accounts[2].address, token: Addresses.pathUsd })
@@ -1,17 +1,11 @@
1
1
  import express from 'express'
2
2
  import { Receipt } from 'mppx'
3
- import {
4
- Mppx as Mppx_client,
5
- sessionLegacy as sessionIntent,
6
- tempo as tempo_client,
7
- } from 'mppx/client'
3
+ import { Mppx as Mppx_client, session as sessionIntent, tempo as tempo_client } from 'mppx/client'
8
4
  import { Mppx, discovery, payment } from 'mppx/express'
9
5
  import { Mppx as Mppx_server, tempo as tempo_server } from 'mppx/server'
10
- import type { Address } from 'viem'
11
6
  import { Addresses } from 'viem/tempo'
12
7
  import { beforeAll, describe, expect, test } from 'vp/test'
13
8
  import * as Http from '~test/Http.js'
14
- import { deployEscrow } from '~test/tempo/legacy/session.js'
15
9
  import { accounts, asset, client, fundAccount } from '~test/tempo/viem.js'
16
10
 
17
11
  function createServer(app: express.Express) {
@@ -195,16 +189,13 @@ describe('payment', () => {
195
189
  })
196
190
 
197
191
  describe('session', () => {
198
- let escrowContract: Address
199
-
200
192
  function createSessionHarness(feePayer: boolean) {
201
193
  const mppx = Mppx.create({
202
194
  methods: [
203
- tempo_server.sessionLegacy({
195
+ tempo_server.session({
204
196
  getClient: () => client,
205
197
  account: accounts[0],
206
198
  currency: asset,
207
- escrowContract,
208
199
  ...(feePayer ? { feePayer: accounts[1] } : {}),
209
200
  } as any),
210
201
  ],
@@ -226,7 +217,6 @@ describe('session', () => {
226
217
  }
227
218
 
228
219
  beforeAll(async () => {
229
- escrowContract = await deployEscrow()
230
220
  await fundAccount({ address: accounts[1].address, token: Addresses.pathUsd })
231
221
  await fundAccount({ address: accounts[1].address, token: asset })
232
222
  await fundAccount({ address: accounts[2].address, token: Addresses.pathUsd })