@absol-labs/agent 0.10.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 (331) hide show
  1. package/README.md +106 -30
  2. package/dist/capability/invocation-capability.d.ts +20 -8
  3. package/dist/capability/invocation-capability.d.ts.map +1 -1
  4. package/dist/capability/invocation-capability.js.map +1 -1
  5. package/dist/capability/probe-capability.d.ts +225 -0
  6. package/dist/capability/probe-capability.d.ts.map +1 -0
  7. package/dist/capability/probe-capability.js +248 -0
  8. package/dist/capability/probe-capability.js.map +1 -0
  9. package/dist/cli/args.d.ts +11 -0
  10. package/dist/cli/args.d.ts.map +1 -1
  11. package/dist/cli/args.js +23 -0
  12. package/dist/cli/args.js.map +1 -1
  13. package/dist/cli/commands/claim.d.ts.map +1 -1
  14. package/dist/cli/commands/claim.js +21 -5
  15. package/dist/cli/commands/claim.js.map +1 -1
  16. package/dist/cli/commands/close.d.ts.map +1 -1
  17. package/dist/cli/commands/close.js +51 -7
  18. package/dist/cli/commands/close.js.map +1 -1
  19. package/dist/cli/commands/invoke.d.ts +2 -0
  20. package/dist/cli/commands/invoke.d.ts.map +1 -1
  21. package/dist/cli/commands/invoke.js +3 -2
  22. package/dist/cli/commands/invoke.js.map +1 -1
  23. package/dist/cli/commands/mcp.d.ts.map +1 -1
  24. package/dist/cli/commands/mcp.js +15 -2
  25. package/dist/cli/commands/mcp.js.map +1 -1
  26. package/dist/cli/commands/open.d.ts.map +1 -1
  27. package/dist/cli/commands/open.js +121 -15
  28. package/dist/cli/commands/open.js.map +1 -1
  29. package/dist/cli/commands/pay.d.ts +19 -0
  30. package/dist/cli/commands/pay.d.ts.map +1 -0
  31. package/dist/cli/commands/pay.js +355 -0
  32. package/dist/cli/commands/pay.js.map +1 -0
  33. package/dist/cli/commands/reclaim-unverified.d.ts.map +1 -1
  34. package/dist/cli/commands/reclaim-unverified.js +15 -6
  35. package/dist/cli/commands/reclaim-unverified.js.map +1 -1
  36. package/dist/cli/commands/reclaim.d.ts +23 -2
  37. package/dist/cli/commands/reclaim.d.ts.map +1 -1
  38. package/dist/cli/commands/reclaim.js +200 -21
  39. package/dist/cli/commands/reclaim.js.map +1 -1
  40. package/dist/cli/commands/refund.d.ts +13 -0
  41. package/dist/cli/commands/refund.d.ts.map +1 -0
  42. package/dist/cli/commands/refund.js +224 -0
  43. package/dist/cli/commands/refund.js.map +1 -0
  44. package/dist/cli/commands/status.d.ts.map +1 -1
  45. package/dist/cli/commands/status.js +10 -1
  46. package/dist/cli/commands/status.js.map +1 -1
  47. package/dist/cli/commands/streams.js +9 -13
  48. package/dist/cli/commands/streams.js.map +1 -1
  49. package/dist/cli/commands/watch.d.ts.map +1 -1
  50. package/dist/cli/commands/watch.js +2 -1
  51. package/dist/cli/commands/watch.js.map +1 -1
  52. package/dist/cli/config.d.ts +44 -26
  53. package/dist/cli/config.d.ts.map +1 -1
  54. package/dist/cli/config.js +88 -38
  55. package/dist/cli/config.js.map +1 -1
  56. package/dist/cli/deps.d.ts +86 -7
  57. package/dist/cli/deps.d.ts.map +1 -1
  58. package/dist/cli/deps.js +102 -16
  59. package/dist/cli/deps.js.map +1 -1
  60. package/dist/cli/errors.d.ts.map +1 -1
  61. package/dist/cli/errors.js +21 -1
  62. package/dist/cli/errors.js.map +1 -1
  63. package/dist/cli/escape-hatch.d.ts +6 -4
  64. package/dist/cli/escape-hatch.d.ts.map +1 -1
  65. package/dist/cli/escape-hatch.js +6 -2
  66. package/dist/cli/escape-hatch.js.map +1 -1
  67. package/dist/cli/listings.d.ts +18 -0
  68. package/dist/cli/listings.d.ts.map +1 -1
  69. package/dist/cli/listings.js +22 -12
  70. package/dist/cli/listings.js.map +1 -1
  71. package/dist/cli/preflight.d.ts +20 -14
  72. package/dist/cli/preflight.d.ts.map +1 -1
  73. package/dist/cli/preflight.js +34 -20
  74. package/dist/cli/preflight.js.map +1 -1
  75. package/dist/cli/privy.d.ts +83 -0
  76. package/dist/cli/privy.d.ts.map +1 -0
  77. package/dist/cli/privy.js +232 -0
  78. package/dist/cli/privy.js.map +1 -0
  79. package/dist/cli/reclaimability.d.ts +82 -0
  80. package/dist/cli/reclaimability.d.ts.map +1 -0
  81. package/dist/cli/reclaimability.js +80 -0
  82. package/dist/cli/reclaimability.js.map +1 -0
  83. package/dist/cli/run.d.ts +2 -1
  84. package/dist/cli/run.d.ts.map +1 -1
  85. package/dist/cli/run.js +40 -11
  86. package/dist/cli/run.js.map +1 -1
  87. package/dist/cli/scan-range.d.ts +2 -2
  88. package/dist/cli/scan-range.js +2 -2
  89. package/dist/cli/spend-policy.d.ts +60 -0
  90. package/dist/cli/spend-policy.d.ts.map +1 -0
  91. package/dist/cli/spend-policy.js +65 -0
  92. package/dist/cli/spend-policy.js.map +1 -0
  93. package/dist/cli/status.d.ts +3 -1
  94. package/dist/cli/status.d.ts.map +1 -1
  95. package/dist/cli/status.js +15 -3
  96. package/dist/cli/status.js.map +1 -1
  97. package/dist/cli/wallet.d.ts +109 -40
  98. package/dist/cli/wallet.d.ts.map +1 -1
  99. package/dist/cli/wallet.js +109 -44
  100. package/dist/cli/wallet.js.map +1 -1
  101. package/dist/discovery/rate-band.d.ts +74 -0
  102. package/dist/discovery/rate-band.d.ts.map +1 -0
  103. package/dist/discovery/rate-band.js +114 -0
  104. package/dist/discovery/rate-band.js.map +1 -0
  105. package/dist/escrow-generation.d.ts +81 -0
  106. package/dist/escrow-generation.d.ts.map +1 -0
  107. package/dist/escrow-generation.js +76 -0
  108. package/dist/escrow-generation.js.map +1 -0
  109. package/dist/frameworks/agentkit.d.ts +8 -4
  110. package/dist/frameworks/agentkit.d.ts.map +1 -1
  111. package/dist/frameworks/agentkit.js +27 -10
  112. package/dist/frameworks/agentkit.js.map +1 -1
  113. package/dist/frameworks/eliza.d.ts +3 -3
  114. package/dist/frameworks/eliza.d.ts.map +1 -1
  115. package/dist/frameworks/eliza.js +15 -6
  116. package/dist/frameworks/eliza.js.map +1 -1
  117. package/dist/frameworks/langchain.d.ts.map +1 -1
  118. package/dist/frameworks/langchain.js +8 -0
  119. package/dist/frameworks/langchain.js.map +1 -1
  120. package/dist/gateway/caller-auth-gateway.d.ts +91 -4
  121. package/dist/gateway/caller-auth-gateway.d.ts.map +1 -1
  122. package/dist/gateway/caller-auth-gateway.js +184 -7
  123. package/dist/gateway/caller-auth-gateway.js.map +1 -1
  124. package/dist/gateway/http-server.d.ts +121 -1
  125. package/dist/gateway/http-server.d.ts.map +1 -1
  126. package/dist/gateway/http-server.js +474 -5
  127. package/dist/gateway/http-server.js.map +1 -1
  128. package/dist/gateway/probe-auth.d.ts +112 -0
  129. package/dist/gateway/probe-auth.d.ts.map +1 -0
  130. package/dist/gateway/probe-auth.js +127 -0
  131. package/dist/gateway/probe-auth.js.map +1 -0
  132. package/dist/gateway/signed-rate-bounds.d.ts +51 -0
  133. package/dist/gateway/signed-rate-bounds.d.ts.map +1 -0
  134. package/dist/gateway/signed-rate-bounds.js +94 -0
  135. package/dist/gateway/signed-rate-bounds.js.map +1 -0
  136. package/dist/gateway/x402-opener-mode.d.ts +215 -0
  137. package/dist/gateway/x402-opener-mode.d.ts.map +1 -0
  138. package/dist/gateway/x402-opener-mode.js +639 -0
  139. package/dist/gateway/x402-opener-mode.js.map +1 -0
  140. package/dist/index.d.ts +11 -5
  141. package/dist/index.d.ts.map +1 -1
  142. package/dist/index.js +15 -5
  143. package/dist/index.js.map +1 -1
  144. package/dist/mandates/env.d.ts +3 -2
  145. package/dist/mandates/env.d.ts.map +1 -1
  146. package/dist/mandates/env.js +3 -2
  147. package/dist/mandates/env.js.map +1 -1
  148. package/dist/mcp/server.d.ts +100 -0
  149. package/dist/mcp/server.d.ts.map +1 -1
  150. package/dist/mcp/server.js +719 -39
  151. package/dist/mcp/server.js.map +1 -1
  152. package/dist/mcp/service-invoker.d.ts +97 -0
  153. package/dist/mcp/service-invoker.d.ts.map +1 -0
  154. package/dist/mcp/service-invoker.js +167 -0
  155. package/dist/mcp/service-invoker.js.map +1 -0
  156. package/dist/mcp/x402-tools.d.ts +104 -0
  157. package/dist/mcp/x402-tools.d.ts.map +1 -0
  158. package/dist/mcp/x402-tools.js +434 -0
  159. package/dist/mcp/x402-tools.js.map +1 -0
  160. package/dist/network.d.ts +119 -0
  161. package/dist/network.d.ts.map +1 -0
  162. package/dist/network.js +199 -0
  163. package/dist/network.js.map +1 -0
  164. package/dist/sdk/invoke.d.ts +23 -4
  165. package/dist/sdk/invoke.d.ts.map +1 -1
  166. package/dist/sdk/invoke.js +71 -10
  167. package/dist/sdk/invoke.js.map +1 -1
  168. package/dist/wallet/autonomous-wallet-broker.d.ts +3 -0
  169. package/dist/wallet/autonomous-wallet-broker.d.ts.map +1 -1
  170. package/dist/wallet/autonomous-wallet-broker.js +27 -23
  171. package/dist/wallet/autonomous-wallet-broker.js.map +1 -1
  172. package/dist/wallet/autonomous-wallet-protocol.d.ts +8 -2
  173. package/dist/wallet/autonomous-wallet-protocol.d.ts.map +1 -1
  174. package/dist/wallet/autonomous-wallet-protocol.js +9 -2
  175. package/dist/wallet/autonomous-wallet-protocol.js.map +1 -1
  176. package/dist/wallet/autonomous-wallet.d.ts.map +1 -1
  177. package/dist/wallet/autonomous-wallet.js +3 -2
  178. package/dist/wallet/autonomous-wallet.js.map +1 -1
  179. package/dist/wallet/broker-escrows.d.ts +222 -0
  180. package/dist/wallet/broker-escrows.d.ts.map +1 -0
  181. package/dist/wallet/broker-escrows.js +36 -0
  182. package/dist/wallet/broker-escrows.js.map +1 -0
  183. package/dist/wallet/lifecycle.d.ts +21 -5
  184. package/dist/wallet/lifecycle.d.ts.map +1 -1
  185. package/dist/wallet/lifecycle.js +32 -12
  186. package/dist/wallet/lifecycle.js.map +1 -1
  187. package/dist/wallet/privy-broker-server.d.ts.map +1 -1
  188. package/dist/wallet/privy-broker-server.js +31 -26
  189. package/dist/wallet/privy-broker-server.js.map +1 -1
  190. package/dist/wallet/privy-session-broker.d.ts +14 -5
  191. package/dist/wallet/privy-session-broker.d.ts.map +1 -1
  192. package/dist/wallet/privy-session-broker.js +29 -17
  193. package/dist/wallet/privy-session-broker.js.map +1 -1
  194. package/dist/wallet/privy-session-provider.d.ts +3 -1
  195. package/dist/wallet/privy-session-provider.d.ts.map +1 -1
  196. package/dist/wallet/privy-session-provider.js +5 -3
  197. package/dist/wallet/privy-session-provider.js.map +1 -1
  198. package/dist/wallet/provider.d.ts.map +1 -1
  199. package/dist/wallet/provider.js +15 -8
  200. package/dist/wallet/provider.js.map +1 -1
  201. package/dist/x402/facilitator.d.ts +42 -17
  202. package/dist/x402/facilitator.d.ts.map +1 -1
  203. package/dist/x402/facilitator.js +49 -33
  204. package/dist/x402/facilitator.js.map +1 -1
  205. package/dist/x402-buyer/guarded-fetch.d.ts +51 -0
  206. package/dist/x402-buyer/guarded-fetch.d.ts.map +1 -0
  207. package/dist/x402-buyer/guarded-fetch.js +147 -0
  208. package/dist/x402-buyer/guarded-fetch.js.map +1 -0
  209. package/dist/x402-buyer/index.d.ts +10 -0
  210. package/dist/x402-buyer/index.d.ts.map +1 -0
  211. package/dist/x402-buyer/index.js +10 -0
  212. package/dist/x402-buyer/index.js.map +1 -0
  213. package/dist/x402-buyer/pay.d.ts +135 -0
  214. package/dist/x402-buyer/pay.d.ts.map +1 -0
  215. package/dist/x402-buyer/pay.js +336 -0
  216. package/dist/x402-buyer/pay.js.map +1 -0
  217. package/dist/x402-opener/abi.d.ts +684 -0
  218. package/dist/x402-opener/abi.d.ts.map +1 -0
  219. package/dist/x402-opener/abi.js +880 -0
  220. package/dist/x402-opener/abi.js.map +1 -0
  221. package/dist/x402-opener/facilitator-entry.d.ts +3 -0
  222. package/dist/x402-opener/facilitator-entry.d.ts.map +1 -0
  223. package/dist/x402-opener/facilitator-entry.js +37 -0
  224. package/dist/x402-opener/facilitator-entry.js.map +1 -0
  225. package/dist/x402-opener/facilitator-server.d.ts +180 -0
  226. package/dist/x402-opener/facilitator-server.d.ts.map +1 -0
  227. package/dist/x402-opener/facilitator-server.js +696 -0
  228. package/dist/x402-opener/facilitator-server.js.map +1 -0
  229. package/dist/x402-opener/index.d.ts +14 -0
  230. package/dist/x402-opener/index.d.ts.map +1 -0
  231. package/dist/x402-opener/index.js +14 -0
  232. package/dist/x402-opener/index.js.map +1 -0
  233. package/dist/x402-opener/listing-resolver.d.ts +55 -0
  234. package/dist/x402-opener/listing-resolver.d.ts.map +1 -0
  235. package/dist/x402-opener/listing-resolver.js +125 -0
  236. package/dist/x402-opener/listing-resolver.js.map +1 -0
  237. package/dist/x402-opener/refund-relay.d.ts +240 -0
  238. package/dist/x402-opener/refund-relay.d.ts.map +1 -0
  239. package/dist/x402-opener/refund-relay.js +1240 -0
  240. package/dist/x402-opener/refund-relay.js.map +1 -0
  241. package/dist/x402-opener/relayer-queue.d.ts +14 -0
  242. package/dist/x402-opener/relayer-queue.d.ts.map +1 -0
  243. package/dist/x402-opener/relayer-queue.js +18 -0
  244. package/dist/x402-opener/relayer-queue.js.map +1 -0
  245. package/dist/x402-opener/scheme.d.ts +217 -0
  246. package/dist/x402-opener/scheme.d.ts.map +1 -0
  247. package/dist/x402-opener/scheme.js +749 -0
  248. package/dist/x402-opener/scheme.js.map +1 -0
  249. package/dist/x402-opener/terms.d.ts +105 -0
  250. package/dist/x402-opener/terms.d.ts.map +1 -0
  251. package/dist/x402-opener/terms.js +212 -0
  252. package/dist/x402-opener/terms.js.map +1 -0
  253. package/dist/zktls/reclaim.d.ts +2 -2
  254. package/docs/agent-layer.md +13 -8
  255. package/docs/autonomous-privy-wallet.md +188 -0
  256. package/docs/cli.md +342 -53
  257. package/docs/langchain.md +5 -0
  258. package/docs/mcp-hosted.md +4 -3
  259. package/docs/mcp-reference.md +245 -0
  260. package/docs/probe-capability.md +191 -0
  261. package/docs/quickstart.md +54 -5
  262. package/docs/threat-model.md +24 -3
  263. package/docs/x402.md +681 -0
  264. package/package.json +19 -6
  265. package/src/capability/invocation-capability.ts +17 -1
  266. package/src/capability/probe-capability.ts +355 -0
  267. package/src/cli/args.ts +29 -0
  268. package/src/cli/commands/claim.ts +31 -5
  269. package/src/cli/commands/close.ts +56 -7
  270. package/src/cli/commands/invoke.ts +6 -2
  271. package/src/cli/commands/mcp.ts +18 -2
  272. package/src/cli/commands/open.ts +151 -14
  273. package/src/cli/commands/pay.ts +442 -0
  274. package/src/cli/commands/reclaim-unverified.ts +24 -6
  275. package/src/cli/commands/reclaim.ts +274 -19
  276. package/src/cli/commands/refund.ts +277 -0
  277. package/src/cli/commands/status.ts +17 -1
  278. package/src/cli/commands/streams.ts +11 -15
  279. package/src/cli/commands/watch.ts +7 -1
  280. package/src/cli/config.ts +139 -52
  281. package/src/cli/deps.ts +189 -25
  282. package/src/cli/errors.ts +24 -1
  283. package/src/cli/escape-hatch.ts +19 -5
  284. package/src/cli/listings.ts +43 -10
  285. package/src/cli/preflight.ts +36 -21
  286. package/src/cli/privy.ts +398 -0
  287. package/src/cli/reclaimability.ts +154 -0
  288. package/src/cli/run.ts +54 -11
  289. package/src/cli/scan-range.ts +2 -2
  290. package/src/cli/spend-policy.ts +139 -0
  291. package/src/cli/status.ts +14 -1
  292. package/src/cli/wallet.ts +189 -58
  293. package/src/discovery/rate-band.ts +172 -0
  294. package/src/escrow-generation.ts +135 -0
  295. package/src/frameworks/agentkit.ts +45 -11
  296. package/src/frameworks/eliza.ts +27 -5
  297. package/src/frameworks/langchain.ts +14 -0
  298. package/src/gateway/caller-auth-gateway.ts +336 -13
  299. package/src/gateway/http-server.ts +690 -7
  300. package/src/gateway/probe-auth.ts +191 -0
  301. package/src/gateway/signed-rate-bounds.ts +164 -0
  302. package/src/gateway/x402-opener-mode.ts +974 -0
  303. package/src/index.ts +112 -14
  304. package/src/mandates/env.ts +3 -2
  305. package/src/mcp/server.ts +973 -44
  306. package/src/mcp/service-invoker.ts +285 -0
  307. package/src/mcp/x402-tools.ts +621 -0
  308. package/src/network.ts +302 -0
  309. package/src/sdk/invoke.ts +96 -17
  310. package/src/wallet/autonomous-wallet-broker.ts +46 -20
  311. package/src/wallet/autonomous-wallet-protocol.ts +11 -2
  312. package/src/wallet/autonomous-wallet.ts +4 -2
  313. package/src/wallet/broker-escrows.ts +66 -0
  314. package/src/wallet/lifecycle.ts +53 -18
  315. package/src/wallet/privy-broker-server.ts +35 -25
  316. package/src/wallet/privy-session-broker.ts +58 -25
  317. package/src/wallet/privy-session-provider.ts +7 -3
  318. package/src/wallet/provider.ts +20 -15
  319. package/src/x402/facilitator.ts +85 -46
  320. package/src/x402-buyer/guarded-fetch.ts +213 -0
  321. package/src/x402-buyer/index.ts +9 -0
  322. package/src/x402-buyer/pay.ts +517 -0
  323. package/src/x402-opener/abi.ts +881 -0
  324. package/src/x402-opener/facilitator-entry.ts +45 -0
  325. package/src/x402-opener/facilitator-server.ts +1014 -0
  326. package/src/x402-opener/index.ts +13 -0
  327. package/src/x402-opener/listing-resolver.ts +202 -0
  328. package/src/x402-opener/refund-relay.ts +1743 -0
  329. package/src/x402-opener/relayer-queue.ts +18 -0
  330. package/src/x402-opener/scheme.ts +1133 -0
  331. package/src/x402-opener/terms.ts +300 -0
