mppx 0.8.15 → 0.8.18

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 (966) hide show
  1. package/CHANGELOG.md +91 -0
  2. package/README.md +15 -0
  3. package/dist/Challenge.js +61 -39
  4. package/dist/Constants.d.ts +17 -17
  5. package/dist/Errors.d.ts +3 -3
  6. package/dist/Method.d.ts +35 -5
  7. package/dist/Method.js +7 -22
  8. package/dist/Store.d.ts +19 -0
  9. package/dist/Store.js +43 -0
  10. package/dist/attestation/Client.d.ts +17 -0
  11. package/dist/attestation/Client.js +28 -0
  12. package/dist/attestation/Constants.d.ts +15 -0
  13. package/dist/attestation/Constants.js +15 -0
  14. package/dist/attestation/Server.d.ts +4 -0
  15. package/dist/attestation/Server.js +8 -0
  16. package/dist/attestation/Types.d.ts +76 -0
  17. package/dist/attestation/Types.js +2 -0
  18. package/dist/attestation/index.d.ts +6 -0
  19. package/dist/attestation/index.js +6 -0
  20. package/dist/attestation/internal/HttpMessageSignature.d.ts +73 -0
  21. package/dist/attestation/internal/HttpMessageSignature.js +320 -0
  22. package/dist/attestation/internal/SigningContext.d.ts +4 -0
  23. package/dist/attestation/internal/SigningContext.js +11 -0
  24. package/dist/bin.js +3 -3
  25. package/dist/cli/THIRD-PARTY-LICENSES.txt +328 -0
  26. package/dist/cli/account.d.ts +14 -14
  27. package/dist/cli/cli.d.ts +6 -6
  28. package/dist/cli/cli.js +253 -1504
  29. package/dist/cli/plugins/index.js +19 -5
  30. package/dist/cli/plugins/tempo.js +7 -3
  31. package/dist/cli/sessions/Manager.js +7 -4
  32. package/dist/cli/sessions/commands.d.ts +4 -4
  33. package/dist/cli/sessions/request.d.ts +2 -0
  34. package/dist/cli/sessions/request.js +18 -0
  35. package/dist/cli/sessions/store.js +28 -14
  36. package/dist/cli/utils.d.ts +1 -1
  37. package/dist/cli/validate/index.d.ts +3 -3
  38. package/dist/client/Mppx.d.ts +3 -0
  39. package/dist/client/Mppx.js +13 -5
  40. package/dist/client/Transport.d.ts +3 -5
  41. package/dist/client/Transport.js +1 -17
  42. package/dist/client/internal/Fetch.js +2 -6
  43. package/dist/discovery/Discovery.js +2 -1
  44. package/dist/discovery/OpenApi.d.ts +3 -5
  45. package/dist/discovery/OpenApi.js +13 -34
  46. package/dist/discovery/internal/Metadata.d.ts +20 -0
  47. package/dist/discovery/internal/Metadata.js +36 -0
  48. package/dist/evm/Methods.d.ts +11 -11
  49. package/dist/evm/Types.d.ts +17 -17
  50. package/dist/evm/client/Charge.d.ts +11 -11
  51. package/dist/evm/client/Charge.js +8 -0
  52. package/dist/evm/client/Methods.d.ts +11 -11
  53. package/dist/evm/server/Charge.d.ts +1 -1
  54. package/dist/evm/server/Charge.js +2 -0
  55. package/dist/evm/server/Methods.d.ts +11 -11
  56. package/dist/internal/HeaderCodec.d.ts +2 -2
  57. package/dist/internal/types.d.ts +6 -0
  58. package/dist/proxy/Proxy.d.ts +2 -0
  59. package/dist/proxy/Proxy.js +117 -9
  60. package/dist/proxy/Service.d.ts +36 -1
  61. package/dist/proxy/Service.js +9 -8
  62. package/dist/proxy/services/anthropic.js +1 -0
  63. package/dist/proxy/services/openai.js +1 -0
  64. package/dist/proxy/services/stripe.js +1 -0
  65. package/dist/server/Mppx.d.ts +75 -13
  66. package/dist/server/Mppx.js +201 -23
  67. package/dist/server/core.d.ts +9 -0
  68. package/dist/server/core.js +9 -0
  69. package/dist/server/internal/html/config.d.ts +9 -9
  70. package/dist/server/internal/html/constants.d.ts +17 -17
  71. package/dist/stripe/Methods.d.ts +10 -10
  72. package/dist/stripe/client/Charge.d.ts +10 -10
  73. package/dist/stripe/client/Methods.d.ts +10 -10
  74. package/dist/stripe/internal/constants.d.ts +1 -1
  75. package/dist/stripe/internal/constants.js +1 -1
  76. package/dist/stripe/internal/types.d.ts +1 -0
  77. package/dist/stripe/server/Charge.d.ts +11 -11
  78. package/dist/stripe/server/Charge.js +51 -5
  79. package/dist/stripe/server/Methods.d.ts +137 -48
  80. package/dist/stripe/server/Methods.js +265 -4
  81. package/dist/stripe/server/internal/deposit-address.d.ts +13 -0
  82. package/dist/stripe/server/internal/deposit-address.js +28 -0
  83. package/dist/stripe/server/internal/html.gen.d.ts +1 -1
  84. package/dist/stripe/server/internal/html.gen.js +1 -1
  85. package/dist/stripe/server/internal/record-payment.d.ts +15 -0
  86. package/dist/stripe/server/internal/record-payment.js +42 -0
  87. package/dist/stripe/server/internal/request.d.ts +25 -0
  88. package/dist/stripe/server/internal/request.js +29 -0
  89. package/dist/stripe/server/spt.d.ts +8 -0
  90. package/dist/stripe/server/spt.js +8 -0
  91. package/dist/tap/Constants.d.ts +28 -0
  92. package/dist/tap/Constants.js +32 -0
  93. package/dist/tap/Types.d.ts +11 -0
  94. package/dist/tap/Types.js +2 -0
  95. package/dist/tap/client/index.d.ts +26 -0
  96. package/dist/tap/client/index.js +33 -0
  97. package/dist/tap/index.d.ts +5 -0
  98. package/dist/tap/index.js +5 -0
  99. package/dist/tap/server/index.d.ts +20 -0
  100. package/dist/tap/server/index.js +36 -0
  101. package/dist/tempo/Attribution.d.ts +1 -1
  102. package/dist/tempo/Methods.d.ts +73 -60
  103. package/dist/tempo/Methods.js +14 -3
  104. package/dist/tempo/Proof.d.ts +16 -16
  105. package/dist/tempo/client/Charge.d.ts +22 -19
  106. package/dist/tempo/client/Charge.js +32 -16
  107. package/dist/tempo/client/Methods.d.ts +51 -38
  108. package/dist/tempo/client/Subscription.d.ts +23 -23
  109. package/dist/tempo/internal/address.d.ts +2 -1
  110. package/dist/tempo/internal/address.js +3 -1
  111. package/dist/tempo/internal/auto-swap.js +4 -19
  112. package/dist/tempo/internal/defaults.d.ts +17 -6
  113. package/dist/tempo/internal/defaults.js +11 -0
  114. package/dist/tempo/internal/fee-payer.d.ts +12 -12
  115. package/dist/tempo/internal/machine-token-charge.d.ts +51 -0
  116. package/dist/tempo/internal/machine-token-charge.js +113 -0
  117. package/dist/tempo/internal/machine-token-session.d.ts +88 -0
  118. package/dist/tempo/internal/machine-token-session.js +173 -0
  119. package/dist/tempo/internal/proof.d.ts +17 -17
  120. package/dist/tempo/internal/signature-envelope.d.ts +14 -0
  121. package/dist/tempo/internal/signature-envelope.js +28 -0
  122. package/dist/tempo/legacy/client/ChannelOps.d.ts +2 -2
  123. package/dist/tempo/legacy/client/ChannelOps.js +11 -5
  124. package/dist/tempo/legacy/client/Session.d.ts +33 -21
  125. package/dist/tempo/legacy/client/Session.js +3 -3
  126. package/dist/tempo/legacy/client/SessionManager.d.ts +3 -1
  127. package/dist/tempo/legacy/client/SessionManager.js +2 -0
  128. package/dist/tempo/legacy/index.d.ts +1 -3
  129. package/dist/tempo/legacy/index.js +1 -3
  130. package/dist/tempo/legacy/session/escrow.abi.d.ts +374 -374
  131. package/dist/tempo/server/Charge.d.ts +28 -11
  132. package/dist/tempo/server/Charge.js +101 -55
  133. package/dist/tempo/server/Methods.d.ts +58 -56
  134. package/dist/tempo/server/Methods.js +8 -18
  135. package/dist/tempo/server/Relay.d.ts +1 -1
  136. package/dist/tempo/server/Relay.js +2 -2
  137. package/dist/tempo/server/Subscription.d.ts +25 -25
  138. package/dist/tempo/server/Subscription.js +2 -0
  139. package/dist/tempo/server/index.d.ts +1 -1
  140. package/dist/tempo/server/index.js +1 -1
  141. package/dist/tempo/server/internal/html.gen.d.ts +1 -1
  142. package/dist/tempo/server/internal/html.gen.js +1 -1
  143. package/dist/tempo/server/internal/transport.d.ts +2 -0
  144. package/dist/tempo/server/internal/transport.js +9 -2
  145. package/dist/tempo/session/client/ChannelOps.d.ts +18 -3
  146. package/dist/tempo/session/client/ChannelOps.js +35 -6
  147. package/dist/tempo/session/client/ChannelStore.d.ts +0 -5
  148. package/dist/tempo/session/client/ChannelStore.js +2 -2
  149. package/dist/tempo/session/client/CredentialState.d.ts +18 -3
  150. package/dist/tempo/session/client/CredentialState.js +77 -76
  151. package/dist/tempo/session/client/Runtime.d.ts +4 -2
  152. package/dist/tempo/session/client/Runtime.js +21 -5
  153. package/dist/tempo/session/client/Session.d.ts +34 -22
  154. package/dist/tempo/session/client/Session.js +186 -63
  155. package/dist/tempo/session/client/SessionManager.d.ts +3 -1
  156. package/dist/tempo/session/client/SessionManager.js +35 -11
  157. package/dist/tempo/session/client/Transports.d.ts +2 -0
  158. package/dist/tempo/session/client/Transports.js +12 -2
  159. package/dist/tempo/session/precompile/Chain.d.ts +37 -2
  160. package/dist/tempo/session/precompile/Chain.js +116 -15
  161. package/dist/tempo/session/precompile/Protocol.d.ts +15 -0
  162. package/dist/tempo/session/precompile/Protocol.js +7 -0
  163. package/dist/tempo/session/precompile/Voucher.d.ts +7 -5
  164. package/dist/tempo/session/precompile/Voucher.js +6 -12
  165. package/dist/tempo/session/precompile/escrow.abi.d.ts +306 -306
  166. package/dist/tempo/session/server/ChannelStore.d.ts +15 -0
  167. package/dist/tempo/session/server/ChannelStore.js +27 -12
  168. package/dist/tempo/session/server/CredentialVerification.d.ts +39 -20
  169. package/dist/tempo/session/server/CredentialVerification.js +359 -89
  170. package/dist/tempo/session/server/MeteredStream.d.ts +4 -1
  171. package/dist/tempo/session/server/MeteredStream.js +8 -5
  172. package/dist/tempo/session/server/RequestState.d.ts +19 -0
  173. package/dist/tempo/session/server/RequestState.js +61 -15
  174. package/dist/tempo/session/server/Session.d.ts +46 -23
  175. package/dist/tempo/session/server/Session.js +150 -56
  176. package/dist/tempo/session/server/Settlement.d.ts +11 -4
  177. package/dist/tempo/session/server/Settlement.js +53 -21
  178. package/dist/tempo/session/server/Sse.d.ts +3 -1
  179. package/dist/tempo/session/server/Sse.js +2 -1
  180. package/dist/tempo/session/server/Transports.d.ts +1 -1
  181. package/dist/tempo/session/server/Transports.js +1 -0
  182. package/dist/tempo/session/server/Ws.d.ts +6 -1
  183. package/dist/tempo/session/server/Ws.js +1 -0
  184. package/dist/tempo/subscription/KeyAuthorization.d.ts +39 -39
  185. package/dist/web-bot-auth/Constants.d.ts +20 -0
  186. package/dist/web-bot-auth/Constants.js +24 -0
  187. package/dist/web-bot-auth/Types.d.ts +10 -0
  188. package/dist/web-bot-auth/Types.js +2 -0
  189. package/dist/web-bot-auth/client/index.d.ts +29 -0
  190. package/dist/web-bot-auth/client/index.js +64 -0
  191. package/dist/web-bot-auth/index.d.ts +7 -0
  192. package/dist/web-bot-auth/index.js +7 -0
  193. package/dist/web-bot-auth/internal/JwkThumbprint.d.ts +5 -0
  194. package/dist/web-bot-auth/internal/JwkThumbprint.js +20 -0
  195. package/dist/web-bot-auth/internal/SignatureAgent.d.ts +3 -0
  196. package/dist/web-bot-auth/internal/SignatureAgent.js +18 -0
  197. package/dist/web-bot-auth/server/index.d.ts +35 -0
  198. package/dist/web-bot-auth/server/index.js +88 -0
  199. package/dist/x402/Types.d.ts +6 -6
  200. package/dist/x402/client/Exact.d.ts +8 -0
  201. package/dist/x402/client/Exact.js +40 -10
  202. package/dist/x402/server/EvmCharge.d.ts +22 -0
  203. package/dist/x402/server/EvmCharge.js +54 -20
  204. package/package.json +28 -34
  205. package/dist/BodyDigest.d.ts.map +0 -1
  206. package/dist/BodyDigest.js.map +0 -1
  207. package/dist/Challenge.d.ts.map +0 -1
  208. package/dist/Challenge.js.map +0 -1
  209. package/dist/Constants.d.ts.map +0 -1
  210. package/dist/Constants.js.map +0 -1
  211. package/dist/Credential.d.ts.map +0 -1
  212. package/dist/Credential.js.map +0 -1
  213. package/dist/Errors.d.ts.map +0 -1
  214. package/dist/Errors.js.map +0 -1
  215. package/dist/Expires.d.ts.map +0 -1
  216. package/dist/Expires.js.map +0 -1
  217. package/dist/Html.d.ts.map +0 -1
  218. package/dist/Html.js.map +0 -1
  219. package/dist/Mcp.d.ts.map +0 -1
  220. package/dist/Mcp.js.map +0 -1
  221. package/dist/Method.d.ts.map +0 -1
  222. package/dist/Method.js.map +0 -1
  223. package/dist/PaymentRequest.d.ts.map +0 -1
  224. package/dist/PaymentRequest.js.map +0 -1
  225. package/dist/Receipt.d.ts.map +0 -1
  226. package/dist/Receipt.js.map +0 -1
  227. package/dist/Store.d.ts.map +0 -1
  228. package/dist/Store.js.map +0 -1
  229. package/dist/bin.d.ts.map +0 -1
  230. package/dist/bin.js.map +0 -1
  231. package/dist/cli/account.d.ts.map +0 -1
  232. package/dist/cli/account.js.map +0 -1
  233. package/dist/cli/cli.d.ts.map +0 -1
  234. package/dist/cli/cli.js.map +0 -1
  235. package/dist/cli/config.d.ts.map +0 -1
  236. package/dist/cli/config.js.map +0 -1
  237. package/dist/cli/internal.d.ts.map +0 -1
  238. package/dist/cli/internal.js.map +0 -1
  239. package/dist/cli/plugins/evm.d.ts.map +0 -1
  240. package/dist/cli/plugins/evm.js.map +0 -1
  241. package/dist/cli/plugins/index.d.ts.map +0 -1
  242. package/dist/cli/plugins/index.js.map +0 -1
  243. package/dist/cli/plugins/plugin.d.ts.map +0 -1
  244. package/dist/cli/plugins/plugin.js.map +0 -1
  245. package/dist/cli/plugins/stripe.d.ts.map +0 -1
  246. package/dist/cli/plugins/stripe.js.map +0 -1
  247. package/dist/cli/plugins/tempo.d.ts.map +0 -1
  248. package/dist/cli/plugins/tempo.js.map +0 -1
  249. package/dist/cli/sessions/Manager.d.ts.map +0 -1
  250. package/dist/cli/sessions/Manager.js.map +0 -1
  251. package/dist/cli/sessions/commands.d.ts.map +0 -1
  252. package/dist/cli/sessions/commands.js.map +0 -1
  253. package/dist/cli/sessions/request.d.ts.map +0 -1
  254. package/dist/cli/sessions/request.js.map +0 -1
  255. package/dist/cli/sessions/store.d.ts.map +0 -1
  256. package/dist/cli/sessions/store.js.map +0 -1
  257. package/dist/cli/utils.d.ts.map +0 -1
  258. package/dist/cli/utils.js.map +0 -1
  259. package/dist/cli/validate/challenge.d.ts.map +0 -1
  260. package/dist/cli/validate/challenge.js.map +0 -1
  261. package/dist/cli/validate/discovery.d.ts.map +0 -1
  262. package/dist/cli/validate/discovery.js.map +0 -1
  263. package/dist/cli/validate/helpers.d.ts.map +0 -1
  264. package/dist/cli/validate/helpers.js.map +0 -1
  265. package/dist/cli/validate/index.d.ts.map +0 -1
  266. package/dist/cli/validate/index.js.map +0 -1
  267. package/dist/cli/validate/messages.d.ts.map +0 -1
  268. package/dist/cli/validate/messages.js.map +0 -1
  269. package/dist/cli/validate/payment.d.ts.map +0 -1
  270. package/dist/cli/validate/payment.js.map +0 -1
  271. package/dist/client/Methods.d.ts.map +0 -1
  272. package/dist/client/Methods.js.map +0 -1
  273. package/dist/client/Mppx.d.ts.map +0 -1
  274. package/dist/client/Mppx.js.map +0 -1
  275. package/dist/client/Transport.d.ts.map +0 -1
  276. package/dist/client/Transport.js.map +0 -1
  277. package/dist/client/index.d.ts.map +0 -1
  278. package/dist/client/index.js.map +0 -1
  279. package/dist/client/internal/Fetch.d.ts.map +0 -1
  280. package/dist/client/internal/Fetch.js.map +0 -1
  281. package/dist/client/internal/MethodChallenge.d.ts.map +0 -1
  282. package/dist/client/internal/MethodChallenge.js.map +0 -1
  283. package/dist/client/internal/MethodResponse.d.ts.map +0 -1
  284. package/dist/client/internal/MethodResponse.js.map +0 -1
  285. package/dist/client/internal/protocols/Mcp.d.ts.map +0 -1
  286. package/dist/client/internal/protocols/Mcp.js.map +0 -1
  287. package/dist/client/internal/protocols/Mpp.d.ts.map +0 -1
  288. package/dist/client/internal/protocols/Mpp.js.map +0 -1
  289. package/dist/client/internal/protocols/Protocol.d.ts.map +0 -1
  290. package/dist/client/internal/protocols/Protocol.js.map +0 -1
  291. package/dist/client/internal/protocols/Shared.d.ts.map +0 -1
  292. package/dist/client/internal/protocols/Shared.js.map +0 -1
  293. package/dist/client/internal/protocols/X402.d.ts.map +0 -1
  294. package/dist/client/internal/protocols/X402.js.map +0 -1
  295. package/dist/client/node.d.ts.map +0 -1
  296. package/dist/client/node.js.map +0 -1
  297. package/dist/discovery/Discovery.d.ts.map +0 -1
  298. package/dist/discovery/Discovery.js.map +0 -1
  299. package/dist/discovery/OpenApi.d.ts.map +0 -1
  300. package/dist/discovery/OpenApi.js.map +0 -1
  301. package/dist/discovery/Validate.d.ts.map +0 -1
  302. package/dist/discovery/Validate.js.map +0 -1
  303. package/dist/discovery/index.d.ts.map +0 -1
  304. package/dist/discovery/index.js.map +0 -1
  305. package/dist/evm/Assets.d.ts.map +0 -1
  306. package/dist/evm/Assets.js.map +0 -1
  307. package/dist/evm/Chains.d.ts.map +0 -1
  308. package/dist/evm/Chains.js.map +0 -1
  309. package/dist/evm/Methods.d.ts.map +0 -1
  310. package/dist/evm/Methods.js.map +0 -1
  311. package/dist/evm/Types.d.ts.map +0 -1
  312. package/dist/evm/Types.js.map +0 -1
  313. package/dist/evm/client/Charge.d.ts.map +0 -1
  314. package/dist/evm/client/Charge.js.map +0 -1
  315. package/dist/evm/client/Methods.d.ts.map +0 -1
  316. package/dist/evm/client/Methods.js.map +0 -1
  317. package/dist/evm/client/index.d.ts.map +0 -1
  318. package/dist/evm/client/index.js.map +0 -1
  319. package/dist/evm/index.d.ts.map +0 -1
  320. package/dist/evm/index.js.map +0 -1
  321. package/dist/evm/server/Charge.d.ts.map +0 -1
  322. package/dist/evm/server/Charge.js.map +0 -1
  323. package/dist/evm/server/Methods.d.ts.map +0 -1
  324. package/dist/evm/server/Methods.js.map +0 -1
  325. package/dist/evm/server/index.d.ts.map +0 -1
  326. package/dist/evm/server/index.js.map +0 -1
  327. package/dist/index.d.ts.map +0 -1
  328. package/dist/index.js.map +0 -1
  329. package/dist/internal/AcceptPayment.d.ts.map +0 -1
  330. package/dist/internal/AcceptPayment.js.map +0 -1
  331. package/dist/internal/HeaderCodec.d.ts.map +0 -1
  332. package/dist/internal/HeaderCodec.js.map +0 -1
  333. package/dist/internal/constantTimeEqual.d.ts.map +0 -1
  334. package/dist/internal/constantTimeEqual.js.map +0 -1
  335. package/dist/internal/env.d.ts.map +0 -1
  336. package/dist/internal/env.js.map +0 -1
  337. package/dist/internal/types.d.ts.map +0 -1
  338. package/dist/internal/types.js.map +0 -1
  339. package/dist/mcp/client/McpClient.d.ts.map +0 -1
  340. package/dist/mcp/client/McpClient.js.map +0 -1
  341. package/dist/mcp/client/index.d.ts.map +0 -1
  342. package/dist/mcp/client/index.js.map +0 -1
  343. package/dist/mcp/server/Transport.d.ts.map +0 -1
  344. package/dist/mcp/server/Transport.js.map +0 -1
  345. package/dist/mcp/server/index.d.ts.map +0 -1
  346. package/dist/mcp/server/index.js.map +0 -1
  347. package/dist/middlewares/elysia.d.ts.map +0 -1
  348. package/dist/middlewares/elysia.js.map +0 -1
  349. package/dist/middlewares/express.d.ts.map +0 -1
  350. package/dist/middlewares/express.js.map +0 -1
  351. package/dist/middlewares/hono.d.ts.map +0 -1
  352. package/dist/middlewares/hono.js.map +0 -1
  353. package/dist/middlewares/internal/mppx.d.ts.map +0 -1
  354. package/dist/middlewares/internal/mppx.js.map +0 -1
  355. package/dist/middlewares/nextjs.d.ts.map +0 -1
  356. package/dist/middlewares/nextjs.js.map +0 -1
  357. package/dist/proxy/Proxy.d.ts.map +0 -1
  358. package/dist/proxy/Proxy.js.map +0 -1
  359. package/dist/proxy/Service.d.ts.map +0 -1
  360. package/dist/proxy/Service.js.map +0 -1
  361. package/dist/proxy/index.d.ts.map +0 -1
  362. package/dist/proxy/index.js.map +0 -1
  363. package/dist/proxy/internal/Headers.d.ts.map +0 -1
  364. package/dist/proxy/internal/Headers.js.map +0 -1
  365. package/dist/proxy/internal/Route.d.ts.map +0 -1
  366. package/dist/proxy/internal/Route.js.map +0 -1
  367. package/dist/proxy/services/anthropic.d.ts.map +0 -1
  368. package/dist/proxy/services/anthropic.js.map +0 -1
  369. package/dist/proxy/services/openai.d.ts.map +0 -1
  370. package/dist/proxy/services/openai.js.map +0 -1
  371. package/dist/proxy/services/stripe.d.ts.map +0 -1
  372. package/dist/proxy/services/stripe.js.map +0 -1
  373. package/dist/server/Methods.d.ts.map +0 -1
  374. package/dist/server/Methods.js.map +0 -1
  375. package/dist/server/Mppx.d.ts.map +0 -1
  376. package/dist/server/Mppx.js.map +0 -1
  377. package/dist/server/NodeListener.d.ts.map +0 -1
  378. package/dist/server/NodeListener.js.map +0 -1
  379. package/dist/server/Request.d.ts.map +0 -1
  380. package/dist/server/Request.js.map +0 -1
  381. package/dist/server/Response.d.ts.map +0 -1
  382. package/dist/server/Response.js.map +0 -1
  383. package/dist/server/Transport.d.ts.map +0 -1
  384. package/dist/server/Transport.js.map +0 -1
  385. package/dist/server/index.d.ts.map +0 -1
  386. package/dist/server/index.js.map +0 -1
  387. package/dist/server/internal/html/compose.main.gen.d.ts.map +0 -1
  388. package/dist/server/internal/html/compose.main.gen.js.map +0 -1
  389. package/dist/server/internal/html/config.d.ts.map +0 -1
  390. package/dist/server/internal/html/config.js.map +0 -1
  391. package/dist/server/internal/html/constants.d.ts.map +0 -1
  392. package/dist/server/internal/html/constants.js.map +0 -1
  393. package/dist/server/internal/html/serviceWorker.client.d.ts.map +0 -1
  394. package/dist/server/internal/html/serviceWorker.client.js.map +0 -1
  395. package/dist/server/internal/html/serviceWorker.gen.d.ts.map +0 -1
  396. package/dist/server/internal/html/serviceWorker.gen.js.map +0 -1
  397. package/dist/server/internal/scope.d.ts.map +0 -1
  398. package/dist/server/internal/scope.js.map +0 -1
  399. package/dist/stripe/Methods.d.ts.map +0 -1
  400. package/dist/stripe/Methods.js.map +0 -1
  401. package/dist/stripe/client/Charge.d.ts.map +0 -1
  402. package/dist/stripe/client/Charge.js.map +0 -1
  403. package/dist/stripe/client/Methods.d.ts.map +0 -1
  404. package/dist/stripe/client/Methods.js.map +0 -1
  405. package/dist/stripe/client/index.d.ts.map +0 -1
  406. package/dist/stripe/client/index.js.map +0 -1
  407. package/dist/stripe/index.d.ts.map +0 -1
  408. package/dist/stripe/index.js.map +0 -1
  409. package/dist/stripe/internal/constants.d.ts.map +0 -1
  410. package/dist/stripe/internal/constants.js.map +0 -1
  411. package/dist/stripe/internal/types.d.ts.map +0 -1
  412. package/dist/stripe/internal/types.js.map +0 -1
  413. package/dist/stripe/server/Charge.d.ts.map +0 -1
  414. package/dist/stripe/server/Charge.js.map +0 -1
  415. package/dist/stripe/server/Methods.d.ts.map +0 -1
  416. package/dist/stripe/server/Methods.js.map +0 -1
  417. package/dist/stripe/server/index.d.ts.map +0 -1
  418. package/dist/stripe/server/index.js.map +0 -1
  419. package/dist/stripe/server/internal/html/types.d.ts.map +0 -1
  420. package/dist/stripe/server/internal/html/types.js.map +0 -1
  421. package/dist/stripe/server/internal/html.gen.d.ts.map +0 -1
  422. package/dist/stripe/server/internal/html.gen.js.map +0 -1
  423. package/dist/tempo/Attribution.d.ts.map +0 -1
  424. package/dist/tempo/Attribution.js.map +0 -1
  425. package/dist/tempo/Methods.d.ts.map +0 -1
  426. package/dist/tempo/Methods.js.map +0 -1
  427. package/dist/tempo/Proof.d.ts.map +0 -1
  428. package/dist/tempo/Proof.js.map +0 -1
  429. package/dist/tempo/client/Charge.d.ts.map +0 -1
  430. package/dist/tempo/client/Charge.js.map +0 -1
  431. package/dist/tempo/client/Methods.d.ts.map +0 -1
  432. package/dist/tempo/client/Methods.js.map +0 -1
  433. package/dist/tempo/client/ResolveAccount.d.ts.map +0 -1
  434. package/dist/tempo/client/ResolveAccount.js.map +0 -1
  435. package/dist/tempo/client/Subscription.d.ts.map +0 -1
  436. package/dist/tempo/client/Subscription.js.map +0 -1
  437. package/dist/tempo/client/index.d.ts.map +0 -1
  438. package/dist/tempo/client/index.js.map +0 -1
  439. package/dist/tempo/index.d.ts.map +0 -1
  440. package/dist/tempo/index.js.map +0 -1
  441. package/dist/tempo/internal/account.d.ts.map +0 -1
  442. package/dist/tempo/internal/account.js.map +0 -1
  443. package/dist/tempo/internal/address.d.ts.map +0 -1
  444. package/dist/tempo/internal/address.js.map +0 -1
  445. package/dist/tempo/internal/auto-swap.d.ts.map +0 -1
  446. package/dist/tempo/internal/auto-swap.js.map +0 -1
  447. package/dist/tempo/internal/charge.d.ts.map +0 -1
  448. package/dist/tempo/internal/charge.js.map +0 -1
  449. package/dist/tempo/internal/defaults.d.ts.map +0 -1
  450. package/dist/tempo/internal/defaults.js.map +0 -1
  451. package/dist/tempo/internal/fee-payer.d.ts.map +0 -1
  452. package/dist/tempo/internal/fee-payer.js.map +0 -1
  453. package/dist/tempo/internal/fee-token.d.ts.map +0 -1
  454. package/dist/tempo/internal/fee-token.js.map +0 -1
  455. package/dist/tempo/internal/proof.d.ts.map +0 -1
  456. package/dist/tempo/internal/proof.js.map +0 -1
  457. package/dist/tempo/internal/selectors.d.ts.map +0 -1
  458. package/dist/tempo/internal/selectors.js.map +0 -1
  459. package/dist/tempo/internal/types.d.ts.map +0 -1
  460. package/dist/tempo/internal/types.js.map +0 -1
  461. package/dist/tempo/legacy/client/ChannelOps.d.ts.map +0 -1
  462. package/dist/tempo/legacy/client/ChannelOps.js.map +0 -1
  463. package/dist/tempo/legacy/client/Session.d.ts.map +0 -1
  464. package/dist/tempo/legacy/client/Session.js.map +0 -1
  465. package/dist/tempo/legacy/client/SessionManager.d.ts.map +0 -1
  466. package/dist/tempo/legacy/client/SessionManager.js.map +0 -1
  467. package/dist/tempo/legacy/client/index.d.ts.map +0 -1
  468. package/dist/tempo/legacy/client/index.js.map +0 -1
  469. package/dist/tempo/legacy/index.d.ts.map +0 -1
  470. package/dist/tempo/legacy/index.js.map +0 -1
  471. package/dist/tempo/legacy/server/Session.d.ts +0 -208
  472. package/dist/tempo/legacy/server/Session.d.ts.map +0 -1
  473. package/dist/tempo/legacy/server/Session.js +0 -698
  474. package/dist/tempo/legacy/server/Session.js.map +0 -1
  475. package/dist/tempo/legacy/server/index.d.ts +0 -5
  476. package/dist/tempo/legacy/server/index.d.ts.map +0 -1
  477. package/dist/tempo/legacy/server/index.js +0 -5
  478. package/dist/tempo/legacy/server/index.js.map +0 -1
  479. package/dist/tempo/legacy/session/Chain.d.ts.map +0 -1
  480. package/dist/tempo/legacy/session/Chain.js.map +0 -1
  481. package/dist/tempo/legacy/session/Channel.d.ts.map +0 -1
  482. package/dist/tempo/legacy/session/Channel.js.map +0 -1
  483. package/dist/tempo/legacy/session/ChannelStore.d.ts +0 -22
  484. package/dist/tempo/legacy/session/ChannelStore.d.ts.map +0 -1
  485. package/dist/tempo/legacy/session/ChannelStore.js +0 -6
  486. package/dist/tempo/legacy/session/ChannelStore.js.map +0 -1
  487. package/dist/tempo/legacy/session/Types.d.ts.map +0 -1
  488. package/dist/tempo/legacy/session/Types.js.map +0 -1
  489. package/dist/tempo/legacy/session/Voucher.d.ts.map +0 -1
  490. package/dist/tempo/legacy/session/Voucher.js.map +0 -1
  491. package/dist/tempo/legacy/session/escrow.abi.d.ts.map +0 -1
  492. package/dist/tempo/legacy/session/escrow.abi.js.map +0 -1
  493. package/dist/tempo/legacy/session/index.d.ts.map +0 -1
  494. package/dist/tempo/legacy/session/index.js.map +0 -1
  495. package/dist/tempo/server/Charge.d.ts.map +0 -1
  496. package/dist/tempo/server/Charge.js.map +0 -1
  497. package/dist/tempo/server/Methods.d.ts.map +0 -1
  498. package/dist/tempo/server/Methods.js.map +0 -1
  499. package/dist/tempo/server/Relay.d.ts.map +0 -1
  500. package/dist/tempo/server/Relay.js.map +0 -1
  501. package/dist/tempo/server/SponsorBudget.d.ts.map +0 -1
  502. package/dist/tempo/server/SponsorBudget.js.map +0 -1
  503. package/dist/tempo/server/Subscription.d.ts.map +0 -1
  504. package/dist/tempo/server/Subscription.js.map +0 -1
  505. package/dist/tempo/server/index.d.ts.map +0 -1
  506. package/dist/tempo/server/index.js.map +0 -1
  507. package/dist/tempo/server/internal/html.gen.d.ts.map +0 -1
  508. package/dist/tempo/server/internal/html.gen.js.map +0 -1
  509. package/dist/tempo/server/internal/request-body.d.ts.map +0 -1
  510. package/dist/tempo/server/internal/request-body.js.map +0 -1
  511. package/dist/tempo/server/internal/transport.d.ts.map +0 -1
  512. package/dist/tempo/server/internal/transport.js.map +0 -1
  513. package/dist/tempo/session/Snapshot.d.ts.map +0 -1
  514. package/dist/tempo/session/Snapshot.js.map +0 -1
  515. package/dist/tempo/session/client/ChannelOps.d.ts.map +0 -1
  516. package/dist/tempo/session/client/ChannelOps.js.map +0 -1
  517. package/dist/tempo/session/client/ChannelStore.d.ts.map +0 -1
  518. package/dist/tempo/session/client/ChannelStore.js.map +0 -1
  519. package/dist/tempo/session/client/CredentialState.d.ts.map +0 -1
  520. package/dist/tempo/session/client/CredentialState.js.map +0 -1
  521. package/dist/tempo/session/client/ReceiptCoordinator.d.ts.map +0 -1
  522. package/dist/tempo/session/client/ReceiptCoordinator.js.map +0 -1
  523. package/dist/tempo/session/client/Runtime.d.ts.map +0 -1
  524. package/dist/tempo/session/client/Runtime.js.map +0 -1
  525. package/dist/tempo/session/client/Session.d.ts.map +0 -1
  526. package/dist/tempo/session/client/Session.js.map +0 -1
  527. package/dist/tempo/session/client/SessionManager.d.ts.map +0 -1
  528. package/dist/tempo/session/client/SessionManager.js.map +0 -1
  529. package/dist/tempo/session/client/Transports.d.ts.map +0 -1
  530. package/dist/tempo/session/client/Transports.js.map +0 -1
  531. package/dist/tempo/session/client/index.d.ts.map +0 -1
  532. package/dist/tempo/session/client/index.js.map +0 -1
  533. package/dist/tempo/session/client/internal/SessionManager.d.ts.map +0 -1
  534. package/dist/tempo/session/client/internal/SessionManager.js.map +0 -1
  535. package/dist/tempo/session/index.d.ts.map +0 -1
  536. package/dist/tempo/session/index.js.map +0 -1
  537. package/dist/tempo/session/precompile/Chain.d.ts.map +0 -1
  538. package/dist/tempo/session/precompile/Chain.js.map +0 -1
  539. package/dist/tempo/session/precompile/Channel.d.ts.map +0 -1
  540. package/dist/tempo/session/precompile/Channel.js.map +0 -1
  541. package/dist/tempo/session/precompile/Protocol.d.ts.map +0 -1
  542. package/dist/tempo/session/precompile/Protocol.js.map +0 -1
  543. package/dist/tempo/session/precompile/Voucher.d.ts.map +0 -1
  544. package/dist/tempo/session/precompile/Voucher.js.map +0 -1
  545. package/dist/tempo/session/precompile/escrow.abi.d.ts.map +0 -1
  546. package/dist/tempo/session/precompile/escrow.abi.js.map +0 -1
  547. package/dist/tempo/session/precompile/index.d.ts.map +0 -1
  548. package/dist/tempo/session/precompile/index.js.map +0 -1
  549. package/dist/tempo/session/server/ChannelOps.d.ts.map +0 -1
  550. package/dist/tempo/session/server/ChannelOps.js.map +0 -1
  551. package/dist/tempo/session/server/ChannelStore.d.ts.map +0 -1
  552. package/dist/tempo/session/server/ChannelStore.js.map +0 -1
  553. package/dist/tempo/session/server/CredentialVerification.d.ts.map +0 -1
  554. package/dist/tempo/session/server/CredentialVerification.js.map +0 -1
  555. package/dist/tempo/session/server/MeteredStream.d.ts.map +0 -1
  556. package/dist/tempo/session/server/MeteredStream.js.map +0 -1
  557. package/dist/tempo/session/server/RequestState.d.ts.map +0 -1
  558. package/dist/tempo/session/server/RequestState.js.map +0 -1
  559. package/dist/tempo/session/server/Session.d.ts.map +0 -1
  560. package/dist/tempo/session/server/Session.js.map +0 -1
  561. package/dist/tempo/session/server/Settlement.d.ts.map +0 -1
  562. package/dist/tempo/session/server/Settlement.js.map +0 -1
  563. package/dist/tempo/session/server/Sse.d.ts.map +0 -1
  564. package/dist/tempo/session/server/Sse.js.map +0 -1
  565. package/dist/tempo/session/server/Transports.d.ts.map +0 -1
  566. package/dist/tempo/session/server/Transports.js.map +0 -1
  567. package/dist/tempo/session/server/Ws.d.ts.map +0 -1
  568. package/dist/tempo/session/server/Ws.js.map +0 -1
  569. package/dist/tempo/session/server/index.d.ts.map +0 -1
  570. package/dist/tempo/session/server/index.js.map +0 -1
  571. package/dist/tempo/subscription/KeyAuthorization.d.ts.map +0 -1
  572. package/dist/tempo/subscription/KeyAuthorization.js.map +0 -1
  573. package/dist/tempo/subscription/Receipt.d.ts.map +0 -1
  574. package/dist/tempo/subscription/Receipt.js.map +0 -1
  575. package/dist/tempo/subscription/Store.d.ts.map +0 -1
  576. package/dist/tempo/subscription/Store.js.map +0 -1
  577. package/dist/tempo/subscription/Types.d.ts.map +0 -1
  578. package/dist/tempo/subscription/Types.js.map +0 -1
  579. package/dist/tempo/subscription/index.d.ts.map +0 -1
  580. package/dist/tempo/subscription/index.js.map +0 -1
  581. package/dist/validation/core.d.ts.map +0 -1
  582. package/dist/validation/core.js.map +0 -1
  583. package/dist/validation/index.d.ts.map +0 -1
  584. package/dist/validation/index.js.map +0 -1
  585. package/dist/viem/Account.d.ts.map +0 -1
  586. package/dist/viem/Account.js.map +0 -1
  587. package/dist/viem/Client.d.ts.map +0 -1
  588. package/dist/viem/Client.js.map +0 -1
  589. package/dist/x402/Assets.d.ts.map +0 -1
  590. package/dist/x402/Assets.js.map +0 -1
  591. package/dist/x402/Header.d.ts.map +0 -1
  592. package/dist/x402/Header.js.map +0 -1
  593. package/dist/x402/Types.d.ts.map +0 -1
  594. package/dist/x402/Types.js.map +0 -1
  595. package/dist/x402/client/Exact.d.ts.map +0 -1
  596. package/dist/x402/client/Exact.js.map +0 -1
  597. package/dist/x402/index.d.ts.map +0 -1
  598. package/dist/x402/index.js.map +0 -1
  599. package/dist/x402/internal/ChallengeBrand.d.ts.map +0 -1
  600. package/dist/x402/internal/ChallengeBrand.js.map +0 -1
  601. package/dist/x402/internal/RouteBinding.d.ts.map +0 -1
  602. package/dist/x402/internal/RouteBinding.js.map +0 -1
  603. package/dist/x402/server/EvmCharge.d.ts.map +0 -1
  604. package/dist/x402/server/EvmCharge.js.map +0 -1
  605. package/dist/x402/server/Facilitator.d.ts.map +0 -1
  606. package/dist/x402/server/Facilitator.js.map +0 -1
  607. package/dist/zod.d.ts.map +0 -1
  608. package/dist/zod.js.map +0 -1
  609. package/src/BodyDigest.test.ts +0 -43
  610. package/src/BodyDigest.ts +0 -55
  611. package/src/Challenge.fuzz.test.ts +0 -121
  612. package/src/Challenge.test-d.ts +0 -82
  613. package/src/Challenge.test.ts +0 -995
  614. package/src/Challenge.ts +0 -683
  615. package/src/Constants.ts +0 -58
  616. package/src/Credential.fuzz.test.ts +0 -62
  617. package/src/Credential.test.ts +0 -378
  618. package/src/Credential.ts +0 -217
  619. package/src/Errors.test.ts +0 -520
  620. package/src/Errors.ts +0 -448
  621. package/src/Expires.test.ts +0 -112
  622. package/src/Expires.ts +0 -59
  623. package/src/Html.ts +0 -67
  624. package/src/Mcp.ts +0 -85
  625. package/src/Method.test.ts +0 -177
  626. package/src/Method.ts +0 -617
  627. package/src/PaymentRequest.test.ts +0 -147
  628. package/src/PaymentRequest.ts +0 -108
  629. package/src/Receipt.test.ts +0 -151
  630. package/src/Receipt.ts +0 -146
  631. package/src/Store.test-d.ts +0 -195
  632. package/src/Store.test.ts +0 -357
  633. package/src/Store.ts +0 -329
  634. package/src/bin.ts +0 -4
  635. package/src/cli/account.ts +0 -269
  636. package/src/cli/cli.test.ts +0 -2221
  637. package/src/cli/cli.ts +0 -1649
  638. package/src/cli/config.test.ts +0 -89
  639. package/src/cli/config.ts +0 -50
  640. package/src/cli/internal.ts +0 -114
  641. package/src/cli/mcp.test.ts +0 -262
  642. package/src/cli/plugins/evm.ts +0 -55
  643. package/src/cli/plugins/index.ts +0 -4
  644. package/src/cli/plugins/plugin.ts +0 -84
  645. package/src/cli/plugins/stripe.ts +0 -174
  646. package/src/cli/plugins/tempo.ts +0 -1102
  647. package/src/cli/sessions/Manager.test.ts +0 -249
  648. package/src/cli/sessions/Manager.ts +0 -93
  649. package/src/cli/sessions/commands.ts +0 -444
  650. package/src/cli/sessions/request.test.ts +0 -51
  651. package/src/cli/sessions/request.ts +0 -353
  652. package/src/cli/sessions/store.test.ts +0 -581
  653. package/src/cli/sessions/store.ts +0 -940
  654. package/src/cli/utils.test.ts +0 -156
  655. package/src/cli/utils.ts +0 -394
  656. package/src/cli/validate/challenge.ts +0 -565
  657. package/src/cli/validate/discovery.test.ts +0 -435
  658. package/src/cli/validate/discovery.ts +0 -221
  659. package/src/cli/validate/helpers.ts +0 -166
  660. package/src/cli/validate/index.ts +0 -229
  661. package/src/cli/validate/messages.ts +0 -7
  662. package/src/cli/validate/payment.ts +0 -774
  663. package/src/cli/validate.test.ts +0 -843
  664. package/src/client/Methods.ts +0 -8
  665. package/src/client/Mppx.test-d.ts +0 -270
  666. package/src/client/Mppx.test.ts +0 -1065
  667. package/src/client/Mppx.ts +0 -466
  668. package/src/client/Transport.test.ts +0 -619
  669. package/src/client/Transport.ts +0 -191
  670. package/src/client/index.ts +0 -29
  671. package/src/client/internal/Fetch.browser.test.ts +0 -197
  672. package/src/client/internal/Fetch.test-d.ts +0 -109
  673. package/src/client/internal/Fetch.test.ts +0 -2336
  674. package/src/client/internal/Fetch.ts +0 -1079
  675. package/src/client/internal/MethodChallenge.ts +0 -35
  676. package/src/client/internal/MethodResponse.ts +0 -67
  677. package/src/client/internal/protocols/Mcp.test.ts +0 -220
  678. package/src/client/internal/protocols/Mcp.ts +0 -186
  679. package/src/client/internal/protocols/Mpp.ts +0 -21
  680. package/src/client/internal/protocols/Protocol.ts +0 -10
  681. package/src/client/internal/protocols/Shared.ts +0 -25
  682. package/src/client/internal/protocols/X402.ts +0 -46
  683. package/src/client/node.test.ts +0 -115
  684. package/src/client/node.ts +0 -247
  685. package/src/discovery/Discovery.test.ts +0 -214
  686. package/src/discovery/Discovery.ts +0 -105
  687. package/src/discovery/OpenApi.test.ts +0 -453
  688. package/src/discovery/OpenApi.ts +0 -224
  689. package/src/discovery/Validate.test.ts +0 -305
  690. package/src/discovery/Validate.ts +0 -77
  691. package/src/discovery/index.ts +0 -3
  692. package/src/env.d.ts +0 -12
  693. package/src/evm/Assets.ts +0 -1
  694. package/src/evm/Chains.ts +0 -11
  695. package/src/evm/Methods.ts +0 -44
  696. package/src/evm/PublicInterface.test-d.ts +0 -134
  697. package/src/evm/Types.ts +0 -140
  698. package/src/evm/client/Charge.test.ts +0 -347
  699. package/src/evm/client/Charge.ts +0 -187
  700. package/src/evm/client/Methods.ts +0 -19
  701. package/src/evm/client/index.ts +0 -6
  702. package/src/evm/index.ts +0 -16
  703. package/src/evm/server/Charge.test.ts +0 -339
  704. package/src/evm/server/Charge.ts +0 -290
  705. package/src/evm/server/Methods.ts +0 -22
  706. package/src/evm/server/index.ts +0 -6
  707. package/src/index.ts +0 -14
  708. package/src/internal/AcceptPayment.test.ts +0 -343
  709. package/src/internal/AcceptPayment.ts +0 -366
  710. package/src/internal/HeaderCodec.ts +0 -36
  711. package/src/internal/changeset.test.ts +0 -106
  712. package/src/internal/constantTimeEqual.test.ts +0 -47
  713. package/src/internal/constantTimeEqual.ts +0 -10
  714. package/src/internal/env.test.ts +0 -42
  715. package/src/internal/env.ts +0 -49
  716. package/src/internal/types.test-d.ts +0 -21
  717. package/src/internal/types.ts +0 -470
  718. package/src/mcp/client/McpClient.integration.test.ts +0 -652
  719. package/src/mcp/client/McpClient.test-d.ts +0 -144
  720. package/src/mcp/client/McpClient.test.ts +0 -463
  721. package/src/mcp/client/McpClient.ts +0 -307
  722. package/src/mcp/client/McpClient.unit.test.ts +0 -135
  723. package/src/mcp/client/index.ts +0 -2
  724. package/src/mcp/server/Transport.test.ts +0 -191
  725. package/src/mcp/server/Transport.ts +0 -111
  726. package/src/mcp/server/index.ts +0 -1
  727. package/src/middlewares/elysia.test.ts +0 -295
  728. package/src/middlewares/elysia.ts +0 -116
  729. package/src/middlewares/express.test.ts +0 -371
  730. package/src/middlewares/express.ts +0 -140
  731. package/src/middlewares/hono.test.ts +0 -476
  732. package/src/middlewares/hono.ts +0 -153
  733. package/src/middlewares/internal/mppx.test.ts +0 -177
  734. package/src/middlewares/internal/mppx.ts +0 -67
  735. package/src/middlewares/nextjs.test.ts +0 -369
  736. package/src/middlewares/nextjs.ts +0 -107
  737. package/src/proxy/Proxy.test.ts +0 -1031
  738. package/src/proxy/Proxy.ts +0 -345
  739. package/src/proxy/Service.test.ts +0 -182
  740. package/src/proxy/Service.ts +0 -253
  741. package/src/proxy/index.ts +0 -6
  742. package/src/proxy/internal/Headers.test.ts +0 -139
  743. package/src/proxy/internal/Headers.ts +0 -66
  744. package/src/proxy/internal/Route.test.ts +0 -217
  745. package/src/proxy/internal/Route.ts +0 -64
  746. package/src/proxy/services/anthropic.test.ts +0 -132
  747. package/src/proxy/services/anthropic.ts +0 -52
  748. package/src/proxy/services/openai.test.ts +0 -157
  749. package/src/proxy/services/openai.ts +0 -59
  750. package/src/proxy/services/stripe.test.ts +0 -175
  751. package/src/proxy/services/stripe.ts +0 -58
  752. package/src/server/Methods.ts +0 -3
  753. package/src/server/Mppx.authorize.test.ts +0 -210
  754. package/src/server/Mppx.test-d.ts +0 -360
  755. package/src/server/Mppx.test.ts +0 -5813
  756. package/src/server/Mppx.ts +0 -2623
  757. package/src/server/NodeListener.test.ts +0 -293
  758. package/src/server/NodeListener.ts +0 -45
  759. package/src/server/Request.test.ts +0 -255
  760. package/src/server/Request.ts +0 -155
  761. package/src/server/Response.test.ts +0 -32
  762. package/src/server/Response.ts +0 -45
  763. package/src/server/Transport.test.ts +0 -598
  764. package/src/server/Transport.ts +0 -320
  765. package/src/server/index.ts +0 -9
  766. package/src/server/internal/html/compose.main.gen.ts +0 -2
  767. package/src/server/internal/html/compose.main.ts +0 -88
  768. package/src/server/internal/html/config.ts +0 -672
  769. package/src/server/internal/html/constants.ts +0 -28
  770. package/src/server/internal/html/serviceWorker.client.ts +0 -28
  771. package/src/server/internal/html/serviceWorker.gen.ts +0 -2
  772. package/src/server/internal/html/serviceWorker.ts +0 -27
  773. package/src/server/internal/html/tsconfig.compose.json +0 -8
  774. package/src/server/internal/html/tsconfig.worker.client.json +0 -8
  775. package/src/server/internal/html/tsconfig.worker.json +0 -8
  776. package/src/server/internal/scope.ts +0 -43
  777. package/src/stripe/Charge.integration.test.ts +0 -329
  778. package/src/stripe/Methods.test.ts +0 -62
  779. package/src/stripe/Methods.ts +0 -44
  780. package/src/stripe/client/Charge.test.ts +0 -205
  781. package/src/stripe/client/Charge.ts +0 -132
  782. package/src/stripe/client/Methods.ts +0 -37
  783. package/src/stripe/client/index.ts +0 -2
  784. package/src/stripe/index.ts +0 -1
  785. package/src/stripe/internal/constants.ts +0 -7
  786. package/src/stripe/internal/types.ts +0 -46
  787. package/src/stripe/server/Charge.test-d.ts +0 -66
  788. package/src/stripe/server/Charge.test.ts +0 -621
  789. package/src/stripe/server/Charge.ts +0 -434
  790. package/src/stripe/server/Methods.ts +0 -24
  791. package/src/stripe/server/index.ts +0 -2
  792. package/src/stripe/server/internal/html/main.ts +0 -165
  793. package/src/stripe/server/internal/html/node_modules/.bin/mppx +0 -22
  794. package/src/stripe/server/internal/html/node_modules/.bin/mppx.src +0 -22
  795. package/src/stripe/server/internal/html/package.json +0 -9
  796. package/src/stripe/server/internal/html/stripe-js-pure.d.ts +0 -7
  797. package/src/stripe/server/internal/html/tsconfig.json +0 -8
  798. package/src/stripe/server/internal/html/types.ts +0 -5
  799. package/src/stripe/server/internal/html.gen.ts +0 -2
  800. package/src/tempo/AccessKeyAuthorization.test.ts +0 -141
  801. package/src/tempo/Attribution.test.ts +0 -294
  802. package/src/tempo/Attribution.ts +0 -185
  803. package/src/tempo/Methods.test.ts +0 -425
  804. package/src/tempo/Methods.ts +0 -367
  805. package/src/tempo/Proof.conformance.test.ts +0 -146
  806. package/src/tempo/Proof.test-d.ts +0 -32
  807. package/src/tempo/Proof.test.ts +0 -40
  808. package/src/tempo/Proof.ts +0 -69
  809. package/src/tempo/PublicExports.test-d.ts +0 -130
  810. package/src/tempo/Subscription.integration.test.ts +0 -591
  811. package/src/tempo/client/Charge.test.ts +0 -501
  812. package/src/tempo/client/Charge.ts +0 -289
  813. package/src/tempo/client/Methods.ts +0 -45
  814. package/src/tempo/client/ResolveAccount.ts +0 -46
  815. package/src/tempo/client/Subscription.test.ts +0 -180
  816. package/src/tempo/client/Subscription.ts +0 -156
  817. package/src/tempo/client/index.ts +0 -17
  818. package/src/tempo/index.ts +0 -5
  819. package/src/tempo/internal/account.ts +0 -56
  820. package/src/tempo/internal/address.ts +0 -6
  821. package/src/tempo/internal/auto-swap.test.ts +0 -198
  822. package/src/tempo/internal/auto-swap.ts +0 -188
  823. package/src/tempo/internal/charge.test.ts +0 -66
  824. package/src/tempo/internal/charge.ts +0 -43
  825. package/src/tempo/internal/defaults.test.ts +0 -95
  826. package/src/tempo/internal/defaults.ts +0 -53
  827. package/src/tempo/internal/fee-payer.test.ts +0 -1177
  828. package/src/tempo/internal/fee-payer.ts +0 -808
  829. package/src/tempo/internal/fee-token.test.ts +0 -165
  830. package/src/tempo/internal/fee-token.ts +0 -72
  831. package/src/tempo/internal/proof.test.ts +0 -97
  832. package/src/tempo/internal/proof.ts +0 -87
  833. package/src/tempo/internal/selectors.ts +0 -10
  834. package/src/tempo/internal/types.ts +0 -19
  835. package/src/tempo/legacy/AccessKeyAuthorization.test.ts +0 -162
  836. package/src/tempo/legacy/README.md +0 -9
  837. package/src/tempo/legacy/client/ChannelOps.test.ts +0 -379
  838. package/src/tempo/legacy/client/ChannelOps.ts +0 -271
  839. package/src/tempo/legacy/client/Session.test.ts +0 -800
  840. package/src/tempo/legacy/client/Session.ts +0 -397
  841. package/src/tempo/legacy/client/SessionManager.test.ts +0 -468
  842. package/src/tempo/legacy/client/SessionManager.ts +0 -909
  843. package/src/tempo/legacy/client/index.ts +0 -6
  844. package/src/tempo/legacy/index.ts +0 -6
  845. package/src/tempo/legacy/server/Defaults.test-d.ts +0 -9
  846. package/src/tempo/legacy/server/Session.test.ts +0 -6370
  847. package/src/tempo/legacy/server/Session.ts +0 -1024
  848. package/src/tempo/legacy/server/index.ts +0 -4
  849. package/src/tempo/legacy/session/Chain.test.ts +0 -1349
  850. package/src/tempo/legacy/session/Chain.ts +0 -830
  851. package/src/tempo/legacy/session/Channel.test.ts +0 -109
  852. package/src/tempo/legacy/session/Channel.ts +0 -51
  853. package/src/tempo/legacy/session/ChannelStore.test.ts +0 -58
  854. package/src/tempo/legacy/session/ChannelStore.ts +0 -39
  855. package/src/tempo/legacy/session/Types.ts +0 -91
  856. package/src/tempo/legacy/session/Voucher.test.ts +0 -410
  857. package/src/tempo/legacy/session/Voucher.ts +0 -183
  858. package/src/tempo/legacy/session/escrow.abi.ts +0 -760
  859. package/src/tempo/legacy/session/index.ts +0 -8
  860. package/src/tempo/server/AtomicStore.test-d.ts +0 -50
  861. package/src/tempo/server/Charge.test.ts +0 -6121
  862. package/src/tempo/server/Charge.ts +0 -1351
  863. package/src/tempo/server/Methods.ts +0 -106
  864. package/src/tempo/server/Relay.test.ts +0 -677
  865. package/src/tempo/server/Relay.ts +0 -297
  866. package/src/tempo/server/SponsorBudget.test.ts +0 -154
  867. package/src/tempo/server/SponsorBudget.ts +0 -219
  868. package/src/tempo/server/Sse.test.ts +0 -321
  869. package/src/tempo/server/Subscription.test.ts +0 -1944
  870. package/src/tempo/server/Subscription.ts +0 -1333
  871. package/src/tempo/server/index.ts +0 -12
  872. package/src/tempo/server/internal/html/main.ts +0 -115
  873. package/src/tempo/server/internal/html/node_modules/.bin/mppx +0 -22
  874. package/src/tempo/server/internal/html/node_modules/.bin/mppx.src +0 -22
  875. package/src/tempo/server/internal/html/package.json +0 -10
  876. package/src/tempo/server/internal/html/tsconfig.json +0 -8
  877. package/src/tempo/server/internal/html.gen.ts +0 -2
  878. package/src/tempo/server/internal/request-body.test.ts +0 -210
  879. package/src/tempo/server/internal/request-body.ts +0 -61
  880. package/src/tempo/server/internal/transport.test.ts +0 -903
  881. package/src/tempo/server/internal/transport.ts +0 -310
  882. package/src/tempo/session/README.md +0 -208
  883. package/src/tempo/session/Snapshot.test.ts +0 -41
  884. package/src/tempo/session/Snapshot.ts +0 -95
  885. package/src/tempo/session/client/ChannelOps.test.ts +0 -218
  886. package/src/tempo/session/client/ChannelOps.ts +0 -348
  887. package/src/tempo/session/client/ChannelStore.ts +0 -111
  888. package/src/tempo/session/client/CredentialState.test.ts +0 -789
  889. package/src/tempo/session/client/CredentialState.ts +0 -942
  890. package/src/tempo/session/client/ReceiptCoordinator.ts +0 -95
  891. package/src/tempo/session/client/Runtime.test.ts +0 -1104
  892. package/src/tempo/session/client/Runtime.ts +0 -1008
  893. package/src/tempo/session/client/Session.test.ts +0 -1355
  894. package/src/tempo/session/client/Session.ts +0 -420
  895. package/src/tempo/session/client/SessionManager.test.ts +0 -1899
  896. package/src/tempo/session/client/SessionManager.ts +0 -996
  897. package/src/tempo/session/client/Transports.test.ts +0 -1141
  898. package/src/tempo/session/client/Transports.ts +0 -1534
  899. package/src/tempo/session/client/index.ts +0 -40
  900. package/src/tempo/session/client/internal/SessionManager.ts +0 -36
  901. package/src/tempo/session/index.ts +0 -7
  902. package/src/tempo/session/precompile/Chain.integration.test.ts +0 -339
  903. package/src/tempo/session/precompile/Chain.test.ts +0 -1641
  904. package/src/tempo/session/precompile/Chain.ts +0 -1149
  905. package/src/tempo/session/precompile/Channel.test.ts +0 -147
  906. package/src/tempo/session/precompile/Channel.ts +0 -108
  907. package/src/tempo/session/precompile/Protocol.test.ts +0 -358
  908. package/src/tempo/session/precompile/Protocol.ts +0 -520
  909. package/src/tempo/session/precompile/Voucher.test.ts +0 -354
  910. package/src/tempo/session/precompile/Voucher.ts +0 -162
  911. package/src/tempo/session/precompile/escrow.abi.ts +0 -226
  912. package/src/tempo/session/precompile/index.ts +0 -33
  913. package/src/tempo/session/server/ChannelOps.test.ts +0 -129
  914. package/src/tempo/session/server/ChannelOps.ts +0 -157
  915. package/src/tempo/session/server/ChannelStore.test.ts +0 -1093
  916. package/src/tempo/session/server/ChannelStore.ts +0 -835
  917. package/src/tempo/session/server/CredentialVerification.test.ts +0 -299
  918. package/src/tempo/session/server/CredentialVerification.ts +0 -775
  919. package/src/tempo/session/server/MeteredStream.ts +0 -95
  920. package/src/tempo/session/server/RequestState.test.ts +0 -574
  921. package/src/tempo/session/server/RequestState.ts +0 -507
  922. package/src/tempo/session/server/Session.integration.test.ts +0 -449
  923. package/src/tempo/session/server/Session.test.ts +0 -3862
  924. package/src/tempo/session/server/Session.ts +0 -570
  925. package/src/tempo/session/server/Settlement.test.ts +0 -345
  926. package/src/tempo/session/server/Settlement.ts +0 -527
  927. package/src/tempo/session/server/Sse.fuzz.test.ts +0 -138
  928. package/src/tempo/session/server/Sse.test.ts +0 -557
  929. package/src/tempo/session/server/Sse.ts +0 -254
  930. package/src/tempo/session/server/Transports.test.ts +0 -346
  931. package/src/tempo/session/server/Transports.ts +0 -255
  932. package/src/tempo/session/server/Ws.test.ts +0 -594
  933. package/src/tempo/session/server/Ws.ts +0 -385
  934. package/src/tempo/session/server/index.ts +0 -12
  935. package/src/tempo/subscription/KeyAuthorization.test.ts +0 -282
  936. package/src/tempo/subscription/KeyAuthorization.ts +0 -396
  937. package/src/tempo/subscription/Receipt.ts +0 -28
  938. package/src/tempo/subscription/Store.test.ts +0 -609
  939. package/src/tempo/subscription/Store.ts +0 -449
  940. package/src/tempo/subscription/Types.ts +0 -68
  941. package/src/tempo/subscription/index.ts +0 -23
  942. package/src/tsconfig.json +0 -10
  943. package/src/validation/core.ts +0 -386
  944. package/src/validation/index.ts +0 -11
  945. package/src/viem/Account.test.ts +0 -72
  946. package/src/viem/Account.ts +0 -30
  947. package/src/viem/Client.test.ts +0 -366
  948. package/src/viem/Client.ts +0 -93
  949. package/src/x402/Assets.test.ts +0 -253
  950. package/src/x402/Assets.ts +0 -221
  951. package/src/x402/Exact.e2e.test.ts +0 -448
  952. package/src/x402/Exact.localnet.test.ts +0 -475
  953. package/src/x402/Header.test.ts +0 -73
  954. package/src/x402/Header.ts +0 -79
  955. package/src/x402/PublicInterface.test-d.ts +0 -39
  956. package/src/x402/Types.ts +0 -248
  957. package/src/x402/client/Exact.test.ts +0 -309
  958. package/src/x402/client/Exact.ts +0 -186
  959. package/src/x402/index.ts +0 -6
  960. package/src/x402/internal/ChallengeBrand.ts +0 -14
  961. package/src/x402/internal/RouteBinding.ts +0 -18
  962. package/src/x402/server/EvmCharge.ts +0 -394
  963. package/src/x402/server/Facilitator.test.ts +0 -111
  964. package/src/x402/server/Facilitator.ts +0 -56
  965. package/src/zod.test.ts +0 -169
  966. package/src/zod.ts +0 -71
