@absol-labs/agent 0.11.0 → 0.12.0-rc.1

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 (350) hide show
  1. package/README.md +42 -50
  2. package/dist/capability/invocation-capability.d.ts +2 -2
  3. package/dist/capability/probe-capability.d.ts +225 -0
  4. package/dist/capability/probe-capability.d.ts.map +1 -0
  5. package/dist/capability/probe-capability.js +248 -0
  6. package/dist/capability/probe-capability.js.map +1 -0
  7. package/dist/cli/args.d.ts +11 -0
  8. package/dist/cli/args.d.ts.map +1 -1
  9. package/dist/cli/args.js +23 -0
  10. package/dist/cli/args.js.map +1 -1
  11. package/dist/cli/commands/claim.js +1 -1
  12. package/dist/cli/commands/claim.js.map +1 -1
  13. package/dist/cli/commands/close.d.ts.map +1 -1
  14. package/dist/cli/commands/close.js +35 -3
  15. package/dist/cli/commands/close.js.map +1 -1
  16. package/dist/cli/commands/invoke.d.ts +2 -0
  17. package/dist/cli/commands/invoke.d.ts.map +1 -1
  18. package/dist/cli/commands/invoke.js +2 -2
  19. package/dist/cli/commands/invoke.js.map +1 -1
  20. package/dist/cli/commands/mcp.d.ts.map +1 -1
  21. package/dist/cli/commands/mcp.js +15 -2
  22. package/dist/cli/commands/mcp.js.map +1 -1
  23. package/dist/cli/commands/open.d.ts.map +1 -1
  24. package/dist/cli/commands/open.js +58 -4
  25. package/dist/cli/commands/open.js.map +1 -1
  26. package/dist/cli/commands/pay.d.ts +19 -0
  27. package/dist/cli/commands/pay.d.ts.map +1 -0
  28. package/dist/cli/commands/pay.js +355 -0
  29. package/dist/cli/commands/pay.js.map +1 -0
  30. package/dist/cli/commands/reclaim-unverified.d.ts.map +1 -1
  31. package/dist/cli/commands/reclaim-unverified.js +3 -2
  32. package/dist/cli/commands/reclaim-unverified.js.map +1 -1
  33. package/dist/cli/commands/reclaim.d.ts +23 -2
  34. package/dist/cli/commands/reclaim.d.ts.map +1 -1
  35. package/dist/cli/commands/reclaim.js +184 -16
  36. package/dist/cli/commands/reclaim.js.map +1 -1
  37. package/dist/cli/commands/refund.d.ts +13 -0
  38. package/dist/cli/commands/refund.d.ts.map +1 -0
  39. package/dist/cli/commands/refund.js +224 -0
  40. package/dist/cli/commands/refund.js.map +1 -0
  41. package/dist/cli/commands/status.d.ts.map +1 -1
  42. package/dist/cli/commands/status.js +10 -1
  43. package/dist/cli/commands/status.js.map +1 -1
  44. package/dist/cli/commands/streams.js +8 -12
  45. package/dist/cli/commands/streams.js.map +1 -1
  46. package/dist/cli/commands/watch.d.ts.map +1 -1
  47. package/dist/cli/commands/watch.js +2 -1
  48. package/dist/cli/commands/watch.js.map +1 -1
  49. package/dist/cli/config.d.ts +44 -26
  50. package/dist/cli/config.d.ts.map +1 -1
  51. package/dist/cli/config.js +88 -38
  52. package/dist/cli/config.js.map +1 -1
  53. package/dist/cli/deps.d.ts +33 -0
  54. package/dist/cli/deps.d.ts.map +1 -1
  55. package/dist/cli/deps.js +37 -1
  56. package/dist/cli/deps.js.map +1 -1
  57. package/dist/cli/errors.d.ts.map +1 -1
  58. package/dist/cli/errors.js +21 -1
  59. package/dist/cli/errors.js.map +1 -1
  60. package/dist/cli/escape-hatch.d.ts +6 -4
  61. package/dist/cli/escape-hatch.d.ts.map +1 -1
  62. package/dist/cli/escape-hatch.js +6 -2
  63. package/dist/cli/escape-hatch.js.map +1 -1
  64. package/dist/cli/listings.d.ts +18 -0
  65. package/dist/cli/listings.d.ts.map +1 -1
  66. package/dist/cli/listings.js +22 -12
  67. package/dist/cli/listings.js.map +1 -1
  68. package/dist/cli/preflight.d.ts +20 -14
  69. package/dist/cli/preflight.d.ts.map +1 -1
  70. package/dist/cli/preflight.js +34 -20
  71. package/dist/cli/preflight.js.map +1 -1
  72. package/dist/cli/privy.d.ts.map +1 -1
  73. package/dist/cli/privy.js +4 -2
  74. package/dist/cli/privy.js.map +1 -1
  75. package/dist/cli/reclaimability.d.ts +82 -0
  76. package/dist/cli/reclaimability.d.ts.map +1 -0
  77. package/dist/cli/reclaimability.js +80 -0
  78. package/dist/cli/reclaimability.js.map +1 -0
  79. package/dist/cli/run.d.ts +2 -1
  80. package/dist/cli/run.d.ts.map +1 -1
  81. package/dist/cli/run.js +40 -11
  82. package/dist/cli/run.js.map +1 -1
  83. package/dist/cli/scan-range.d.ts +2 -2
  84. package/dist/cli/scan-range.js +2 -2
  85. package/dist/cli/status.d.ts +3 -1
  86. package/dist/cli/status.d.ts.map +1 -1
  87. package/dist/cli/status.js +15 -3
  88. package/dist/cli/status.js.map +1 -1
  89. package/dist/cli/wallet.d.ts +1 -1
  90. package/dist/cli/wallet.js +2 -2
  91. package/dist/cli/wallet.js.map +1 -1
  92. package/dist/discovery/rate-band.d.ts +74 -0
  93. package/dist/discovery/rate-band.d.ts.map +1 -0
  94. package/dist/discovery/rate-band.js +114 -0
  95. package/dist/discovery/rate-band.js.map +1 -0
  96. package/dist/escrow-generation.d.ts +81 -0
  97. package/dist/escrow-generation.d.ts.map +1 -0
  98. package/dist/escrow-generation.js +76 -0
  99. package/dist/escrow-generation.js.map +1 -0
  100. package/dist/frameworks/agentkit.d.ts +8 -4
  101. package/dist/frameworks/agentkit.d.ts.map +1 -1
  102. package/dist/frameworks/agentkit.js +27 -10
  103. package/dist/frameworks/agentkit.js.map +1 -1
  104. package/dist/frameworks/eliza.d.ts +3 -3
  105. package/dist/frameworks/eliza.d.ts.map +1 -1
  106. package/dist/frameworks/eliza.js +15 -6
  107. package/dist/frameworks/eliza.js.map +1 -1
  108. package/dist/frameworks/langchain.d.ts.map +1 -1
  109. package/dist/frameworks/langchain.js +8 -0
  110. package/dist/frameworks/langchain.js.map +1 -1
  111. package/dist/gateway/caller-auth-gateway.d.ts +83 -31
  112. package/dist/gateway/caller-auth-gateway.d.ts.map +1 -1
  113. package/dist/gateway/caller-auth-gateway.js +180 -27
  114. package/dist/gateway/caller-auth-gateway.js.map +1 -1
  115. package/dist/gateway/http-server.d.ts +111 -44
  116. package/dist/gateway/http-server.d.ts.map +1 -1
  117. package/dist/gateway/http-server.js +439 -155
  118. package/dist/gateway/http-server.js.map +1 -1
  119. package/dist/gateway/probe-auth.d.ts +112 -0
  120. package/dist/gateway/probe-auth.d.ts.map +1 -0
  121. package/dist/gateway/probe-auth.js +127 -0
  122. package/dist/gateway/probe-auth.js.map +1 -0
  123. package/dist/gateway/signed-rate-bounds.d.ts +51 -0
  124. package/dist/gateway/signed-rate-bounds.d.ts.map +1 -0
  125. package/dist/gateway/signed-rate-bounds.js +94 -0
  126. package/dist/gateway/signed-rate-bounds.js.map +1 -0
  127. package/dist/gateway/x402-opener-mode.d.ts +215 -0
  128. package/dist/gateway/x402-opener-mode.d.ts.map +1 -0
  129. package/dist/gateway/x402-opener-mode.js +639 -0
  130. package/dist/gateway/x402-opener-mode.js.map +1 -0
  131. package/dist/index.d.ts +6 -2
  132. package/dist/index.d.ts.map +1 -1
  133. package/dist/index.js +10 -5
  134. package/dist/index.js.map +1 -1
  135. package/dist/mcp/server.d.ts +52 -1
  136. package/dist/mcp/server.d.ts.map +1 -1
  137. package/dist/mcp/server.js +228 -37
  138. package/dist/mcp/server.js.map +1 -1
  139. package/dist/mcp/x402-tools.d.ts +104 -0
  140. package/dist/mcp/x402-tools.d.ts.map +1 -0
  141. package/dist/mcp/x402-tools.js +434 -0
  142. package/dist/mcp/x402-tools.js.map +1 -0
  143. package/dist/network.d.ts +119 -0
  144. package/dist/network.d.ts.map +1 -0
  145. package/dist/network.js +199 -0
  146. package/dist/network.js.map +1 -0
  147. package/dist/sdk/invoke.d.ts +4 -0
  148. package/dist/sdk/invoke.d.ts.map +1 -1
  149. package/dist/sdk/invoke.js +2 -5
  150. package/dist/sdk/invoke.js.map +1 -1
  151. package/dist/wallet/autonomous-wallet-broker.d.ts +3 -0
  152. package/dist/wallet/autonomous-wallet-broker.d.ts.map +1 -1
  153. package/dist/wallet/autonomous-wallet-broker.js +27 -23
  154. package/dist/wallet/autonomous-wallet-broker.js.map +1 -1
  155. package/dist/wallet/autonomous-wallet-protocol.d.ts +8 -2
  156. package/dist/wallet/autonomous-wallet-protocol.d.ts.map +1 -1
  157. package/dist/wallet/autonomous-wallet-protocol.js +9 -2
  158. package/dist/wallet/autonomous-wallet-protocol.js.map +1 -1
  159. package/dist/wallet/autonomous-wallet.d.ts.map +1 -1
  160. package/dist/wallet/autonomous-wallet.js +3 -2
  161. package/dist/wallet/autonomous-wallet.js.map +1 -1
  162. package/dist/wallet/broker-escrows.d.ts +222 -0
  163. package/dist/wallet/broker-escrows.d.ts.map +1 -0
  164. package/dist/wallet/broker-escrows.js +36 -0
  165. package/dist/wallet/broker-escrows.js.map +1 -0
  166. package/dist/wallet/lifecycle.d.ts +21 -5
  167. package/dist/wallet/lifecycle.d.ts.map +1 -1
  168. package/dist/wallet/lifecycle.js +32 -12
  169. package/dist/wallet/lifecycle.js.map +1 -1
  170. package/dist/wallet/privy-broker-server.d.ts.map +1 -1
  171. package/dist/wallet/privy-broker-server.js +31 -26
  172. package/dist/wallet/privy-broker-server.js.map +1 -1
  173. package/dist/wallet/privy-session-broker.d.ts +14 -5
  174. package/dist/wallet/privy-session-broker.d.ts.map +1 -1
  175. package/dist/wallet/privy-session-broker.js +29 -17
  176. package/dist/wallet/privy-session-broker.js.map +1 -1
  177. package/dist/wallet/privy-session-provider.d.ts +3 -1
  178. package/dist/wallet/privy-session-provider.d.ts.map +1 -1
  179. package/dist/wallet/privy-session-provider.js +5 -3
  180. package/dist/wallet/privy-session-provider.js.map +1 -1
  181. package/dist/wallet/provider.d.ts.map +1 -1
  182. package/dist/wallet/provider.js +15 -8
  183. package/dist/wallet/provider.js.map +1 -1
  184. package/dist/x402/facilitator.d.ts +3 -30
  185. package/dist/x402/facilitator.d.ts.map +1 -1
  186. package/dist/x402/facilitator.js +0 -27
  187. package/dist/x402/facilitator.js.map +1 -1
  188. package/dist/x402-buyer/guarded-fetch.d.ts +51 -0
  189. package/dist/x402-buyer/guarded-fetch.d.ts.map +1 -0
  190. package/dist/x402-buyer/guarded-fetch.js +147 -0
  191. package/dist/x402-buyer/guarded-fetch.js.map +1 -0
  192. package/dist/x402-buyer/index.d.ts +10 -0
  193. package/dist/x402-buyer/index.d.ts.map +1 -0
  194. package/dist/x402-buyer/index.js +10 -0
  195. package/dist/x402-buyer/index.js.map +1 -0
  196. package/dist/x402-buyer/pay.d.ts +135 -0
  197. package/dist/x402-buyer/pay.d.ts.map +1 -0
  198. package/dist/x402-buyer/pay.js +336 -0
  199. package/dist/x402-buyer/pay.js.map +1 -0
  200. package/dist/x402-opener/abi.d.ts +684 -0
  201. package/dist/x402-opener/abi.d.ts.map +1 -0
  202. package/dist/x402-opener/abi.js +880 -0
  203. package/dist/x402-opener/abi.js.map +1 -0
  204. package/dist/x402-opener/facilitator-entry.d.ts +3 -0
  205. package/dist/x402-opener/facilitator-entry.d.ts.map +1 -0
  206. package/dist/x402-opener/facilitator-entry.js +37 -0
  207. package/dist/x402-opener/facilitator-entry.js.map +1 -0
  208. package/dist/x402-opener/facilitator-server.d.ts +180 -0
  209. package/dist/x402-opener/facilitator-server.d.ts.map +1 -0
  210. package/dist/x402-opener/facilitator-server.js +696 -0
  211. package/dist/x402-opener/facilitator-server.js.map +1 -0
  212. package/dist/x402-opener/index.d.ts +14 -0
  213. package/dist/x402-opener/index.d.ts.map +1 -0
  214. package/dist/x402-opener/index.js +14 -0
  215. package/dist/x402-opener/index.js.map +1 -0
  216. package/dist/x402-opener/listing-resolver.d.ts +55 -0
  217. package/dist/x402-opener/listing-resolver.d.ts.map +1 -0
  218. package/dist/x402-opener/listing-resolver.js +125 -0
  219. package/dist/x402-opener/listing-resolver.js.map +1 -0
  220. package/dist/x402-opener/refund-relay.d.ts +240 -0
  221. package/dist/x402-opener/refund-relay.d.ts.map +1 -0
  222. package/dist/x402-opener/refund-relay.js +1240 -0
  223. package/dist/x402-opener/refund-relay.js.map +1 -0
  224. package/dist/x402-opener/relayer-queue.d.ts +14 -0
  225. package/dist/x402-opener/relayer-queue.d.ts.map +1 -0
  226. package/dist/x402-opener/relayer-queue.js +18 -0
  227. package/dist/x402-opener/relayer-queue.js.map +1 -0
  228. package/dist/x402-opener/scheme.d.ts +217 -0
  229. package/dist/x402-opener/scheme.d.ts.map +1 -0
  230. package/dist/x402-opener/scheme.js +749 -0
  231. package/dist/x402-opener/scheme.js.map +1 -0
  232. package/dist/x402-opener/terms.d.ts +105 -0
  233. package/dist/x402-opener/terms.d.ts.map +1 -0
  234. package/dist/x402-opener/terms.js +212 -0
  235. package/dist/x402-opener/terms.js.map +1 -0
  236. package/dist/zktls/reclaim.d.ts +2 -2
  237. package/dist/zktls/t2-delivery-proof.d.ts +6 -6
  238. package/docs/agent-layer.md +3 -2
  239. package/docs/autonomous-privy-wallet.md +188 -0
  240. package/docs/cli.md +184 -31
  241. package/docs/langchain.md +5 -0
  242. package/docs/mcp-reference.md +75 -5
  243. package/docs/probe-capability.md +191 -0
  244. package/docs/quickstart.md +36 -1
  245. package/docs/threat-model.md +20 -0
  246. package/docs/x402.md +628 -595
  247. package/package.json +19 -17
  248. package/src/capability/probe-capability.ts +355 -0
  249. package/src/cli/args.ts +29 -0
  250. package/src/cli/commands/claim.ts +1 -1
  251. package/src/cli/commands/close.ts +36 -3
  252. package/src/cli/commands/invoke.ts +5 -2
  253. package/src/cli/commands/mcp.ts +18 -2
  254. package/src/cli/commands/open.ts +75 -4
  255. package/src/cli/commands/pay.ts +442 -0
  256. package/src/cli/commands/reclaim-unverified.ts +8 -2
  257. package/src/cli/commands/reclaim.ts +252 -14
  258. package/src/cli/commands/refund.ts +277 -0
  259. package/src/cli/commands/status.ts +17 -1
  260. package/src/cli/commands/streams.ts +10 -14
  261. package/src/cli/commands/watch.ts +7 -1
  262. package/src/cli/config.ts +139 -52
  263. package/src/cli/deps.ts +74 -1
  264. package/src/cli/errors.ts +24 -1
  265. package/src/cli/escape-hatch.ts +19 -5
  266. package/src/cli/listings.ts +43 -10
  267. package/src/cli/preflight.ts +36 -21
  268. package/src/cli/privy.ts +4 -2
  269. package/src/cli/reclaimability.ts +154 -0
  270. package/src/cli/run.ts +54 -11
  271. package/src/cli/scan-range.ts +2 -2
  272. package/src/cli/status.ts +14 -1
  273. package/src/cli/wallet.ts +2 -2
  274. package/src/discovery/rate-band.ts +172 -0
  275. package/src/escrow-generation.ts +135 -0
  276. package/src/frameworks/agentkit.ts +45 -11
  277. package/src/frameworks/eliza.ts +27 -5
  278. package/src/frameworks/langchain.ts +14 -0
  279. package/src/gateway/caller-auth-gateway.ts +320 -68
  280. package/src/gateway/http-server.ts +629 -220
  281. package/src/gateway/probe-auth.ts +191 -0
  282. package/src/gateway/signed-rate-bounds.ts +164 -0
  283. package/src/gateway/x402-opener-mode.ts +974 -0
  284. package/src/index.ts +82 -19
  285. package/src/mcp/server.ts +319 -42
  286. package/src/mcp/x402-tools.ts +621 -0
  287. package/src/network.ts +302 -0
  288. package/src/sdk/invoke.ts +6 -5
  289. package/src/wallet/autonomous-wallet-broker.ts +46 -20
  290. package/src/wallet/autonomous-wallet-protocol.ts +11 -2
  291. package/src/wallet/autonomous-wallet.ts +4 -2
  292. package/src/wallet/broker-escrows.ts +66 -0
  293. package/src/wallet/lifecycle.ts +53 -18
  294. package/src/wallet/privy-broker-server.ts +35 -25
  295. package/src/wallet/privy-session-broker.ts +58 -25
  296. package/src/wallet/privy-session-provider.ts +7 -3
  297. package/src/wallet/provider.ts +20 -15
  298. package/src/x402/facilitator.ts +3 -43
  299. package/src/x402-buyer/guarded-fetch.ts +213 -0
  300. package/src/x402-buyer/index.ts +9 -0
  301. package/src/x402-buyer/pay.ts +517 -0
  302. package/src/x402-opener/abi.ts +881 -0
  303. package/src/x402-opener/facilitator-entry.ts +45 -0
  304. package/src/x402-opener/facilitator-server.ts +1014 -0
  305. package/src/x402-opener/index.ts +13 -0
  306. package/src/x402-opener/listing-resolver.ts +202 -0
  307. package/src/x402-opener/refund-relay.ts +1743 -0
  308. package/src/x402-opener/relayer-queue.ts +18 -0
  309. package/src/x402-opener/scheme.ts +1133 -0
  310. package/src/x402-opener/terms.ts +300 -0
  311. package/dist/gateway/x402-mode.d.ts +0 -123
  312. package/dist/gateway/x402-mode.d.ts.map +0 -1
  313. package/dist/gateway/x402-mode.js +0 -212
  314. package/dist/gateway/x402-mode.js.map +0 -1
  315. package/dist/x402/delivery-oracle.d.ts +0 -108
  316. package/dist/x402/delivery-oracle.d.ts.map +0 -1
  317. package/dist/x402/delivery-oracle.js +0 -174
  318. package/dist/x402/delivery-oracle.js.map +0 -1
  319. package/dist/x402/facilitator-server-entry.d.ts +0 -3
  320. package/dist/x402/facilitator-server-entry.d.ts.map +0 -1
  321. package/dist/x402/facilitator-server-entry.js +0 -27
  322. package/dist/x402/facilitator-server-entry.js.map +0 -1
  323. package/dist/x402/facilitator-server.d.ts +0 -73
  324. package/dist/x402/facilitator-server.d.ts.map +0 -1
  325. package/dist/x402/facilitator-server.js +0 -305
  326. package/dist/x402/facilitator-server.js.map +0 -1
  327. package/dist/x402/payment-requirements.d.ts +0 -106
  328. package/dist/x402/payment-requirements.d.ts.map +0 -1
  329. package/dist/x402/payment-requirements.js +0 -138
  330. package/dist/x402/payment-requirements.js.map +0 -1
  331. package/dist/x402/relayer.d.ts +0 -41
  332. package/dist/x402/relayer.d.ts.map +0 -1
  333. package/dist/x402/relayer.js +0 -64
  334. package/dist/x402/relayer.js.map +0 -1
  335. package/dist/x402/resource-index.d.ts +0 -75
  336. package/dist/x402/resource-index.d.ts.map +0 -1
  337. package/dist/x402/resource-index.js +0 -126
  338. package/dist/x402/resource-index.js.map +0 -1
  339. package/dist/x402/verified-delivery-facilitator.d.ts +0 -285
  340. package/dist/x402/verified-delivery-facilitator.d.ts.map +0 -1
  341. package/dist/x402/verified-delivery-facilitator.js +0 -423
  342. package/dist/x402/verified-delivery-facilitator.js.map +0 -1
  343. package/src/gateway/x402-mode.ts +0 -350
  344. package/src/x402/delivery-oracle.ts +0 -285
  345. package/src/x402/facilitator-server-entry.ts +0 -35
  346. package/src/x402/facilitator-server.ts +0 -445
  347. package/src/x402/payment-requirements.ts +0 -231
  348. package/src/x402/relayer.ts +0 -122
  349. package/src/x402/resource-index.ts +0 -228
  350. package/src/x402/verified-delivery-facilitator.ts +0 -744