@@ -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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"}
@@ -0,0 +1,119 @@
1
+ import { MetrikClient, type MetrikNetworkDeployment, type MetrikNetwork } from "@absol-labs/sdk";
2
+ import { type Chain } from "viem";
3
+ /**
4
+ * The agent layer's ONE view of where Metrik is deployed.
5
+ *
6
+ * Every chain id, CAIP-2 id, contract address, deploy block, default RPC, gas
7
+ * token and oracle origin this package uses comes from the `@absol-labs/sdk`
8
+ * network registry through this module. Nothing under `src/` may hardcode them
9
+ * (`test/no-hardcoded-chain.test.ts` fails the build if anything does), so a new
10
+ * deployment — the V3 escrow and factory included — is a registry/config change,
11
+ * not a code change here.
12
+ *
13
+ * What the agent adds on top of the registry is only what the registry does not
14
+ * describe: which network is the DEFAULT for a surface that is given none, and
15
+ * where a test wallet gets funded (a faucet is an off-chain courtesy, not a
16
+ * deployment fact).
17
+ */
18
+ /**
19
+ * The registry id every surface defaults to when no network is selected. An
20
+ * id, not a chain id: the registry resolves it to the chain, addresses and RPC.
21
+ */
22
+ export declare const DEFAULT_METRIK_NETWORK_ID = "baseSepolia";
23
+ /** Environment variable that selects the network by id, chain id or CAIP-2 id. */
24
+ export declare const METRIK_NETWORK_ENV = "METRIK_NETWORK";
25
+ /** What a surface is allowed to settle on, beyond "the registry knows it". */
26
+ export interface NetworkPolicy {
27
+ /**
28
+ * Refuse a registered network that is not a testnet. The CLI and the agent
29
+ * frameworks sign with keys read from the environment, so they keep the
30
+ * testnet-only rule; the registry's `testnet` flag is the source of truth.
31
+ */
32
+ readonly testnetOnly?: boolean;
33
+ }
34
+ /** A network the registry does not know, or one the build does not allow. */
35
+ export declare class UnsupportedNetworkError extends Error {
36
+ readonly selector: string;
37
+ constructor(selector: string, message: string);
38
+ }
39
+ /** The network a surface uses when none is selected. */
40
+ export declare function defaultNetwork(): MetrikNetwork;
41
+ /** Every registered network the policy allows, in registry order. */
42
+ export declare function allowedNetworks(policy?: NetworkPolicy): MetrikNetwork[];
43
+ /** `"<chainId> (<name>)"` for every allowed network, for error messages. */
44
+ export declare function describeAllowedNetworks(policy?: NetworkPolicy): string;
45
+ /**
46
+ * Resolve a network selector — a registry id (e.g. the default
47
+ * {@link DEFAULT_METRIK_NETWORK_ID}), an EVM chain id (as a number or a decimal
48
+ * string), or a CAIP-2 id (`eip155:<chainId>`) — to a registered
49
+ * network the policy allows. `undefined` (or empty) selects the default.
50
+ *
51
+ * Fail closed: an unknown selector, or a known network the policy forbids, is an
52
+ * {@link UnsupportedNetworkError}, never a silent fallback to the default.
53
+ */
54
+ export declare function resolveAgentNetwork(selector: string | number | undefined, policy?: NetworkPolicy): MetrikNetwork;
55
+ /** The registered network on `chainId` the policy allows; throws otherwise. */
56
+ export declare function requireNetworkForChainId(chainId: number, policy?: NetworkPolicy, source?: string): MetrikNetwork;
57
+ /** The registered network with this CAIP-2 id the policy allows; throws otherwise. */
58
+ export declare function requireNetworkForCaip2(caip2: string, policy?: NetworkPolicy, source?: string): MetrikNetwork;
59
+ /**
60
+ * The network's registered deployment (the CURRENT one, or a `legacy` one that
61
+ * still holds streams) whose escrow is `escrow`, or `undefined`.
62
+ */
63
+ export declare function registeredDeployment(network: MetrikNetwork, escrow: string): (MetrikNetworkDeployment & {
64
+ readonly legacy: boolean;
65
+ }) | undefined;
66
+ /**
67
+ * Whether `escrow` is one of the network's registered escrows — the current
68
+ * one or a legacy one (whose streams can still be read, closed and
69
+ * reclaimed; the SDK refuses NEW opens on it unless explicitly opted in).
70
+ */
71
+ export declare function isRegisteredEscrow(network: MetrikNetwork, escrow: string): boolean;
72
+ /**
73
+ * The viem chain for a chain id: the registered network's chain when there is
74
+ * one, otherwise a minimal chain definition around the given RPC (so a custom,
75
+ * explicitly configured deployment still signs with the right chain id).
76
+ */
77
+ export declare function chainForChainId(chainId: number, rpcUrl: string): Chain;
78
+ /**
79
+ * A read-only `MetrikClient` for one escrow on a REGISTERED network (default:
80
+ * the registry's default network). The chain, the default USDC and oracle, and
81
+ * opener-factory detection all come from the registry; the escrow and RPC are
82
+ * the caller's. A chain id the registry does not know is refused — register the
83
+ * network with the SDK's `registerNetwork()` first.
84
+ */
85
+ export declare function readOnlyMetrikClient(options: {
86
+ readonly escrowAddress: `0x${string}`;
87
+ readonly rpcUrl: string;
88
+ readonly chainId?: number;
89
+ /**
90
+ * Only for an escrow the registry does NOT record (a deliberate private
91
+ * deployment): its declared generation. The SDK then skips its code-hash
92
+ * pin. Ignored for a registered escrow, whose generation is the registry's.
93
+ */
94
+ readonly unregisteredEscrowGeneration?: "v2" | "v3";
95
+ }): MetrikClient;
96
+ /**
97
+ * Where a test wallet on a network gets its gas and its USDC. Off-chain
98
+ * courtesy data the registry does not carry; keyed by registry id, never by
99
+ * chain id.
100
+ */
101
+ export interface NetworkFunding {
102
+ /** A faucet for the network's GAS token, or `null` if none is known. */
103
+ readonly gasFaucetUrl: string | null;
104
+ /** A faucet for the network's settlement USDC, or `null` if none is known. */
105
+ readonly usdcFaucetUrl: string | null;
106
+ /** The Coinbase CDP faucet's name for this network, or `null` if CDP has none. */
107
+ readonly cdpNetwork: string | null;
108
+ }
109
+ /** Funding hints for a network; all `null` for a network with none known. */
110
+ export declare function networkFunding(network: MetrikNetwork): NetworkFunding;
111
+ /**
112
+ * One sentence telling a user how to fund GAS on this network, read from the
113
+ * network's gas-token metadata. Where gas is the settlement token (USDC), the
114
+ * USDC faucet is the gas faucet.
115
+ */
116
+ export declare function gasFundingHint(network: MetrikNetwork): string;
117
+ /** One sentence telling a user how to fund the settlement USDC on this network. */
118
+ export declare function usdcFundingHint(network: MetrikNetwork): string;
119
+ //# sourceMappingURL=network.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../src/network.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,YAAY,EAEZ,KAAK,uBAAuB,EAK5B,KAAK,aAAa,EACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAA0C,KAAK,KAAK,EAAE,MAAM,MAAM,CAAC;AAE1E;;;;;;;;;;;;;;GAcG;AAEH;;;GAGG;AACH,eAAO,MAAM,yBAAyB,gBAAgB,CAAC;AAEvD,kFAAkF;AAClF,eAAO,MAAM,kBAAkB,mBAAmB,CAAC;AAEnD,8EAA8E;AAC9E,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,6EAA6E;AAC7E,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK9C;AAED,wDAAwD;AACxD,wBAAgB,cAAc,IAAI,aAAa,CAE9C;AAED,qEAAqE;AACrE,wBAAgB,eAAe,CAAC,MAAM,GAAE,aAAkB,GAAG,aAAa,EAAE,CAI3E;AAED,4EAA4E;AAC5E,wBAAgB,uBAAuB,CAAC,MAAM,GAAE,aAAkB,GAAG,MAAM,CAM1E;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,EACrC,MAAM,GAAE,aAAkB,GACzB,aAAa,CAef;AAED,+EAA+E;AAC/E,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,aAAkB,EAC1B,MAAM,SAA4B,GACjC,aAAa,CAUf;AAED,sFAAsF;AACtF,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EACb,MAAM,GAAE,aAAkB,EAC1B,MAAM,SAA2B,GAChC,aAAa,CAUf;AAqBD;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,MAAM,GACb,CAAC,uBAAuB,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,GAAG,SAAS,CAStE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,MAAM,GACb,OAAO,CAET;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,CAStE;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE;IAC5C,QAAQ,CAAC,aAAa,EAAE,KAAK,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;OAIG;IACH,QAAQ,CAAC,4BAA4B,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACrD,GAAG,YAAY,CAiBf;AAID;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,wEAAwE;IACxE,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,8EAA8E;IAC9E,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,kFAAkF;IAClF,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAUD,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,GAAG,cAAc,CAQrE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAS7D;AAED,mFAAmF;AACnF,wBAAgB,eAAe,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAK9D"}