mppx 0.6.30 → 0.7.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 (483) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/Challenge.d.ts.map +1 -1
  3. package/dist/Challenge.js +9 -7
  4. package/dist/Challenge.js.map +1 -1
  5. package/dist/Constants.d.ts +46 -0
  6. package/dist/Constants.d.ts.map +1 -0
  7. package/dist/Constants.js +46 -0
  8. package/dist/Constants.js.map +1 -0
  9. package/dist/Credential.d.ts.map +1 -1
  10. package/dist/Credential.js +5 -4
  11. package/dist/Credential.js.map +1 -1
  12. package/dist/Method.d.ts +32 -4
  13. package/dist/Method.d.ts.map +1 -1
  14. package/dist/Method.js +5 -2
  15. package/dist/Method.js.map +1 -1
  16. package/dist/Receipt.d.ts.map +1 -1
  17. package/dist/Receipt.js +3 -2
  18. package/dist/Receipt.js.map +1 -1
  19. package/dist/cli/cli.d.ts.map +1 -1
  20. package/dist/cli/cli.js +19 -11
  21. package/dist/cli/cli.js.map +1 -1
  22. package/dist/cli/plugins/tempo.d.ts.map +1 -1
  23. package/dist/cli/plugins/tempo.js +17 -6
  24. package/dist/cli/plugins/tempo.js.map +1 -1
  25. package/dist/cli/utils.d.ts +5 -0
  26. package/dist/cli/utils.d.ts.map +1 -1
  27. package/dist/cli/utils.js +10 -0
  28. package/dist/cli/utils.js.map +1 -1
  29. package/dist/client/Methods.d.ts +5 -2
  30. package/dist/client/Methods.d.ts.map +1 -1
  31. package/dist/client/Methods.js +5 -2
  32. package/dist/client/Methods.js.map +1 -1
  33. package/dist/client/Transport.d.ts.map +1 -1
  34. package/dist/client/Transport.js +4 -5
  35. package/dist/client/Transport.js.map +1 -1
  36. package/dist/client/index.d.ts +2 -1
  37. package/dist/client/index.d.ts.map +1 -1
  38. package/dist/client/index.js +2 -1
  39. package/dist/client/index.js.map +1 -1
  40. package/dist/client/internal/Fetch.d.ts.map +1 -1
  41. package/dist/client/internal/Fetch.js +14 -6
  42. package/dist/client/internal/Fetch.js.map +1 -1
  43. package/dist/evm/server/Methods.d.ts +1 -1
  44. package/dist/evm/server/Methods.d.ts.map +1 -1
  45. package/dist/index.d.ts +1 -0
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +1 -0
  48. package/dist/index.js.map +1 -1
  49. package/dist/internal/AcceptPayment.d.ts +3 -0
  50. package/dist/internal/AcceptPayment.d.ts.map +1 -1
  51. package/dist/internal/AcceptPayment.js +15 -11
  52. package/dist/internal/AcceptPayment.js.map +1 -1
  53. package/dist/mcp-sdk/client/McpClient.d.ts +12 -5
  54. package/dist/mcp-sdk/client/McpClient.d.ts.map +1 -1
  55. package/dist/mcp-sdk/client/McpClient.js +55 -42
  56. package/dist/mcp-sdk/client/McpClient.js.map +1 -1
  57. package/dist/server/Mppx.d.ts +11 -3
  58. package/dist/server/Mppx.d.ts.map +1 -1
  59. package/dist/server/Mppx.js +76 -27
  60. package/dist/server/Mppx.js.map +1 -1
  61. package/dist/server/Request.js +24 -10
  62. package/dist/server/Request.js.map +1 -1
  63. package/dist/server/Response.d.ts.map +1 -1
  64. package/dist/server/Response.js +2 -1
  65. package/dist/server/Response.js.map +1 -1
  66. package/dist/server/Transport.d.ts.map +1 -1
  67. package/dist/server/Transport.js +4 -3
  68. package/dist/server/Transport.js.map +1 -1
  69. package/dist/server/index.d.ts +1 -0
  70. package/dist/server/index.d.ts.map +1 -1
  71. package/dist/server/index.js +1 -0
  72. package/dist/server/index.js.map +1 -1
  73. package/dist/stripe/client/Charge.d.ts +1 -1
  74. package/dist/stripe/client/Charge.d.ts.map +1 -1
  75. package/dist/stripe/client/Charge.js +3 -1
  76. package/dist/stripe/client/Charge.js.map +1 -1
  77. package/dist/stripe/server/Charge.d.ts +1 -1
  78. package/dist/stripe/server/Charge.d.ts.map +1 -1
  79. package/dist/stripe/server/Charge.js +9 -2
  80. package/dist/stripe/server/Charge.js.map +1 -1
  81. package/dist/stripe/server/Methods.d.ts +1 -1
  82. package/dist/stripe/server/Methods.d.ts.map +1 -1
  83. package/dist/stripe/server/internal/html.gen.d.ts +1 -1
  84. package/dist/stripe/server/internal/html.gen.d.ts.map +1 -1
  85. package/dist/stripe/server/internal/html.gen.js +1 -1
  86. package/dist/stripe/server/internal/html.gen.js.map +1 -1
  87. package/dist/tempo/Methods.d.ts +18 -0
  88. package/dist/tempo/Methods.d.ts.map +1 -1
  89. package/dist/tempo/Methods.js +16 -1
  90. package/dist/tempo/Methods.js.map +1 -1
  91. package/dist/tempo/client/Charge.d.ts +6 -0
  92. package/dist/tempo/client/Charge.d.ts.map +1 -1
  93. package/dist/tempo/client/Charge.js +9 -2
  94. package/dist/tempo/client/Charge.js.map +1 -1
  95. package/dist/tempo/client/Methods.d.ts +36 -7
  96. package/dist/tempo/client/Methods.d.ts.map +1 -1
  97. package/dist/tempo/client/Methods.js +12 -5
  98. package/dist/tempo/client/Methods.js.map +1 -1
  99. package/dist/tempo/client/index.d.ts +7 -4
  100. package/dist/tempo/client/index.d.ts.map +1 -1
  101. package/dist/tempo/client/index.js +5 -3
  102. package/dist/tempo/client/index.js.map +1 -1
  103. package/dist/tempo/index.d.ts +1 -0
  104. package/dist/tempo/index.d.ts.map +1 -1
  105. package/dist/tempo/index.js +1 -0
  106. package/dist/tempo/index.js.map +1 -1
  107. package/dist/tempo/internal/fee-payer.d.ts +21 -1
  108. package/dist/tempo/internal/fee-payer.d.ts.map +1 -1
  109. package/dist/tempo/internal/fee-payer.js +109 -4
  110. package/dist/tempo/internal/fee-payer.js.map +1 -1
  111. package/dist/tempo/{client → legacy/client}/ChannelOps.d.ts +19 -6
  112. package/dist/tempo/legacy/client/ChannelOps.d.ts.map +1 -0
  113. package/dist/tempo/{client → legacy/client}/ChannelOps.js +9 -3
  114. package/dist/tempo/legacy/client/ChannelOps.js.map +1 -0
  115. package/dist/tempo/{client → legacy/client}/Session.d.ts +23 -4
  116. package/dist/tempo/legacy/client/Session.d.ts.map +1 -0
  117. package/dist/tempo/{client → legacy/client}/Session.js +14 -7
  118. package/dist/tempo/legacy/client/Session.js.map +1 -0
  119. package/dist/tempo/{client → legacy/client}/SessionManager.d.ts +20 -5
  120. package/dist/tempo/legacy/client/SessionManager.d.ts.map +1 -0
  121. package/dist/tempo/{client → legacy/client}/SessionManager.js +20 -16
  122. package/dist/tempo/legacy/client/SessionManager.js.map +1 -0
  123. package/dist/tempo/legacy/client/index.d.ts +7 -0
  124. package/dist/tempo/legacy/client/index.d.ts.map +1 -0
  125. package/dist/tempo/legacy/client/index.js +5 -0
  126. package/dist/tempo/legacy/client/index.js.map +1 -0
  127. package/dist/tempo/legacy/index.d.ts +7 -0
  128. package/dist/tempo/legacy/index.d.ts.map +1 -0
  129. package/dist/tempo/legacy/index.js +7 -0
  130. package/dist/tempo/legacy/index.js.map +1 -0
  131. package/dist/tempo/{server → legacy/server}/Session.d.ts +28 -11
  132. package/dist/tempo/legacy/server/Session.d.ts.map +1 -0
  133. package/dist/tempo/{server → legacy/server}/Session.js +28 -23
  134. package/dist/tempo/legacy/server/Session.js.map +1 -0
  135. package/dist/tempo/legacy/server/index.d.ts +5 -0
  136. package/dist/tempo/legacy/server/index.d.ts.map +1 -0
  137. package/dist/tempo/legacy/server/index.js +5 -0
  138. package/dist/tempo/legacy/server/index.js.map +1 -0
  139. package/dist/tempo/{session → legacy/session}/Chain.d.ts +30 -23
  140. package/dist/tempo/legacy/session/Chain.d.ts.map +1 -0
  141. package/dist/tempo/{session → legacy/session}/Chain.js +12 -11
  142. package/dist/tempo/legacy/session/Chain.js.map +1 -0
  143. package/dist/tempo/{session → legacy/session}/Channel.d.ts +1 -0
  144. package/dist/tempo/legacy/session/Channel.d.ts.map +1 -0
  145. package/dist/tempo/legacy/session/Channel.js.map +1 -0
  146. package/dist/tempo/legacy/session/ChannelStore.d.ts +22 -0
  147. package/dist/tempo/legacy/session/ChannelStore.d.ts.map +1 -0
  148. package/dist/tempo/legacy/session/ChannelStore.js +6 -0
  149. package/dist/tempo/legacy/session/ChannelStore.js.map +1 -0
  150. package/dist/tempo/legacy/session/Types.d.ts +73 -0
  151. package/dist/tempo/legacy/session/Types.d.ts.map +1 -0
  152. package/dist/tempo/legacy/session/Types.js.map +1 -0
  153. package/dist/tempo/{session → legacy/session}/Voucher.d.ts +4 -4
  154. package/dist/tempo/legacy/session/Voucher.d.ts.map +1 -0
  155. package/dist/tempo/{session → legacy/session}/Voucher.js +1 -1
  156. package/dist/tempo/legacy/session/Voucher.js.map +1 -0
  157. package/dist/tempo/{session → legacy/session}/escrow.abi.d.ts +1 -0
  158. package/dist/tempo/{session → legacy/session}/escrow.abi.d.ts.map +1 -1
  159. package/dist/tempo/{session → legacy/session}/escrow.abi.js +1 -0
  160. package/dist/tempo/legacy/session/escrow.abi.js.map +1 -0
  161. package/dist/tempo/legacy/session/index.d.ts +9 -0
  162. package/dist/tempo/legacy/session/index.d.ts.map +1 -0
  163. package/dist/tempo/legacy/session/index.js +9 -0
  164. package/dist/tempo/legacy/session/index.js.map +1 -0
  165. package/dist/tempo/server/Charge.d.ts +1 -1
  166. package/dist/tempo/server/Charge.d.ts.map +1 -1
  167. package/dist/tempo/server/Charge.js +13 -16
  168. package/dist/tempo/server/Charge.js.map +1 -1
  169. package/dist/tempo/server/Methods.d.ts +63 -6
  170. package/dist/tempo/server/Methods.d.ts.map +1 -1
  171. package/dist/tempo/server/Methods.js +36 -8
  172. package/dist/tempo/server/Methods.js.map +1 -1
  173. package/dist/tempo/server/Subscription.d.ts +1 -1
  174. package/dist/tempo/server/Subscription.d.ts.map +1 -1
  175. package/dist/tempo/server/index.d.ts +6 -5
  176. package/dist/tempo/server/index.d.ts.map +1 -1
  177. package/dist/tempo/server/index.js +5 -5
  178. package/dist/tempo/server/index.js.map +1 -1
  179. package/dist/tempo/server/internal/html.gen.d.ts +1 -1
  180. package/dist/tempo/server/internal/html.gen.d.ts.map +1 -1
  181. package/dist/tempo/server/internal/html.gen.js +1 -1
  182. package/dist/tempo/server/internal/html.gen.js.map +1 -1
  183. package/dist/tempo/server/internal/request-body.d.ts +7 -2
  184. package/dist/tempo/server/internal/request-body.d.ts.map +1 -1
  185. package/dist/tempo/server/internal/request-body.js +20 -3
  186. package/dist/tempo/server/internal/request-body.js.map +1 -1
  187. package/dist/tempo/server/internal/transport.d.ts +8 -4
  188. package/dist/tempo/server/internal/transport.d.ts.map +1 -1
  189. package/dist/tempo/server/internal/transport.js +8 -7
  190. package/dist/tempo/server/internal/transport.js.map +1 -1
  191. package/dist/tempo/session/Snapshot.d.ts +32 -0
  192. package/dist/tempo/session/Snapshot.d.ts.map +1 -0
  193. package/dist/tempo/session/Snapshot.js +37 -0
  194. package/dist/tempo/session/Snapshot.js.map +1 -0
  195. package/dist/tempo/session/client/ChannelOps.d.ts +82 -0
  196. package/dist/tempo/session/client/ChannelOps.d.ts.map +1 -0
  197. package/dist/tempo/session/client/ChannelOps.js +204 -0
  198. package/dist/tempo/session/client/ChannelOps.js.map +1 -0
  199. package/dist/tempo/session/client/CredentialState.d.ts +262 -0
  200. package/dist/tempo/session/client/CredentialState.d.ts.map +1 -0
  201. package/dist/tempo/session/client/CredentialState.js +417 -0
  202. package/dist/tempo/session/client/CredentialState.js.map +1 -0
  203. package/dist/tempo/session/client/ReceiptCoordinator.d.ts +26 -0
  204. package/dist/tempo/session/client/ReceiptCoordinator.d.ts.map +1 -0
  205. package/dist/tempo/session/client/ReceiptCoordinator.js +61 -0
  206. package/dist/tempo/session/client/ReceiptCoordinator.js.map +1 -0
  207. package/dist/tempo/session/client/Runtime.d.ts +464 -0
  208. package/dist/tempo/session/client/Runtime.d.ts.map +1 -0
  209. package/dist/tempo/session/client/Runtime.js +499 -0
  210. package/dist/tempo/session/client/Runtime.js.map +1 -0
  211. package/dist/tempo/session/client/Session.d.ts +132 -0
  212. package/dist/tempo/session/client/Session.d.ts.map +1 -0
  213. package/dist/tempo/session/client/Session.js +55 -0
  214. package/dist/tempo/session/client/Session.js.map +1 -0
  215. package/dist/tempo/session/client/SessionManager.d.ts +120 -0
  216. package/dist/tempo/session/client/SessionManager.d.ts.map +1 -0
  217. package/dist/tempo/session/client/SessionManager.js +627 -0
  218. package/dist/tempo/session/client/SessionManager.js.map +1 -0
  219. package/dist/tempo/session/client/Transports.d.ts +449 -0
  220. package/dist/tempo/session/client/Transports.d.ts.map +1 -0
  221. package/dist/tempo/session/client/Transports.js +721 -0
  222. package/dist/tempo/session/client/Transports.js.map +1 -0
  223. package/dist/tempo/session/client/index.d.ts +12 -0
  224. package/dist/tempo/session/client/index.d.ts.map +1 -0
  225. package/dist/tempo/session/client/index.js +5 -0
  226. package/dist/tempo/session/client/index.js.map +1 -0
  227. package/dist/tempo/session/index.d.ts +7 -8
  228. package/dist/tempo/session/index.d.ts.map +1 -1
  229. package/dist/tempo/session/index.js +7 -8
  230. package/dist/tempo/session/index.js.map +1 -1
  231. package/dist/tempo/session/precompile/Chain.d.ts +319 -0
  232. package/dist/tempo/session/precompile/Chain.d.ts.map +1 -0
  233. package/dist/tempo/session/precompile/Chain.js +492 -0
  234. package/dist/tempo/session/precompile/Chain.js.map +1 -0
  235. package/dist/tempo/session/precompile/Channel.d.ts +46 -0
  236. package/dist/tempo/session/precompile/Channel.d.ts.map +1 -0
  237. package/dist/tempo/session/precompile/Channel.js +56 -0
  238. package/dist/tempo/session/precompile/Channel.js.map +1 -0
  239. package/dist/tempo/session/precompile/Protocol.d.ts +308 -0
  240. package/dist/tempo/session/precompile/Protocol.d.ts.map +1 -0
  241. package/dist/tempo/session/precompile/Protocol.js +264 -0
  242. package/dist/tempo/session/precompile/Protocol.js.map +1 -0
  243. package/dist/tempo/session/precompile/Voucher.d.ts +40 -0
  244. package/dist/tempo/session/precompile/Voucher.d.ts.map +1 -0
  245. package/dist/tempo/session/precompile/Voucher.js +126 -0
  246. package/dist/tempo/session/precompile/Voucher.js.map +1 -0
  247. package/dist/tempo/session/precompile/escrow.abi.d.ts +522 -0
  248. package/dist/tempo/session/precompile/escrow.abi.d.ts.map +1 -0
  249. package/dist/tempo/session/precompile/escrow.abi.js +224 -0
  250. package/dist/tempo/session/precompile/escrow.abi.js.map +1 -0
  251. package/dist/tempo/session/precompile/index.d.ts +24 -0
  252. package/dist/tempo/session/precompile/index.d.ts.map +1 -0
  253. package/dist/tempo/session/precompile/index.js +22 -0
  254. package/dist/tempo/session/precompile/index.js.map +1 -0
  255. package/dist/tempo/session/server/ChannelOps.d.ts +56 -0
  256. package/dist/tempo/session/server/ChannelOps.d.ts.map +1 -0
  257. package/dist/tempo/session/server/ChannelOps.js +91 -0
  258. package/dist/tempo/session/server/ChannelOps.js.map +1 -0
  259. package/dist/tempo/session/server/ChannelStore.d.ts +347 -0
  260. package/dist/tempo/session/server/ChannelStore.d.ts.map +1 -0
  261. package/dist/tempo/session/server/ChannelStore.js +404 -0
  262. package/dist/tempo/session/server/ChannelStore.js.map +1 -0
  263. package/dist/tempo/session/server/CredentialVerification.d.ts +85 -0
  264. package/dist/tempo/session/server/CredentialVerification.d.ts.map +1 -0
  265. package/dist/tempo/session/server/CredentialVerification.js +494 -0
  266. package/dist/tempo/session/server/CredentialVerification.js.map +1 -0
  267. package/dist/tempo/session/server/MeteredStream.d.ts +40 -0
  268. package/dist/tempo/session/server/MeteredStream.d.ts.map +1 -0
  269. package/dist/tempo/session/server/MeteredStream.js +42 -0
  270. package/dist/tempo/session/server/MeteredStream.js.map +1 -0
  271. package/dist/tempo/session/server/RequestState.d.ts +208 -0
  272. package/dist/tempo/session/server/RequestState.d.ts.map +1 -0
  273. package/dist/tempo/session/server/RequestState.js +252 -0
  274. package/dist/tempo/session/server/RequestState.js.map +1 -0
  275. package/dist/tempo/session/server/Session.d.ts +169 -0
  276. package/dist/tempo/session/server/Session.d.ts.map +1 -0
  277. package/dist/tempo/session/server/Session.js +351 -0
  278. package/dist/tempo/session/server/Session.js.map +1 -0
  279. package/dist/tempo/session/server/Settlement.d.ts +185 -0
  280. package/dist/tempo/session/server/Settlement.d.ts.map +1 -0
  281. package/dist/tempo/session/server/Settlement.js +250 -0
  282. package/dist/tempo/session/server/Settlement.js.map +1 -0
  283. package/dist/tempo/session/{Sse.d.ts → server/Sse.d.ts} +9 -56
  284. package/dist/tempo/session/server/Sse.d.ts.map +1 -0
  285. package/dist/tempo/session/server/Sse.js +184 -0
  286. package/dist/tempo/session/server/Sse.js.map +1 -0
  287. package/dist/tempo/session/server/Transports.d.ts +89 -0
  288. package/dist/tempo/session/server/Transports.d.ts.map +1 -0
  289. package/dist/tempo/session/server/Transports.js +149 -0
  290. package/dist/tempo/session/server/Transports.js.map +1 -0
  291. package/dist/tempo/session/server/Ws.d.ts +48 -0
  292. package/dist/tempo/session/server/Ws.d.ts.map +1 -0
  293. package/dist/tempo/session/server/Ws.js +244 -0
  294. package/dist/tempo/session/server/Ws.js.map +1 -0
  295. package/dist/tempo/session/server/index.d.ts +4 -0
  296. package/dist/tempo/session/server/index.d.ts.map +1 -0
  297. package/dist/tempo/session/server/index.js +2 -0
  298. package/dist/tempo/session/server/index.js.map +1 -0
  299. package/package.json +8 -3
  300. package/src/Challenge.ts +9 -7
  301. package/src/Constants.ts +58 -0
  302. package/src/Credential.ts +5 -4
  303. package/src/Method.ts +46 -5
  304. package/src/Receipt.ts +3 -2
  305. package/src/cli/cli.test.ts +23 -28
  306. package/src/cli/cli.ts +23 -10
  307. package/src/cli/mcp.test.ts +21 -7
  308. package/src/cli/plugins/tempo.ts +21 -8
  309. package/src/cli/utils.test.ts +25 -1
  310. package/src/cli/utils.ts +10 -0
  311. package/src/client/Methods.ts +5 -2
  312. package/src/client/Mppx.test-d.ts +10 -0
  313. package/src/client/Mppx.test.ts +75 -0
  314. package/src/client/Transport.ts +4 -5
  315. package/src/client/index.ts +11 -1
  316. package/src/client/internal/Fetch.test.ts +29 -4
  317. package/src/client/internal/Fetch.ts +17 -5
  318. package/src/env.d.ts +1 -1
  319. package/src/index.ts +1 -0
  320. package/src/internal/AcceptPayment.test.ts +61 -0
  321. package/src/internal/AcceptPayment.ts +21 -14
  322. package/src/mcp-sdk/client/McpClient.integration.test.ts +8 -7
  323. package/src/mcp-sdk/client/McpClient.test-d.ts +7 -0
  324. package/src/mcp-sdk/client/McpClient.ts +99 -67
  325. package/src/mcp-sdk/client/McpClient.unit.test.ts +131 -0
  326. package/src/middlewares/elysia.test.ts +8 -4
  327. package/src/middlewares/express.test.ts +8 -4
  328. package/src/middlewares/hono.test.ts +4 -4
  329. package/src/middlewares/nextjs.test.ts +8 -4
  330. package/src/proxy/Proxy.test.ts +8 -8
  331. package/src/server/Mppx.test-d.ts +54 -0
  332. package/src/server/Mppx.test.ts +274 -7
  333. package/src/server/Mppx.ts +487 -406
  334. package/src/server/Request.test.ts +81 -0
  335. package/src/server/Request.ts +23 -9
  336. package/src/server/Response.ts +2 -1
  337. package/src/server/Transport.ts +4 -3
  338. package/src/server/index.ts +1 -0
  339. package/src/stripe/client/Charge.test.ts +20 -5
  340. package/src/stripe/client/Charge.ts +6 -2
  341. package/src/stripe/server/Charge.test.ts +114 -1
  342. package/src/stripe/server/Charge.ts +13 -2
  343. package/src/stripe/server/internal/html/package.json +1 -1
  344. package/src/stripe/server/internal/html.gen.ts +1 -1
  345. package/src/tempo/AccessKeyAuthorization.test.ts +4 -94
  346. package/src/tempo/Methods.test.ts +45 -17
  347. package/src/tempo/Methods.ts +22 -0
  348. package/src/tempo/PublicExports.test-d.ts +105 -0
  349. package/src/tempo/client/Charge.test.ts +85 -0
  350. package/src/tempo/client/Charge.ts +19 -2
  351. package/src/tempo/client/Methods.ts +18 -6
  352. package/src/tempo/client/index.ts +15 -4
  353. package/src/tempo/index.ts +1 -0
  354. package/src/tempo/internal/fee-payer.test.ts +241 -17
  355. package/src/tempo/internal/fee-payer.ts +150 -4
  356. package/src/tempo/internal/fee-token.test.ts +14 -9
  357. package/src/tempo/legacy/AccessKeyAuthorization.test.ts +162 -0
  358. package/src/tempo/legacy/README.md +9 -0
  359. package/src/tempo/{client → legacy/client}/ChannelOps.test.ts +6 -7
  360. package/src/tempo/{client → legacy/client}/ChannelOps.ts +22 -9
  361. package/src/tempo/{client → legacy/client}/Session.test.ts +51 -9
  362. package/src/tempo/{client → legacy/client}/Session.ts +25 -11
  363. package/src/tempo/{client → legacy/client}/SessionManager.test.ts +81 -9
  364. package/src/tempo/{client → legacy/client}/SessionManager.ts +41 -20
  365. package/src/tempo/legacy/client/index.ts +6 -0
  366. package/src/tempo/legacy/index.ts +6 -0
  367. package/src/tempo/{server → legacy/server}/Session.test.ts +162 -63
  368. package/src/tempo/{server → legacy/server}/Session.ts +49 -37
  369. package/src/tempo/legacy/server/index.ts +4 -0
  370. package/src/tempo/{session → legacy/session}/Chain.test.ts +3 -4
  371. package/src/tempo/{session → legacy/session}/Chain.ts +94 -63
  372. package/src/tempo/{session → legacy/session}/Channel.ts +1 -0
  373. package/src/tempo/legacy/session/ChannelStore.test.ts +58 -0
  374. package/src/tempo/legacy/session/ChannelStore.ts +39 -0
  375. package/src/tempo/legacy/session/Types.ts +91 -0
  376. package/src/tempo/{session → legacy/session}/Voucher.ts +12 -8
  377. package/src/tempo/{session → legacy/session}/escrow.abi.ts +1 -0
  378. package/src/tempo/legacy/session/index.ts +8 -0
  379. package/src/tempo/server/AtomicStore.test-d.ts +16 -11
  380. package/src/tempo/server/Charge.test.ts +92 -14
  381. package/src/tempo/server/Charge.ts +18 -16
  382. package/src/tempo/server/Methods.ts +54 -8
  383. package/src/tempo/server/Sse.test.ts +2 -2
  384. package/src/tempo/server/index.ts +6 -5
  385. package/src/tempo/server/internal/html/package.json +1 -1
  386. package/src/tempo/server/internal/html.gen.ts +1 -1
  387. package/src/tempo/server/internal/request-body.test.ts +37 -4
  388. package/src/tempo/server/internal/request-body.ts +25 -6
  389. package/src/tempo/server/internal/transport.test.ts +4 -4
  390. package/src/tempo/server/internal/transport.ts +19 -10
  391. package/src/tempo/session/Snapshot.test.ts +41 -0
  392. package/src/tempo/session/Snapshot.ts +74 -0
  393. package/src/tempo/session/client/ChannelOps.test.ts +163 -0
  394. package/src/tempo/session/client/ChannelOps.ts +344 -0
  395. package/src/tempo/session/client/CredentialState.test.ts +645 -0
  396. package/src/tempo/session/client/CredentialState.ts +814 -0
  397. package/src/tempo/session/client/ReceiptCoordinator.ts +95 -0
  398. package/src/tempo/session/client/Runtime.test.ts +1092 -0
  399. package/src/tempo/session/client/Runtime.ts +986 -0
  400. package/src/tempo/session/client/Session.test.ts +734 -0
  401. package/src/tempo/session/client/Session.ts +97 -0
  402. package/src/tempo/session/client/SessionManager.test.ts +1308 -0
  403. package/src/tempo/session/client/SessionManager.ts +845 -0
  404. package/src/tempo/session/client/Transports.test.ts +837 -0
  405. package/src/tempo/session/client/Transports.ts +1292 -0
  406. package/src/tempo/session/client/index.ts +37 -0
  407. package/src/tempo/session/index.ts +7 -8
  408. package/src/tempo/session/precompile/Chain.integration.test.ts +321 -0
  409. package/src/tempo/session/precompile/Chain.test.ts +1258 -0
  410. package/src/tempo/session/precompile/Chain.ts +979 -0
  411. package/src/tempo/session/precompile/Channel.test.ts +138 -0
  412. package/src/tempo/session/precompile/Channel.ts +103 -0
  413. package/src/tempo/session/precompile/Protocol.test.ts +358 -0
  414. package/src/tempo/session/precompile/Protocol.ts +520 -0
  415. package/src/tempo/session/precompile/Voucher.test.ts +316 -0
  416. package/src/tempo/session/precompile/Voucher.ts +160 -0
  417. package/src/tempo/session/precompile/escrow.abi.ts +226 -0
  418. package/src/tempo/session/precompile/index.ts +33 -0
  419. package/src/tempo/session/server/ChannelOps.test.ts +129 -0
  420. package/src/tempo/session/server/ChannelOps.ts +157 -0
  421. package/src/tempo/session/{ChannelStore.test.ts → server/ChannelStore.test.ts} +536 -29
  422. package/src/tempo/session/server/ChannelStore.ts +835 -0
  423. package/src/tempo/session/server/CredentialVerification.test.ts +146 -0
  424. package/src/tempo/session/server/CredentialVerification.ts +710 -0
  425. package/src/tempo/session/server/MeteredStream.ts +88 -0
  426. package/src/tempo/session/server/RequestState.test.ts +531 -0
  427. package/src/tempo/session/server/RequestState.ts +499 -0
  428. package/src/tempo/session/server/Session.integration.test.ts +444 -0
  429. package/src/tempo/session/server/Session.test.ts +3253 -0
  430. package/src/tempo/session/server/Session.ts +543 -0
  431. package/src/tempo/session/server/Settlement.test.ts +242 -0
  432. package/src/tempo/session/server/Settlement.ts +470 -0
  433. package/src/tempo/session/{Sse.test.ts → server/Sse.test.ts} +37 -3
  434. package/src/tempo/session/server/Sse.ts +256 -0
  435. package/src/tempo/session/server/Transports.test.ts +346 -0
  436. package/src/tempo/session/server/Transports.ts +255 -0
  437. package/src/tempo/session/{Ws.test.ts → server/Ws.test.ts} +4 -4
  438. package/src/tempo/session/server/Ws.ts +384 -0
  439. package/src/tempo/session/server/index.ts +8 -0
  440. package/dist/tempo/client/ChannelOps.d.ts.map +0 -1
  441. package/dist/tempo/client/ChannelOps.js.map +0 -1
  442. package/dist/tempo/client/Session.d.ts.map +0 -1
  443. package/dist/tempo/client/Session.js.map +0 -1
  444. package/dist/tempo/client/SessionManager.d.ts.map +0 -1
  445. package/dist/tempo/client/SessionManager.js.map +0 -1
  446. package/dist/tempo/server/Session.d.ts.map +0 -1
  447. package/dist/tempo/server/Session.js.map +0 -1
  448. package/dist/tempo/session/Chain.d.ts.map +0 -1
  449. package/dist/tempo/session/Chain.js.map +0 -1
  450. package/dist/tempo/session/Channel.d.ts.map +0 -1
  451. package/dist/tempo/session/Channel.js.map +0 -1
  452. package/dist/tempo/session/ChannelStore.d.ts +0 -117
  453. package/dist/tempo/session/ChannelStore.d.ts.map +0 -1
  454. package/dist/tempo/session/ChannelStore.js +0 -172
  455. package/dist/tempo/session/ChannelStore.js.map +0 -1
  456. package/dist/tempo/session/Receipt.d.ts +0 -22
  457. package/dist/tempo/session/Receipt.d.ts.map +0 -1
  458. package/dist/tempo/session/Receipt.js +0 -34
  459. package/dist/tempo/session/Receipt.js.map +0 -1
  460. package/dist/tempo/session/Sse.d.ts.map +0 -1
  461. package/dist/tempo/session/Sse.js +0 -363
  462. package/dist/tempo/session/Sse.js.map +0 -1
  463. package/dist/tempo/session/Types.d.ts +0 -78
  464. package/dist/tempo/session/Types.d.ts.map +0 -1
  465. package/dist/tempo/session/Types.js.map +0 -1
  466. package/dist/tempo/session/Voucher.d.ts.map +0 -1
  467. package/dist/tempo/session/Voucher.js.map +0 -1
  468. package/dist/tempo/session/Ws.d.ts +0 -87
  469. package/dist/tempo/session/Ws.d.ts.map +0 -1
  470. package/dist/tempo/session/Ws.js +0 -443
  471. package/dist/tempo/session/Ws.js.map +0 -1
  472. package/dist/tempo/session/escrow.abi.js.map +0 -1
  473. package/src/tempo/session/ChannelStore.ts +0 -308
  474. package/src/tempo/session/Receipt.test.ts +0 -89
  475. package/src/tempo/session/Receipt.ts +0 -46
  476. package/src/tempo/session/Sse.ts +0 -462
  477. package/src/tempo/session/Types.ts +0 -86
  478. package/src/tempo/session/Ws.ts +0 -576
  479. /package/dist/tempo/{session → legacy/session}/Channel.js +0 -0
  480. /package/dist/tempo/{session → legacy/session}/Types.js +0 -0
  481. /package/src/tempo/{session → legacy/session}/Channel.test.ts +0 -0
  482. /package/src/tempo/{session → legacy/session}/Voucher.test.ts +0 -0
  483. /package/src/tempo/session/{Sse.fuzz.test.ts → server/Sse.fuzz.test.ts} +0 -0
