mppx 0.6.31 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (616) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/README.md +20 -11
  3. package/dist/Challenge.d.ts.map +1 -1
  4. package/dist/Challenge.js +27 -13
  5. package/dist/Challenge.js.map +1 -1
  6. package/dist/Constants.d.ts +46 -0
  7. package/dist/Constants.d.ts.map +1 -0
  8. package/dist/Constants.js +46 -0
  9. package/dist/Constants.js.map +1 -0
  10. package/dist/Credential.d.ts.map +1 -1
  11. package/dist/Credential.js +5 -4
  12. package/dist/Credential.js.map +1 -1
  13. package/dist/Mcp.d.ts +3 -0
  14. package/dist/Mcp.d.ts.map +1 -1
  15. package/dist/Mcp.js +2 -0
  16. package/dist/Mcp.js.map +1 -1
  17. package/dist/Method.d.ts +32 -4
  18. package/dist/Method.d.ts.map +1 -1
  19. package/dist/Method.js +5 -2
  20. package/dist/Method.js.map +1 -1
  21. package/dist/PaymentRequest.d.ts +10 -10
  22. package/dist/PaymentRequest.js +8 -8
  23. package/dist/Receipt.d.ts.map +1 -1
  24. package/dist/Receipt.js +3 -2
  25. package/dist/Receipt.js.map +1 -1
  26. package/dist/cli/cli.d.ts.map +1 -1
  27. package/dist/cli/cli.js +19 -11
  28. package/dist/cli/cli.js.map +1 -1
  29. package/dist/cli/plugins/tempo.d.ts.map +1 -1
  30. package/dist/cli/plugins/tempo.js +17 -6
  31. package/dist/cli/plugins/tempo.js.map +1 -1
  32. package/dist/cli/utils.d.ts +5 -0
  33. package/dist/cli/utils.d.ts.map +1 -1
  34. package/dist/cli/utils.js +10 -0
  35. package/dist/cli/utils.js.map +1 -1
  36. package/dist/client/Methods.d.ts +5 -2
  37. package/dist/client/Methods.d.ts.map +1 -1
  38. package/dist/client/Methods.js +5 -2
  39. package/dist/client/Methods.js.map +1 -1
  40. package/dist/client/Mppx.js +2 -2
  41. package/dist/client/Mppx.js.map +1 -1
  42. package/dist/client/Transport.d.ts +11 -16
  43. package/dist/client/Transport.d.ts.map +1 -1
  44. package/dist/client/Transport.js +55 -76
  45. package/dist/client/Transport.js.map +1 -1
  46. package/dist/client/index.d.ts +5 -1
  47. package/dist/client/index.d.ts.map +1 -1
  48. package/dist/client/index.js +3 -1
  49. package/dist/client/index.js.map +1 -1
  50. package/dist/client/internal/Fetch.d.ts.map +1 -1
  51. package/dist/client/internal/Fetch.js +60 -13
  52. package/dist/client/internal/Fetch.js.map +1 -1
  53. package/dist/client/internal/protocols/Mcp.d.ts +7 -0
  54. package/dist/client/internal/protocols/Mcp.d.ts.map +1 -0
  55. package/dist/client/internal/protocols/Mcp.js +159 -0
  56. package/dist/client/internal/protocols/Mcp.js.map +1 -0
  57. package/dist/client/internal/protocols/Mpp.d.ts +4 -0
  58. package/dist/client/internal/protocols/Mpp.d.ts.map +1 -0
  59. package/dist/client/internal/protocols/Mpp.js +18 -0
  60. package/dist/client/internal/protocols/Mpp.js.map +1 -0
  61. package/dist/client/internal/protocols/Protocol.d.ts +10 -0
  62. package/dist/client/internal/protocols/Protocol.d.ts.map +1 -0
  63. package/dist/client/internal/protocols/Protocol.js +2 -0
  64. package/dist/client/internal/protocols/Protocol.js.map +1 -0
  65. package/dist/client/internal/protocols/Shared.d.ts +5 -0
  66. package/dist/client/internal/protocols/Shared.d.ts.map +1 -0
  67. package/dist/client/internal/protocols/Shared.js +20 -0
  68. package/dist/client/internal/protocols/Shared.js.map +1 -0
  69. package/dist/client/internal/protocols/X402.d.ts +8 -0
  70. package/dist/client/internal/protocols/X402.d.ts.map +1 -0
  71. package/dist/client/internal/protocols/X402.js +39 -0
  72. package/dist/client/internal/protocols/X402.js.map +1 -0
  73. package/dist/evm/client/index.d.ts +1 -0
  74. package/dist/evm/client/index.d.ts.map +1 -1
  75. package/dist/evm/client/index.js +1 -0
  76. package/dist/evm/client/index.js.map +1 -1
  77. package/dist/evm/index.d.ts +2 -0
  78. package/dist/evm/index.d.ts.map +1 -1
  79. package/dist/evm/index.js +2 -0
  80. package/dist/evm/index.js.map +1 -1
  81. package/dist/evm/server/Methods.d.ts +1 -1
  82. package/dist/evm/server/Methods.d.ts.map +1 -1
  83. package/dist/evm/server/index.d.ts +1 -0
  84. package/dist/evm/server/index.d.ts.map +1 -1
  85. package/dist/evm/server/index.js +1 -0
  86. package/dist/evm/server/index.js.map +1 -1
  87. package/dist/index.d.ts +1 -0
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/index.js +1 -0
  90. package/dist/index.js.map +1 -1
  91. package/dist/internal/AcceptPayment.d.ts +3 -0
  92. package/dist/internal/AcceptPayment.d.ts.map +1 -1
  93. package/dist/internal/AcceptPayment.js +15 -11
  94. package/dist/internal/AcceptPayment.js.map +1 -1
  95. package/dist/mcp/client/McpClient.d.ts +101 -0
  96. package/dist/mcp/client/McpClient.d.ts.map +1 -0
  97. package/dist/mcp/client/McpClient.js +162 -0
  98. package/dist/mcp/client/McpClient.js.map +1 -0
  99. package/dist/mcp/client/index.d.ts.map +1 -0
  100. package/dist/mcp/client/index.js.map +1 -0
  101. package/dist/mcp/server/Transport.d.ts.map +1 -0
  102. package/dist/mcp/server/Transport.js.map +1 -0
  103. package/dist/mcp/server/index.d.ts.map +1 -0
  104. package/dist/mcp/server/index.js.map +1 -0
  105. package/dist/server/Mppx.d.ts +12 -4
  106. package/dist/server/Mppx.d.ts.map +1 -1
  107. package/dist/server/Mppx.js +85 -27
  108. package/dist/server/Mppx.js.map +1 -1
  109. package/dist/server/Response.d.ts.map +1 -1
  110. package/dist/server/Response.js +2 -1
  111. package/dist/server/Response.js.map +1 -1
  112. package/dist/server/Transport.d.ts +1 -1
  113. package/dist/server/Transport.d.ts.map +1 -1
  114. package/dist/server/Transport.js +5 -4
  115. package/dist/server/Transport.js.map +1 -1
  116. package/dist/server/index.d.ts +1 -0
  117. package/dist/server/index.d.ts.map +1 -1
  118. package/dist/server/index.js +1 -0
  119. package/dist/server/index.js.map +1 -1
  120. package/dist/stripe/client/Charge.d.ts +1 -1
  121. package/dist/stripe/client/Charge.d.ts.map +1 -1
  122. package/dist/stripe/client/Charge.js +3 -1
  123. package/dist/stripe/client/Charge.js.map +1 -1
  124. package/dist/stripe/server/Charge.d.ts +1 -1
  125. package/dist/stripe/server/Charge.d.ts.map +1 -1
  126. package/dist/stripe/server/Charge.js +9 -2
  127. package/dist/stripe/server/Charge.js.map +1 -1
  128. package/dist/stripe/server/Methods.d.ts +1 -1
  129. package/dist/stripe/server/Methods.d.ts.map +1 -1
  130. package/dist/stripe/server/internal/html.gen.d.ts +1 -1
  131. package/dist/stripe/server/internal/html.gen.d.ts.map +1 -1
  132. package/dist/stripe/server/internal/html.gen.js +1 -1
  133. package/dist/stripe/server/internal/html.gen.js.map +1 -1
  134. package/dist/tempo/Methods.d.ts +18 -0
  135. package/dist/tempo/Methods.d.ts.map +1 -1
  136. package/dist/tempo/Methods.js +16 -1
  137. package/dist/tempo/Methods.js.map +1 -1
  138. package/dist/tempo/Proof.d.ts +85 -1
  139. package/dist/tempo/Proof.d.ts.map +1 -1
  140. package/dist/tempo/Proof.js +35 -0
  141. package/dist/tempo/Proof.js.map +1 -1
  142. package/dist/tempo/client/Charge.d.ts +19 -1
  143. package/dist/tempo/client/Charge.d.ts.map +1 -1
  144. package/dist/tempo/client/Charge.js +47 -27
  145. package/dist/tempo/client/Charge.js.map +1 -1
  146. package/dist/tempo/client/Methods.d.ts +41 -10
  147. package/dist/tempo/client/Methods.d.ts.map +1 -1
  148. package/dist/tempo/client/Methods.js +16 -7
  149. package/dist/tempo/client/Methods.js.map +1 -1
  150. package/dist/tempo/client/ResolveAccount.d.ts +40 -0
  151. package/dist/tempo/client/ResolveAccount.d.ts.map +1 -0
  152. package/dist/tempo/client/ResolveAccount.js +2 -0
  153. package/dist/tempo/client/ResolveAccount.js.map +1 -0
  154. package/dist/tempo/client/index.d.ts +7 -4
  155. package/dist/tempo/client/index.d.ts.map +1 -1
  156. package/dist/tempo/client/index.js +5 -3
  157. package/dist/tempo/client/index.js.map +1 -1
  158. package/dist/tempo/index.d.ts +1 -0
  159. package/dist/tempo/index.d.ts.map +1 -1
  160. package/dist/tempo/index.js +1 -0
  161. package/dist/tempo/index.js.map +1 -1
  162. package/dist/tempo/internal/fee-payer.d.ts +29 -1
  163. package/dist/tempo/internal/fee-payer.d.ts.map +1 -1
  164. package/dist/tempo/internal/fee-payer.js +138 -4
  165. package/dist/tempo/internal/fee-payer.js.map +1 -1
  166. package/dist/tempo/internal/proof.d.ts +71 -5
  167. package/dist/tempo/internal/proof.d.ts.map +1 -1
  168. package/dist/tempo/internal/proof.js +42 -6
  169. package/dist/tempo/internal/proof.js.map +1 -1
  170. package/dist/tempo/{client → legacy/client}/ChannelOps.d.ts +19 -6
  171. package/dist/tempo/legacy/client/ChannelOps.d.ts.map +1 -0
  172. package/dist/tempo/{client → legacy/client}/ChannelOps.js +9 -3
  173. package/dist/tempo/legacy/client/ChannelOps.js.map +1 -0
  174. package/dist/tempo/{client → legacy/client}/Session.d.ts +23 -4
  175. package/dist/tempo/legacy/client/Session.d.ts.map +1 -0
  176. package/dist/tempo/{client → legacy/client}/Session.js +14 -7
  177. package/dist/tempo/legacy/client/Session.js.map +1 -0
  178. package/dist/tempo/{client → legacy/client}/SessionManager.d.ts +20 -5
  179. package/dist/tempo/legacy/client/SessionManager.d.ts.map +1 -0
  180. package/dist/tempo/{client → legacy/client}/SessionManager.js +30 -19
  181. package/dist/tempo/legacy/client/SessionManager.js.map +1 -0
  182. package/dist/tempo/legacy/client/index.d.ts +7 -0
  183. package/dist/tempo/legacy/client/index.d.ts.map +1 -0
  184. package/dist/tempo/legacy/client/index.js +5 -0
  185. package/dist/tempo/legacy/client/index.js.map +1 -0
  186. package/dist/tempo/legacy/index.d.ts +7 -0
  187. package/dist/tempo/legacy/index.d.ts.map +1 -0
  188. package/dist/tempo/legacy/index.js +7 -0
  189. package/dist/tempo/legacy/index.js.map +1 -0
  190. package/dist/tempo/{server → legacy/server}/Session.d.ts +28 -11
  191. package/dist/tempo/legacy/server/Session.d.ts.map +1 -0
  192. package/dist/tempo/{server → legacy/server}/Session.js +12 -10
  193. package/dist/tempo/legacy/server/Session.js.map +1 -0
  194. package/dist/tempo/legacy/server/index.d.ts +5 -0
  195. package/dist/tempo/legacy/server/index.d.ts.map +1 -0
  196. package/dist/tempo/legacy/server/index.js +5 -0
  197. package/dist/tempo/legacy/server/index.js.map +1 -0
  198. package/dist/tempo/{session → legacy/session}/Chain.d.ts +30 -23
  199. package/dist/tempo/legacy/session/Chain.d.ts.map +1 -0
  200. package/dist/tempo/{session → legacy/session}/Chain.js +12 -11
  201. package/dist/tempo/legacy/session/Chain.js.map +1 -0
  202. package/dist/tempo/{session → legacy/session}/Channel.d.ts +1 -0
  203. package/dist/tempo/legacy/session/Channel.d.ts.map +1 -0
  204. package/dist/tempo/legacy/session/Channel.js.map +1 -0
  205. package/dist/tempo/legacy/session/ChannelStore.d.ts +22 -0
  206. package/dist/tempo/legacy/session/ChannelStore.d.ts.map +1 -0
  207. package/dist/tempo/legacy/session/ChannelStore.js +6 -0
  208. package/dist/tempo/legacy/session/ChannelStore.js.map +1 -0
  209. package/dist/tempo/legacy/session/Types.d.ts +73 -0
  210. package/dist/tempo/legacy/session/Types.d.ts.map +1 -0
  211. package/dist/tempo/legacy/session/Types.js.map +1 -0
  212. package/dist/tempo/{session → legacy/session}/Voucher.d.ts +4 -4
  213. package/dist/tempo/legacy/session/Voucher.d.ts.map +1 -0
  214. package/dist/tempo/{session → legacy/session}/Voucher.js +1 -1
  215. package/dist/tempo/legacy/session/Voucher.js.map +1 -0
  216. package/dist/tempo/{session → legacy/session}/escrow.abi.d.ts +1 -0
  217. package/dist/tempo/{session → legacy/session}/escrow.abi.d.ts.map +1 -1
  218. package/dist/tempo/{session → legacy/session}/escrow.abi.js +1 -0
  219. package/dist/tempo/legacy/session/escrow.abi.js.map +1 -0
  220. package/dist/tempo/legacy/session/index.d.ts +9 -0
  221. package/dist/tempo/legacy/session/index.d.ts.map +1 -0
  222. package/dist/tempo/legacy/session/index.js +9 -0
  223. package/dist/tempo/legacy/session/index.js.map +1 -0
  224. package/dist/tempo/server/Charge.d.ts +1 -1
  225. package/dist/tempo/server/Charge.d.ts.map +1 -1
  226. package/dist/tempo/server/Charge.js +51 -30
  227. package/dist/tempo/server/Charge.js.map +1 -1
  228. package/dist/tempo/server/Methods.d.ts +67 -8
  229. package/dist/tempo/server/Methods.d.ts.map +1 -1
  230. package/dist/tempo/server/Methods.js +40 -10
  231. package/dist/tempo/server/Methods.js.map +1 -1
  232. package/dist/tempo/server/Subscription.d.ts +11 -1
  233. package/dist/tempo/server/Subscription.d.ts.map +1 -1
  234. package/dist/tempo/server/Subscription.js +135 -23
  235. package/dist/tempo/server/Subscription.js.map +1 -1
  236. package/dist/tempo/server/index.d.ts +6 -5
  237. package/dist/tempo/server/index.d.ts.map +1 -1
  238. package/dist/tempo/server/index.js +5 -5
  239. package/dist/tempo/server/index.js.map +1 -1
  240. package/dist/tempo/server/internal/html.gen.d.ts +1 -1
  241. package/dist/tempo/server/internal/html.gen.d.ts.map +1 -1
  242. package/dist/tempo/server/internal/html.gen.js +1 -1
  243. package/dist/tempo/server/internal/html.gen.js.map +1 -1
  244. package/dist/tempo/server/internal/request-body.d.ts +7 -2
  245. package/dist/tempo/server/internal/request-body.d.ts.map +1 -1
  246. package/dist/tempo/server/internal/request-body.js +20 -3
  247. package/dist/tempo/server/internal/request-body.js.map +1 -1
  248. package/dist/tempo/server/internal/transport.d.ts +8 -4
  249. package/dist/tempo/server/internal/transport.d.ts.map +1 -1
  250. package/dist/tempo/server/internal/transport.js +8 -7
  251. package/dist/tempo/server/internal/transport.js.map +1 -1
  252. package/dist/tempo/session/Snapshot.d.ts +32 -0
  253. package/dist/tempo/session/Snapshot.d.ts.map +1 -0
  254. package/dist/tempo/session/Snapshot.js +37 -0
  255. package/dist/tempo/session/Snapshot.js.map +1 -0
  256. package/dist/tempo/session/client/ChannelOps.d.ts +81 -0
  257. package/dist/tempo/session/client/ChannelOps.d.ts.map +1 -0
  258. package/dist/tempo/session/client/ChannelOps.js +201 -0
  259. package/dist/tempo/session/client/ChannelOps.js.map +1 -0
  260. package/dist/tempo/session/client/ChannelStore.d.ts +51 -0
  261. package/dist/tempo/session/client/ChannelStore.d.ts.map +1 -0
  262. package/dist/tempo/session/client/ChannelStore.js +63 -0
  263. package/dist/tempo/session/client/ChannelStore.js.map +1 -0
  264. package/dist/tempo/session/client/CredentialState.d.ts +245 -0
  265. package/dist/tempo/session/client/CredentialState.d.ts.map +1 -0
  266. package/dist/tempo/session/client/CredentialState.js +419 -0
  267. package/dist/tempo/session/client/CredentialState.js.map +1 -0
  268. package/dist/tempo/session/client/ReceiptCoordinator.d.ts +26 -0
  269. package/dist/tempo/session/client/ReceiptCoordinator.d.ts.map +1 -0
  270. package/dist/tempo/session/client/ReceiptCoordinator.js +61 -0
  271. package/dist/tempo/session/client/ReceiptCoordinator.js.map +1 -0
  272. package/dist/tempo/session/client/Runtime.d.ts +464 -0
  273. package/dist/tempo/session/client/Runtime.d.ts.map +1 -0
  274. package/dist/tempo/session/client/Runtime.js +499 -0
  275. package/dist/tempo/session/client/Runtime.js.map +1 -0
  276. package/dist/tempo/session/client/Session.d.ts +138 -0
  277. package/dist/tempo/session/client/Session.d.ts.map +1 -0
  278. package/dist/tempo/session/client/Session.js +69 -0
  279. package/dist/tempo/session/client/Session.js.map +1 -0
  280. package/dist/tempo/session/client/SessionManager.d.ts +84 -0
  281. package/dist/tempo/session/client/SessionManager.d.ts.map +1 -0
  282. package/dist/tempo/session/client/SessionManager.js +577 -0
  283. package/dist/tempo/session/client/SessionManager.js.map +1 -0
  284. package/dist/tempo/session/client/Transports.d.ts +449 -0
  285. package/dist/tempo/session/client/Transports.d.ts.map +1 -0
  286. package/dist/tempo/session/client/Transports.js +721 -0
  287. package/dist/tempo/session/client/Transports.js.map +1 -0
  288. package/dist/tempo/session/client/index.d.ts +11 -0
  289. package/dist/tempo/session/client/index.d.ts.map +1 -0
  290. package/dist/tempo/session/client/index.js +6 -0
  291. package/dist/tempo/session/client/index.js.map +1 -0
  292. package/dist/tempo/session/index.d.ts +7 -8
  293. package/dist/tempo/session/index.d.ts.map +1 -1
  294. package/dist/tempo/session/index.js +7 -8
  295. package/dist/tempo/session/index.js.map +1 -1
  296. package/dist/tempo/session/precompile/Chain.d.ts +319 -0
  297. package/dist/tempo/session/precompile/Chain.d.ts.map +1 -0
  298. package/dist/tempo/session/precompile/Chain.js +492 -0
  299. package/dist/tempo/session/precompile/Chain.js.map +1 -0
  300. package/dist/tempo/session/precompile/Channel.d.ts +46 -0
  301. package/dist/tempo/session/precompile/Channel.d.ts.map +1 -0
  302. package/dist/tempo/session/precompile/Channel.js +56 -0
  303. package/dist/tempo/session/precompile/Channel.js.map +1 -0
  304. package/dist/tempo/session/precompile/Protocol.d.ts +308 -0
  305. package/dist/tempo/session/precompile/Protocol.d.ts.map +1 -0
  306. package/dist/tempo/session/precompile/Protocol.js +264 -0
  307. package/dist/tempo/session/precompile/Protocol.js.map +1 -0
  308. package/dist/tempo/session/precompile/Voucher.d.ts +40 -0
  309. package/dist/tempo/session/precompile/Voucher.d.ts.map +1 -0
  310. package/dist/tempo/session/precompile/Voucher.js +125 -0
  311. package/dist/tempo/session/precompile/Voucher.js.map +1 -0
  312. package/dist/tempo/session/precompile/escrow.abi.d.ts +522 -0
  313. package/dist/tempo/session/precompile/escrow.abi.d.ts.map +1 -0
  314. package/dist/tempo/session/precompile/escrow.abi.js +224 -0
  315. package/dist/tempo/session/precompile/escrow.abi.js.map +1 -0
  316. package/dist/tempo/session/precompile/index.d.ts +24 -0
  317. package/dist/tempo/session/precompile/index.d.ts.map +1 -0
  318. package/dist/tempo/session/precompile/index.js +22 -0
  319. package/dist/tempo/session/precompile/index.js.map +1 -0
  320. package/dist/tempo/session/server/ChannelOps.d.ts +56 -0
  321. package/dist/tempo/session/server/ChannelOps.d.ts.map +1 -0
  322. package/dist/tempo/session/server/ChannelOps.js +91 -0
  323. package/dist/tempo/session/server/ChannelOps.js.map +1 -0
  324. package/dist/tempo/session/server/ChannelStore.d.ts +347 -0
  325. package/dist/tempo/session/server/ChannelStore.d.ts.map +1 -0
  326. package/dist/tempo/session/server/ChannelStore.js +404 -0
  327. package/dist/tempo/session/server/ChannelStore.js.map +1 -0
  328. package/dist/tempo/session/server/CredentialVerification.d.ts +85 -0
  329. package/dist/tempo/session/server/CredentialVerification.d.ts.map +1 -0
  330. package/dist/tempo/session/server/CredentialVerification.js +494 -0
  331. package/dist/tempo/session/server/CredentialVerification.js.map +1 -0
  332. package/dist/tempo/session/server/MeteredStream.d.ts +40 -0
  333. package/dist/tempo/session/server/MeteredStream.d.ts.map +1 -0
  334. package/dist/tempo/session/server/MeteredStream.js +42 -0
  335. package/dist/tempo/session/server/MeteredStream.js.map +1 -0
  336. package/dist/tempo/session/server/RequestState.d.ts +208 -0
  337. package/dist/tempo/session/server/RequestState.d.ts.map +1 -0
  338. package/dist/tempo/session/server/RequestState.js +252 -0
  339. package/dist/tempo/session/server/RequestState.js.map +1 -0
  340. package/dist/tempo/session/server/Session.d.ts +169 -0
  341. package/dist/tempo/session/server/Session.d.ts.map +1 -0
  342. package/dist/tempo/session/server/Session.js +351 -0
  343. package/dist/tempo/session/server/Session.js.map +1 -0
  344. package/dist/tempo/session/server/Settlement.d.ts +185 -0
  345. package/dist/tempo/session/server/Settlement.d.ts.map +1 -0
  346. package/dist/tempo/session/server/Settlement.js +252 -0
  347. package/dist/tempo/session/server/Settlement.js.map +1 -0
  348. package/dist/tempo/session/{Sse.d.ts → server/Sse.d.ts} +9 -56
  349. package/dist/tempo/session/server/Sse.d.ts.map +1 -0
  350. package/dist/tempo/session/server/Sse.js +184 -0
  351. package/dist/tempo/session/server/Sse.js.map +1 -0
  352. package/dist/tempo/session/server/Transports.d.ts +89 -0
  353. package/dist/tempo/session/server/Transports.d.ts.map +1 -0
  354. package/dist/tempo/session/server/Transports.js +149 -0
  355. package/dist/tempo/session/server/Transports.js.map +1 -0
  356. package/dist/tempo/session/server/Ws.d.ts +48 -0
  357. package/dist/tempo/session/server/Ws.d.ts.map +1 -0
  358. package/dist/tempo/session/server/Ws.js +244 -0
  359. package/dist/tempo/session/server/Ws.js.map +1 -0
  360. package/dist/tempo/session/server/index.d.ts +4 -0
  361. package/dist/tempo/session/server/index.d.ts.map +1 -0
  362. package/dist/tempo/session/server/index.js +2 -0
  363. package/dist/tempo/session/server/index.js.map +1 -0
  364. package/dist/tempo/subscription/KeyAuthorization.d.ts +712 -1
  365. package/dist/tempo/subscription/KeyAuthorization.d.ts.map +1 -1
  366. package/dist/tempo/subscription/Store.d.ts +2 -0
  367. package/dist/tempo/subscription/Store.d.ts.map +1 -1
  368. package/dist/tempo/subscription/Store.js +16 -1
  369. package/dist/tempo/subscription/Store.js.map +1 -1
  370. package/dist/x402/index.d.ts +1 -0
  371. package/dist/x402/index.d.ts.map +1 -1
  372. package/dist/x402/index.js +1 -0
  373. package/dist/x402/index.js.map +1 -1
  374. package/package.json +25 -9
  375. package/src/Challenge.test.ts +40 -0
  376. package/src/Challenge.ts +28 -13
  377. package/src/Constants.ts +58 -0
  378. package/src/Credential.ts +5 -4
  379. package/src/Mcp.ts +4 -0
  380. package/src/Method.ts +46 -5
  381. package/src/PaymentRequest.ts +10 -10
  382. package/src/Receipt.ts +3 -2
  383. package/src/cli/cli.test.ts +38 -43
  384. package/src/cli/cli.ts +23 -10
  385. package/src/cli/mcp.test.ts +21 -7
  386. package/src/cli/plugins/tempo.ts +21 -8
  387. package/src/cli/utils.test.ts +25 -1
  388. package/src/cli/utils.ts +10 -0
  389. package/src/client/Methods.ts +5 -2
  390. package/src/client/Mppx.test-d.ts +31 -1
  391. package/src/client/Mppx.test.ts +76 -1
  392. package/src/client/Mppx.ts +2 -2
  393. package/src/client/Transport.test.ts +225 -178
  394. package/src/client/Transport.ts +77 -84
  395. package/src/client/index.ts +25 -1
  396. package/src/client/internal/Fetch.test.ts +236 -6
  397. package/src/client/internal/Fetch.ts +69 -11
  398. package/src/client/internal/protocols/Mcp.test.ts +220 -0
  399. package/src/client/internal/protocols/Mcp.ts +162 -0
  400. package/src/client/internal/protocols/Mpp.ts +21 -0
  401. package/src/client/internal/protocols/Protocol.ts +10 -0
  402. package/src/client/internal/protocols/Shared.ts +25 -0
  403. package/src/client/internal/protocols/X402.ts +42 -0
  404. package/src/discovery/OpenApi.test.ts +1 -1
  405. package/src/env.d.ts +1 -1
  406. package/src/evm/PublicInterface.test-d.ts +1 -1
  407. package/src/evm/client/index.ts +1 -0
  408. package/src/evm/index.ts +2 -0
  409. package/src/evm/server/Charge.test.ts +1 -1
  410. package/src/evm/server/index.ts +1 -0
  411. package/src/index.ts +1 -0
  412. package/src/internal/AcceptPayment.test.ts +61 -0
  413. package/src/internal/AcceptPayment.ts +21 -14
  414. package/src/{mcp-sdk → mcp}/client/McpClient.integration.test.ts +18 -11
  415. package/src/{mcp-sdk → mcp}/client/McpClient.test-d.ts +45 -11
  416. package/src/{mcp-sdk → mcp}/client/McpClient.test.ts +211 -5
  417. package/src/mcp/client/McpClient.ts +307 -0
  418. package/src/mcp/client/McpClient.unit.test.ts +135 -0
  419. package/src/middlewares/elysia.test.ts +9 -5
  420. package/src/middlewares/express.test.ts +9 -5
  421. package/src/middlewares/hono.test.ts +5 -5
  422. package/src/middlewares/internal/mppx.test.ts +1 -1
  423. package/src/middlewares/nextjs.test.ts +9 -5
  424. package/src/proxy/Proxy.test.ts +9 -9
  425. package/src/proxy/services/anthropic.test.ts +1 -1
  426. package/src/proxy/services/openai.test.ts +1 -1
  427. package/src/proxy/services/stripe.test.ts +1 -1
  428. package/src/server/Mppx.authorize.test.ts +1 -1
  429. package/src/server/Mppx.test-d.ts +55 -1
  430. package/src/server/Mppx.test.ts +220 -9
  431. package/src/server/Mppx.ts +501 -407
  432. package/src/server/Response.ts +2 -1
  433. package/src/server/Transport.test.ts +6 -6
  434. package/src/server/Transport.ts +5 -4
  435. package/src/server/index.ts +1 -0
  436. package/src/stripe/Charge.integration.test.ts +1 -1
  437. package/src/stripe/client/Charge.test.ts +21 -6
  438. package/src/stripe/client/Charge.ts +6 -2
  439. package/src/stripe/server/Charge.test.ts +115 -2
  440. package/src/stripe/server/Charge.ts +13 -2
  441. package/src/stripe/server/internal/html/package.json +1 -1
  442. package/src/stripe/server/internal/html.gen.ts +1 -1
  443. package/src/tempo/AccessKeyAuthorization.test.ts +4 -94
  444. package/src/tempo/Methods.test.ts +45 -17
  445. package/src/tempo/Methods.ts +22 -0
  446. package/src/tempo/Proof.conformance.test.ts +146 -0
  447. package/src/tempo/Proof.test-d.ts +15 -0
  448. package/src/tempo/Proof.ts +52 -1
  449. package/src/tempo/PublicExports.test-d.ts +105 -0
  450. package/src/tempo/Subscription.integration.test.ts +1 -1
  451. package/src/tempo/client/Charge.test.ts +258 -0
  452. package/src/tempo/client/Charge.ts +84 -38
  453. package/src/tempo/client/Methods.ts +22 -8
  454. package/src/tempo/client/ResolveAccount.ts +46 -0
  455. package/src/tempo/client/index.ts +15 -4
  456. package/src/tempo/index.ts +1 -0
  457. package/src/tempo/internal/fee-payer.test.ts +296 -17
  458. package/src/tempo/internal/fee-payer.ts +186 -4
  459. package/src/tempo/internal/fee-token.test.ts +14 -9
  460. package/src/tempo/internal/proof.test.ts +12 -4
  461. package/src/tempo/internal/proof.ts +55 -6
  462. package/src/tempo/legacy/AccessKeyAuthorization.test.ts +162 -0
  463. package/src/tempo/legacy/README.md +9 -0
  464. package/src/tempo/{client → legacy/client}/ChannelOps.test.ts +6 -7
  465. package/src/tempo/{client → legacy/client}/ChannelOps.ts +22 -9
  466. package/src/tempo/{client → legacy/client}/Session.test.ts +51 -9
  467. package/src/tempo/{client → legacy/client}/Session.ts +25 -11
  468. package/src/tempo/{client → legacy/client}/SessionManager.test.ts +81 -9
  469. package/src/tempo/{client → legacy/client}/SessionManager.ts +52 -23
  470. package/src/tempo/legacy/client/index.ts +6 -0
  471. package/src/tempo/legacy/index.ts +6 -0
  472. package/src/tempo/{server → legacy/server}/Session.test.ts +136 -71
  473. package/src/tempo/{server → legacy/server}/Session.ts +32 -23
  474. package/src/tempo/legacy/server/index.ts +4 -0
  475. package/src/tempo/{session → legacy/session}/Chain.test.ts +3 -4
  476. package/src/tempo/{session → legacy/session}/Chain.ts +94 -63
  477. package/src/tempo/{session → legacy/session}/Channel.ts +1 -0
  478. package/src/tempo/legacy/session/ChannelStore.test.ts +58 -0
  479. package/src/tempo/legacy/session/ChannelStore.ts +39 -0
  480. package/src/tempo/legacy/session/Types.ts +91 -0
  481. package/src/tempo/{session → legacy/session}/Voucher.ts +12 -8
  482. package/src/tempo/{session → legacy/session}/escrow.abi.ts +1 -0
  483. package/src/tempo/legacy/session/index.ts +8 -0
  484. package/src/tempo/server/AtomicStore.test-d.ts +16 -11
  485. package/src/tempo/server/Charge.test.ts +480 -31
  486. package/src/tempo/server/Charge.ts +54 -30
  487. package/src/tempo/server/Methods.ts +58 -10
  488. package/src/tempo/server/Sse.test.ts +2 -2
  489. package/src/tempo/server/Subscription.test.ts +465 -3
  490. package/src/tempo/server/Subscription.ts +174 -19
  491. package/src/tempo/server/index.ts +6 -5
  492. package/src/tempo/server/internal/html/package.json +2 -2
  493. package/src/tempo/server/internal/html.gen.ts +1 -1
  494. package/src/tempo/server/internal/request-body.test.ts +37 -4
  495. package/src/tempo/server/internal/request-body.ts +25 -6
  496. package/src/tempo/server/internal/transport.test.ts +4 -4
  497. package/src/tempo/server/internal/transport.ts +19 -10
  498. package/src/tempo/session/Snapshot.test.ts +41 -0
  499. package/src/tempo/session/Snapshot.ts +74 -0
  500. package/src/tempo/session/client/ChannelOps.test.ts +163 -0
  501. package/src/tempo/session/client/ChannelOps.ts +330 -0
  502. package/src/tempo/session/client/ChannelStore.ts +111 -0
  503. package/src/tempo/session/client/CredentialState.test.ts +789 -0
  504. package/src/tempo/session/client/CredentialState.ts +799 -0
  505. package/src/tempo/session/client/ReceiptCoordinator.ts +95 -0
  506. package/src/tempo/session/client/Runtime.test.ts +1092 -0
  507. package/src/tempo/session/client/Runtime.ts +986 -0
  508. package/src/tempo/session/client/Session.test.ts +774 -0
  509. package/src/tempo/session/client/Session.ts +123 -0
  510. package/src/tempo/session/client/SessionManager.test.ts +1397 -0
  511. package/src/tempo/session/client/SessionManager.ts +751 -0
  512. package/src/tempo/session/client/Transports.test.ts +837 -0
  513. package/src/tempo/session/client/Transports.ts +1292 -0
  514. package/src/tempo/session/client/index.ts +40 -0
  515. package/src/tempo/session/index.ts +7 -8
  516. package/src/tempo/session/precompile/Chain.integration.test.ts +321 -0
  517. package/src/tempo/session/precompile/Chain.test.ts +1258 -0
  518. package/src/tempo/session/precompile/Chain.ts +979 -0
  519. package/src/tempo/session/precompile/Channel.test.ts +138 -0
  520. package/src/tempo/session/precompile/Channel.ts +103 -0
  521. package/src/tempo/session/precompile/Protocol.test.ts +358 -0
  522. package/src/tempo/session/precompile/Protocol.ts +520 -0
  523. package/src/tempo/session/precompile/Voucher.test.ts +354 -0
  524. package/src/tempo/session/precompile/Voucher.ts +162 -0
  525. package/src/tempo/session/precompile/escrow.abi.ts +226 -0
  526. package/src/tempo/session/precompile/index.ts +33 -0
  527. package/src/tempo/session/server/ChannelOps.test.ts +129 -0
  528. package/src/tempo/session/server/ChannelOps.ts +157 -0
  529. package/src/tempo/session/{ChannelStore.test.ts → server/ChannelStore.test.ts} +536 -29
  530. package/src/tempo/session/server/ChannelStore.ts +835 -0
  531. package/src/tempo/session/server/CredentialVerification.test.ts +146 -0
  532. package/src/tempo/session/server/CredentialVerification.ts +710 -0
  533. package/src/tempo/session/server/MeteredStream.ts +88 -0
  534. package/src/tempo/session/server/RequestState.test.ts +531 -0
  535. package/src/tempo/session/server/RequestState.ts +499 -0
  536. package/src/tempo/session/server/Session.integration.test.ts +444 -0
  537. package/src/tempo/session/server/Session.test.ts +3253 -0
  538. package/src/tempo/session/server/Session.ts +543 -0
  539. package/src/tempo/session/server/Settlement.test.ts +329 -0
  540. package/src/tempo/session/server/Settlement.ts +471 -0
  541. package/src/tempo/session/{Sse.test.ts → server/Sse.test.ts} +37 -3
  542. package/src/tempo/session/server/Sse.ts +254 -0
  543. package/src/tempo/session/server/Transports.test.ts +346 -0
  544. package/src/tempo/session/server/Transports.ts +255 -0
  545. package/src/tempo/session/{Ws.test.ts → server/Ws.test.ts} +4 -4
  546. package/src/tempo/session/server/Ws.ts +380 -0
  547. package/src/tempo/session/server/index.ts +8 -0
  548. package/src/tempo/subscription/Store.ts +27 -9
  549. package/src/x402/Exact.e2e.test.ts +1 -1
  550. package/src/x402/PublicInterface.test-d.ts +1 -1
  551. package/src/x402/index.ts +1 -0
  552. package/dist/mcp-sdk/client/McpClient.d.ts +0 -78
  553. package/dist/mcp-sdk/client/McpClient.d.ts.map +0 -1
  554. package/dist/mcp-sdk/client/McpClient.js +0 -105
  555. package/dist/mcp-sdk/client/McpClient.js.map +0 -1
  556. package/dist/mcp-sdk/client/index.d.ts.map +0 -1
  557. package/dist/mcp-sdk/client/index.js.map +0 -1
  558. package/dist/mcp-sdk/server/Transport.d.ts.map +0 -1
  559. package/dist/mcp-sdk/server/Transport.js.map +0 -1
  560. package/dist/mcp-sdk/server/index.d.ts.map +0 -1
  561. package/dist/mcp-sdk/server/index.js.map +0 -1
  562. package/dist/tempo/client/ChannelOps.d.ts.map +0 -1
  563. package/dist/tempo/client/ChannelOps.js.map +0 -1
  564. package/dist/tempo/client/Session.d.ts.map +0 -1
  565. package/dist/tempo/client/Session.js.map +0 -1
  566. package/dist/tempo/client/SessionManager.d.ts.map +0 -1
  567. package/dist/tempo/client/SessionManager.js.map +0 -1
  568. package/dist/tempo/server/Session.d.ts.map +0 -1
  569. package/dist/tempo/server/Session.js.map +0 -1
  570. package/dist/tempo/session/Chain.d.ts.map +0 -1
  571. package/dist/tempo/session/Chain.js.map +0 -1
  572. package/dist/tempo/session/Channel.d.ts.map +0 -1
  573. package/dist/tempo/session/Channel.js.map +0 -1
  574. package/dist/tempo/session/ChannelStore.d.ts +0 -117
  575. package/dist/tempo/session/ChannelStore.d.ts.map +0 -1
  576. package/dist/tempo/session/ChannelStore.js +0 -172
  577. package/dist/tempo/session/ChannelStore.js.map +0 -1
  578. package/dist/tempo/session/Receipt.d.ts +0 -22
  579. package/dist/tempo/session/Receipt.d.ts.map +0 -1
  580. package/dist/tempo/session/Receipt.js +0 -34
  581. package/dist/tempo/session/Receipt.js.map +0 -1
  582. package/dist/tempo/session/Sse.d.ts.map +0 -1
  583. package/dist/tempo/session/Sse.js +0 -363
  584. package/dist/tempo/session/Sse.js.map +0 -1
  585. package/dist/tempo/session/Types.d.ts +0 -78
  586. package/dist/tempo/session/Types.d.ts.map +0 -1
  587. package/dist/tempo/session/Types.js.map +0 -1
  588. package/dist/tempo/session/Voucher.d.ts.map +0 -1
  589. package/dist/tempo/session/Voucher.js.map +0 -1
  590. package/dist/tempo/session/Ws.d.ts +0 -87
  591. package/dist/tempo/session/Ws.d.ts.map +0 -1
  592. package/dist/tempo/session/Ws.js +0 -443
  593. package/dist/tempo/session/Ws.js.map +0 -1
  594. package/dist/tempo/session/escrow.abi.js.map +0 -1
  595. package/src/mcp-sdk/client/McpClient.ts +0 -196
  596. package/src/tempo/session/ChannelStore.ts +0 -308
  597. package/src/tempo/session/Receipt.test.ts +0 -89
  598. package/src/tempo/session/Receipt.ts +0 -46
  599. package/src/tempo/session/Sse.ts +0 -462
  600. package/src/tempo/session/Types.ts +0 -86
  601. package/src/tempo/session/Ws.ts +0 -576
  602. /package/dist/{mcp-sdk → mcp}/client/index.d.ts +0 -0
  603. /package/dist/{mcp-sdk → mcp}/client/index.js +0 -0
  604. /package/dist/{mcp-sdk → mcp}/server/Transport.d.ts +0 -0
  605. /package/dist/{mcp-sdk → mcp}/server/Transport.js +0 -0
  606. /package/dist/{mcp-sdk → mcp}/server/index.d.ts +0 -0
  607. /package/dist/{mcp-sdk → mcp}/server/index.js +0 -0
  608. /package/dist/tempo/{session → legacy/session}/Channel.js +0 -0
  609. /package/dist/tempo/{session → legacy/session}/Types.js +0 -0
  610. /package/src/{mcp-sdk → mcp}/client/index.ts +0 -0
  611. /package/src/{mcp-sdk → mcp}/server/Transport.test.ts +0 -0
  612. /package/src/{mcp-sdk → mcp}/server/Transport.ts +0 -0
  613. /package/src/{mcp-sdk → mcp}/server/index.ts +0 -0
  614. /package/src/tempo/{session → legacy/session}/Channel.test.ts +0 -0
  615. /package/src/tempo/{session → legacy/session}/Voucher.test.ts +0 -0
  616. /package/src/tempo/session/{Sse.fuzz.test.ts → server/Sse.fuzz.test.ts} +0 -0