@@ -0,0 +1,104 @@
1
+ import type { MetrikNetwork } from "@absol-labs/sdk";
2
+ import type { RefundClient, X402PayerSigner } from "@absol-labs/sdk/x402";
3
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
4
+ import { type SignedSpendMandate } from "../mandates/mandate.js";
5
+ import { type LookupFn } from "../x402-buyer/guarded-fetch.js";
6
+ import type { PayX402WithMandateInput, PayX402WithMandateResult } from "../x402-buyer/pay.js";
7
+ /**
8
+ * The MCP surface for x402 (metrik-agent#121 item 4): `x402_pay`,
9
+ * `refund_status`, `refund`. Registered only when the server is given an
10
+ * {@link McpX402Options}; every existing tool is unchanged.
11
+ *
12
+ * `x402_pay` is gated exactly like `hire_verified_service`: the SAME server
13
+ * mandate, the SAME per-owner serialization, the SAME cumulative spend
14
+ * (`getSpentSoFarUsdc`, which counts the stream this payment opens once it is
15
+ * recorded), and `checkMandate()` on the payment's opener terms before the SDK
16
+ * signs anything (see `../x402-buyer/pay.ts`).
17
+ */
18
+ export declare const X402_PAY_TOOL_DESCRIPTION = "Pay an x402 endpoint (HTTP 402 Payment Required, x402 v2 'exact') and return its response. A Metrik x402 seller quotes a payment that opens an escrow STREAM with deposit = price; the seller earns ratePerSecond x VERIFIED seconds, capped at the deposit, and the unearned remainder stays recoverable by this server's wallet. Subject to the agent's spend mandate (price vs per-stream and total caps, rate, duration, operator), checked BEFORE anything is signed. Refunds are NOT automatic: use refund_status and refund with the returned streamId.";
19
+ export declare const REFUND_STATUS_TOOL_DESCRIPTION = "Read the refund state of a stream this server paid for over x402, from the seller's gasless refund relay: whether it is running, what is reclaimable, and the next step (close / wait / reclaim). Moves no funds.";
20
+ export declare const REFUND_TOOL_DESCRIPTION = "Recover the unearned part of an x402 payment through the seller's gasless refund relay: close=true stops the stream (this wallet signs the opener's Close; the relay pays the gas), reclaim=true sends the permissionless reclaim (the refund always goes to the payer). Nothing is refunded automatically; reclaim waits for the settlement window and may say when to retry.";
21
+ export interface McpX402Options {
22
+ /** The payer: this server's own wallet (must own the server mandate). */
23
+ readonly signer: X402PayerSigner;
24
+ readonly network: MetrikNetwork;
25
+ /** Mandate-gated payer. Default: `payX402WithMandate` (lazily loaded). */
26
+ readonly pay?: (input: PayX402WithMandateInput) => Promise<PayX402WithMandateResult>;
27
+ /** Refund relay client factory. Default: the SDK's `refundClient`. */
28
+ readonly refundClient?: (target: {
29
+ readonly refundUrl: string;
30
+ readonly streamId: `0x${string}`;
31
+ readonly opener?: `0x${string}`;
32
+ /** The guarded fetch the relay client must use. */
33
+ readonly fetch?: typeof fetch;
34
+ }) => Promise<RefundClient>;
35
+ /** Passed to the SDK payer (e.g. a transport for the on-chain checks). */
36
+ readonly sdkOptions?: PayX402WithMandateInput["sdkOptions"];
37
+ /** Chain reads after a post-signature failure (see `payX402WithMandate`). */
38
+ readonly chainReader?: PayX402WithMandateInput["chainReader"];
39
+ /**
40
+ * `METRIK_AGENT_X402_ALLOWED_HOSTS`: the only hosts x402_pay / refund /
41
+ * refund_status may contact (exact, or `*.domain`). Unset = any PUBLIC host.
42
+ */
43
+ readonly allowedHosts?: readonly string[];
44
+ /** Base fetch under the outbound guard (tests). Default `globalThis.fetch`. */
45
+ readonly fetch?: typeof fetch;
46
+ /** DNS resolution for the outbound guard (tests). */
47
+ readonly lookup?: LookupFn;
48
+ /**
49
+ * Local development / fork tests ONLY: let the outbound guard reach
50
+ * loopback and private addresses (and plain http). Never set from env.
51
+ */
52
+ readonly allowPrivateNetworks?: boolean;
53
+ }
54
+ /** What the server shares with these tools (its mandate state and registry). */
55
+ export interface McpX402Context {
56
+ readonly x402: McpX402Options;
57
+ readonly resolveMandate: () => SignedSpendMandate | Promise<SignedSpendMandate>;
58
+ readonly getSpentSoFarUsdc: (owner: `0x${string}`) => Promise<bigint>;
59
+ readonly getRevokedMandateIds: (owner: `0x${string}`) => Promise<readonly `0x${string}`[]>;
60
+ readonly serialize: <T>(owner: `0x${string}`, task: () => Promise<T>) => Promise<T>;
61
+ readonly recordStream: (record: {
62
+ readonly streamId: `0x${string}`;
63
+ readonly buyer: `0x${string}`;
64
+ readonly operator: `0x${string}`;
65
+ readonly serviceRef: `0x${string}`;
66
+ readonly budgetUsdc: bigint;
67
+ readonly ratePerSecondUsdc: bigint;
68
+ readonly maxDurationSeconds: number;
69
+ readonly openedAtSeconds: number;
70
+ readonly mandateId: `0x${string}`;
71
+ readonly refundUrl?: string;
72
+ readonly opener?: `0x${string}`;
73
+ readonly x402Reservation?: boolean;
74
+ }) => Promise<void>;
75
+ /** Drop a record (a released reservation). Absent = reservations are kept. */
76
+ readonly removeStream?: (streamId: `0x${string}`) => Promise<void>;
77
+ readonly findStream: (streamId: `0x${string}`) => Promise<{
78
+ readonly refundUrl?: string;
79
+ readonly opener?: `0x${string}`;
80
+ } | null>;
81
+ readonly now: () => number;
82
+ readonly ok: (text: string, structured?: Record<string, unknown>) => {
83
+ content: {
84
+ type: "text";
85
+ text: string;
86
+ }[];
87
+ };
88
+ readonly fail: (text: string) => {
89
+ content: {
90
+ type: "text";
91
+ text: string;
92
+ }[];
93
+ isError: boolean;
94
+ };
95
+ readonly unexpected: (error: unknown) => {
96
+ content: {
97
+ type: "text";
98
+ text: string;
99
+ }[];
100
+ isError: boolean;
101
+ };
102
+ }
103
+ export declare function registerX402Tools(mcpServer: McpServer, ctx: McpX402Context): void;
104
+ //# sourceMappingURL=x402-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"x402-tools.d.ts","sourceRoot":"","sources":["../../src/mcp/x402-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,434 @@
1
+ import { z } from "zod";
2
+ import { verifyMandateOwnerSignature, } from "../mandates/mandate.js";
3
+ import { keccak256, toHex } from "viem";
4
+ import { assertOutboundUrlAllowed, createGuardedFetch, OutboundRequestRefusedError, } from "../x402-buyer/guarded-fetch.js";
5
+ /**
6
+ * The MCP surface for x402 (metrik-agent#121 item 4): `x402_pay`,
7
+ * `refund_status`, `refund`. Registered only when the server is given an
8
+ * {@link McpX402Options}; every existing tool is unchanged.
9
+ *
10
+ * `x402_pay` is gated exactly like `hire_verified_service`: the SAME server
11
+ * mandate, the SAME per-owner serialization, the SAME cumulative spend
12
+ * (`getSpentSoFarUsdc`, which counts the stream this payment opens once it is
13
+ * recorded), and `checkMandate()` on the payment's opener terms before the SDK
14
+ * signs anything (see `../x402-buyer/pay.ts`).
15
+ */
16
+ export const X402_PAY_TOOL_DESCRIPTION = "Pay an x402 endpoint (HTTP 402 Payment Required, x402 v2 'exact') and return its response. A Metrik x402 seller quotes a payment that opens an escrow STREAM with deposit = price; the seller earns ratePerSecond x VERIFIED seconds, capped at the deposit, and the unearned remainder stays recoverable by this server's wallet. Subject to the agent's spend mandate (price vs per-stream and total caps, rate, duration, operator), checked BEFORE anything is signed. Refunds are NOT automatic: use refund_status and refund with the returned streamId.";
17
+ export const REFUND_STATUS_TOOL_DESCRIPTION = "Read the refund state of a stream this server paid for over x402, from the seller's gasless refund relay: whether it is running, what is reclaimable, and the next step (close / wait / reclaim). Moves no funds.";
18
+ export const REFUND_TOOL_DESCRIPTION = "Recover the unearned part of an x402 payment through the seller's gasless refund relay: close=true stops the stream (this wallet signs the opener's Close; the relay pays the gas), reclaim=true sends the permissionless reclaim (the refund always goes to the payer). Nothing is refunded automatically; reclaim waits for the settlement window and may say when to retry.";
19
+ /** Longest response body returned to the model. */
20
+ const MAX_BODY_CHARS = 32 * 1024;
21
+ const atomicSchema = z
22
+ .string()
23
+ .regex(/^[1-9]\d*$/, "a positive integer of USDC base units (6 decimals)");
24
+ const bytes32Schema = z
25
+ .string()
26
+ .regex(/^0x[0-9a-fA-F]{64}$/, "a 0x-prefixed 32-byte hex value");
27
+ const x402PaySchema = {
28
+ url: z
29
+ .string()
30
+ .url()
31
+ .describe("The x402 endpoint. https only (http only for localhost)."),
32
+ method: z
33
+ .enum(["GET", "POST", "PUT", "PATCH", "DELETE"])
34
+ .optional()
35
+ .describe("HTTP method. Default POST with a body, otherwise GET."),
36
+ headers: z.record(z.string()).optional(),
37
+ body: z.string().max(1_000_000).optional().describe("Request body."),
38
+ maxAmountUsdc: atomicSchema
39
+ .optional()
40
+ .describe("Optional price ceiling, base units. Can only TIGHTEN the server mandate's per-stream cap."),
41
+ maxRatePerSecondUsdc: atomicSchema
42
+ .optional()
43
+ .describe("Optional rate ceiling, base units/second. Tightens only."),
44
+ minDurationSeconds: z
45
+ .number()
46
+ .int()
47
+ .positive()
48
+ .optional()
49
+ .describe("Refuse a quote the seller can fully earn in fewer verified seconds."),
50
+ };
51
+ const refundSchema = {
52
+ streamId: bytes32Schema,
53
+ refundUrl: z
54
+ .string()
55
+ .url()
56
+ .optional()
57
+ .describe("The seller's refund relay URL. Optional for a stream this server paid for (it was recorded)."),
58
+ };
59
+ const refundActionSchema = {
60
+ ...refundSchema,
61
+ close: z
62
+ .boolean()
63
+ .optional()
64
+ .describe("Stop the stream first (this wallet signs Close)."),
65
+ reclaim: z
66
+ .boolean()
67
+ .optional()
68
+ .describe("Send the permissionless reclaim. Default true."),
69
+ };
70
+ const PAYMENT_HEADERS = new Set(["payment-signature", "x-payment"]);
71
+ export function registerX402Tools(mcpServer, ctx) {
72
+ const pay = ctx.x402.pay ??
73
+ (async (input) => {
74
+ const { payX402WithMandate } = await import("../x402-buyer/pay.js");
75
+ return await payX402WithMandate(input);
76
+ });
77
+ // Every outbound request these tools make — the seller, and the refund
78
+ // relay — goes through the guard: https only, public addresses only, the
79
+ // optional host allowlist, and never a redirect.
80
+ const guard = {
81
+ ...(ctx.x402.allowedHosts === undefined
82
+ ? {}
83
+ : { allowedHosts: ctx.x402.allowedHosts }),
84
+ ...(ctx.x402.allowPrivateNetworks === true
85
+ ? { allowPrivateNetworks: true }
86
+ : {}),
87
+ ...(ctx.x402.fetch === undefined ? {} : { fetch: ctx.x402.fetch }),
88
+ ...(ctx.x402.lookup === undefined ? {} : { lookup: ctx.x402.lookup }),
89
+ };
90
+ const guardedFetch = createGuardedFetch(guard);
91
+ const openRefunds = ctx.x402.refundClient ??
92
+ (async (target) => {
93
+ const { refundClient } = await import("@absol-labs/sdk/x402");
94
+ return refundClient(target.refundUrl, {
95
+ streamId: target.streamId,
96
+ ...(target.opener === undefined ? {} : { opener: target.opener }),
97
+ ...(target.fetch === undefined ? {} : { fetch: target.fetch }),
98
+ expectedChainId: ctx.x402.network.chain.id,
99
+ });
100
+ });
101
+ mcpServer.registerTool("x402_pay", {
102
+ description: X402_PAY_TOOL_DESCRIPTION,
103
+ inputSchema: x402PaySchema,
104
+ annotations: {
105
+ destructiveHint: true,
106
+ idempotentHint: false,
107
+ openWorldHint: true,
108
+ readOnlyHint: false,
109
+ title: "Pay x402 Endpoint",
110
+ },
111
+ }, async (args) => {
112
+ const headers = {};
113
+ for (const [name, value] of Object.entries(args.headers ?? {})) {
114
+ if (PAYMENT_HEADERS.has(name.toLowerCase())) {
115
+ return ctx.fail(`do not set the ${name} header: this server signs the payment itself, after the quote passes the spend mandate.`);
116
+ }
117
+ headers[name.toLowerCase()] = value;
118
+ }
119
+ if (args.body !== undefined && headers["content-type"] === undefined) {
120
+ headers["content-type"] = "application/json";
121
+ }
122
+ try {
123
+ // Refuse a forbidden target before the mandate, the registry or the
124
+ // seller is touched.
125
+ await assertOutboundUrlAllowed(args.url, guard);
126
+ const signedMandate = await ctx.resolveMandate();
127
+ const owner = signedMandate.owner;
128
+ return await ctx.serialize(owner, async () => {
129
+ const spentSoFarUsdc = await ctx.getSpentSoFarUsdc(owner);
130
+ const revokedMandateIds = await ctx.getRevokedMandateIds(owner);
131
+ const nowSeconds = ctx.now();
132
+ // The reservation: written BEFORE the SDK signs (onApproved), inside
133
+ // this owner's serialized queue, under a key of its own. It is
134
+ // released only when the authorization provably never moved money,
135
+ // and replaced by the real stream record once the stream is known.
136
+ let reservation = null;
137
+ const release = async () => {
138
+ if (reservation !== null)
139
+ await ctx.removeStream?.(reservation);
140
+ };
141
+ let result;
142
+ try {
143
+ result = await pay({
144
+ url: args.url,
145
+ init: {
146
+ method: args.method ?? (args.body === undefined ? "GET" : "POST"),
147
+ headers,
148
+ ...(args.body === undefined ? {} : { body: args.body }),
149
+ },
150
+ signer: ctx.x402.signer,
151
+ network: ctx.x402.network,
152
+ signedMandate,
153
+ spentSoFarUsdc,
154
+ nowSeconds,
155
+ revokedMandateIds,
156
+ ...(args.maxAmountUsdc === undefined
157
+ ? {}
158
+ : { maxAmount: BigInt(args.maxAmountUsdc) }),
159
+ ...(args.maxRatePerSecondUsdc === undefined
160
+ ? {}
161
+ : { maxRatePerSecond: BigInt(args.maxRatePerSecondUsdc) }),
162
+ ...(args.minDurationSeconds === undefined
163
+ ? {}
164
+ : { minDurationSeconds: args.minDurationSeconds }),
165
+ sdkOptions: { ...ctx.x402.sdkOptions, fetch: guardedFetch },
166
+ ...(ctx.x402.chainReader === undefined
167
+ ? {}
168
+ : { chainReader: ctx.x402.chainReader }),
169
+ onApproved: async ({ request, quote }) => {
170
+ reservation = keccak256(toHex(`x402-reservation:${owner}:${quote.payTo}:${nowSeconds}:${crypto.randomUUID()}`));
171
+ await ctx.recordStream({
172
+ streamId: reservation,
173
+ buyer: owner,
174
+ operator: request.operator,
175
+ serviceRef: quote.serviceRef ?? `0x${"00".repeat(32)}`,
176
+ budgetUsdc: request.budgetUsdc,
177
+ ratePerSecondUsdc: request.ratePerSecondUsdc,
178
+ maxDurationSeconds: request.maxDurationSeconds,
179
+ openedAtSeconds: nowSeconds,
180
+ mandateId: signedMandate.mandateId,
181
+ opener: quote.payTo,
182
+ x402Reservation: true,
183
+ });
184
+ },
185
+ });
186
+ }
187
+ catch (error) {
188
+ return await settleFailure(ctx, error, {
189
+ release,
190
+ reservation,
191
+ owner,
192
+ mandateId: signedMandate.mandateId,
193
+ nowSeconds,
194
+ });
195
+ }
196
+ const opener = result.metrikStreamOpener;
197
+ if (result.paid && opener !== null && result.approved !== null) {
198
+ // Replace the reservation with the real stream (same amount).
199
+ await ctx.recordStream({
200
+ streamId: opener.streamId,
201
+ buyer: owner,
202
+ operator: result.approved.operator,
203
+ serviceRef: result.quote?.serviceRef ?? `0x${"00".repeat(32)}`,
204
+ budgetUsdc: result.approved.budgetUsdc,
205
+ ratePerSecondUsdc: result.approved.ratePerSecondUsdc,
206
+ maxDurationSeconds: result.approved.maxDurationSeconds,
207
+ openedAtSeconds: nowSeconds,
208
+ mandateId: signedMandate.mandateId,
209
+ ...(opener.refundUrl === null
210
+ ? {}
211
+ : { refundUrl: opener.refundUrl }),
212
+ opener: opener.opener,
213
+ });
214
+ await release();
215
+ }
216
+ else if (!result.paid) {
217
+ // No 402 was answered, so nothing was approved or signed.
218
+ await release();
219
+ }
220
+ if (!result.paid) {
221
+ // Not a payment: do not relay a body this server fetched on the
222
+ // model's behalf (it would make the tool a general-purpose
223
+ // fetcher of whatever the URL serves).
224
+ return ctx.fail(`the endpoint answered HTTP ${result.response.status} without asking for an x402 payment; nothing was signed or paid, and its body is not returned.`);
225
+ }
226
+ const body = await result.response.text();
227
+ const truncated = body.length > MAX_BODY_CHARS;
228
+ const structured = {
229
+ paid: result.paid,
230
+ httpStatus: result.response.status,
231
+ contentType: result.response.headers.get("content-type"),
232
+ body: truncated ? body.slice(0, MAX_BODY_CHARS) : body,
233
+ bodyTruncated: truncated,
234
+ streamId: opener?.streamId ?? null,
235
+ opener: opener?.opener ?? null,
236
+ refundUrl: opener?.refundUrl ?? null,
237
+ depositUsdc: opener?.deposit?.toString() ?? null,
238
+ ratePerSecondUsdc: opener?.ratePerSecond?.toString() ?? null,
239
+ expiresAt: opener?.expiresAt ?? null,
240
+ minEarnSeconds: result.quote?.minEarnSeconds?.toString() ?? null,
241
+ refundIsAutomatic: false,
242
+ };
243
+ return ctx.ok(`paid ${opener?.deposit?.toString() ?? "?"} USDC base units into stream ${opener?.streamId ?? "?"}; HTTP ${result.response.status}. The seller earns only for VERIFIED seconds; the unearned remainder is NOT refunded automatically — call refund (or refund_status) with this streamId.`, structured);
244
+ });
245
+ }
246
+ catch (error) {
247
+ if (error instanceof OutboundRequestRefusedError) {
248
+ return ctx.fail(error.message);
249
+ }
250
+ return ctx.unexpected(error);
251
+ }
252
+ });
253
+ const bind = async (args) => {
254
+ const streamId = args.streamId.toLowerCase();
255
+ const record = await ctx.findStream(streamId);
256
+ const refundUrl = args.refundUrl ?? record?.refundUrl;
257
+ if (refundUrl === undefined) {
258
+ return {
259
+ error: `no refund relay is known for stream ${streamId}: pass refundUrl (x402_pay returned it).`,
260
+ };
261
+ }
262
+ try {
263
+ await assertOutboundUrlAllowed(refundUrl.replace("{streamId}", streamId), guard);
264
+ }
265
+ catch (error) {
266
+ if (error instanceof OutboundRequestRefusedError) {
267
+ return { error: error.message };
268
+ }
269
+ throw error;
270
+ }
271
+ return await openRefunds({
272
+ refundUrl,
273
+ streamId,
274
+ ...(record?.opener === undefined ? {} : { opener: record.opener }),
275
+ fetch: guardedFetch,
276
+ });
277
+ };
278
+ mcpServer.registerTool("refund_status", {
279
+ description: REFUND_STATUS_TOOL_DESCRIPTION,
280
+ inputSchema: refundSchema,
281
+ annotations: {
282
+ idempotentHint: true,
283
+ openWorldHint: true,
284
+ readOnlyHint: true,
285
+ title: "x402 Refund Status",
286
+ },
287
+ }, async (args) => {
288
+ try {
289
+ const refunds = await bind(args);
290
+ if ("error" in refunds)
291
+ return ctx.fail(refunds.error);
292
+ const status = await refunds.status();
293
+ return ctx.ok(describeStatus(status), serializeStatus(status));
294
+ }
295
+ catch (error) {
296
+ return explainRefundError(ctx, error);
297
+ }
298
+ });
299
+ mcpServer.registerTool("refund", {
300
+ description: REFUND_TOOL_DESCRIPTION,
301
+ inputSchema: refundActionSchema,
302
+ annotations: {
303
+ destructiveHint: true,
304
+ idempotentHint: false,
305
+ openWorldHint: true,
306
+ readOnlyHint: false,
307
+ title: "x402 Refund",
308
+ },
309
+ }, async (args) => {
310
+ try {
311
+ const refunds = await bind(args);
312
+ if ("error" in refunds)
313
+ return ctx.fail(refunds.error);
314
+ let closeResult = null;
315
+ if (args.close === true) {
316
+ // Buyer recovery, authorized on the mandate owner's signature alone
317
+ // (never on caps or expiry, so a lapsed mandate cannot strand the
318
+ // payer's own money) — the same rule as reclaim_unspent.
319
+ const signedMandate = await ctx.resolveMandate();
320
+ const decision = await verifyMandateOwnerSignature(signedMandate);
321
+ if (!decision.allowed) {
322
+ return ctx.fail(`mandate denied: ${decision.reason ?? "unknown"}`);
323
+ }
324
+ closeResult = await refunds.close({ signer: ctx.x402.signer });
325
+ }
326
+ let reclaimResult = null;
327
+ if (args.reclaim !== false) {
328
+ reclaimResult = await refunds.reclaim();
329
+ }
330
+ const status = await refunds.status();
331
+ return ctx.ok(`${closeResult === null ? "" : `closed (${closeResult.transaction}). `}${reclaimResult === null ? "" : `reclaimed ${reclaimResult.amount?.toString() ?? "?"} USDC base units to the payer (${reclaimResult.transaction}). `}${describeStatus(status)}`, {
332
+ ...serializeStatus(status),
333
+ close: closeResult === null
334
+ ? null
335
+ : {
336
+ transaction: closeResult.transaction,
337
+ verified: closeResult.verified,
338
+ },
339
+ reclaim: reclaimResult === null
340
+ ? null
341
+ : {
342
+ transaction: reclaimResult.transaction,
343
+ amountUsdc: reclaimResult.amount?.toString() ?? null,
344
+ verified: reclaimResult.verified,
345
+ },
346
+ });
347
+ }
348
+ catch (error) {
349
+ return explainRefundError(ctx, error);
350
+ }
351
+ });
352
+ }
353
+ function serializeStatus(status) {
354
+ return {
355
+ streamId: status.streamId,
356
+ opener: status.opener,
357
+ payer: status.payer,
358
+ status: status.status,
359
+ reclaimed: status.reclaimed,
360
+ reclaimableUsdc: status.reclaimable?.toString() ?? null,
361
+ next: status.next,
362
+ refundIsAutomatic: false,
363
+ };
364
+ }
365
+ function describeStatus(status) {
366
+ if (status.reclaimed) {
367
+ return `stream ${status.streamId} is reclaimed: the unearned remainder went back to ${status.payer}.`;
368
+ }
369
+ return `stream ${status.streamId} is ${status.status}; next step: ${status.next.action}${status.next.retryAt === undefined ? "" : ` (from ${status.next.retryAt})`}. Nothing is refunded automatically.`;
370
+ }
371
+ /**
372
+ * A failed x402_pay. Before the signature was handed out (mandate or SDK
373
+ * refusal) the reservation is released. After it, the reservation is KEPT
374
+ * unless the authorization provably can never move funds, the real stream is
375
+ * recorded when it can be identified on-chain, and the model is never told
376
+ * "not settled" when the money may have moved.
377
+ */
378
+ async function settleFailure(ctx, error, state) {
379
+ if (error instanceof Error && error.name === "X402PostSignatureError") {
380
+ const post = error;
381
+ if (post.releasable) {
382
+ await state.release();
383
+ }
384
+ else if (post.streamId !== null) {
385
+ await ctx.recordStream({
386
+ streamId: post.streamId,
387
+ buyer: state.owner,
388
+ operator: post.approved.operator,
389
+ serviceRef: post.quote.serviceRef ?? `0x${"00".repeat(32)}`,
390
+ budgetUsdc: post.approved.budgetUsdc,
391
+ ratePerSecondUsdc: post.approved.ratePerSecondUsdc,
392
+ maxDurationSeconds: post.approved.maxDurationSeconds,
393
+ openedAtSeconds: state.nowSeconds,
394
+ mandateId: state.mandateId,
395
+ opener: post.opener,
396
+ });
397
+ await state.release();
398
+ }
399
+ return ctx.fail(`${post.message} ${post.releasable ? "The spend reservation was released." : `The ${post.approved.budgetUsdc.toString()} USDC base units stay COUNTED against the spend mandate.`}${post.streamId === null ? "" : ` streamId: ${post.streamId} (opener ${post.opener}); recover the unearned part with refund / refund_status.`} Do not retry this payment blindly.`);
400
+ }
401
+ // Anything else was raised before a signature existed: nothing moved.
402
+ await state.release();
403
+ if (error instanceof OutboundRequestRefusedError)
404
+ return ctx.fail(error.message);
405
+ return explainPayError(ctx, error);
406
+ }
407
+ function explainPayError(ctx, error) {
408
+ if (error instanceof Error) {
409
+ switch (error.name) {
410
+ case "X402MandateDeniedError":
411
+ return ctx.fail(`${error.message} Raise the server's METRIK_AGENT_MANDATE_* caps only if that payment is intended.`);
412
+ case "X402PaymentRefusedError":
413
+ return ctx.fail(error.message);
414
+ }
415
+ }
416
+ return ctx.unexpected(error);
417
+ }
418
+ function explainRefundError(ctx, error) {
419
+ if (error instanceof Error) {
420
+ switch (error.name) {
421
+ case "RefundNotReadyError": {
422
+ const retryAt = error.retryAt;
423
+ return ctx.fail(`${error.message}${retryAt === null || retryAt === undefined ? "" : ` Retry at ${retryAt} (unix seconds).`} Nothing is refunded automatically.`);
424
+ }
425
+ case "OutboundRequestRefusedError":
426
+ case "RefundRelayError":
427
+ case "NotStreamPayerError":
428
+ case "InvalidInputError":
429
+ return ctx.fail(error.message);
430
+ }
431
+ }
432
+ return ctx.unexpected(error);
433
+ }
434
+ //# sourceMappingURL=x402-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"x402-tools.js","sourceRoot":"","sources":["../../src/mcp/x402-tools.ts"],"names":[],"mappings":"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"}