@@ -4,16 +4,16 @@ import * as os from 'node:os'
4
4
  import * as path from 'node:path'
5
5
  import { pathToFileURL } from 'node:url'
6
6
 
7
- import { decodeFunctionData, erc20Abi, parseUnits, type Address } from 'viem'
7
+ import { decodeFunctionData, parseUnits, type Address } from 'viem'
8
8
  import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts'
9
9
  import { Addresses, Transaction } from 'viem/tempo'
10
10
  import { afterAll, describe, expect, test } from 'vp/test'
11
11
  import * as Http from '~test/Http.js'
12
- import { rpcUrl } from '~test/tempo/prool.js'
13
- import { deployEscrow, escrowAbi } from '~test/tempo/session.js'
12
+ import { rpcUrl } from '~test/tempo/rpc.js'
14
13
  import { accounts, asset, chain, client, fundAccount } from '~test/tempo/viem.js'
15
14
 
16
15
  import * as Challenge from '../Challenge.js'
16
+ import * as Constants from '../Constants.js'
17
17
  import * as Credential from '../Credential.js'
18
18
  import * as Method from '../Method.js'
19
19
  import * as Receipt from '../Receipt.js'
@@ -22,7 +22,9 @@ import { toNodeListener } from '../server/Mppx.js'
22
22
  import * as Store from '../Store.js'