@@ -6,16 +6,12 @@ import {
6
6
  Secp256k1,
7
7
  Transaction,
8
8
  } from 'viem/tempo'
9
- import { beforeAll, describe, expect, test } from 'vp/test'
10
- import { nodeEnv } from '~test/config.js'
11
- import { deployEscrow, openChannel } from '~test/tempo/session.js'
9
+ import { describe, expect, test } from 'vp/test'
10
+ import { tempoNetwork } from '~test/config.js'
12
11
  import { asset as currency, chain, http } from '~test/tempo/viem.js'
13
12
 
14
- import { createOpenPayload } from './client/ChannelOps.js'
15
13
  import { charge } from './client/Charge.js'
16
14
  import * as Methods from './Methods.js'
17
- import { closeOnChain, settleOnChain } from './session/Chain.js'
18
- import { signVoucher } from './session/Voucher.js'
19
15
 
20
16
  type ChargeCredentialPayload =
21
17
  | { hash: Hex; type: 'hash' }
@@ -25,6 +21,7 @@ const rootAccount = TempoAccount.fromSecp256k1(
25
21
  '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80',
26
22
  )
27
23
  const recipient = '0x2222222222222222222222222222222222222222' as Address
24
+ const isLocalnet = tempoNetwork === 'localnet'
28
25
 
