@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.
- package/README.md +42 -50
- package/dist/capability/invocation-capability.d.ts +2 -2
- package/dist/capability/probe-capability.d.ts +225 -0
- package/dist/capability/probe-capability.d.ts.map +1 -0
- package/dist/capability/probe-capability.js +248 -0
- package/dist/capability/probe-capability.js.map +1 -0
- package/dist/cli/args.d.ts +11 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +23 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/commands/claim.js +1 -1
- package/dist/cli/commands/claim.js.map +1 -1
- package/dist/cli/commands/close.d.ts.map +1 -1
- package/dist/cli/commands/close.js +35 -3
- package/dist/cli/commands/close.js.map +1 -1
- package/dist/cli/commands/invoke.d.ts +2 -0
- package/dist/cli/commands/invoke.d.ts.map +1 -1
- package/dist/cli/commands/invoke.js +2 -2
- package/dist/cli/commands/invoke.js.map +1 -1
- package/dist/cli/commands/mcp.d.ts.map +1 -1
- package/dist/cli/commands/mcp.js +15 -2
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/open.d.ts.map +1 -1
- package/dist/cli/commands/open.js +58 -4
- package/dist/cli/commands/open.js.map +1 -1
- package/dist/cli/commands/pay.d.ts +19 -0
- package/dist/cli/commands/pay.d.ts.map +1 -0
- package/dist/cli/commands/pay.js +355 -0
- package/dist/cli/commands/pay.js.map +1 -0
- package/dist/cli/commands/reclaim-unverified.d.ts.map +1 -1
- package/dist/cli/commands/reclaim-unverified.js +3 -2
- package/dist/cli/commands/reclaim-unverified.js.map +1 -1
- package/dist/cli/commands/reclaim.d.ts +23 -2
- package/dist/cli/commands/reclaim.d.ts.map +1 -1
- package/dist/cli/commands/reclaim.js +184 -16
- package/dist/cli/commands/reclaim.js.map +1 -1
- package/dist/cli/commands/refund.d.ts +13 -0
- package/dist/cli/commands/refund.d.ts.map +1 -0
- package/dist/cli/commands/refund.js +224 -0
- package/dist/cli/commands/refund.js.map +1 -0
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +10 -1
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/streams.js +8 -12
- package/dist/cli/commands/streams.js.map +1 -1
- package/dist/cli/commands/watch.d.ts.map +1 -1
- package/dist/cli/commands/watch.js +2 -1
- package/dist/cli/commands/watch.js.map +1 -1
- package/dist/cli/config.d.ts +44 -26
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +88 -38
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/deps.d.ts +33 -0
- package/dist/cli/deps.d.ts.map +1 -1
- package/dist/cli/deps.js +37 -1
- package/dist/cli/deps.js.map +1 -1
- package/dist/cli/errors.d.ts.map +1 -1
- package/dist/cli/errors.js +21 -1
- package/dist/cli/errors.js.map +1 -1
- package/dist/cli/escape-hatch.d.ts +6 -4
- package/dist/cli/escape-hatch.d.ts.map +1 -1
- package/dist/cli/escape-hatch.js +6 -2
- package/dist/cli/escape-hatch.js.map +1 -1
- package/dist/cli/listings.d.ts +18 -0
- package/dist/cli/listings.d.ts.map +1 -1
- package/dist/cli/listings.js +22 -12
- package/dist/cli/listings.js.map +1 -1
- package/dist/cli/preflight.d.ts +20 -14
- package/dist/cli/preflight.d.ts.map +1 -1
- package/dist/cli/preflight.js +34 -20
- package/dist/cli/preflight.js.map +1 -1
- package/dist/cli/privy.d.ts.map +1 -1
- package/dist/cli/privy.js +4 -2
- package/dist/cli/privy.js.map +1 -1
- package/dist/cli/reclaimability.d.ts +82 -0
- package/dist/cli/reclaimability.d.ts.map +1 -0
- package/dist/cli/reclaimability.js +80 -0
- package/dist/cli/reclaimability.js.map +1 -0
- package/dist/cli/run.d.ts +2 -1
- package/dist/cli/run.d.ts.map +1 -1
- package/dist/cli/run.js +40 -11
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/scan-range.d.ts +2 -2
- package/dist/cli/scan-range.js +2 -2
- package/dist/cli/status.d.ts +3 -1
- package/dist/cli/status.d.ts.map +1 -1
- package/dist/cli/status.js +15 -3
- package/dist/cli/status.js.map +1 -1
- package/dist/cli/wallet.d.ts +1 -1
- package/dist/cli/wallet.js +2 -2
- package/dist/cli/wallet.js.map +1 -1
- package/dist/discovery/rate-band.d.ts +74 -0
- package/dist/discovery/rate-band.d.ts.map +1 -0
- package/dist/discovery/rate-band.js +114 -0
- package/dist/discovery/rate-band.js.map +1 -0
- package/dist/escrow-generation.d.ts +81 -0
- package/dist/escrow-generation.d.ts.map +1 -0
- package/dist/escrow-generation.js +76 -0
- package/dist/escrow-generation.js.map +1 -0
- package/dist/frameworks/agentkit.d.ts +8 -4
- package/dist/frameworks/agentkit.d.ts.map +1 -1
- package/dist/frameworks/agentkit.js +27 -10
- package/dist/frameworks/agentkit.js.map +1 -1
- package/dist/frameworks/eliza.d.ts +3 -3
- package/dist/frameworks/eliza.d.ts.map +1 -1
- package/dist/frameworks/eliza.js +15 -6
- package/dist/frameworks/eliza.js.map +1 -1
- package/dist/frameworks/langchain.d.ts.map +1 -1
- package/dist/frameworks/langchain.js +8 -0
- package/dist/frameworks/langchain.js.map +1 -1
- package/dist/gateway/caller-auth-gateway.d.ts +83 -31
- package/dist/gateway/caller-auth-gateway.d.ts.map +1 -1
- package/dist/gateway/caller-auth-gateway.js +180 -27
- package/dist/gateway/caller-auth-gateway.js.map +1 -1
- package/dist/gateway/http-server.d.ts +111 -44
- package/dist/gateway/http-server.d.ts.map +1 -1
- package/dist/gateway/http-server.js +439 -155
- package/dist/gateway/http-server.js.map +1 -1
- package/dist/gateway/probe-auth.d.ts +112 -0
- package/dist/gateway/probe-auth.d.ts.map +1 -0
- package/dist/gateway/probe-auth.js +127 -0
- package/dist/gateway/probe-auth.js.map +1 -0
- package/dist/gateway/signed-rate-bounds.d.ts +51 -0
- package/dist/gateway/signed-rate-bounds.d.ts.map +1 -0
- package/dist/gateway/signed-rate-bounds.js +94 -0
- package/dist/gateway/signed-rate-bounds.js.map +1 -0
- package/dist/gateway/x402-opener-mode.d.ts +215 -0
- package/dist/gateway/x402-opener-mode.d.ts.map +1 -0
- package/dist/gateway/x402-opener-mode.js +639 -0
- package/dist/gateway/x402-opener-mode.js.map +1 -0
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -5
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts +52 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +228 -37
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/x402-tools.d.ts +104 -0
- package/dist/mcp/x402-tools.d.ts.map +1 -0
- package/dist/mcp/x402-tools.js +434 -0
- package/dist/mcp/x402-tools.js.map +1 -0
- package/dist/network.d.ts +119 -0
- package/dist/network.d.ts.map +1 -0
- package/dist/network.js +199 -0
- package/dist/network.js.map +1 -0
- package/dist/sdk/invoke.d.ts +4 -0
- package/dist/sdk/invoke.d.ts.map +1 -1
- package/dist/sdk/invoke.js +2 -5
- package/dist/sdk/invoke.js.map +1 -1
- package/dist/wallet/autonomous-wallet-broker.d.ts +3 -0
- package/dist/wallet/autonomous-wallet-broker.d.ts.map +1 -1
- package/dist/wallet/autonomous-wallet-broker.js +27 -23
- package/dist/wallet/autonomous-wallet-broker.js.map +1 -1
- package/dist/wallet/autonomous-wallet-protocol.d.ts +8 -2
- package/dist/wallet/autonomous-wallet-protocol.d.ts.map +1 -1
- package/dist/wallet/autonomous-wallet-protocol.js +9 -2
- package/dist/wallet/autonomous-wallet-protocol.js.map +1 -1
- package/dist/wallet/autonomous-wallet.d.ts.map +1 -1
- package/dist/wallet/autonomous-wallet.js +3 -2
- package/dist/wallet/autonomous-wallet.js.map +1 -1
- package/dist/wallet/broker-escrows.d.ts +222 -0
- package/dist/wallet/broker-escrows.d.ts.map +1 -0
- package/dist/wallet/broker-escrows.js +36 -0
- package/dist/wallet/broker-escrows.js.map +1 -0
- package/dist/wallet/lifecycle.d.ts +21 -5
- package/dist/wallet/lifecycle.d.ts.map +1 -1
- package/dist/wallet/lifecycle.js +32 -12
- package/dist/wallet/lifecycle.js.map +1 -1
- package/dist/wallet/privy-broker-server.d.ts.map +1 -1
- package/dist/wallet/privy-broker-server.js +31 -26
- package/dist/wallet/privy-broker-server.js.map +1 -1
- package/dist/wallet/privy-session-broker.d.ts +14 -5
- package/dist/wallet/privy-session-broker.d.ts.map +1 -1
- package/dist/wallet/privy-session-broker.js +29 -17
- package/dist/wallet/privy-session-broker.js.map +1 -1
- package/dist/wallet/privy-session-provider.d.ts +3 -1
- package/dist/wallet/privy-session-provider.d.ts.map +1 -1
- package/dist/wallet/privy-session-provider.js +5 -3
- package/dist/wallet/privy-session-provider.js.map +1 -1
- package/dist/wallet/provider.d.ts.map +1 -1
- package/dist/wallet/provider.js +15 -8
- package/dist/wallet/provider.js.map +1 -1
- package/dist/x402/facilitator.d.ts +3 -30
- package/dist/x402/facilitator.d.ts.map +1 -1
- package/dist/x402/facilitator.js +0 -27
- package/dist/x402/facilitator.js.map +1 -1
- package/dist/x402-buyer/guarded-fetch.d.ts +51 -0
- package/dist/x402-buyer/guarded-fetch.d.ts.map +1 -0
- package/dist/x402-buyer/guarded-fetch.js +147 -0
- package/dist/x402-buyer/guarded-fetch.js.map +1 -0
- package/dist/x402-buyer/index.d.ts +10 -0
- package/dist/x402-buyer/index.d.ts.map +1 -0
- package/dist/x402-buyer/index.js +10 -0
- package/dist/x402-buyer/index.js.map +1 -0
- package/dist/x402-buyer/pay.d.ts +135 -0
- package/dist/x402-buyer/pay.d.ts.map +1 -0
- package/dist/x402-buyer/pay.js +336 -0
- package/dist/x402-buyer/pay.js.map +1 -0
- package/dist/x402-opener/abi.d.ts +684 -0
- package/dist/x402-opener/abi.d.ts.map +1 -0
- package/dist/x402-opener/abi.js +880 -0
- package/dist/x402-opener/abi.js.map +1 -0
- package/dist/x402-opener/facilitator-entry.d.ts +3 -0
- package/dist/x402-opener/facilitator-entry.d.ts.map +1 -0
- package/dist/x402-opener/facilitator-entry.js +37 -0
- package/dist/x402-opener/facilitator-entry.js.map +1 -0
- package/dist/x402-opener/facilitator-server.d.ts +180 -0
- package/dist/x402-opener/facilitator-server.d.ts.map +1 -0
- package/dist/x402-opener/facilitator-server.js +696 -0
- package/dist/x402-opener/facilitator-server.js.map +1 -0
- package/dist/x402-opener/index.d.ts +14 -0
- package/dist/x402-opener/index.d.ts.map +1 -0
- package/dist/x402-opener/index.js +14 -0
- package/dist/x402-opener/index.js.map +1 -0
- package/dist/x402-opener/listing-resolver.d.ts +55 -0
- package/dist/x402-opener/listing-resolver.d.ts.map +1 -0
- package/dist/x402-opener/listing-resolver.js +125 -0
- package/dist/x402-opener/listing-resolver.js.map +1 -0
- package/dist/x402-opener/refund-relay.d.ts +240 -0
- package/dist/x402-opener/refund-relay.d.ts.map +1 -0
- package/dist/x402-opener/refund-relay.js +1240 -0
- package/dist/x402-opener/refund-relay.js.map +1 -0
- package/dist/x402-opener/relayer-queue.d.ts +14 -0
- package/dist/x402-opener/relayer-queue.d.ts.map +1 -0
- package/dist/x402-opener/relayer-queue.js +18 -0
- package/dist/x402-opener/relayer-queue.js.map +1 -0
- package/dist/x402-opener/scheme.d.ts +217 -0
- package/dist/x402-opener/scheme.d.ts.map +1 -0
- package/dist/x402-opener/scheme.js +749 -0
- package/dist/x402-opener/scheme.js.map +1 -0
- package/dist/x402-opener/terms.d.ts +105 -0
- package/dist/x402-opener/terms.d.ts.map +1 -0
- package/dist/x402-opener/terms.js +212 -0
- package/dist/x402-opener/terms.js.map +1 -0
- package/dist/zktls/reclaim.d.ts +2 -2
- package/dist/zktls/t2-delivery-proof.d.ts +6 -6
- package/docs/agent-layer.md +3 -2
- package/docs/autonomous-privy-wallet.md +188 -0
- package/docs/cli.md +184 -31
- package/docs/langchain.md +5 -0
- package/docs/mcp-reference.md +75 -5
- package/docs/probe-capability.md +191 -0
- package/docs/quickstart.md +36 -1
- package/docs/threat-model.md +20 -0
- package/docs/x402.md +628 -595
- package/package.json +19 -17
- package/src/capability/probe-capability.ts +355 -0
- package/src/cli/args.ts +29 -0
- package/src/cli/commands/claim.ts +1 -1
- package/src/cli/commands/close.ts +36 -3
- package/src/cli/commands/invoke.ts +5 -2
- package/src/cli/commands/mcp.ts +18 -2
- package/src/cli/commands/open.ts +75 -4
- package/src/cli/commands/pay.ts +442 -0
- package/src/cli/commands/reclaim-unverified.ts +8 -2
- package/src/cli/commands/reclaim.ts +252 -14
- package/src/cli/commands/refund.ts +277 -0
- package/src/cli/commands/status.ts +17 -1
- package/src/cli/commands/streams.ts +10 -14
- package/src/cli/commands/watch.ts +7 -1
- package/src/cli/config.ts +139 -52
- package/src/cli/deps.ts +74 -1
- package/src/cli/errors.ts +24 -1
- package/src/cli/escape-hatch.ts +19 -5
- package/src/cli/listings.ts +43 -10
- package/src/cli/preflight.ts +36 -21
- package/src/cli/privy.ts +4 -2
- package/src/cli/reclaimability.ts +154 -0
- package/src/cli/run.ts +54 -11
- package/src/cli/scan-range.ts +2 -2
- package/src/cli/status.ts +14 -1
- package/src/cli/wallet.ts +2 -2
- package/src/discovery/rate-band.ts +172 -0
- package/src/escrow-generation.ts +135 -0
- package/src/frameworks/agentkit.ts +45 -11
- package/src/frameworks/eliza.ts +27 -5
- package/src/frameworks/langchain.ts +14 -0
- package/src/gateway/caller-auth-gateway.ts +320 -68
- package/src/gateway/http-server.ts +629 -220
- package/src/gateway/probe-auth.ts +191 -0
- package/src/gateway/signed-rate-bounds.ts +164 -0
- package/src/gateway/x402-opener-mode.ts +974 -0
- package/src/index.ts +82 -19
- package/src/mcp/server.ts +319 -42
- package/src/mcp/x402-tools.ts +621 -0
- package/src/network.ts +302 -0
- package/src/sdk/invoke.ts +6 -5
- package/src/wallet/autonomous-wallet-broker.ts +46 -20
- package/src/wallet/autonomous-wallet-protocol.ts +11 -2
- package/src/wallet/autonomous-wallet.ts +4 -2
- package/src/wallet/broker-escrows.ts +66 -0
- package/src/wallet/lifecycle.ts +53 -18
- package/src/wallet/privy-broker-server.ts +35 -25
- package/src/wallet/privy-session-broker.ts +58 -25
- package/src/wallet/privy-session-provider.ts +7 -3
- package/src/wallet/provider.ts +20 -15
- package/src/x402/facilitator.ts +3 -43
- package/src/x402-buyer/guarded-fetch.ts +213 -0
- package/src/x402-buyer/index.ts +9 -0
- package/src/x402-buyer/pay.ts +517 -0
- package/src/x402-opener/abi.ts +881 -0
- package/src/x402-opener/facilitator-entry.ts +45 -0
- package/src/x402-opener/facilitator-server.ts +1014 -0
- package/src/x402-opener/index.ts +13 -0
- package/src/x402-opener/listing-resolver.ts +202 -0
- package/src/x402-opener/refund-relay.ts +1743 -0
- package/src/x402-opener/relayer-queue.ts +18 -0
- package/src/x402-opener/scheme.ts +1133 -0
- package/src/x402-opener/terms.ts +300 -0
- package/dist/gateway/x402-mode.d.ts +0 -123
- package/dist/gateway/x402-mode.d.ts.map +0 -1
- package/dist/gateway/x402-mode.js +0 -212
- package/dist/gateway/x402-mode.js.map +0 -1
- package/dist/x402/delivery-oracle.d.ts +0 -108
- package/dist/x402/delivery-oracle.d.ts.map +0 -1
- package/dist/x402/delivery-oracle.js +0 -174
- package/dist/x402/delivery-oracle.js.map +0 -1
- package/dist/x402/facilitator-server-entry.d.ts +0 -3
- package/dist/x402/facilitator-server-entry.d.ts.map +0 -1
- package/dist/x402/facilitator-server-entry.js +0 -27
- package/dist/x402/facilitator-server-entry.js.map +0 -1
- package/dist/x402/facilitator-server.d.ts +0 -73
- package/dist/x402/facilitator-server.d.ts.map +0 -1
- package/dist/x402/facilitator-server.js +0 -305
- package/dist/x402/facilitator-server.js.map +0 -1
- package/dist/x402/payment-requirements.d.ts +0 -106
- package/dist/x402/payment-requirements.d.ts.map +0 -1
- package/dist/x402/payment-requirements.js +0 -138
- package/dist/x402/payment-requirements.js.map +0 -1
- package/dist/x402/relayer.d.ts +0 -41
- package/dist/x402/relayer.d.ts.map +0 -1
- package/dist/x402/relayer.js +0 -64
- package/dist/x402/relayer.js.map +0 -1
- package/dist/x402/resource-index.d.ts +0 -75
- package/dist/x402/resource-index.d.ts.map +0 -1
- package/dist/x402/resource-index.js +0 -126
- package/dist/x402/resource-index.js.map +0 -1
- package/dist/x402/verified-delivery-facilitator.d.ts +0 -285
- package/dist/x402/verified-delivery-facilitator.d.ts.map +0 -1
- package/dist/x402/verified-delivery-facilitator.js +0 -423
- package/dist/x402/verified-delivery-facilitator.js.map +0 -1
- package/src/gateway/x402-mode.ts +0 -350
- package/src/x402/delivery-oracle.ts +0 -285
- package/src/x402/facilitator-server-entry.ts +0 -35
- package/src/x402/facilitator-server.ts +0 -445
- package/src/x402/payment-requirements.ts +0 -231
- package/src/x402/relayer.ts +0 -122
- package/src/x402/resource-index.ts +0 -228
- 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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"}
|