23
23
  import { stripe as stripe_server } from '../stripe/server/Methods.js'
24
24
  import { tempo } from '../tempo/server/Methods.js'
25
- import type { SessionCredentialPayload } from '../tempo/session/Types.js'
25
+ import { escrowAbi } from '../tempo/session/precompile/escrow.abi.js'
26
+ import { tip20ChannelEscrow } from '../tempo/session/precompile/Protocol.js'
27
+ import type { SessionCredentialPayload } from '../tempo/session/precompile/Protocol.js'
26
28
  import * as z from '../zod.js'
27
29
  import cli from './cli.js'
28
30
 
@@ -798,7 +800,7 @@ describe('session multi-fetch (examples/session/multi-fetch)', () => {
798
800
  await fundAccount({ address: testAccount.address, token: Addresses.pathUsd })
799
801
  await fundAccount({ address: testAccount.address, token: asset })
800
802
 
801
- const escrow = await deployEscrow()
803
+ const escrow = tip20ChannelEscrow
802
804
  const store = Store.memory()
803
805
  const server = Mppx_server.create({
804
806
  methods: [
@@ -840,11 +842,11 @@ describe('session multi-fetch (examples/session/multi-fetch)', () => {
840
842
  }
841
843
  })
842
844
 
843
- test('prefers CLI deposit over server suggestedDeposit', { timeout: 120_000 }, async () => {
845
+ test('uses server suggestedDeposit within CLI max deposit', { timeout: 120_000 }, async () => {
844
846
  await fundAccount({ address: testAccount.address, token: Addresses.pathUsd })
845
847
  await fundAccount({ address: testAccount.address, token: asset })
846
848
 
847
- const escrow = await deployEscrow()
849
+ const escrow = tip20ChannelEscrow
848
850
  let openCredential: SessionCredentialPayload | undefined
849
851
 
850
852
  const httpServer = await Http.createServer(async (req, res) => {
@@ -867,6 +869,7 @@ describe('session multi-fetch (examples/session/multi-fetch)', () => {
867
869
  methodDetails: {
868
870
  chainId: chain.id,
869
871
  escrowContract: escrow,
872
+ sessionProtocol: Constants.SessionProtocols.v2,
870
873
  },
871
874
  },
872
875
  }),
@@ -897,27 +900,18 @@ describe('session multi-fetch (examples/session/multi-fetch)', () => {
897
900
 
898
901
  const transaction = Transaction.deserialize(openCredential.transaction)
899
902
  if (!('calls' in transaction)) throw new Error('unexpected transaction type')
900
- const [approveCall, openCall] = transaction.calls as readonly [
901
- { to?: Address; data?: `0x${string}` },
902
- { to?: Address; data?: `0x${string}` },
903
- ]
904
- const approve = decodeFunctionData({ abi: erc20Abi, data: approveCall.data ?? '0x' })
903
+ const [openCall] = transaction.calls as readonly [{ to?: Address; data?: `0x${string}` }]
905
904
  const open = decodeFunctionData({ abi: escrowAbi, data: openCall.data ?? '0x' })
906
- const approveArgs = approve.args as readonly [Address, bigint]
907
- const openArgs = open.args as readonly [Address, Address, bigint, string, Address]
908
-
909
- expect(approveCall.to).toBe(asset)
910
- expect(approve.functionName).toBe('approve')
911
- expect(approveArgs[0].toLowerCase()).toBe(escrow.toLowerCase())
912
- expect(approveArgs[1]).toBe(10_000_000n)
905
+ const openArgs = open.args as readonly [Address, Address, Address, bigint, string, Address]
913
906
 
914
907
  expect(openCall.to?.toLowerCase()).toBe(escrow.toLowerCase())
915
908
  expect(open.functionName).toBe('open')
916
909
  expect(openArgs[0].toLowerCase()).toBe(accounts[0].address.toLowerCase())
917
- expect(openArgs[1].toLowerCase()).toBe(asset.toLowerCase())
918
- expect(openArgs[2]).toBe(10_000_000n)
919
- expect(openArgs[3]).toEqual(expect.any(String))
920
- expect(openArgs[4].toLowerCase()).toBe(testAccount.address.toLowerCase())
910
+ expect(openArgs[1]).toBe('0x0000000000000000000000000000000000000000')
911
+ expect(openArgs[2].toLowerCase()).toBe(asset.toLowerCase())
912
+ expect(openArgs[3]).toBe(7_000_000n)
913
+ expect(openArgs[4]).toEqual(expect.any(String))
914
+ expect(openArgs[5].toLowerCase()).toBe(testAccount.address.toLowerCase())
921
915
  } finally {
922
916
  httpServer.close()
923
917
  }
@@ -927,7 +921,7 @@ describe('session multi-fetch (examples/session/multi-fetch)', () => {
927
921
  await fundAccount({ address: testAccount.address, token: Addresses.pathUsd })
928
922
  await fundAccount({ address: testAccount.address, token: asset })
929
923
 
930
- const escrow = await deployEscrow()
924
+ const escrow = tip20ChannelEscrow
931
925
  const store = Store.memory()
932
926
  const tickAmount = '0.001'
933
927
  const server = Mppx_server.create({
@@ -991,7 +985,7 @@ describe('session multi-fetch (examples/session/multi-fetch)', () => {
991
985
  await fundAccount({ address: testAccount.address, token: Addresses.pathUsd })
992
986
  await fundAccount({ address: testAccount.address, token: asset })
993
987
 
994
- const escrow = await deployEscrow()
988
+ const escrow = tip20ChannelEscrow
995
989
  const store = Store.memory()
996
990
  const server = Mppx_server.create({
997
991
  methods: [
@@ -1069,7 +1063,7 @@ describe('session sse (examples/session/sse)', () => {
1069
1063
  await fundAccount({ address: testAccount.address, token: Addresses.pathUsd })
1070
1064
  await fundAccount({ address: testAccount.address, token: asset })
1071
1065
 
1072
- const escrow = await deployEscrow()
1066
+ const escrow = tip20ChannelEscrow
1073
1067
  const store = Store.memory()
1074
1068
  const server = Mppx_server.create({
1075
1069
  methods: [
@@ -1251,9 +1245,10 @@ describe('stripe charge', () => {
1251
1245
 
1252
1246
  // ---------------------------------------------------------------------------
1253
1247
  // account [action]
1254
- // TODO: investigate account tests timing out in CI (secret-tool/gnome-keyring hangs)
1248
+ // Keychain tests are opt-in because macOS/Linux keychain commands can block on
1249
+ // developer machines without an unlocked keychain daemon.
1255
1250
  // ---------------------------------------------------------------------------
1256
- describe.skipIf(!!process.env.CI)('account', () => {
1251
+ describe.runIf(process.env.MPPX_TEST_KEYCHAIN === 'true')('account', () => {
1257
1252
  const binPath = path.resolve(import.meta.dirname, '../bin.ts')
1258
1253
  const cwd = path.resolve(import.meta.dirname, '../..')
1259
1254
  const accountEnv = {
package/src/cli/cli.ts CHANGED
@@ -11,6 +11,7 @@ import { tempo as tempoMainnet } from 'viem/tempo/chains'
11
11
  import * as Challenge from '../Challenge.js'
12
12
  import { normalizeHeaders } from '../client/internal/Fetch.js'
13
13
  import * as Mppx from '../client/Mppx.js'
14
+ import * as Constants from '../Constants.js'
14
15
  import { validate as validateDiscovery } from '../discovery/Validate.js'
15
16
  import { createDefaultStore, createKeychain, resolveAccountName } from './account.js'
16
17
  import { loadConfig, resolveAcceptPayment, selectChallenge } from './internal.js'
@@ -32,6 +33,7 @@ import {
32
33
  printResponseHeaders,
33
34
  prompt,
34
35
  resolveChain,
36
+ resolveFundingNetwork,
35
37
  resolveRpcUrl,
36
38
  } from './utils.js'
37
39
 
@@ -373,7 +375,7 @@ const cli = Cli.create('mppx', {
373
375
  const { challenge, plugin, method: configMethod } = selected
374
376
  const selectedChallengeResponse = new Response(null, {
375
377
  status: 402,
376
- headers: { 'WWW-Authenticate': Challenge.serialize(challenge) },
378
+ headers: { [Constants.Headers.wwwAuthenticate]: Challenge.serialize(challenge) },
377
379
  })
378
380
 
379
381
  let tokenSymbol = (challenge.request.currency as string | undefined) ?? ''
@@ -547,7 +549,7 @@ const cli = Cli.create('mppx', {
547
549
 
548
550
  if (!handled) {
549
551
  // Default: print receipt + body
550
- const receiptHeader = credentialResponse.headers.get('Payment-Receipt')
552
+ const receiptHeader = credentialResponse.headers.get(Constants.Headers.paymentReceipt)
551
553
  if (receiptHeader && c.options.verbose >= 1) {
552
554
  try {
553
555
  const receiptJson = JSON.parse(Base64.toString(receiptHeader)) as Record<
@@ -704,8 +706,9 @@ const account = Cli.create('account', {
704
706
  const addrDisplay = explorerUrl
705
707
  ? link(`${explorerUrl}/address/${acct.address}`, acct.address)
706
708
  : acct.address
707
- const rpcUrl = resolveRpcUrl(c.options.rpcUrl, { network: c.options.network })
708
- resolveChain({ network: c.options.network, rpcUrl })
709
+ const fundingNetwork = resolveFundingNetwork(c.options)
710
+ const rpcUrl = resolveRpcUrl(c.options.rpcUrl, { network: fundingNetwork })
711
+ resolveChain({ network: fundingNetwork, rpcUrl })
709
712
  .then((chain) => createClient({ chain, transport: http(rpcUrl) }))
710
713
  .then((client) =>
711
714
  import('viem/tempo').then(({ Actions }) =>
@@ -715,6 +718,11 @@ const account = Cli.create('account', {
715
718
  return outputResult(c, { address: acct.address, name: resolvedName }, () => {
716
719
  console.log(`Account "${resolvedName}" saved to keychain.`)
717
720
  console.log(pc.dim(`Address ${addrDisplay}`))
721
+ console.log(
722
+ pc.dim(
723
+ `Fund testnet tokens: mppx account fund --account ${resolvedName} --network testnet`,
724
+ ),
725
+ )
718
726
  })
719
727
  },
720
728
  })
@@ -840,8 +848,9 @@ const account = Cli.create('account', {
840
848
  return c.error({ code: 'ACCOUNT_NOT_FOUND', message: 'No account found.', exitCode: 69 })
841
849
  }
842
850
  const acct = privateKeyToAccount(key as `0x${string}`)
843
- const rpcUrl = resolveRpcUrl(c.options.rpcUrl, { network: c.options.network })
844
- const chain = await resolveChain({ network: c.options.network, rpcUrl })
851
+ const fundingNetwork = resolveFundingNetwork(c.options)
852
+ const rpcUrl = resolveRpcUrl(c.options.rpcUrl, { network: fundingNetwork })
853
+ const chain = await resolveChain({ network: fundingNetwork, rpcUrl })
845
854
  const client = createClient({ chain, transport: http(rpcUrl) })
846
855
  if (!structured) console.log(`Funding "${accountName}" on ${chainName(chain)}`)
847
856
  try {
@@ -864,14 +873,18 @@ const account = Cli.create('account', {
864
873
  },
865
874
  )
866
875
  } catch (err) {
876
+ const message = err instanceof Error ? err.message : String(err)
867
877
  if (structured)
868
878
  return c.error({
869
879
  code: 'FUNDING_FAILED',
870
- message: err instanceof Error ? err.message : String(err),
880
+ message,
871
881
  exitCode: 1,
872
882
  })
873
- console.error('Funding failed:', err instanceof Error ? err.message : err)
874
- return undefined as never
883
+ return c.error({
884
+ code: 'FUNDING_FAILED',
885
+ message: `Funding failed: ${message}`,
886
+ exitCode: 1,
887
+ })
875
888
  }
876
889
  },
877
890
  })
@@ -1145,7 +1158,7 @@ const sign = Cli.create('sign', {
1145
1158
  const wwwAuth = Challenge.serialize(challenge)
1146
1159
  const fakeResponse = new Response(null, {
1147
1160
  status: 402,
1148
- headers: { 'WWW-Authenticate': wwwAuth },
1161
+ headers: { [Constants.Headers.wwwAuthenticate]: wwwAuth },
1149
1162
  })
1150
1163
 
1151
1164
  let credential: string
@@ -48,6 +48,14 @@ function createLineClient(child: ChildProcessWithoutNullStreams) {
48
48
  child.stderr.setEncoding('utf8')
49
49
  child.stdout.on('data', (chunk) => {
50
50
  buffer += chunk
51
+ drainLines()
52
+ drainJsonBuffer()
53
+ })
54
+ child.stderr.on('data', (chunk) => {
55
+ stderr += chunk
56
+ })
57
+
58
+ function drainLines() {
51
59
  for (;;) {
52
60
  const index = buffer.indexOf('\n')
53
61
  if (index === -1) break
@@ -60,10 +68,16 @@ function createLineClient(child: ChildProcessWithoutNullStreams) {
60
68
  nonJsonLines.push(line)
61
69
  }
62
70
  }
63
- })
64
- child.stderr.on('data', (chunk) => {
65
- stderr += chunk
66
- })
71
+ }
72
+
73
+ function drainJsonBuffer() {
74
+ const text = buffer.trim()
75
+ if (!text) return
76
+ try {
77
+ messages.push(JSON.parse(text))
78
+ buffer = ''
79
+ } catch {}
80
+ }
67
81
 
68
82
  return {
69
83
  get nonJsonLines() {
@@ -88,9 +102,9 @@ function createLineClient(child: ChildProcessWithoutNullStreams) {
88
102
  await new Promise((resolve) => setTimeout(resolve, 20))
89
103
  }
90
104
  throw new Error(
91
- `Timed out waiting for MCP response ${id}. stderr=${stderr} nonJson=${JSON.stringify(
92
- nonJsonLines,
93
- )}`,
105
+ `Timed out waiting for MCP response ${id}. stderr=${stderr} buffer=${JSON.stringify(
106
+ buffer,
107
+ )} nonJson=${JSON.stringify(nonJsonLines)}`,
94
108
  )
95
109
  },
96
110
  }
@@ -11,10 +11,15 @@ import { createClient, http } from 'viem'
11
11
  import { privateKeyToAccount } from 'viem/accounts'
12
12
 
13
13
  import { normalizeHeaders } from '../../client/internal/Fetch.js'
14
+ import * as Constants from '../../Constants.js'
14
15
  import * as Credential from '../../Credential.js'
15
16
  import { tempo as tempoMethods } from '../../tempo/client/index.js'
16
- import type { SessionCredentialPayload } from '../../tempo/session/Types.js'
17
- import { signVoucher } from '../../tempo/session/Voucher.js'
17
+ import { tip20ChannelEscrow } from '../../tempo/session/precompile/Protocol.js'
18
+ import type {
19
+ ChannelDescriptor,
20
+ SessionCredentialPayload,
21
+ } from '../../tempo/session/precompile/Protocol.js'
22
+ import { signVoucher } from '../../tempo/session/precompile/Voucher.js'
18
23
  import { createDefaultStore, createKeychain, resolveAccountName } from '../account.js'
19
24
  import {
20
25
  fetchTokenInfo,
@@ -40,6 +45,7 @@ export function tempo() {
40
45
  chainId: number
41
46
  action?: 'voucher' | 'close'
42
47
  }): Promise<string>
48
+ descriptor?: ChannelDescriptor | undefined
43
49
  source: string
44
50
  }
45
51
  | undefined
@@ -176,7 +182,7 @@ export function tempo() {
176
182
  account,
177
183
  getClient: () => client!,
178
184
  ...(autoSwap !== undefined ? { autoSwap } : {}),
179
- deposit: (() => {
185
+ maxDeposit: (() => {
180
186
  if (challenge.intent !== 'session') return undefined
181
187
  const suggestedDeposit = (challenge.request as Record<string, unknown>)
182
188
  .suggestedDeposit as string | undefined
@@ -209,6 +215,7 @@ export function tempo() {
209
215
 
210
216
  // Store session support for use in lifecycle hooks
211
217
  _session = {
218
+ descriptor: undefined,
212
219
  async signVoucher({
213
220
  channelId,
214
221
  cumulativeAmount,
@@ -216,11 +223,14 @@ export function tempo() {
216
223
  chainId,
217
224
  action = 'voucher',
218
225
  }) {
226
+ const descriptor = _session?.descriptor
227
+ if (!descriptor) throw new Error('session descriptor not available')
219
228
  return Credential.serialize({
220
229
  challenge,
221
230
  payload: {
222
231
  action,
223
232
  channelId,
233
+ descriptor,
224
234
  cumulativeAmount: cumulativeAmount.toString(),
225
235
  signature: await signVoucher(
226
236
  client!,
@@ -260,16 +270,19 @@ export function tempo() {
260
270
  const parsed = Credential.deserialize<SessionCredentialPayload>(credential)
261
271
  const challengeRequest = challenge.request as Record<string, unknown>
262
272
  const sessionMd = challengeRequest.methodDetails as
263
- | { escrowContract?: string; chainId?: number }
273
+ | { escrow?: string; escrowContract?: string; chainId?: number }
264
274
  | undefined
265
275
  const channelId = parsed.payload.channelId
266
- const escrowContract = sessionMd?.escrowContract as Address | undefined
276
+ const escrowContract = (sessionMd?.escrowContract ??
277
+ sessionMd?.escrow ??
278
+ tip20ChannelEscrow) as Address
267
279
  const chainId = sessionMd?.chainId ?? 0
268
280
  const tickCost = BigInt(challengeRequest.amount as string)
269
281
  let cumulativeAmount =
270
282
  'cumulativeAmount' in parsed.payload && parsed.payload.cumulativeAmount
271
283
  ? BigInt(parsed.payload.cumulativeAmount)
272
284
  : 0n
285
+ if ('descriptor' in parsed.payload) _session.descriptor = parsed.payload.descriptor
273
286
 
274
287
  if (verbose >= 1) {
275
288
  if (parsed.payload.action === 'open') {
@@ -302,7 +315,7 @@ export function tempo() {
302
315
  }
303
316
 
304
317
  // Print receipt from initial response headers
305
- const receiptHeader = credentialResponse.headers.get('Payment-Receipt')
318
+ const receiptHeader = credentialResponse.headers.get(Constants.Headers.paymentReceipt)
306
319
  if (receiptHeader) {
307
320
  try {
308
321
  const receiptJson = JSON.parse(Base64.toString(receiptHeader)) as Record<string, unknown>
@@ -556,7 +569,7 @@ async function handleSseStream(
556
569
  })
557
570
  await globalThis.fetch(opts.fetchUrl, {
558
571
  method: 'POST',
559
- headers: { Authorization: voucherCred },
572
+ headers: { [Constants.Headers.authorization]: voucherCred },
560
573
  })
561
574
  } catch (e) {
562
575
  opts.info(pc.dim(pc.yellow(` [voucher failed: ${e instanceof Error ? e.message : e}]`)))
@@ -669,7 +682,7 @@ async function closeChannel(opts: {
669
682
  if (closeRes.ok) {
670
683
  deleteChannelState(opts.channelId)
671
684
  if (opts.verbose >= 1) {
672
- const closeReceiptHeader = closeRes.headers.get('Payment-Receipt')
685
+ const closeReceiptHeader = closeRes.headers.get(Constants.Headers.paymentReceipt)
673
686
  let closeTxHash: string | undefined
674
687
  if (closeReceiptHeader) {
675
688
  try {
@@ -1,7 +1,7 @@
1
1
  import { tempo as tempoMainnet, tempoModerato } from 'viem/tempo/chains'
2
2
  import { afterEach, describe, expect, test } from 'vp/test'
3
3
 
4
- import { networkRpcUrls, resolveChain, resolveRpcUrl } from './utils.js'
4
+ import { networkRpcUrls, resolveChain, resolveFundingNetwork, resolveRpcUrl } from './utils.js'
5
5
 
6
6
  describe('resolveRpcUrl', () => {
7
7
  afterEach(() => {
@@ -52,6 +52,30 @@ describe('resolveRpcUrl', () => {
52
52
  })
53
53
  })
54
54
 
55
+ describe('resolveFundingNetwork', () => {
56
+ afterEach(() => {
57
+ delete process.env.MPPX_RPC_URL
58
+ delete process.env.RPC_URL
59
+ })
60
+
61
+ test('defaults faucet funding to testnet', () => {
62
+ expect(resolveFundingNetwork()).toBe('testnet')
63
+ })
64
+
65
+ test('keeps explicit network selection', () => {
66
+ expect(resolveFundingNetwork({ network: 'mainnet' })).toBe('mainnet')
67
+ })
68
+
69
+ test('does not override explicit rpc url', () => {
70
+ expect(resolveFundingNetwork({ rpcUrl: 'https://explicit.example.com' })).toBeUndefined()
71
+ })
72
+
73
+ test('does not override env rpc urls', () => {
74
+ process.env.MPPX_RPC_URL = 'https://env.example.com'
75
+ expect(resolveFundingNetwork()).toBeUndefined()
76
+ })
77
+ })
78
+
55
79
  describe('resolveChain', () => {
56
80
  afterEach(() => {
57
81
  delete process.env.MPPX_RPC_URL
package/src/cli/utils.ts CHANGED
@@ -242,6 +242,16 @@ export function resolveRpcUrl(
242
242
  )
243
243
  }
244
244
 
245
+ /** Select the default network for faucet funding without overriding explicit RPC configuration. */
246
+ export function resolveFundingNetwork(
247
+ options: { network?: Network | undefined; rpcUrl?: string | undefined } = {},
248
+ ): Network | undefined {
249
+ if (options.network) return options.network
250
+ if (options.rpcUrl) return undefined
251
+ if (process.env.MPPX_RPC_URL?.trim() || process.env.RPC_URL?.trim()) return undefined
252
+ return 'testnet'
253
+ }
254
+
245
255
  export async function resolveChain(
246
256
  opts: { network?: Network | undefined; rpcUrl?: string | undefined } = {},
247
257
  ): Promise<Chain> {
@@ -1,5 +1,8 @@
1
1
  export { evm } from '../evm/client/index.js'
2
2
  export { stripe } from '../stripe/client/index.js'
3
3
  export { subscription } from '../tempo/client/Subscription.js'
4
- export { tempo } from '../tempo/client/index.js'
5
- export { session } from '../tempo/client/Session.js'
4
+ export { session, tempo } from '../tempo/client/index.js'
5
+ export { session as sessionMethod } from '../tempo/session/client/Session.js'
6
+ export { sessionManager } from '../tempo/session/client/SessionManager.js'
7
+ export { session as sessionLegacy } from '../tempo/legacy/client/index.js'
8
+ export { sessionManager as sessionLegacyManager } from '../tempo/legacy/client/index.js'
@@ -10,10 +10,20 @@ import type * as AutoSwap from '../tempo/internal/auto-swap.js'
10
10
  import * as Methods from '../tempo/Methods.js'
11
11
  import * as z from '../zod.js'
12
12
  import * as Fetch from './internal/Fetch.js'
13
+ import { session, sessionManager, sessionMethod } from './Methods.js'
13
14
  import * as Mppx from './Mppx.js'
14
15
  import * as Transport from './Transport.js'
15
16
 
16
17
  describe('Mppx', () => {
18
+ test('exports low-level session method and explicit managed session helper', () => {
19
+ expectTypeOf(session({ account: {} as Account })).toMatchTypeOf<Method.AnyClient>()
20
+ expectTypeOf(session.manager({ account: {} as Account })).toHaveProperty('fetch')
21
+ expectTypeOf(sessionManager({ account: {} as Account })).toHaveProperty('fetch')
22
+ expectTypeOf(sessionMethod({ account: {} as Account })).toMatchTypeOf<Method.AnyClient>()
23
+ expectTypeOf(tempo.session({ account: {} as Account })).toMatchTypeOf<Method.AnyClient>()
24
+ expectTypeOf(tempo.session.manager({ account: {} as Account })).toHaveProperty('fetch')
25
+ })
26
+
17
27
  test('has methods array', () => {
18
28
  const method = charge({
19
29
  account: {} as Account,
@@ -74,6 +74,81 @@ describe('Mppx.create', () => {
74
74
  })
75
75
 
76
76
  describe('createCredential', () => {
77
+ function sessionChallenge(id: string, sessionProtocol?: string) {
78
+ return {
79
+ expires: new Date(Date.now() + 60_000).toISOString(),
80
+ id,
81
+ intent: 'session',
82
+ method: 'tempo',
83
+ realm,
84
+ request: {
85
+ amount: '100',
86
+ currency: asset,
87
+ unitType: 'request',
88
+ methodDetails: {
89
+ chainId: 1,
90
+ escrowContract: '0x0000000000000000000000000000000000000001',
91
+ ...(sessionProtocol !== undefined ? { sessionProtocol } : {}),
92
+ },
93
+ },
94
+ } as const
95
+ }
96
+
97
+ function paymentRequiredResponse(...challenges: Challenge.Challenge[]) {
98
+ return new Response(null, {
99
+ status: 402,
100
+ headers: { 'WWW-Authenticate': challenges.map(Challenge.serialize).join(', ') },
101
+ })
102
+ }
103
+
104
+ function taggedSessionMethod(tag: string, canHandleChallenge: Method.CanHandleChallengeFn) {
105
+ return Method.toClient(Methods.session, {
106
+ canHandleChallenge,
107
+ async createCredential({ challenge }) {
108
+ return Credential.serialize({ challenge, payload: { tag } })
109
+ },
110
+ })
111
+ }
112
+
113
+ test('behavior: routes duplicate tempo/session client methods by sessionProtocol', async () => {
114
+ const tip1034 = taggedSessionMethod(
115
+ 'v2',
116
+ ({ challenge }) =>
117
+ (challenge.request.methodDetails as { sessionProtocol?: string } | undefined)
118
+ ?.sessionProtocol === 'v2',
119
+ )
120
+ const legacy = taggedSessionMethod('v1', ({ challenge }) => {
121
+ const sessionProtocol = (
122
+ challenge.request.methodDetails as { sessionProtocol?: string } | undefined
123
+ )?.sessionProtocol
124
+ return sessionProtocol === undefined || sessionProtocol === 'v1'
125
+ })
126
+ const mppx = Mppx.create({ polyfill: false, methods: [tip1034, legacy] })
127
+
128
+ const [newCredential, legacyCredential, oldCredential] = await Promise.all([
129
+ mppx.createCredential(paymentRequiredResponse(sessionChallenge('new', 'v2'))),
130
+ mppx.createCredential(paymentRequiredResponse(sessionChallenge('v1', 'v1'))),
131
+ mppx.createCredential(paymentRequiredResponse(sessionChallenge('old'))),
132
+ ])
133
+ expect(Credential.deserialize(newCredential).payload).toEqual({ tag: 'v2' })
134
+ expect(Credential.deserialize(legacyCredential).payload).toEqual({ tag: 'v1' })
135
+ expect(Credential.deserialize(oldCredential).payload).toEqual({ tag: 'v1' })
136
+ })
137
+
138
+ test('behavior: rejects unknown tempo/session sessionProtocol', async () => {
139
+ const method = taggedSessionMethod(
140
+ 'v2',
141
+ ({ challenge }) =>
142
+ (challenge.request.methodDetails as { sessionProtocol?: string } | undefined)
143
+ ?.sessionProtocol === 'v2',
144
+ )
145
+ const mppx = Mppx.create({ polyfill: false, methods: [method] })
146
+
147
+ await expect(
148
+ mppx.createCredential(paymentRequiredResponse(sessionChallenge('unknown', 'future'))),
149
+ ).rejects.toThrow('No method found for challenges: tempo.session')
150
+ })
151
+
77
152
  test('behavior: routes to correct method based on challenge', async () => {
78
153
  const mppx = Mppx.create({
79
154
  polyfill: false,
@@ -1,4 +1,5 @@
1
1
  import * as Challenge from '../Challenge.js'
2
+ import * as Constants from '../Constants.js'
2
3
  import * as Credential from '../Credential.js'
3
4
  import * as Mcp from '../Mcp.js'
4
5
  import * as x402_Header from '../x402/Header.js'
@@ -6,10 +7,8 @@ import * as x402_ChallengeBrand from '../x402/internal/ChallengeBrand.js'
6
7
  import * as x402_Types from '../x402/Types.js'
7
8
 
8
9
  const paymentRequiredStatus = 402
9
- const paymentAuthChallengeHeader = 'WWW-Authenticate'
10
- const paymentAuthCredentialHeader = 'Authorization'
11
10
  const credentialHeaders = [
12
- paymentAuthCredentialHeader,
11
+ Constants.Headers.authorization,
13
12
  x402_Types.paymentRequiredHeader,
14
13
  x402_Types.paymentResponseHeader,
15
14
  x402_Types.paymentSignatureHeader,
@@ -107,7 +106,7 @@ export function http() {
107
106
  if (isX402Challenge(options?.challenge)) {
108
107
  headers.set(x402_Types.paymentSignatureHeader, credential)
109
108
  } else {
110
- headers.set(paymentAuthCredentialHeader, credential)
109
+ headers.set(Constants.Headers.authorization, credential)
111
110
  }
112
111
  return { ...request, headers }
113
112
  },
@@ -116,7 +115,7 @@ export function http() {
116
115
 
117
116
  function paymentRequiredChallenges(response: Response): Challenge.Challenge[] {
118
117
  return [
119
- ...(response.headers.has(paymentAuthChallengeHeader)
118
+ ...(response.headers.has(Constants.Headers.wwwAuthenticate)
120
119
  ? Challenge.fromResponseList(response)
121
120
  : []),
122
121
  ...x402Challenges(response),
@@ -1,5 +1,15 @@
1
+ export * as Constants from '../Constants.js'
1
2
  export * as Expires from '../Expires.js'
2
3
  export * as Fetch from './internal/Fetch.js'
3
- export { evm, session, stripe, tempo } from './Methods.js'
4
+ export {
5
+ evm,
6
+ session,
7
+ sessionManager,
8
+ sessionMethod,
9
+ sessionLegacy,
10
+ sessionLegacyManager,
11
+ stripe,
12
+ tempo,
13
+ } from './Methods.js'
4
14
  export * as Mppx from './Mppx.js'
5
15
  export * as Transport from './Transport.js'