29
26
  type ChargeRequest = ReturnType<typeof Methods.charge.schema.request.parse>
30
27
 
@@ -100,35 +97,7 @@ function expectTransactionKeyAuthorization(
100
97
  expect(transaction.keyAuthorization).toEqual(keyAuthorization)
101
98
  }
102
99
 
103
- async function createChannelForPayee(payee: Address, escrowContract: Address) {
104
- const payer = rootAccount
105
- const { channelId } = await openChannel({
106
- deposit: 10_000_000n,
107
- escrow: escrowContract,
108
- payee,
109
- payer,
110
- salt: Secp256k1.randomPrivateKey(),
111
- token: currency,
112
- })
113
- const cumulativeAmount = 1_000_000n
114
- const signature = await signVoucher(
115
- createClient({ account: payer, chain, transport: http() }),
116
- payer,
117
- { channelId, cumulativeAmount },
118
- escrowContract,
119
- chain.id,
120
- )
121
-
122
- return { channelId, cumulativeAmount, escrowContract, signature }
123
- }
124
-
125
- describe.runIf(nodeEnv === 'localnet')('Tempo access-key authorization attachment', () => {
126
- let escrowContract: Address
127
-
128
- beforeAll(async () => {
129
- escrowContract = await deployEscrow()
130
- })
131
-
100
+ describe.runIf(isLocalnet)('Tempo access-key authorization attachment', () => {
132
101
  test('tempo.charge pull signs a prepared transaction with keyAuthorization', async () => {
133
102
  const { accessKey, client, keyAuthorization } = await createAccessKeyClient()
134
103
  const method = charge({
@@ -169,63 +138,4 @@ describe.runIf(nodeEnv === 'localnet')('Tempo access-key authorization attachmen
169
138
  expect(signedTransactions).toHaveLength(1)
170
139
  expectTransactionKeyAuthorization(signedTransactions[0]!, keyAuthorization)
171
140
  })
172
-
173
- test('tempo.session open signs a prepared transaction with keyAuthorization', async () => {
174
- const { accessKey, client, keyAuthorization } = await createAccessKeyClient()
175
-
176
- const { payload } = await createOpenPayload(client, accessKey, {
177
- chainId: chain.id,
178
- currency,
179
- deposit: 5_000_000n,
180
- escrowContract,
181
- initialAmount: 1_000_000n,
182
- payee: recipient,
183
- })
184
-
185
- expect(payload.action).toBe('open')
186
- if (payload.action !== 'open') throw new Error('unexpected payload action')
187
- expectTransactionKeyAuthorization(payload.transaction, keyAuthorization)
188
- })
189
-
190
- test('tempo.session settle sends a prepared transaction with keyAuthorization', async () => {
191
- const { accessKey, client, keyAuthorization, signedTransactions } =
192
- await createAccessKeyClient()
193
- const channel = await createChannelForPayee(rootAccount.address, escrowContract)
194
-
195
- const hash = await settleOnChain(
196
- client,
197
- channel.escrowContract,
198
- {
199
- channelId: channel.channelId,
200
- cumulativeAmount: channel.cumulativeAmount,
201
- signature: channel.signature,
202
- },
203
- { account: accessKey },
204
- )
205
-
206
- expect(hash).toMatch(/^0x[0-9a-f]{64}$/)
207
- expect(signedTransactions).toHaveLength(1)
208
- expectTransactionKeyAuthorization(signedTransactions[0]!, keyAuthorization)
209
- })
210
-
211
- test('tempo.session close sends a prepared transaction with keyAuthorization', async () => {
212
- const { accessKey, client, keyAuthorization, signedTransactions } =
213
- await createAccessKeyClient()
214
- const channel = await createChannelForPayee(rootAccount.address, escrowContract)
215
-
216
- const hash = await closeOnChain(
217
- client,
218
- channel.escrowContract,
219
- {
220
- channelId: channel.channelId,
221
- cumulativeAmount: channel.cumulativeAmount,
222
- signature: channel.signature,
223
- },
224
- { account: accessKey },
225
- )
226
-
227
- expect(hash).toMatch(/^0x[0-9a-f]{64}$/)
228
- expect(signedTransactions).toHaveLength(1)
229
- expectTransactionKeyAuthorization(signedTransactions[0]!, keyAuthorization)
230
- })
231
141
  })
@@ -248,6 +248,51 @@ describe('session', () => {
248
248
  expect(request.amount).toBe('1000000')
249
249
  expect(request.methodDetails?.minVoucherDelta).toBe('100000')
250
250
  })
251
+
252
+ test('schema: preserves precompile session snapshots in method details', () => {
253
+ const sessionSnapshot = {
254
+ acceptedCumulative: '2',
255
+ channelId: `0x${'11'.repeat(32)}` as const,
256
+ deposit: '5',
257
+ descriptor: {
258
+ authorizedSigner: '0x0000000000000000000000000000000000000006',
259
+ expiringNonceHash: `0x${'22'.repeat(32)}` as const,
260
+ operator: '0x0000000000000000000000000000000000000000',
261
+ payee: '0x0000000000000000000000000000000000000002',
262
+ payer: '0x0000000000000000000000000000000000000001',
263
+ salt: `0x${'33'.repeat(32)}` as const,
264
+ token: '0x0000000000000000000000000000000000000003',
265
+ },
266
+ requiredCumulative: '3',
267
+ settled: '0',
268
+ spent: '2',
269
+ units: 2,
270
+ }
271
+ const request = Methods.session.schema.request.parse({
272
+ amount: '1',
273
+ currency: '0x20c0000000000000000000000000000000000001',
274
+ decimals: 6,
275
+ recipient: '0x1234567890abcdef1234567890abcdef12345678',
276
+ sessionSnapshot,
277
+ unitType: 'token',
278
+ })
279
+
280
+ expect(request.methodDetails?.sessionSnapshot).toEqual(sessionSnapshot)
281
+ })
282
+
283
+ test('schema: advertises precompile session operator in method details', () => {
284
+ const operator = '0x0000000000000000000000000000000000000006'
285
+ const request = Methods.session.schema.request.parse({
286
+ amount: '1',
287
+ currency: '0x20c0000000000000000000000000000000000001',
288
+ decimals: 6,
289
+ operator,
290
+ recipient: '0x1234567890abcdef1234567890abcdef12345678',
291
+ unitType: 'token',
292
+ })
293
+
294
+ expect(request.methodDetails?.operator).toBe(operator)
295
+ })
251
296
  })
252
297
 
253
298
  describe('subscription', () => {
@@ -313,23 +358,6 @@ describe('subscription', () => {
313
358
  expect(request.periodCount).toBe(expected)
314
359
  })
315
360
 
316
- test.each(['dev_second'] as const)(
317
- 'schema: accepts %s subscription periods for development and tests',
318
- (periodUnit) => {
319
- const request = Methods.subscription.schema.request.parse({
320
- amount: '10',
321
- currency: '0x20c0000000000000000000000000000000000001',
322
- decimals: 6,
323
- periodCount: '5',
324
- periodUnit,
325
- recipient: '0x1234567890abcdef1234567890abcdef12345678',
326
- subscriptionExpires: '2026-01-01T00:00:00Z',
327
- })
328
-
329
- expect(request.periodUnit).toBe(periodUnit)
330
- },
331
- )
332
-
333
361
  test('schema: rejects non-numeric periodCount', () => {
334
362
  const result = Methods.subscription.schema.request.safeParse({
335
363
  amount: '10',
@@ -1,8 +1,11 @@
1
1
  import type { Account, Address } from 'viem'
2
2
  import { parseUnits } from 'viem'
3
3
 
4
+ import * as Constants from '../Constants.js'
4
5
  import * as Method from '../Method.js'
5
6
  import * as z from '../zod.js'
7
+ import type { SessionSnapshot } from './session/client/Runtime.js'
8
+ import type * as PrecompileChannel from './session/precompile/Channel.js'
6
9
  import type { SubscriptionPeriodUnit } from './subscription/Types.js'
7
10
 
8
11
  export const chargeModes = ['push', 'pull'] as const
@@ -196,6 +199,7 @@ export const session = Method.from({
196
199
  authorizedSigner: z.optional(z.string()),
197
200
  channelId: z.hash(),
198
201
  cumulativeAmount: z.amount(),
202
+ descriptor: z.optional(z.custom<PrecompileChannel.ChannelDescriptor>()),
199
203
  signature: z.signature(),
200
204
  transaction: z.signature(),
201
205
  type: z.literal('transaction'),
@@ -204,6 +208,7 @@ export const session = Method.from({
204
208
  action: z.literal('topUp'),
205
209
  additionalDeposit: z.amount(),
206
210
  channelId: z.hash(),
211
+ descriptor: z.optional(z.custom<PrecompileChannel.ChannelDescriptor>()),
207
212
  transaction: z.signature(),
208
213
  type: z.literal('transaction'),
209
214
  }),
@@ -211,12 +216,14 @@ export const session = Method.from({
211
216
  action: z.literal('voucher'),
212
217
  channelId: z.hash(),
213
218
  cumulativeAmount: z.amount(),
219
+ descriptor: z.optional(z.custom<PrecompileChannel.ChannelDescriptor>()),
214
220
  signature: z.signature(),
215
221
  }),
216
222
  z.object({
217
223
  action: z.literal('close'),
218
224
  channelId: z.hash(),
219
225
  cumulativeAmount: z.amount(),
226
+ descriptor: z.optional(z.custom<PrecompileChannel.ChannelDescriptor>()),
220
227
  signature: z.signature(),
221
228
  }),
222
229
  ]),
@@ -237,7 +244,12 @@ export const session = Method.from({
237
244
  ),
238
245
  ),
239
246
  minVoucherDelta: z.optional(z.amount()),
247
+ operator: z.optional(z.address()),
240
248
  recipient: z.optional(z.string()),
249
+ sessionProtocol: z.optional(
250
+ z.enum([Constants.SessionProtocols.v2, Constants.SessionProtocols.v1]),
251
+ ),
252
+ sessionSnapshot: z.optional(z.custom<SessionSnapshot>()),
241
253
  suggestedDeposit: z.optional(z.amount()),
242
254
  unitType: z.string(),
243
255
  })
@@ -256,6 +268,9 @@ export const session = Method.from({
256
268
  escrowContract,
257
269
  feePayer,
258
270
  minVoucherDelta,
271
+ operator,
272
+ sessionProtocol,
273
+ sessionSnapshot,
259
274
  suggestedDeposit,
260
275
  ...rest
261
276
  }) => ({
@@ -274,6 +289,13 @@ export const session = Method.from({
274
289
  }),
275
290
  ...(chainId !== undefined && { chainId }),
276
291
  ...(feePayer !== undefined && { feePayer }),
292
+ ...(operator !== undefined && { operator }),
293
+ ...(sessionProtocol !== undefined && {
294
+ [Constants.MethodDetailKeys.sessionProtocol]: sessionProtocol,
295
+ }),
296
+ ...(sessionSnapshot !== undefined && {
297
+ [Constants.MethodDetailKeys.sessionSnapshot]: sessionSnapshot,
298
+ }),
277
299
  },
278
300
  }),
279
301
  ),
@@ -0,0 +1,146 @@
1
+ import { recoverTypedDataAddress } from 'viem'
2
+ import { privateKeyToAccount } from 'viem/accounts'
3
+ import { describe, expect, test } from 'vp/test'
4
+
5
+ import * as Proof from './Proof.js'
6
+
7
+ /**
8
+ * Deterministic conformance vector for the wallet-bound Tempo proof contract
9
+ * (EIP-712 domain `MPP` version `3`). These values pin the on-the-wire
10
+ * signing payload so any change to the proof ABI is caught here.
11
+ */
12
+ const vector = {
13
+ account: '0x1a642f0E3c3aF545E7AcBD38b07251B3990914F1',
14
+ chainId: 42431,
15
+ challengeId: 'kM9xPqWvT2nJrHsY4aDfEb',
16
+ digest: '0x3860a700a55e02ad3c2dc047e92489feceecbdb0a801d948e1d9f0b61ea9bc3f',
17
+ privateKey: `0x${'01'.repeat(32)}`,
18
+ realm: 'api.example.com',
19
+ signature:
20
+ '0x53f5d64d9f995e841b4212639b2e17e508e96752e10316df3814a16443dcbdb626c082190a4c3ecc3148101eb443d15bd83b579380b1be735a9c99f0df36c9fe1b',
21
+ } as const
22
+
23
+ const params = {
24
+ account: vector.account,
25
+ chainId: vector.chainId,
26
+ challengeId: vector.challengeId,
27
+ realm: vector.realm,
28
+ } as const
29
+
30
+ describe('tempo.Proof conformance (wallet binding)', () => {
31
+ test('typedData is the canonical wallet-bound MPP v3 proof contract', () => {
32
+ expect(Proof.typedData(params)).toEqual({
33
+ domain: { name: 'MPP', version: '3', chainId: vector.chainId },
34
+ types: {
35
+ Proof: [
36
+ { name: 'account', type: 'address' },
37
+ { name: 'challengeId', type: 'string' },
38
+ { name: 'realm', type: 'string' },
39
+ ],
40
+ },
41
+ primaryType: 'Proof',
42
+ message: {
43
+ account: vector.account,
44
+ challengeId: vector.challengeId,
45
+ realm: vector.realm,
46
+ },
47
+ })
48
+ })
49
+
50
+ test('hash matches the deterministic EIP-712 digest vector', () => {
51
+ expect(Proof.hash(params)).toBe(vector.digest)
52
+ })
53
+
54
+ test('the wallet produces the deterministic signature vector', async () => {
55
+ const account = privateKeyToAccount(vector.privateKey)
56
+ expect(account.address).toBe(vector.account)
57
+ const signature = await account.signTypedData(Proof.typedData(params))
58
+ expect(signature).toBe(vector.signature)
59
+ })
60
+
61
+ test('the signature vector recovers to the bound wallet', async () => {
62
+ const recovered = await recoverTypedDataAddress({
63
+ ...Proof.typedData(params),
64
+ signature: vector.signature,
65
+ })
66
+ expect(recovered).toBe(vector.account)
67
+ })
68
+
69
+ test('the digest is bound to the wallet: a different account changes the digest', () => {
70
+ const other = '0x000000000000000000000000000000000000dEaD'
71
+ expect(Proof.hash({ ...params, account: other })).not.toBe(vector.digest)
72
+ })
73
+
74
+ test('a proof cannot be replayed against a different wallet for the same challenge', async () => {
75
+ const account = privateKeyToAccount(vector.privateKey)
76
+ const signature = await account.signTypedData(Proof.typedData(params))
77
+
78
+ // An attacker swaps the bound `account` to a wallet they want to impersonate
79
+ // while keeping the same challenge. Because `account` is a signed field, the
80
+ // recovered signer no longer matches the swapped wallet, so verification
81
+ // (and the access-key delegation check, which rebuilds the message from the
82
+ // claimed source) fails.
83
+ const swapped = '0x000000000000000000000000000000000000dEaD'
84
+ const recovered = await recoverTypedDataAddress({
85
+ ...Proof.typedData({ ...params, account: swapped }),
86
+ signature,
87
+ })
88
+ expect(recovered).not.toBe(swapped)
89
+ expect(recovered).not.toBe(vector.account)
90
+ })
91
+
92
+ test('models the access-key delegation path: swapping the source breaks signer recovery', async () => {
93
+ // An access key K signs a proof bound to root account A. The server's
94
+ // delegation check recovers the signer from the message it rebuilds using
95
+ // the *claimed* source, then requires `isActiveAccessKey(signer, source)`.
96
+ // Distinct access key (signer) and root account (the bound payer / source).
97
+ const accessKey = privateKeyToAccount(`0x${'02'.repeat(32)}`)
98
+ const rootA = vector.account // proof is signed bound to account = A
99
+ const signature = await accessKey.signTypedData(Proof.typedData({ ...params, account: rootA }))
100
+ expect(accessKey.address).not.toBe(rootA)
101
+
102
+ // Honest submission (source = A): server recovers exactly K, so
103
+ // isActiveAccessKey(K, A) — the key actually authorized for A — is checked.
104
+ const recoveredForA = await recoverTypedDataAddress({
105
+ ...Proof.typedData({ ...params, account: rootA }),
106
+ signature,
107
+ })
108
+ expect(recoveredForA).toBe(accessKey.address)
109
+
110
+ // Replay against a different root B (attacker swaps source to B): server
111
+ // rebuilds the message with account = B, recovering some K' != K. Even if K
112
+ // is an active access key of B, the server checks isActiveAccessKey(K', B),
113
+ // which cannot match the authorized key. Replay is rejected.
114
+ const rootB = '0x000000000000000000000000000000000000bEEF'
115
+ const recoveredForB = await recoverTypedDataAddress({
116
+ ...Proof.typedData({ ...params, account: rootB }),
117
+ signature,
118
+ })
119
+ expect(recoveredForB).not.toBe(accessKey.address)
120
+ })
121
+
122
+ test('a legacy v2 proof (no account field) does not verify under the v3 contract', async () => {
123
+ // The pre-binding contract: domain version "2", message without `account`.
124
+ const account = privateKeyToAccount(vector.privateKey)
125
+ const legacyTypedData = {
126
+ domain: { name: 'MPP', version: '2', chainId: vector.chainId },
127
+ types: {
128
+ Proof: [
129
+ { name: 'challengeId', type: 'string' },
130
+ { name: 'realm', type: 'string' },
131
+ ],
132
+ },
133
+ primaryType: 'Proof',
134
+ message: { challengeId: vector.challengeId, realm: vector.realm },
135
+ } as const
136
+ const legacySignature = await account.signTypedData(legacyTypedData)
137
+
138
+ // Verified against the current wallet-bound v3 contract, recovery yields a
139
+ // different address, so the server rejects stale v2 proofs.
140
+ const recovered = await recoverTypedDataAddress({
141
+ ...Proof.typedData(params),
142
+ signature: legacySignature,
143
+ })
144
+ expect(recovered).not.toBe(account.address)
145
+ })
146
+ })
@@ -1,7 +1,22 @@
1
+ import type { Address, Hex } from 'viem'
1
2
  import { expectTypeOf, test } from 'vp/test'
2
3
 
3
4
  import { Proof } from './index.js'
4
5
 
6
+ test('Proof exports the wallet-bound typed-data contract helpers', () => {
7
+ expectTypeOf(Proof.message).toEqualTypeOf<
8
+ (parameters: { account: Address; challengeId: string; realm: string }) => {
9
+ readonly account: Address
10
+ readonly challengeId: string
11
+ readonly realm: string
12
+ }
13
+ >()
14
+
15
+ expectTypeOf(Proof.hash).toEqualTypeOf<
16
+ (parameters: { account: Address; chainId: number; challengeId: string; realm: string }) => Hex
17
+ >()
18
+ })
19
+
5
20
  test('Proof exports public proof source helpers', () => {
6
21
  expectTypeOf(Proof.proofSource).toEqualTypeOf<
7
22
  (parameters: { address: string; chainId: number }) => string
@@ -1,7 +1,58 @@
1
- import type { Address } from 'viem'
1
+ import type { Address, Hex } from 'viem'
2
2
 
3
3
  import * as Proof_internal from './internal/proof.js'
4
4
 
5
+ /** EIP-712 primary type for Tempo proof credentials. */
6
+ export const primaryType = Proof_internal.primaryType
7
+
8
+ /**
9
+ * EIP-712 typed-data field definitions for Tempo zero-amount proof credentials.
10
+ *
11
+ * The `account` field cryptographically binds the signature to the payer
12
+ * wallet, so a proof signed for one account cannot be replayed against another.
13
+ */
14
+ export const types = Proof_internal.types
15
+
16
+ /** Constructs the EIP-712 domain for a Tempo proof credential. */
17
+ export function domain(chainId: number) {
18
+ return Proof_internal.domain(chainId)
19
+ }
20
+
21
+ /**
22
+ * Constructs the EIP-712 message for a Tempo proof credential.
23
+ *
24
+ * @param parameters - Proof message parameters.
25
+ * @param parameters.account - Payer wallet address the proof is bound to.
26
+ * @param parameters.challengeId - Challenge `id` being proven.
27
+ * @param parameters.realm - Challenge `realm` being proven.
28
+ */
29
+ export function message(parameters: { account: Address; challengeId: string; realm: string }) {
30
+ return Proof_internal.message(parameters)
31
+ }
32
+
33
+ /**
34
+ * Constructs the complete EIP-712 typed-data payload for a Tempo proof
35
+ * credential — the canonical, wallet-bound proof contract.
36
+ */
37
+ export function typedData(parameters: {
38
+ account: Address
39
+ chainId: number
40
+ challengeId: string
41
+ realm: string
42
+ }) {
43
+ return Proof_internal.typedData(parameters)
44
+ }
45
+
46
+ /** Computes the EIP-712 digest (signing payload) for a Tempo proof credential. */
47
+ export function hash(parameters: {
48
+ account: Address
49
+ chainId: number
50
+ challengeId: string
51
+ realm: string
52
+ }): Hex {
53
+ return Proof_internal.hash(parameters)
54
+ }
55
+
5
56
  /** Constructs the canonical `did:pkh:eip155` source DID for Tempo proof credentials. */
6
57
  export function proofSource(parameters: { address: string; chainId: number }): string {
7
58
  return Proof_internal.proofSource(parameters)
@@ -0,0 +1,105 @@
1
+ import { expectTypeOf, test } from 'vp/test'
2
+
3
+ import type {
4
+ PaymentResponse as ClientPaymentResponse,
5
+ SessionManager as ClientSessionManager,
6
+ SessionManagerSseOptions as ClientSessionManagerSseOptions,
7
+ SessionManagerWebSocketOptions as ClientSessionManagerWebSocketOptions,
8
+ } from './client/index.js'
9
+ import * as Tempo from './index.js'
10
+ import type { SettlementSchedule as ServerSettlementSchedule } from './server/index.js'
11
+ import type {
12
+ ActiveSessionState,
13
+ ClosedSessionState,
14
+ PaymentResponse as SessionPaymentResponse,
15
+ SessionManager,
16
+ SessionManagerSseOptions,
17
+ SessionManagerWebSocketOptions,
18
+ SessionTransition,
19
+ VoucherNeededSessionState,
20
+ } from './session/client/index.js'
21
+ import type { SessionTransition as MachineSessionTransition } from './session/client/index.js'
22
+ import type { ChannelTransactionOptions } from './session/precompile/Chain.js'
23
+ import type { RawAmountString } from './session/precompile/index.js'
24
+ import type { SettlementSchedule as SessionSettlementSchedule } from './session/server/index.js'
25
+
26
+ test('tempo session public barrels expose manager and schedule interfaces', () => {
27
+ expectTypeOf(Tempo.Session).toBeObject()
28
+ expectTypeOf(Tempo.Session.Client).toBeObject()
29
+ expectTypeOf(Tempo.Session.Precompile).toBeObject()
30
+ expectTypeOf(Tempo.Session.Server).toBeObject()
31
+ expectTypeOf<typeof Tempo>().not.toHaveProperty('Precompile')
32
+
33
+ expectTypeOf<ClientPaymentResponse>().toEqualTypeOf<SessionPaymentResponse>()
34
+ expectTypeOf<ClientSessionManager>().toEqualTypeOf<SessionManager>()
35
+ expectTypeOf<ClientSessionManagerSseOptions>().toEqualTypeOf<SessionManagerSseOptions>()
36
+ expectTypeOf<ClientSessionManagerWebSocketOptions>().toEqualTypeOf<SessionManagerWebSocketOptions>()
37
+
38
+ expectTypeOf<ServerSettlementSchedule>().toEqualTypeOf<SessionSettlementSchedule>()
39
+ expectTypeOf<MachineSessionTransition>().toEqualTypeOf<SessionTransition>()
40
+ expectTypeOf<ServerSettlementSchedule>().toEqualTypeOf<{
41
+ amount?: string | bigint | undefined
42
+ intervalMs?: number | undefined
43
+ units?: number | undefined
44
+ }>()
45
+ expectTypeOf<RawAmountString>().toEqualTypeOf<string>()
46
+ expectTypeOf<ActiveSessionState['status']>().toEqualTypeOf<'active'>()
47
+ expectTypeOf<VoucherNeededSessionState['status']>().toEqualTypeOf<'voucherNeeded'>()
48
+ expectTypeOf<ClosedSessionState['status']>().toEqualTypeOf<'closed'>()
49
+ })
50
+
51
+ test('tempo session chain exports canonical transaction options', () => {
52
+ expectTypeOf<ChannelTransactionOptions>().toEqualTypeOf<{
53
+ account?: import('viem').Account | undefined
54
+ candidateFeeTokens?: readonly import('viem').Address[] | undefined
55
+ feePayer?: import('viem').Account | undefined
56
+ feePayerPolicy?: Partial<import('./internal/fee-payer.js').Policy> | undefined
57
+ feeToken?: import('viem').Address | undefined
58
+ }>()
59
+ })
60
+
61
+ test('tempo session public barrel hides internal session drivers', () => {
62
+ type SessionNamespacePublic = typeof import('./session/index.js')
63
+ type SessionPublic = typeof import('./session/precompile/index.js')
64
+ type SessionClientPublic = typeof import('./session/client/index.js')
65
+ type SessionServerPublic = typeof import('./session/server/index.js')
66
+
67
+ expectTypeOf<SessionNamespacePublic>().toHaveProperty('Precompile')
68
+ expectTypeOf<SessionNamespacePublic>().toHaveProperty('Client')
69
+ expectTypeOf<SessionNamespacePublic>().toHaveProperty('Server')
70
+ expectTypeOf<SessionNamespacePublic>().not.toHaveProperty('ChannelStore')
71
+ expectTypeOf<SessionNamespacePublic>().not.toHaveProperty('Receipt')
72
+ expectTypeOf<SessionNamespacePublic>().not.toHaveProperty('Sse')
73
+ expectTypeOf<SessionNamespacePublic>().not.toHaveProperty('Types')
74
+ expectTypeOf<SessionNamespacePublic>().not.toHaveProperty('Ws')
75
+ expectTypeOf<SessionNamespacePublic>().not.toHaveProperty('session')
76
+ expectTypeOf<SessionNamespacePublic>().not.toHaveProperty('sessionManager')
77
+ expectTypeOf<SessionPublic>().not.toHaveProperty('openSseSession')
78
+ expectTypeOf<SessionPublic>().not.toHaveProperty('openWebSocketSession')
79
+ expectTypeOf<SessionPublic>().not.toHaveProperty('Client')
80
+ expectTypeOf<SessionPublic>().not.toHaveProperty('Server')
81
+ expectTypeOf<SessionPublic>().not.toHaveProperty('session')
82
+ expectTypeOf<SessionPublic>().not.toHaveProperty('sessionManager')
83
+ expectTypeOf<SessionPublic>().not.toHaveProperty('settle')
84
+ expectTypeOf<SessionClientPublic>().not.toHaveProperty('ChannelOps')
85
+ expectTypeOf<SessionClientPublic>().not.toHaveProperty('Chain')
86
+ expectTypeOf<SessionServerPublic>().not.toHaveProperty('ChannelOps')
87
+ expectTypeOf<SessionServerPublic>().not.toHaveProperty('Chain')
88
+ })
89
+
90
+ test('tempo legacy namespace keeps client, server, and channel primitives isolated', () => {
91
+ type LegacySessionPublic = typeof import('./legacy/session/index.js')
92
+
93
+ expectTypeOf(Tempo.SessionLegacy.Client.session).toBeFunction()
94
+ expectTypeOf(Tempo.SessionLegacy.Client.sessionManager).toBeFunction()
95
+ expectTypeOf(Tempo.SessionLegacy.Server.session).toBeFunction()
96
+ expectTypeOf(Tempo.SessionLegacy.Server.settle).toBeFunction()
97
+ expectTypeOf(Tempo.SessionLegacy.Session.Chain).toBeObject()
98
+ expectTypeOf(Tempo.SessionLegacy.Session.Channel).toBeObject()
99
+ expectTypeOf(Tempo.SessionLegacy.Session.Voucher).toBeObject()
100
+
101
+ expectTypeOf<LegacySessionPublic>().not.toHaveProperty('ChannelStore')
102
+ expectTypeOf<LegacySessionPublic>().not.toHaveProperty('Receipt')
103
+ expectTypeOf<LegacySessionPublic>().not.toHaveProperty('Sse')
104
+ expectTypeOf<LegacySessionPublic>().not.toHaveProperty('Ws')
105
+ })
@@ -10,7 +10,7 @@ import * as SubscriptionStore from './subscription/Store.js'
10
10
  import type { SubscriptionAccessKey, SubscriptionRecord } from './subscription/Types.js'
11
11
 
12
12
  const realm = 'news.example.com'
13
- const secretKey = 'subscription-lifecycle-secret'
13
+ const secretKey = 'subscription-lifecycle-secret-key-32'
14
14
  const currency = '0x20c0000000000000000000000000000000000001'
15
15
  const recipient = '0x1234567890abcdef1234567890abcdef12345678'
16
16
  const periodCount = '30'