package/src/cli/cli.ts DELETED
@@ -1,1649 +0,0 @@
1
- import * as fs from 'node:fs'
2
- import { createRequire } from 'node:module'
3
- import * as path from 'node:path'
4
-
5
- import { Cli, Errors, z } from 'incur'
6
- import { Base64 } from 'ox'
7
- import { type Address, createClient, http } from 'viem'
8
- import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts'
9
- import { tempo as tempoMainnet } from 'viem/tempo/chains'
10
-
11
- import * as Challenge from '../Challenge.js'
12
- import { normalizeHeaders } from '../client/internal/Fetch.js'
13
- import * as Mppx from '../client/Mppx.js'
14
- import * as Constants from '../Constants.js'
15
- import { validate as validateDiscovery } from '../discovery/Validate.js'
16
- import { isTempoSessionChallenge } from '../tempo/session/client/Transports.js'
17
- import { createDefaultStore, createKeychain, resolveAccountName } from './account.js'
18
- import { loadConfig, resolveAcceptPayment, selectChallenge } from './internal.js'
19
- import type { Plugin } from './plugins/plugin.js'
20
- import {
21
- orderTempoChargeChallengesByBalance,
22
- readTempoKeystore,
23
- resolveTempoAccount,
24
- } from './plugins/tempo.js'
25
- import sessions, { sessionCommandError } from './sessions/commands.js'
26
- import { runPersistentSessionRequest } from './sessions/request.js'
27
- import { createSessionRegistry } from './sessions/store.js'
28
- import {
29
- chainName,
30
- confirm,
31
- decodeMemo,
32
- fetchBalanceLines,
33
- fmtBalance,
34
- fmtChallengeValue,
35
- fmtRequestValue,
36
- isTempoAccount,
37
- link,
38
- parseMethodOpts,
39
- pc,
40
- printRequestHeaders,
41
- printResponseHeaders,
42
- prompt,
43
- resolveChain,
44
- resolveFundingNetwork,
45
- resolveRpcUrl,
46
- } from './utils.js'
47
- import validate from './validate/index.js'
48
-
49
- const packageJson = createRequire(import.meta.url)('../../package.json') as {
50
- name: string
51
- version: string
52
- }
53
-
54
- const accountSummarySchema = z.object({
55
- address: z.string(),
56
- isDefault: z.boolean().optional(),
57
- name: z.string(),
58
- source: z.string().optional(),
59
- })
60
-
61
- const accountViewSchema = z.object({
62
- address: z.string(),
63
- balances: z.array(z.string()).optional(),
64
- name: z.string(),
65
- type: z.string().optional(),
66
- })
67
-
68
- const discoveryIssueSchema = z.object({
69
- message: z.string(),
70
- path: z.string(),
71
- severity: z.string(),
72
- })
73
-
74
- const serviceSummarySchema = z.object({
75
- description: z.string().optional(),
76
- id: z.string(),
77
- name: z.string().optional(),
78
- paidEndpoints: z.number(),
79
- status: z.string().optional(),
80
- url: z.string().optional(),
81
- })
82
-
83
- const serviceEndpointSchema = z.object({
84
- description: z.string().optional(),
85
- method: z.string(),
86
- path: z.string(),
87
- payment: z.unknown().optional(),
88
- })
89
-
90
- const servicesRegistryUrl = 'https://mpp.dev/api/services'
91
-
92
- function shouldReturnStructured(c: { format: string; formatExplicit: boolean }) {
93
- return c.format === 'json' && c.formatExplicit
94
- }
95
-
96
- function outputResult<Data>(
97
- c: { format: string; formatExplicit: boolean; ok: (data: Data) => never },
98
- data: Data,
99
- print: () => void,
100
- ): Data {
101
- if (shouldReturnStructured(c)) return c.ok(data)
102
- print()
103
- return undefined as unknown as Data
104
- }
105
-
106
- async function writeResponseBody(response: Response) {
107
- process.stdout.write(Buffer.from(await response.arrayBuffer()))
108
- }
109
-
110
- function canReadCommandStdin() {
111
- if (process.stdin.isTTY !== false) return false
112
- return process.stdin.listenerCount('data') === 0 && process.stdin.listenerCount('readable') === 0
113
- }
114
-
115
- type ServiceRegistryService = Record<string, unknown>
116
- type ServiceRegistryEndpoint = Record<string, unknown>
117
-
118
- function getString(value: unknown): string | undefined {
119
- return typeof value === 'string' ? value : undefined
120
- }
121
-
122
- function getEndpoints(service: ServiceRegistryService): ServiceRegistryEndpoint[] {
123
- return Array.isArray(service.endpoints)
124
- ? service.endpoints.filter(
125
- (endpoint): endpoint is ServiceRegistryEndpoint =>
126
- typeof endpoint === 'object' && endpoint !== null,
127
- )
128
- : []
129
- }
130
-
131
- function summarizeService(service: ServiceRegistryService) {
132
- const endpoints = getEndpoints(service)
133
- return {
134
- ...(getString(service.description) ? { description: getString(service.description) } : {}),
135
- id: getString(service.id) ?? getString(service.name) ?? 'unknown',
136
- ...(getString(service.name) ? { name: getString(service.name) } : {}),
137
- paidEndpoints: endpoints.filter((endpoint) => endpoint.payment).length,
138
- ...(getString(service.status) ? { status: getString(service.status) } : {}),
139
- ...(getString(service.serviceUrl) || getString(service.url)
140
- ? { url: getString(service.serviceUrl) ?? getString(service.url) }
141
- : {}),
142
- }
143
- }
144
-
145
- function summarizeEndpoint(endpoint: ServiceRegistryEndpoint) {
146
- return {
147
- ...(getString(endpoint.description) ? { description: getString(endpoint.description) } : {}),
148
- method: getString(endpoint.method) ?? 'GET',
149
- path: getString(endpoint.path) ?? '/',
150
- ...(endpoint.payment !== undefined ? { payment: endpoint.payment } : {}),
151
- }
152
- }
153
-
154
- function formatPayment(payment: unknown): string {
155
- if (!payment) return 'free'
156
- if (typeof payment !== 'object') return String(payment)
157
- const p = payment as Record<string, unknown>
158
- const amount = getString(p.amount)
159
- const currency = getString(p.currency)
160
- const method = getString(p.method)
161
- const intent = getString(p.intent)
162
- return [amount, currency, method && intent ? `${method}/${intent}` : (method ?? intent)]
163
- .filter(Boolean)
164
- .join(' ')
165
- }
166
-
167
- function filterChallengesByCurrency(
168
- challenges: readonly Challenge.Challenge[],
169
- currency: string | undefined,
170
- ): Challenge.Challenge[] {
171
- if (!currency) return [...challenges]
172
- const normalized = currency.toLowerCase()
173
- return challenges.filter((challenge) => {
174
- const offered = challenge.request.currency
175
- return typeof offered === 'string' && offered.toLowerCase() === normalized
176
- })
177
- }
178
-
179
- async function fetchServicesRegistry(): Promise<ServiceRegistryService[]> {
180
- const url = process.env.MPPX_SERVICES_URL ?? servicesRegistryUrl
181
- const response = await globalThis.fetch(url)
182
- if (!response.ok)
183
- throw new Errors.IncurError({
184
- code: 'SERVICES_FETCH_FAILED',
185
- message: `Failed to fetch services registry: HTTP ${response.status}`,
186
- exitCode: 1,
187
- })
188
- const json = (await response.json()) as unknown
189
- if (
190
- !json ||
191
- typeof json !== 'object' ||
192
- !Array.isArray((json as { services?: unknown }).services)
193
- )
194
- throw new Errors.IncurError({
195
- code: 'SERVICES_INVALID',
196
- message: 'Services registry response did not contain a services array.',
197
- exitCode: 1,
198
- })
199
- return (json as { services: ServiceRegistryService[] }).services
200
- }
201
-
202
- function findService(
203
- services: ServiceRegistryService[],
204
- id: string,
205
- ): ServiceRegistryService | undefined {
206
- const needle = id.toLowerCase()
207
- return services.find((service) => {
208
- const serviceId = getString(service.id)?.toLowerCase()
209
- const serviceName = getString(service.name)?.toLowerCase()
210
- return serviceId === needle || serviceName === needle
211
- })
212
- }
213
-
214
- const cli = Cli.create('mppx', {
215
- version: packageJson.version,
216
- description: 'Make HTTP requests with automatic payment handling',
217
- usage: [{ suffix: '<url> [options]' }],
218
- args: z.object({
219
- url: z.string().describe('URL to make request to'),
220
- }),
221
- options: z.object({
222
- account: z.string().optional().describe('Account name (env: MPPX_ACCOUNT)'),
223
- autoSwap: z.boolean().optional().describe('Auto-swap source tokens into payment currency'),
224
- config: z.string().optional().describe('Path to config file'),
225
- confirm: z.boolean().optional().default(false).describe('Show confirmation prompts'),
226
- currency: z.string().optional().describe('Payment currency/token address to select'),
227
- data: z.string().optional().describe('Send request body (implies POST unless -X is set)'),
228
- fail: z.boolean().optional().describe('Fail silently on HTTP errors (exit 22)'),
229
- header: z.array(z.string()).optional().describe('Add header (repeatable)'),
230
- include: z.boolean().optional().describe('Include response headers in output'),
231
- insecure: z
232
- .boolean()
233
- .optional()
234
- .describe('Skip TLS certificate verification (true for localhost/.local)'),
235
- jsonBody: z
236
- .string()
237
- .optional()
238
- .describe('Send JSON body (sets Content-Type and Accept, implies POST)'),
239
- location: z.boolean().optional().describe('Follow redirects'),
240
- method: z.string().optional().describe('HTTP method'),
241
- methodOpt: z
242
- .array(z.string())
243
- .optional()
244
- .describe('Method-specific option (key=value, repeatable)'),
245
- network: z.enum(['mainnet', 'testnet']).optional().describe('Tempo network'),
246
- payWith: z.string().optional().describe('Source token for Tempo auto-swap'),
247
- rpcUrl: z
248
- .string()
249
- .optional()
250
- .describe('RPC endpoint, defaults to public RPC for chain (env: MPPX_RPC_URL)'),
251
- session: z
252
- .string()
253
- .optional()
254
- .default('auto')
255
- .refine(
256
- (value) => value === 'auto' || value === 'new' || /^0x[0-9a-fA-F]{64}$/.test(value),
257
- 'Expected auto, new, or a 32-byte channel ID',
258
- )
259
- .describe('Session selection: auto, new, or channel ID'),
260
- silent: z.boolean().default(false).describe('Silent mode (suppress progress and info)'),
261
- slippage: z.number().optional().describe('Tempo auto-swap max slippage percentage'),
262
- userAgent: z
263
- .string()
264
- .optional()
265
- .default(`${packageJson.name}/${packageJson.version}`)
266
- .describe('Set User-Agent header'),
267
- verbose: z
268
- .number()
269
- .default(0)
270
- .meta({ count: true })
271
- .describe('Verbosity (-v details, -vv headers)'),
272
- }),
273
- alias: {
274
- account: 'a',
275
- config: 'c',
276
- data: 'd',
277
- fail: 'f',
278
- header: 'H',
279
- include: 'i',
280
- insecure: 'k',
281
- jsonBody: 'J',
282
- location: 'L',
283
- method: 'X',
284
- methodOpt: 'M',
285
- rpcUrl: 'r',
286
- silent: 's',
287
- userAgent: 'A',
288
- verbose: 'v',
289
- },
290
- examples: [{ args: { url: 'mpp.dev/api/ping/paid' }, description: 'Make a payment request' }],
291
- async run(c) {
292
- const info = c.options.silent
293
- ? (_msg: string) => {}
294
- : (msg: string) => process.stderr.write(msg)
295
-
296
- const loaded = await loadConfig(c.options.config)
297
- if (loaded && c.options.verbose >= 1)
298
- info(`${pc.dim('Using config')} ${pc.blue(path.relative(process.cwd(), loaded.path))}\n`)
299
-
300
- const headers: Record<string, string> = {
301
- 'User-Agent': c.options.userAgent,
302
- }
303
- if (c.options.header) {
304
- for (const header of c.options.header) {
305
- const index = header.indexOf(':')
306
- if (index === -1) {
307
- return c.error({
308
- code: 'INVALID_HEADER',
309
- message: `Invalid header format: ${header}`,
310
- exitCode: 2,
311
- })
312
- }
313
- headers[header.slice(0, index).trim()] = header.slice(index + 1).trim()
314
- }
315
- }
316
- const acceptPayment = resolveAcceptPayment(loaded?.config)
317
- if (
318
- acceptPayment &&
319
- !Object.keys(headers).some((key) => key.toLowerCase() === 'accept-payment')
320
- ) {
321
- headers['Accept-Payment'] = acceptPayment
322
- }
323
-
324
- const url = (() => {
325
- const hasProtocol = /^https?:\/\//.test(c.args.url)
326
- const isLocal = /^(localhost|.*\.localhost|127\.0\.0\.1|\[::1\])(:\d+)?/.test(c.args.url)
327
- return hasProtocol ? c.args.url : `${isLocal ? 'http' : 'https'}://${c.args.url}`
328
- })()
329
- const { hostname } = new URL(url)
330
- const insecure =
331
- c.options.insecure ||
332
- hostname === 'localhost' ||
333
- hostname.endsWith('.localhost') ||
334
- hostname.endsWith('.local')
335
-
336
- // Scoped fetch that temporarily disables TLS verification only for
337
- // the target connection when `insecure` is true, then restores
338
- // the original value so other HTTPS connections are unaffected.
339
- const targetFetch: typeof globalThis.fetch = insecure
340
- ? async (input, init) => {
341
- const orig = process.env.NODE_TLS_REJECT_UNAUTHORIZED
342
- process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'
343
- try {
344
- return await globalThis.fetch(input, init)
345
- } finally {
346
- if (orig === undefined) delete process.env.NODE_TLS_REJECT_UNAUTHORIZED
347
- else process.env.NODE_TLS_REJECT_UNAUTHORIZED = orig
348
- }
349
- }
350
- : globalThis.fetch
351
-
352
- // Node.js doesn't resolve *.localhost subdomains to loopback (unlike
353
- // browsers per RFC 6761). Rewrite the URL to 127.0.0.1 and set the
354
- // Host header so reverse proxies can route correctly.
355
- const isSubLocalhost = hostname.endsWith('.localhost') && hostname !== 'localhost'
356
- const fetchUrl = isSubLocalhost ? url.replace(hostname, '127.0.0.1') : url
357
- if (isSubLocalhost) {
358
- const { host } = new URL(url)
359
- headers.Host = host
360
- }
361
-
362
- try {
363
- const methodOpts = parseMethodOpts(c.options.methodOpt)
364
- const sessionRegistry = createSessionRegistry()
365
-
366
- const init: RequestInit = { redirect: c.options.location ? 'follow' : 'manual' }
367
- if (c.options.jsonBody) {
368
- init.body = c.options.jsonBody
369
- headers['Content-Type'] ??= 'application/json'
370
- headers.Accept ??= 'application/json'
371
- } else if (c.options.data) {
372
- init.body = c.options.data
373
- }
374
- if (c.options.method) init.method = c.options.method.toUpperCase()
375
- else if (init.body) init.method = 'POST'
376
- if (Object.keys(headers).length > 0) init.headers = headers
377
-
378
- const headerOpts = {
379
- include: c.options.include ?? false,
380
- verbose: c.options.verbose,
381
- silent: c.options.silent,
382
- }
383
-
384
- if (c.options.verbose >= 2) printRequestHeaders(url, init, info)
385
- const challengeResponse = await targetFetch(fetchUrl, init)
386
- if (challengeResponse.status !== 402) {
387
- if (c.options.session !== 'auto')
388
- return c.error({
389
- code: 'UNSUPPORTED_SESSION',
390
- message: '--session requires a tempo/session payment challenge.',
391
- exitCode: 2,
392
- })
393
- if (c.options.fail && challengeResponse.status >= 400)
394
- return c.error({
395
- code: 'HTTP_ERROR',
396
- message: `HTTP error ${challengeResponse.status}`,
397
- exitCode: 22,
398
- })
399
- printResponseHeaders(challengeResponse, headerOpts)
400
- await writeResponseBody(challengeResponse)
401
- return
402
- }
403
-
404
- const offeredChallenges = Challenge.fromResponseList(challengeResponse)
405
- const currencyChallenges = filterChallengesByCurrency(offeredChallenges, c.options.currency)
406
- if (c.options.currency && currencyChallenges.length === 0) {
407
- const offers = offeredChallenges
408
- .map((challenge) => challenge.request.currency)
409
- .filter((currency): currency is string => typeof currency === 'string')
410
- .join(', ')
411
- return c.error({
412
- code: 'UNSUPPORTED_CURRENCY',
413
- message: `Server did not offer payment currency ${c.options.currency}.${offers ? ` Offered currencies: ${offers}.` : ''}`,
414
- exitCode: 2,
415
- })
416
- }
417
- const challenges = await orderTempoChargeChallengesByBalance(currencyChallenges, {
418
- options: {
419
- account: c.options.account,
420
- network: c.options.network,
421
- rpcUrl: c.options.rpcUrl,
422
- },
423
- })
424
-
425
- const selected = selectChallenge(challenges, loaded?.config)
426
- if (!selected) {
427
- const offers = challenges
428
- .map((challenge) => `${challenge.method}/${challenge.intent}`)
429
- .join(', ')
430
- return c.error({
431
- code: 'UNSUPPORTED_METHOD',
432
- message: `Unsupported payment method. Server offers: ${offers}. Add it to mppx.config.ts using defineConfig().`,
433
- exitCode: 2,
434
- })
435
- }
436
-
437
- const { challenge, plugin, method: configMethod } = selected
438
- const selectedChallengeResponse = new Response(null, {
439
- status: 402,
440
- headers: { [Constants.Headers.wwwAuthenticate]: Challenge.serialize(challenge) },
441
- })
442
-
443
- let tokenSymbol = (challenge.request.currency as string | undefined) ?? ''
444
- let tokenDecimals = (challenge.request.decimals as number | undefined) ?? 6
445
- let explorerUrl: string | undefined
446
- let pluginResult: Awaited<ReturnType<Plugin['setup']>> | undefined
447
- if (plugin) {
448
- pluginResult = await plugin.setup({
449
- challenge,
450
- options: {
451
- account: c.options.account,
452
- autoSwap: c.options.autoSwap,
453
- network: c.options.network,
454
- payWith: c.options.payWith,
455
- rpcUrl: c.options.rpcUrl,
456
- slippage: c.options.slippage,
457
- },
458
- methodOpts,
459
- })
460
- tokenSymbol = pluginResult.tokenSymbol
461
- tokenDecimals = pluginResult.tokenDecimals
462
- explorerUrl = pluginResult.explorerUrl
463
- }
464
-
465
- const confirmEnabled = c.options.silent ? false : c.options.confirm
466
-
467
- // Display challenge
468
- const shownKeys = new Set<string>()
469
- {
470
- printResponseHeaders(
471
- challengeResponse,
472
- challenge.method === 'tempo' && challenge.intent === 'session' && c.options.include
473
- ? { ...headerOpts, include: false, verbose: Math.max(headerOpts.verbose, 2) }
474
- : headerOpts,
475
- )
476
-
477
- const challengeRows = (() => {
478
- const skip = new Set(['id', 'request'])
479
- const rows: [string, string][] = []
480
- for (const [key, value] of Object.entries(challenge)) {
481
- if (skip.has(key) || value === undefined) continue
482
- rows.push([key, fmtChallengeValue(key, value)])
483
- }
484
- return rows.sort(([a], [b]) => a.localeCompare(b))
485
- })()
486
-
487
- const fmtCtx = { tokenSymbol, tokenDecimals, explorerUrl }
488
- const requestRows = (() => {
489
- const skip = new Set(['decimals', 'currency', 'methodDetails'])
490
- const rows: [string, string][] = []
491
- for (const [key, value] of Object.entries(challenge.request)) {
492
- if (skip.has(key) || value === undefined) continue
493
- rows.push([key, fmtRequestValue(key, value, fmtCtx)])
494
- }
495
- return rows.sort(([a], [b]) => a.localeCompare(b))
496
- })()
497
-
498
- const detailRows = (() => {
499
- const methodDetails = challenge.request.methodDetails as
500
- | Record<string, unknown>
501
- | undefined
502
- if (!methodDetails) return []
503
- const rows: [string, string][] = []
504
- for (const [key, value] of Object.entries(methodDetails)) {
505
- if (value === undefined) continue
506
- if (key === 'memo' && typeof value === 'string') {
507
- const decoded = decodeMemo(value)
508
- rows.push([key, decoded ? `${decoded}\n${pc.dim(value)}` : value])
509
- } else {
510
- rows.push([key, fmtRequestValue(key, value, fmtCtx)])
511
- }
512
- }
513
- return rows.sort(([a], [b]) => a.localeCompare(b))
514
- })()
515
-
516
- const sections: [string, [string, string][]][] = [
517
- ['Challenge', challengeRows],
518
- ['Request', requestRows],
519
- ...(detailRows.length ? [['Details', detailRows] as [string, [string, string][]]] : []),
520
- ]
521
- for (const [, rows] of sections) for (const [key] of rows) shownKeys.add(key)
522
- const pad = Math.max(...sections.flatMap(([, rows]) => rows.map(([k]) => k.length)))
523
- const indent = ` ${''.padEnd(pad)} `
524
-
525
- if (c.options.verbose >= 1 || confirmEnabled) {
526
- info(`${pc.bold(pc.yellow('Payment Required'))}\n`)
527
- for (const [title, rows] of sections) {
528
- info(`${pc.bold(title)}\n`)
529
- for (const [label, value] of rows) {
530
- const [first, ...rest] = value.split('\n')
531
- info(` ${pc.dim(label.padEnd(pad))} ${first}\n`)
532
- for (const line of rest) info(`${indent}${line}\n`)
533
- }
534
- }
535
- }
536
- if (confirmEnabled) {
537
- info('\n')
538
- const ok = await confirm(`Proceed with ${challenge.intent}?`, true)
539
- if (!ok) {
540
- info('Aborted.\n')
541
- return
542
- }
543
- }
544
- }
545
-
546
- const persistentSessionAccount =
547
- process.env.MPPX_PRIVATE_KEY?.trim() ||
548
- !isTempoAccount(resolveAccountName(c.options.account))
549
- if (isTempoSessionChallenge(challenge) && persistentSessionAccount) {
550
- try {
551
- await runPersistentSessionRequest({
552
- challenge,
553
- challengeResponse: selectedChallengeResponse,
554
- endpoint: url,
555
- fetch: targetFetch,
556
- fetchInput: fetchUrl,
557
- init,
558
- info,
559
- methodOptions: methodOpts,
560
- options: {
561
- account: c.options.account,
562
- fail: c.options.fail,
563
- include: c.options.include,
564
- network: c.options.network,
565
- rpcUrl: c.options.rpcUrl,
566
- session: c.options.session,
567
- silent: c.options.silent,
568
- verbose: c.options.verbose,
569
- },
570
- registry: sessionRegistry,
571
- })
572
- } catch (error) {
573
- return sessionCommandError(error, 'SESSION_REQUEST_FAILED')
574
- }
575
- return
576
- }
577
- if (c.options.session !== 'auto')
578
- return c.error({
579
- code: 'UNSUPPORTED_SESSION',
580
- message: '--session requires a tempo/session payment challenge.',
581
- exitCode: 2,
582
- })
583
-
584
- // Create credential
585
- let credential: string
586
- if (pluginResult?.createCredential)
587
- credential = await pluginResult.createCredential(selectedChallengeResponse)
588
- else if (pluginResult) {
589
- const mppx = Mppx.create({ methods: pluginResult.methods, polyfill: false })
590
- credential = await mppx.createCredential(
591
- selectedChallengeResponse,
592
- pluginResult.credentialContext as undefined,
593
- )
594
- } else if (configMethod) {
595
- const mppx = Mppx.create({ methods: [configMethod], polyfill: false })
596
- credential = await mppx.createCredential(selectedChallengeResponse)
597
- } else throw new Error('unreachable')
598
-
599
- // Send credential and get response
600
- const credentialHeaders = {
601
- ...normalizeHeaders(init.headers),
602
- Authorization: credential,
603
- }
604
- plugin?.prepareCredentialRequest?.({ challenge, credential, headers: credentialHeaders })
605
-
606
- const credentialFetchInit = { ...init, headers: credentialHeaders }
607
- if (c.options.verbose >= 2) printRequestHeaders(url, credentialFetchInit, info)
608
- const credentialResponse = await targetFetch(fetchUrl, credentialFetchInit)
609
-
610
- if (c.options.fail && credentialResponse.status >= 400)
611
- return c.error({
612
- code: 'HTTP_ERROR',
613
- message: `HTTP error ${credentialResponse.status}`,
614
- exitCode: 22,
615
- })
616
-
617
- if (credentialResponse.status === 402) {
618
- const body = await credentialResponse.text()
619
- info(`${pc.bold(pc.red('Payment Rejected'))}\n`)
620
- try {
621
- const problem = JSON.parse(body) as Record<string, unknown>
622
- const rows: [string, string][] = []
623
- for (const [key, value] of Object.entries(problem)) {
624
- if (value === undefined) continue
625
- rows.push([key, String(value)])
626
- }
627
- rows.sort(([a], [b]) => a.localeCompare(b))
628
- const pad = Math.max(...rows.map(([k]) => k.length))
629
- for (const [label, value] of rows) info(` ${pc.dim(label.padEnd(pad))} ${value}\n`)
630
- } catch {
631
- if (body) info(` ${body}\n`)
632
- }
633
- return c.error({ code: 'PAYMENT_REJECTED', message: 'Payment rejected', exitCode: 75 })
634
- }
635
-
636
- printResponseHeaders(credentialResponse, headerOpts)
637
-
638
- // Let plugin own the response lifecycle if it wants to
639
- const handled = await plugin?.handleResponse?.({
640
- challenge,
641
- credential,
642
- response: credentialResponse,
643
- fetchUrl,
644
- fetchInit: init,
645
- silent: c.options.silent,
646
- verbose: c.options.verbose,
647
- confirmEnabled,
648
- confirm,
649
- tokenSymbol,
650
- tokenDecimals,
651
- explorerUrl,
652
- shownKeys,
653
- })
654
-
655
- if (!handled) {
656
- // Default: print receipt + body
657
- const receiptHeader = credentialResponse.headers.get(Constants.Headers.paymentReceipt)
658
- if (receiptHeader && c.options.verbose >= 1) {
659
- try {
660
- const receiptJson = JSON.parse(Base64.toString(receiptHeader)) as Record<
661
- string,
662
- unknown
663
- >
664
- info(`\n${pc.bold(pc.green('Payment Receipt'))}\n`)
665
- const rows: [string, string][] = []
666
- const channelId = receiptJson.channelId
667
- const reference = receiptJson.reference
668
- const skipReference = channelId && reference && channelId === reference
669
- const receiptBalanceKeys = new Set(['acceptedCumulative', 'spent'])
670
- for (const [key, value] of Object.entries(receiptJson)) {
671
- if (value === undefined || shownKeys.has(key)) continue
672
- if (key === 'reference' && skipReference) continue
673
- const formatted = plugin?.formatReceiptField?.(key, value)
674
- if (formatted !== undefined) {
675
- rows.push([key, formatted])
676
- } else if (receiptBalanceKeys.has(key) && typeof value === 'string') {
677
- rows.push([
678
- key,
679
- `${value} ${pc.dim(`(${fmtBalance(BigInt(value), tokenSymbol, tokenDecimals)})`)}`,
680
- ])
681
- } else if (
682
- (key === 'reference' || key === 'txHash') &&
683
- typeof value === 'string' &&
684
- explorerUrl
685
- ) {
686
- rows.push([key, link(`${explorerUrl}/tx/${value}`, value)])
687
- } else rows.push([key, String(value)])
688
- }
689
- rows.sort(([a], [b]) => a.localeCompare(b))
690
- const pad = Math.max(...rows.map(([k]) => k.length))
691
- for (const [label, value] of rows) info(` ${pc.dim(label.padEnd(pad))} ${value}\n`)
692
- info('\n')
693
- } catch {}
694
- }
695
-
696
- await writeResponseBody(credentialResponse)
697
- }
698
- } catch (err) {
699
- // Re-throw IncurError so incur's error handler formats it properly
700
- if (err instanceof Errors.IncurError) throw err
701
-
702
- // TODO: revert cast when https://github.com/wevm/zile/pull/26 is merged
703
- const errCause =
704
- err instanceof Error ? (err as unknown as Record<string, unknown>).cause : undefined
705
- const cause = errCause instanceof Error ? errCause : undefined
706
-
707
- if (cause && 'code' in cause) {
708
- const code = cause.code as string
709
- if (code === 'ENOTFOUND')
710
- return c.error({
711
- code: 'DNS_ERROR',
712
- message: `Could not resolve host "${hostname}". Check the URL and try again.`,
713
- exitCode: 6,
714
- })
715
- else if (code === 'ECONNREFUSED')
716
- return c.error({
717
- code: 'CONNECTION_REFUSED',
718
- message: `Connection refused by "${hostname}". Is the server running?`,
719
- retryable: true,
720
- exitCode: 7,
721
- })
722
- else if (code === 'ECONNRESET')
723
- return c.error({
724
- code: 'CONNECTION_RESET',
725
- message: `Connection to "${hostname}" was reset.`,
726
- retryable: true,
727
- exitCode: 56,
728
- })
729
- else if (code === 'ETIMEDOUT')
730
- return c.error({
731
- code: 'CONNECTION_TIMEOUT',
732
- message: `Connection to "${hostname}" timed out.`,
733
- retryable: true,
734
- exitCode: 28,
735
- })
736
- else if (code === 'CERT_HAS_EXPIRED' || code === 'UNABLE_TO_VERIFY_LEAF_SIGNATURE')
737
- return c.error({
738
- code: 'TLS_ERROR',
739
- message: `TLS certificate error for "${hostname}". Use --insecure to skip verification.`,
740
- exitCode: 60,
741
- })
742
- else
743
- return c.error({
744
- code: 'REQUEST_FAILED',
745
- message: `Request to "${hostname}" failed: ${cause.message}`,
746
- })
747
- } else {
748
- const msg = err instanceof Error ? err.message : String(err)
749
- return c.error({
750
- code: 'REQUEST_FAILED',
751
- message: cause
752
- ? `Request failed: ${msg} (Cause: ${cause.message})`
753
- : `Request failed: ${msg}`,
754
- })
755
- }
756
- }
757
- },
758
- })
759
-
760
- const account = Cli.create('account', {
761
- description: 'Manage accounts (create, default, delete, export, fund, list, view)',
762
- })
763
- .command('create', {
764
- description: 'Create new account',
765
- options: z.object({
766
- account: z.string().optional().describe('Account name (env: MPPX_ACCOUNT)'),
767
- network: z.enum(['mainnet', 'testnet']).optional().describe('Tempo network'),
768
- rpcUrl: z.string().optional().describe('RPC endpoint (env: MPPX_RPC_URL)'),
769
- }),
770
- output: z.object({ address: z.string(), name: z.string() }),
771
- alias: { account: 'a', rpcUrl: 'r' },
772
- async run(c) {
773
- const structured = shouldReturnStructured(c)
774
- let resolvedName = c.options.account
775
- if (!resolvedName) {
776
- const existing = await createKeychain().list()
777
- if (existing.length === 0) resolvedName = 'main'
778
- else {
779
- if (structured)
780
- return c.error({
781
- code: 'ACCOUNT_REQUIRED',
782
- message: 'Account name is required in structured mode.',
783
- exitCode: 2,
784
- })
785
- const input = await prompt('Account name')
786
- if (!input) return undefined as never
787
- resolvedName = input
788
- }
789
- }
790
- let keychain = createKeychain(resolvedName)
791
- while (await keychain.get()) {
792
- if (structured)
793
- return c.error({
794
- code: 'ACCOUNT_EXISTS',
795
- message: `Account "${resolvedName}" already exists.`,
796
- exitCode: 1,
797
- })
798
- process.stderr.write(`${pc.dim(`Account "${resolvedName}" already exists.`)}\n\n`)
799
- const input = await prompt('Enter different name')
800
- if (!input) return undefined as never
801
- resolvedName = input
802
- keychain = createKeychain(resolvedName)
803
- }
804
- const privateKey = generatePrivateKey()
805
- const acct = privateKeyToAccount(privateKey)
806
- await keychain.set(privateKey)
807
- const accounts = await createKeychain().list()
808
- if (accounts.length === 1) createDefaultStore().set(resolvedName)
809
- const explorerUrl = tempoMainnet.blockExplorers?.default?.url
810
- const addrDisplay = explorerUrl
811
- ? link(`${explorerUrl}/address/${acct.address}`, acct.address)
812
- : acct.address
813
- const fundingNetwork = resolveFundingNetwork(c.options)
814
- const rpcUrl = resolveRpcUrl(c.options.rpcUrl, { network: fundingNetwork })
815
- resolveChain({ network: fundingNetwork, rpcUrl })
816
- .then((chain) => createClient({ chain, transport: http(rpcUrl) }))
817
- .then((client) =>
818
- import('viem/tempo').then(({ Actions }) =>
819
- Actions.faucet.fund(client, { account: acct }).catch(() => {}),
820
- ),
821
- )
822
- return outputResult(c, { address: acct.address, name: resolvedName }, () => {
823
- console.log(`Account "${resolvedName}" saved to keychain.`)
824
- console.log(pc.dim(`Address ${addrDisplay}`))
825
- console.log(
826
- pc.dim(
827
- `Fund testnet tokens: mppx account fund --account ${resolvedName} --network testnet`,
828
- ),
829
- )
830
- })
831
- },
832
- })
833
- .command('default', {
834
- description: 'Set default account',
835
- options: z.object({
836
- account: z.string().describe('Account name'),
837
- }),
838
- output: z.object({ name: z.string() }),
839
- alias: { account: 'a' },
840
- async run(c) {
841
- const accountName = c.options.account
842
- if (isTempoAccount(accountName)) {
843
- const tempoEntry = resolveTempoAccount(accountName)
844
- if (!tempoEntry) {
845
- return c.error({
846
- code: 'ACCOUNT_NOT_FOUND',
847
- message: `Account "${accountName}" not found. Is Tempo wallet configured?`,
848
- exitCode: 69,
849
- })
850
- }
851
- createDefaultStore().set(accountName)
852
- return outputResult(c, { name: accountName }, () => {
853
- console.log(`Default account set to "${accountName}"`)
854
- })
855
- }
856
- const key = await createKeychain(accountName).get()
857
- if (!key) {
858
- return c.error({
859
- code: 'ACCOUNT_NOT_FOUND',
860
- message: `Account "${accountName}" not found.`,
861
- exitCode: 69,
862
- })
863
- }
864
- createDefaultStore().set(accountName)
865
- return outputResult(c, { name: accountName }, () => {
866
- console.log(`Default account set to "${accountName}"`)
867
- })
868
- },
869
- })
870
- .command('delete', {
871
- description: 'Delete account',
872
- options: z.object({
873
- account: z.string().describe('Account name'),
874
- yes: z.boolean().optional().describe('DANGER!! Skip confirmation prompts'),
875
- }),
876
- output: z.object({ defaultAccount: z.string().optional(), name: z.string() }),
877
- alias: { account: 'a' },
878
- async run(c) {
879
- const keychain = createKeychain(c.options.account)
880
- const key = await keychain.get()
881
- if (!key) {
882
- return c.error({
883
- code: 'ACCOUNT_NOT_FOUND',
884
- message: `Account "${c.options.account}" not found.`,
885
- exitCode: 69,
886
- })
887
- }
888
- const acct = privateKeyToAccount(key as `0x${string}`)
889
- const balanceLines = await fetchBalanceLines(acct.address, { includeTestnet: false })
890
- if (!c.options.yes) {
891
- if (shouldReturnStructured(c))
892
- return c.error({
893
- code: 'CONFIRMATION_REQUIRED',
894
- message: 'Pass --yes to delete an account in structured mode.',
895
- exitCode: 2,
896
- })
897
- const explorerUrl = tempoMainnet.blockExplorers?.default?.url
898
- const addrDisplay = explorerUrl
899
- ? link(`${explorerUrl}/address/${acct.address}`, acct.address)
900
- : acct.address
901
- process.stderr.write(pc.dim(`Delete account "${c.options.account}"\n`))
902
- process.stderr.write(pc.dim(` Address ${addrDisplay}\n`))
903
- for (let i = 0; i < balanceLines.length; i++)
904
- process.stderr.write(pc.dim(` ${i === 0 ? 'Balance' : ' '} ${balanceLines[i]}\n`))
905
- process.stderr.write(pc.dim('This action cannot be undone\n\n'))
906
- const confirmed = await confirm('Confirm delete?')
907
- if (!confirmed) {
908
- console.log('Canceled')
909
- return undefined as never
910
- }
911
- }
912
- await keychain.delete()
913
- const currentDefault = createDefaultStore().get()
914
- let defaultAccount: string | undefined
915
- if (currentDefault === c.options.account) {
916
- const remaining = await createKeychain().list()
917
- if (remaining.length > 0) {
918
- defaultAccount = remaining[0]!
919
- createDefaultStore().set(defaultAccount)
920
- } else {
921
- createDefaultStore().clear()
922
- }
923
- }
924
- return outputResult(c, { defaultAccount, name: c.options.account }, () => {
925
- if (defaultAccount) console.log(`Default account set to "${defaultAccount}"`)
926
- console.log(`Account "${c.options.account}" deleted`)
927
- })
928
- },
929
- })
930
- .command('fund', {
931
- description: 'Fund account with testnet tokens',
932
- options: z.object({
933
- account: z.string().optional().describe('Account name (env: MPPX_ACCOUNT)'),
934
- network: z.enum(['testnet']).optional().describe('Tempo network'),
935
- rpcUrl: z.string().optional().describe('RPC endpoint (env: MPPX_RPC_URL)'),
936
- }),
937
- output: z.object({ account: z.string(), chain: z.string(), transactions: z.array(z.string()) }),
938
- alias: { account: 'a', rpcUrl: 'r' },
939
- async run(c) {
940
- const structured = shouldReturnStructured(c)
941
- const accountName = resolveAccountName(c.options.account)
942
- const keychain = createKeychain(accountName)
943
- const key = await keychain.get()
944
- if (!key) {
945
- if (c.options.account)
946
- return c.error({
947
- code: 'ACCOUNT_NOT_FOUND',
948
- message: `Account "${accountName}" not found.`,
949
- exitCode: 69,
950
- })
951
- else
952
- return c.error({ code: 'ACCOUNT_NOT_FOUND', message: 'No account found.', exitCode: 69 })
953
- }
954
- const acct = privateKeyToAccount(key as `0x${string}`)
955
- const fundingNetwork = resolveFundingNetwork(c.options)
956
- const rpcUrl = resolveRpcUrl(c.options.rpcUrl, { network: fundingNetwork })
957
- const chain = await resolveChain({ network: fundingNetwork, rpcUrl })
958
- const client = createClient({ chain, transport: http(rpcUrl) })
959
- if (!structured) console.log(`Funding "${accountName}" on ${chainName(chain)}`)
960
- try {
961
- const { Actions } = await import('viem/tempo')
962
- const hashes = await Actions.faucet.fund(client, { account: acct })
963
- const explorerUrl = chain.blockExplorers?.default?.url
964
- if (!structured) {
965
- for (const hash of hashes) {
966
- const label = explorerUrl ? link(`${explorerUrl}/tx/${hash}`, pc.gray(hash)) : hash
967
- console.log(` ${label}`)
968
- }
969
- }
970
- const { waitForTransactionReceipt } = await import('viem/actions')
971
- await Promise.all(hashes.map((hash) => waitForTransactionReceipt(client, { hash })))
972
- return outputResult(
973
- c,
974
- { account: accountName, chain: chainName(chain), transactions: [...hashes] },
975
- () => {
976
- console.log('Funded successfully')
977
- },
978
- )
979
- } catch (err) {
980
- const message = err instanceof Error ? err.message : String(err)
981
- if (structured)
982
- return c.error({
983
- code: 'FUNDING_FAILED',
984
- message,
985
- exitCode: 1,
986
- })
987
- return c.error({
988
- code: 'FUNDING_FAILED',
989
- message: `Funding failed: ${message}`,
990
- exitCode: 1,
991
- })
992
- }
993
- },
994
- })
995
- .command('list', {
996
- description: 'List all accounts',
997
- output: z.object({ accounts: z.array(accountSummarySchema) }),
998
- async run(c) {
999
- const currentDefault = createDefaultStore().get()
1000
- const accounts = (await createKeychain().list()).sort()
1001
- const resolved: { name: string; address: string; source?: string }[] = []
1002
- for (const accountName of accounts) {
1003
- const key = await createKeychain(accountName).get()
1004
- if (!key) continue
1005
- resolved.push({
1006
- name: accountName,
1007
- address: privateKeyToAccount(key as `0x${string}`).address,
1008
- })
1009
- }
1010
- const tempoEntries = readTempoKeystore()
1011
- for (let i = 0; i < tempoEntries.length; i++) {
1012
- const entry = tempoEntries[i]!
1013
- const tempoName = i === 0 ? 'tempo:default' : `tempo:${i}`
1014
- if (entry.wallet_address)
1015
- resolved.push({ name: tempoName, address: entry.wallet_address, source: 'tempo wallet' })
1016
- }
1017
- if (resolved.length === 0) {
1018
- return outputResult(c, { accounts: [] }, () => {
1019
- console.log(`No accounts found.`)
1020
- })
1021
- }
1022
- const explorerUrl = tempoMainnet.blockExplorers?.default?.url
1023
- const maxWidth = Math.max(
1024
- ...resolved.map((e) => e.name.length + (e.name === currentDefault ? 1 : 0)),
1025
- )
1026
- return outputResult(
1027
- c,
1028
- {
1029
- accounts: resolved.map((entry) => ({
1030
- ...entry,
1031
- ...(entry.name === currentDefault ? { isDefault: true } : undefined),
1032
- })),
1033
- },
1034
- () => {
1035
- for (const entry of resolved) {
1036
- const isDefault = entry.name === currentDefault
1037
- const label = isDefault ? `${entry.name}${pc.dim('*')}` : entry.name
1038
- const width = entry.name.length + (isDefault ? 1 : 0)
1039
- const addrDisplay = explorerUrl
1040
- ? link(`${explorerUrl}/address/${entry.address}`, entry.address)
1041
- : entry.address
1042
- const sourceLabel = entry.source ? ` ${pc.dim(`(${entry.source})`)}` : ''
1043
- console.log(
1044
- `${label}${' '.repeat(maxWidth - width + 2)}${pc.dim(addrDisplay)}${sourceLabel}`,
1045
- )
1046
- }
1047
- },
1048
- )
1049
- },
1050
- })
1051
- .command('export', {
1052
- description: 'Export the private key for a local account',
1053
- options: z.object({
1054
- account: z.string().optional().describe('Account name (env: MPPX_ACCOUNT)'),
1055
- }),
1056
- output: z.object({ privateKey: z.string() }),
1057
- alias: { account: 'a' },
1058
- async run(c) {
1059
- const accountName = resolveAccountName(c.options.account)
1060
-
1061
- if (isTempoAccount(accountName)) {
1062
- return c.error({
1063
- code: 'UNSUPPORTED_ACCOUNT',
1064
- message: `Account "${accountName}" is managed by Tempo wallet and does not expose a private key via mppx.`,
1065
- exitCode: 2,
1066
- })
1067
- }
1068
-
1069
- const key = await createKeychain(accountName).get()
1070
- if (!key) {
1071
- if (c.options.account)
1072
- return c.error({
1073
- code: 'ACCOUNT_NOT_FOUND',
1074
- message: `Account "${accountName}" not found.`,
1075
- exitCode: 69,
1076
- })
1077
- else
1078
- return c.error({ code: 'ACCOUNT_NOT_FOUND', message: 'No account found.', exitCode: 69 })
1079
- }
1080
-
1081
- return outputResult(c, { privateKey: key }, () => {
1082
- console.log(key)
1083
- })
1084
- },
1085
- })
1086
- .command('view', {
1087
- description: 'View account address',
1088
- options: z.object({
1089
- account: z.string().optional().describe('Account name (env: MPPX_ACCOUNT)'),
1090
- network: z.enum(['mainnet', 'testnet']).optional().describe('Tempo network'),
1091
- rpcUrl: z.string().optional().describe('RPC endpoint (env: MPPX_RPC_URL)'),
1092
- }),
1093
- output: accountViewSchema,
1094
- alias: { account: 'a', rpcUrl: 'r' },
1095
- async run(c) {
1096
- const accountName = resolveAccountName(c.options.account)
1097
-
1098
- if (isTempoAccount(accountName)) {
1099
- const tempoEntry = resolveTempoAccount(accountName)
1100
- if (!tempoEntry) {
1101
- return c.error({
1102
- code: 'ACCOUNT_NOT_FOUND',
1103
- message: `Account "${accountName}" not found. Is Tempo wallet configured?`,
1104
- exitCode: 69,
1105
- })
1106
- }
1107
- const address = tempoEntry.wallet_address as Address
1108
- const rpcUrl = resolveRpcUrl(c.options.rpcUrl, { network: c.options.network })
1109
- const chain = await resolveChain({ network: c.options.network, rpcUrl })
1110
- const explorerUrl = chain.blockExplorers?.default?.url
1111
- const addrDisplay = explorerUrl
1112
- ? link(`${explorerUrl}/address/${address}`, address)
1113
- : address
1114
-
1115
- const balanceLines = await fetchBalanceLines(
1116
- address,
1117
- chain && rpcUrl ? { chain, rpcUrl } : undefined,
1118
- )
1119
- return outputResult(
1120
- c,
1121
- {
1122
- address,
1123
- balances: balanceLines,
1124
- name: accountName,
1125
- type: `${tempoEntry.wallet_type} (tempo wallet)`,
1126
- },
1127
- () => {
1128
- console.log(`${pc.dim('Address')} ${addrDisplay}`)
1129
- for (let i = 0; i < balanceLines.length; i++)
1130
- console.log(`${pc.dim(i === 0 ? 'Balance' : ' ')} ${balanceLines[i]}`)
1131
- console.log(`${pc.dim('Name')} ${accountName}`)
1132
- console.log(
1133
- `${pc.dim('Type')} ${tempoEntry.wallet_type} ${pc.dim('(tempo wallet)')}`,
1134
- )
1135
- },
1136
- )
1137
- }
1138
-
1139
- const keychain = createKeychain(accountName)
1140
- const key = await keychain.get()
1141
- if (!key) {
1142
- if (c.options.account)
1143
- return c.error({
1144
- code: 'ACCOUNT_NOT_FOUND',
1145
- message: `Account "${accountName}" not found.`,
1146
- exitCode: 69,
1147
- })
1148
- else
1149
- return c.error({ code: 'ACCOUNT_NOT_FOUND', message: 'No account found.', exitCode: 69 })
1150
- }
1151
- const acct = privateKeyToAccount(key as `0x${string}`)
1152
- const rpcUrl = resolveRpcUrl(c.options.rpcUrl, { network: c.options.network })
1153
- const chain = await resolveChain({ network: c.options.network, rpcUrl })
1154
- const explorerUrl = chain.blockExplorers?.default?.url
1155
- const addrDisplay = explorerUrl
1156
- ? link(`${explorerUrl}/address/${acct.address}`, acct.address)
1157
- : acct.address
1158
-
1159
- const balanceLines = await fetchBalanceLines(
1160
- acct.address,
1161
- chain && rpcUrl ? { chain, rpcUrl } : undefined,
1162
- )
1163
- return outputResult(
1164
- c,
1165
- { address: acct.address, balances: balanceLines, name: accountName },
1166
- () => {
1167
- console.log(`${pc.dim('Address')} ${addrDisplay}`)
1168
- for (let i = 0; i < balanceLines.length; i++)
1169
- console.log(`${pc.dim(i === 0 ? 'Balance' : ' ')} ${balanceLines[i]}`)
1170
- console.log(`${pc.dim('Name')} ${accountName}`)
1171
- },
1172
- )
1173
- },
1174
- })
1175
-
1176
- const sign = Cli.create('sign', {
1177
- description: 'Sign a payment challenge and output the Authorization header',
1178
- usage: [
1179
- { suffix: '--challenge <value> [options]' },
1180
- { prefix: 'echo <challenge> |', suffix: '[options]' },
1181
- ],
1182
- options: z.object({
1183
- account: z.string().optional().describe('Account name (env: MPPX_ACCOUNT)'),
1184
- challenge: z.string().optional().describe('WWW-Authenticate challenge value'),
1185
- config: z.string().optional().describe('Path to config file'),
1186
- dryRun: z.boolean().optional().describe('Validate and parse the challenge without signing'),
1187
- autoSwap: z.boolean().optional().describe('Auto-swap source tokens into payment currency'),
1188
- methodOpt: z
1189
- .array(z.string())
1190
- .optional()
1191
- .describe('Method-specific option (key=value, repeatable)'),
1192
- network: z.enum(['mainnet', 'testnet']).optional().describe('Tempo network'),
1193
- payWith: z.string().optional().describe('Source token for Tempo auto-swap'),
1194
- rpcUrl: z
1195
- .string()
1196
- .optional()
1197
- .describe('RPC endpoint, defaults to public RPC for chain (env: MPPX_RPC_URL)'),
1198
- slippage: z.number().optional().describe('Tempo auto-swap max slippage percentage'),
1199
- }),
1200
- output: z.object({ authorization: z.string() }),
1201
- alias: {
1202
- account: 'a',
1203
- challenge: 'C',
1204
- config: 'c',
1205
- methodOpt: 'M',
1206
- rpcUrl: 'r',
1207
- },
1208
- async run(c) {
1209
- const raw =
1210
- c.options.challenge ||
1211
- (canReadCommandStdin()
1212
- ? await new Promise<string>((resolve, reject) => {
1213
- let data = ''
1214
- process.stdin.setEncoding('utf-8')
1215
- process.stdin.on('data', (chunk) => {
1216
- data += chunk
1217
- })
1218
- process.stdin.on('end', () => resolve(data.trim()))
1219
- process.stdin.on('error', reject)
1220
- })
1221
- : undefined)
1222
- if (!raw) {
1223
- return c.error({
1224
- code: 'NO_CHALLENGE',
1225
- message: 'No challenge provided. Use --challenge or pipe via stdin.',
1226
- exitCode: 2,
1227
- })
1228
- }
1229
-
1230
- let challenges: Challenge.Challenge[]
1231
- try {
1232
- challenges = Challenge.deserializeList(raw)
1233
- } catch (err) {
1234
- return c.error({
1235
- code: 'INVALID_CHALLENGE',
1236
- message: `Failed to parse challenge: ${err instanceof Error ? err.message : err}`,
1237
- exitCode: 2,
1238
- })
1239
- }
1240
-
1241
- if (c.options.dryRun) {
1242
- process.stderr.write('Challenge is valid.\n')
1243
- return undefined as never
1244
- }
1245
-
1246
- const loaded = await loadConfig(c.options.config)
1247
- const selected = selectChallenge(challenges, loaded?.config)
1248
- if (!selected) {
1249
- const offers = challenges
1250
- .map((challenge) => `${challenge.method}/${challenge.intent}`)
1251
- .join(', ')
1252
- return c.error({
1253
- code: 'UNSUPPORTED_METHOD',
1254
- message: `Unsupported payment method. Server offers: ${offers}. Add it to mppx.config.ts using defineConfig().`,
1255
- exitCode: 2,
1256
- })
1257
- }
1258
-
1259
- const { challenge, plugin, method: configMethod } = selected
1260
- const methodOpts = parseMethodOpts(c.options.methodOpt)
1261
-
1262
- const wwwAuth = Challenge.serialize(challenge)
1263
- const fakeResponse = new Response(null, {
1264
- status: 402,
1265
- headers: { [Constants.Headers.wwwAuthenticate]: wwwAuth },
1266
- })
1267
-
1268
- let credential: string
1269
- if (plugin) {
1270
- const result = await plugin.setup({
1271
- challenge,
1272
- options: {
1273
- account: c.options.account,
1274
- autoSwap: c.options.autoSwap,
1275
- network: c.options.network,
1276
- payWith: c.options.payWith,
1277
- rpcUrl: c.options.rpcUrl,
1278
- slippage: c.options.slippage,
1279
- },
1280
- methodOpts,
1281
- })
1282
- if (result.createCredential) {
1283
- credential = await result.createCredential(fakeResponse)
1284
- } else {
1285
- const mppx = Mppx.create({ methods: result.methods, polyfill: false })
1286
- credential = await mppx.createCredential(
1287
- fakeResponse,
1288
- result.credentialContext as undefined,
1289
- )
1290
- }
1291
- } else if (configMethod) {
1292
- const mppx = Mppx.create({ methods: [configMethod], polyfill: false })
1293
- credential = await mppx.createCredential(fakeResponse)
1294
- } else {
1295
- return c.error({
1296
- code: 'UNSUPPORTED_METHOD',
1297
- message: `Unsupported payment method: ${challenge.method}/${challenge.intent}. Add it to mppx.config.ts using defineConfig().`,
1298
- exitCode: 2,
1299
- })
1300
- }
1301
-
1302
- return outputResult(c, { authorization: credential }, () => {
1303
- console.log(credential)
1304
- })
1305
- },
1306
- })
1307
-
1308
- const init = Cli.create('init', {
1309
- description: 'Create an mppx.config.ts file in the current directory',
1310
- options: z.object({
1311
- force: z.boolean().optional().describe('Overwrite existing config file'),
1312
- }),
1313
- output: z.object({ file: z.string() }),
1314
- alias: { force: 'f' },
1315
- async run(c) {
1316
- const cwd = process.cwd()
1317
-
1318
- // Determine file extension: .ts if tsconfig exists, .mjs if type:module, else .js
1319
- const ext = (() => {
1320
- if (fs.existsSync(path.join(cwd, 'tsconfig.json'))) return '.ts'
1321
- try {
1322
- const pkg = JSON.parse(fs.readFileSync(path.join(cwd, 'package.json'), 'utf-8'))
1323
- if (pkg.type === 'module') return '.mjs'
1324
- } catch {}
1325
- return '.js'
1326
- })()
1327
-
1328
- const filename = `mppx.config${ext}`
1329
- const dest = path.join(cwd, filename)
1330
-
1331
- if (fs.existsSync(dest) && !c.options.force) {
1332
- return c.error({
1333
- code: 'CONFIG_EXISTS',
1334
- message: `${filename} already exists. Use --force to overwrite.`,
1335
- exitCode: 1,
1336
- })
1337
- }
1338
-
1339
- const template = `import { defineConfig } from 'mppx/cli'
1340
-
1341
- export default defineConfig({
1342
- methods: [],
1343
- plugins: [],
1344
- })
1345
- `
1346
-
1347
- fs.writeFileSync(dest, template)
1348
- return outputResult(c, { file: dest }, () => {
1349
- console.log(`Created ${filename}`)
1350
- })
1351
- },
1352
- })
1353
-
1354
- const services = Cli.create('services', {
1355
- description: 'Browse the MPP services registry',
1356
- })
1357
- .command('list', {
1358
- description: 'List registered MPP services',
1359
- options: z.object({
1360
- query: z.string().optional().describe('Filter by id, name, category, tag, or description'),
1361
- }),
1362
- output: z.object({ services: z.array(serviceSummarySchema) }),
1363
- alias: { query: 'q' },
1364
- async run(c) {
1365
- const query = c.options.query?.toLowerCase()
1366
- const registry = await fetchServicesRegistry()
1367
- const filtered = query
1368
- ? registry.filter((service) =>
1369
- [
1370
- service.id,
1371
- service.name,
1372
- service.description,
1373
- ...(Array.isArray(service.categories) ? service.categories : []),
1374
- ...(Array.isArray(service.tags) ? service.tags : []),
1375
- ]
1376
- .filter((value): value is string => typeof value === 'string')
1377
- .some((value) => value.toLowerCase().includes(query)),
1378
- )
1379
- : registry
1380
- const summaries = filtered.map(summarizeService).sort((a, b) => a.id.localeCompare(b.id))
1381
- return outputResult(c, { services: summaries }, () => {
1382
- if (summaries.length === 0) {
1383
- console.log('No services found.')
1384
- return
1385
- }
1386
- const idWidth = Math.max(...summaries.map((service) => service.id.length))
1387
- const paidWidth = Math.max(
1388
- ...summaries.map((service) => String(service.paidEndpoints).length),
1389
- )
1390
- for (const service of summaries) {
1391
- const name = service.name && service.name !== service.id ? ` ${service.name}` : ''
1392
- const url = service.url ? ` ${pc.dim(service.url)}` : ''
1393
- console.log(
1394
- `${service.id.padEnd(idWidth)} ${String(service.paidEndpoints).padStart(paidWidth)} paid${name}${url}`,
1395
- )
1396
- }
1397
- })
1398
- },
1399
- })
1400
- .command('show', {
1401
- description: 'Show one registered MPP service',
1402
- args: z.object({
1403
- service: z.string().describe('Service id or name'),
1404
- }),
1405
- output: z.object({ service: z.record(z.string(), z.unknown()) }),
1406
- async run(c) {
1407
- const registry = await fetchServicesRegistry()
1408
- const service = findService(registry, c.args.service)
1409
- if (!service)
1410
- return c.error({
1411
- code: 'SERVICE_NOT_FOUND',
1412
- message: `Service not found: ${c.args.service}`,
1413
- exitCode: 1,
1414
- })
1415
- const summary = summarizeService(service)
1416
- const endpoints = getEndpoints(service)
1417
- return outputResult(c, { service }, () => {
1418
- console.log(`${summary.name ?? summary.id} ${pc.dim(`(${summary.id})`)}`)
1419
- if (summary.description) console.log(summary.description)
1420
- if (summary.url) console.log(`${pc.dim('URL')} ${link(summary.url, summary.url)}`)
1421
- if (summary.status) console.log(`${pc.dim('Status')} ${summary.status}`)
1422
- console.log(`${pc.dim('Endpoints')} ${endpoints.length} (${summary.paidEndpoints} paid)`)
1423
- const docs = service.docs as Record<string, unknown> | undefined
1424
- const homepage = docs && getString(docs.homepage)
1425
- if (homepage) console.log(`${pc.dim('Docs')} ${link(homepage, homepage)}`)
1426
- })
1427
- },
1428
- })
1429
- .command('endpoints', {
1430
- description: 'List endpoints for a registered MPP service',
1431
- args: z.object({
1432
- service: z.string().describe('Service id or name'),
1433
- }),
1434
- output: z.object({
1435
- endpoints: z.array(serviceEndpointSchema),
1436
- service: serviceSummarySchema,
1437
- }),
1438
- async run(c) {
1439
- const registry = await fetchServicesRegistry()
1440
- const service = findService(registry, c.args.service)
1441
- if (!service)
1442
- return c.error({
1443
- code: 'SERVICE_NOT_FOUND',
1444
- message: `Service not found: ${c.args.service}`,
1445
- exitCode: 1,
1446
- })
1447
- const summary = summarizeService(service)
1448
- const endpoints = getEndpoints(service).map(summarizeEndpoint)
1449
- return outputResult(c, { endpoints, service: summary }, () => {
1450
- if (endpoints.length === 0) {
1451
- console.log(`No endpoints found for ${summary.id}.`)
1452
- return
1453
- }
1454
- const methodWidth = Math.max(...endpoints.map((endpoint) => endpoint.method.length))
1455
- const pathWidth = Math.max(...endpoints.map((endpoint) => endpoint.path.length))
1456
- for (const endpoint of endpoints) {
1457
- const payment = formatPayment(endpoint.payment)
1458
- const description = endpoint.description ? ` ${pc.dim(endpoint.description)}` : ''
1459
- console.log(
1460
- `${endpoint.method.padEnd(methodWidth)} ${endpoint.path.padEnd(pathWidth)} ${payment}${description}`,
1461
- )
1462
- }
1463
- })
1464
- },
1465
- })
1466
-
1467
- const discover = Cli.create('discover', {
1468
- description: 'Discovery tooling',
1469
- })
1470
- .command('generate', {
1471
- description: 'Generate a static OpenAPI discovery document from a module',
1472
- args: z.object({
1473
- module: z.string().describe('Path to a module that default-exports a discovery config'),
1474
- }),
1475
- options: z.object({
1476
- output: z.string().optional().describe('Write output to a file instead of stdout'),
1477
- }),
1478
- output: z.record(z.string(), z.unknown()),
1479
- alias: { output: 'o' },
1480
- async run(c) {
1481
- const modulePath = path.resolve(c.args.module)
1482
- if (!fs.existsSync(modulePath)) {
1483
- return c.error({
1484
- code: 'MODULE_NOT_FOUND',
1485
- message: `Module not found: ${modulePath}`,
1486
- exitCode: 1,
1487
- })
1488
- }
1489
-
1490
- let mod: Record<string, unknown>
1491
- try {
1492
- mod = await import(modulePath)
1493
- } catch (error) {
1494
- return c.error({
1495
- code: 'MODULE_IMPORT_FAILED',
1496
- message: `Failed to import module: ${(error as Error).message}`,
1497
- exitCode: 1,
1498
- })
1499
- }
1500
-
1501
- const exported = (mod.default ?? mod) as Record<string, unknown>
1502
-
1503
- // If the export is already a plain OpenAPI doc (has `openapi` key), use it directly.
1504
- // Otherwise, expect { mppx, ...GenerateConfig } and call generate().
1505
- let doc: Record<string, unknown>
1506
- if (typeof exported.openapi === 'string') {
1507
- doc = exported
1508
- } else {
1509
- const { generate } = await import('../discovery/OpenApi.js')
1510
- const mppx = exported.mppx as { methods: readonly any[]; realm: string }
1511
- if (!mppx) {
1512
- return c.error({
1513
- code: 'INVALID_MODULE',
1514
- message:
1515
- 'Module must default-export an OpenAPI document (with `openapi` key) or an object with `mppx` (server instance) and `routes`.',
1516
- exitCode: 1,
1517
- })
1518
- }
1519
- doc = generate(mppx, exported as any)
1520
- }
1521
-
1522
- const json = JSON.stringify(doc, null, 2)
1523
- if (c.options.output) {
1524
- const outPath = path.resolve(c.options.output)
1525
- fs.writeFileSync(outPath, `${json}\n`)
1526
- process.stderr.write(`Wrote ${outPath}\n`)
1527
- return outputResult(c, doc, () => {})
1528
- } else {
1529
- return outputResult(c, doc, () => {
1530
- console.log(json)
1531
- })
1532
- }
1533
- },
1534
- })
1535
- .command('validate', {
1536
- description: 'Validate an OpenAPI discovery document from a file or URL',
1537
- args: z.object({
1538
- input: z.string().describe('Path or URL to a discovery document'),
1539
- }),
1540
- output: z.object({
1541
- errorCount: z.number(),
1542
- issues: z.array(discoveryIssueSchema),
1543
- valid: z.boolean(),
1544
- warningCount: z.number(),
1545
- }),
1546
- async run(c) {
1547
- const input = c.args.input
1548
- let raw: string
1549
- if (/^https?:\/\//.test(input)) {
1550
- const controller = new AbortController()
1551
- const timeout = setTimeout(() => controller.abort(), 30_000)
1552
- let response: Response
1553
- try {
1554
- response = await globalThis.fetch(input, { signal: controller.signal })
1555
- } catch (error) {
1556
- clearTimeout(timeout)
1557
- const msg =
1558
- error instanceof DOMException && error.name === 'AbortError'
1559
- ? 'Request timed out after 30s'
1560
- : (error as Error).message
1561
- return c.error({
1562
- code: 'DISCOVERY_FETCH_FAILED',
1563
- message: `Failed to fetch discovery document: ${msg}`,
1564
- exitCode: 1,
1565
- })
1566
- }
1567
- clearTimeout(timeout)
1568
- if (!response.ok) {
1569
- return c.error({
1570
- code: 'DISCOVERY_FETCH_FAILED',
1571
- message: `Failed to fetch discovery document: HTTP ${response.status}`,
1572
- exitCode: 1,
1573
- })
1574
- }
1575
- const maxSize = 10 * 1024 * 1024 // 10 MB
1576
- const contentLength = response.headers.get('content-length')
1577
- if (contentLength && Number(contentLength) > maxSize) {
1578
- return c.error({
1579
- code: 'DISCOVERY_TOO_LARGE',
1580
- message: `Discovery document exceeds 10 MB limit`,
1581
- exitCode: 1,
1582
- })
1583
- }
1584
- raw = await response.text()
1585
- if (raw.length > maxSize) {
1586
- return c.error({
1587
- code: 'DISCOVERY_TOO_LARGE',
1588
- message: `Discovery document exceeds 10 MB limit`,
1589
- exitCode: 1,
1590
- })
1591
- }
1592
- } else {
1593
- const resolved = path.resolve(input)
1594
- if (!fs.existsSync(resolved)) {
1595
- return c.error({
1596
- code: 'DISCOVERY_NOT_FOUND',
1597
- message: `Discovery document not found: ${resolved}`,
1598
- exitCode: 1,
1599
- })
1600
- }
1601
- raw = fs.readFileSync(resolved, 'utf-8')
1602
- }
1603
-
1604
- let doc: unknown
1605
- try {
1606
- doc = JSON.parse(raw)
1607
- } catch (error) {
1608
- return c.error({
1609
- code: 'DISCOVERY_INVALID_JSON',
1610
- message: `Invalid discovery JSON: ${(error as Error).message}`,
1611
- exitCode: 1,
1612
- })
1613
- }
1614
-
1615
- const issues = validateDiscovery(doc)
1616
- if (!shouldReturnStructured(c))
1617
- for (const issue of issues)
1618
- console.log(`[${issue.severity}] ${issue.path}: ${issue.message}`)
1619
-
1620
- const errorCount = issues.filter((issue) => issue.severity === 'error').length
1621
- const warningCount = issues.filter((issue) => issue.severity === 'warning').length
1622
-
1623
- if (errorCount > 0) {
1624
- return c.error({
1625
- code: 'DISCOVERY_INVALID',
1626
- message: `Discovery document has ${errorCount} error(s) and ${warningCount} warning(s).`,
1627
- exitCode: 1,
1628
- })
1629
- }
1630
-
1631
- return outputResult(c, { errorCount, issues, valid: true, warningCount }, () => {
1632
- console.log(
1633
- warningCount > 0
1634
- ? `Discovery document is valid with ${warningCount} warning(s).`
1635
- : 'Discovery document is valid.',
1636
- )
1637
- })
1638
- },
1639
- })
1640
-
1641
- cli.command(account)
1642
- cli.command(discover)
1643
- cli.command(init)
1644
- cli.command(services)
1645
- cli.command(sessions)
1646
- cli.command(sign)
1647
- cli.command(validate)
1648
-
1649
- export default cli