twzrd-x402-gate 0.5.0 → 0.5.2
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 +119 -11
- package/bin/twzrd-safe-fetch.js +30 -0
- package/dist/config.d.ts +5 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +6 -0
- package/dist/config.js.map +1 -1
- package/dist/evaluate.d.ts +4 -0
- package/dist/evaluate.d.ts.map +1 -1
- package/dist/evaluate.js +14 -2
- package/dist/evaluate.js.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp-hook.d.ts +22 -3
- package/dist/mcp-hook.d.ts.map +1 -1
- package/dist/mcp-hook.js +29 -6
- package/dist/mcp-hook.js.map +1 -1
- package/dist/network.d.ts +57 -0
- package/dist/network.d.ts.map +1 -0
- package/dist/network.js +137 -0
- package/dist/network.js.map +1 -0
- package/dist/policy.d.ts.map +1 -1
- package/dist/policy.js +55 -0
- package/dist/policy.js.map +1 -1
- package/dist/safe-fetch.d.ts +129 -0
- package/dist/safe-fetch.d.ts.map +1 -0
- package/dist/safe-fetch.js +471 -0
- package/dist/safe-fetch.js.map +1 -0
- package/dist/types.d.ts +47 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/with-guard.d.ts.map +1 -1
- package/dist/with-guard.js +2 -0
- package/dist/with-guard.js.map +1 -1
- package/dist/wrap-fetch.d.ts.map +1 -1
- package/dist/wrap-fetch.js +1 -0
- package/dist/wrap-fetch.js.map +1 -1
- package/dist/x402-client-hook.d.ts +87 -0
- package/dist/x402-client-hook.d.ts.map +1 -0
- package/dist/x402-client-hook.js +101 -0
- package/dist/x402-client-hook.js.map +1 -0
- package/package.json +33 -4
package/README.md
CHANGED
|
@@ -1,15 +1,57 @@
|
|
|
1
1
|
# twzrd-x402-gate
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
**TWZRD is the default `onBeforePaymentCreation` policy engine for official x402 clients.**
|
|
4
|
+
|
|
5
|
+
Agent-side firewall: after the client selects the exact payment requirement and **before**
|
|
6
|
+
payment payload creation / wallet signing — free preflight + merchant_card wash refuse.
|
|
7
|
+
Chain-neutral envelope; **Solana-deep** reputation only (Base/EVM = explicit `unknown`).
|
|
8
|
+
|
|
9
|
+
## Canonical integration (official x402 client)
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
import { x402Client } from "@x402/core/client";
|
|
13
|
+
import { wrapFetchWithPayment } from "@x402/fetch";
|
|
14
|
+
import { ExactSvmScheme } from "@x402/svm/exact/client";
|
|
15
|
+
import { installTwzrdX402ClientHook } from "twzrd-x402-gate";
|
|
16
|
+
|
|
17
|
+
const client = new x402Client();
|
|
18
|
+
client.register("solana:*", new ExactSvmScheme(svmSigner));
|
|
19
|
+
// Optional: client.register("eip155:*", new ExactEvmScheme(evmSigner));
|
|
20
|
+
|
|
21
|
+
installTwzrdX402ClientHook(client, { gateOnCanSpend: true });
|
|
22
|
+
// → onBeforePaymentCreation: scores selectedRequirements, abort if policy denies
|
|
23
|
+
|
|
24
|
+
const fetchWithPayment = wrapFetchWithPayment(fetch, client);
|
|
25
|
+
await fetchWithPayment("https://merchant.example/paid");
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
```text
|
|
29
|
+
official x402 client receives 402
|
|
30
|
+
→ selects exact requirement
|
|
31
|
+
→ onBeforePaymentCreation
|
|
32
|
+
→ TWZRD (network + payTo + amount + resource)
|
|
33
|
+
→ local policy allow | warn | block
|
|
34
|
+
→ agent-owned wallet signs same requirement
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
No AgentCash. No marketplace. No second probe. No TWZRD custody.
|
|
38
|
+
|
|
39
|
+
### MCP (`@x402/mcp`)
|
|
40
|
+
|
|
41
|
+
Wire `twzrdOnPaymentRequested` / prefer `onPaymentRequired` + `onBeforePayment` per
|
|
42
|
+
[lifecycle hooks](https://docs.x402.org/advanced-concepts/lifecycle-hooks). Same policy core.
|
|
43
|
+
|
|
44
|
+
### Raw-fetch composition (injectible pay client only)
|
|
5
45
|
|
|
6
46
|
```typescript
|
|
7
47
|
import { installTwzrdAutoGate } from "twzrd-x402-gate";
|
|
8
|
-
import { wrapFetchWithPayment } from "@x402/
|
|
48
|
+
import { wrapFetchWithPayment } from "@x402/fetch"; // or @x402/svm helper
|
|
9
49
|
|
|
10
|
-
|
|
11
|
-
//
|
|
12
|
-
const
|
|
50
|
+
// Guard RAW fetch, then hand to a client that still surfaces 402 to the guard layer
|
|
51
|
+
// — OR prefer installTwzrdX402ClientHook on x402Client (above).
|
|
52
|
+
const payingFetch = installTwzrdAutoGate((guarded) =>
|
|
53
|
+
wrapFetchWithPayment(guarded, client),
|
|
54
|
+
);
|
|
13
55
|
```
|
|
14
56
|
|
|
15
57
|
## Buyer flow (trustless, fail-open) — locked sequence
|
|
@@ -37,7 +79,9 @@ Canonical path for every agent that spends USDC on Solana x402:
|
|
|
37
79
|
|
|
38
80
|
**Order note:** `onWarnUpsell` (points at paid `/trust`) fires on preflight `warn` **before** the merchant_card wash check. A wash-flagged seller that preflighted as `warn` may still get the upsell hook, then be refused on step 2.
|
|
39
81
|
|
|
40
|
-
Dogfood
|
|
82
|
+
Dogfood:
|
|
83
|
+
- Free only (wash refuse): `npm run wash-dogfood` → [`examples/wash-refuse-dogfood.ts`](./examples/wash-refuse-dogfood.ts)
|
|
84
|
+
- Official client + Path E hook (live Solana ≤$0.001): `npm run official-dogfood` → [`examples/official-x402-dogfood.ts`](./examples/official-x402-dogfood.ts). Needs `@x402/fetch` `@x402/svm` `@x402/core` `@solana/kit` `@scure/base` and a funded Solana key (`SVM_KEYPAIR_PATH` or `~/.agentcash/solana-wallet.json`). `--block` exercises hard `gateOnCanSpend` abort with $0 spend.
|
|
41
85
|
|
|
42
86
|
## Install
|
|
43
87
|
|
|
@@ -45,6 +89,37 @@ Dogfood (live, free only): `npm run wash-dogfood` → [`examples/wash-refuse-dog
|
|
|
45
89
|
npm install twzrd-x402-gate
|
|
46
90
|
```
|
|
47
91
|
|
|
92
|
+
### Experimental CLI: `twzrd-safe-fetch` (AgentCash advisory pre-check)
|
|
93
|
+
|
|
94
|
+
> **Not a challenge-bound firewall.** Classification: `advisory_precheck`.
|
|
95
|
+
>
|
|
96
|
+
> AgentCash CLI internalizes 402 handling. This tool can only decide whether to
|
|
97
|
+
> **invoke** AgentCash after scoring a **probe** challenge. AgentCash then makes a
|
|
98
|
+
> **second** request and may sign a different recipient/network/amount (TOCTOU).
|
|
99
|
+
> JSON output always sets `requirementScoredMatchesRequirementSigned: false`.
|
|
100
|
+
>
|
|
101
|
+
> Secure integrations: `installTwzrdAutoGate` over **raw** fetch + injectible pay
|
|
102
|
+
> client, or `twzrdOnPaymentRequested` (MCP). Do **not** wrap AgentCash's paying
|
|
103
|
+
> fetch with `withTwzrdGuard`.
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
# Advisory: block AgentCash invocation when can_spend=false
|
|
107
|
+
npx twzrd-safe-fetch https://example/paid --gate-on-can-spend --payment-network solana --json
|
|
108
|
+
|
|
109
|
+
# Dry-run: preflight only, zero USDC
|
|
110
|
+
npx twzrd-safe-fetch 'https://intel.twzrd.xyz/v1/intel/quick/<pubkey>' --dry-run --json
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
```text
|
|
114
|
+
probe request → TWZRD scores challenge A → (if allowed) AgentCash request → may sign challenge B
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
- Exit `2` = policy blocked (AgentCash never started).
|
|
118
|
+
- Exit `0` = passthrough / dry-run allowed / AgentCash returned success (binding unproven).
|
|
119
|
+
- Base/EVM: explicit `decision=unknown` (see Networks).
|
|
120
|
+
|
|
121
|
+
Library: `import { safeFetch } from "twzrd-x402-gate/safe-fetch"`.
|
|
122
|
+
|
|
48
123
|
## Quickstart: `installTwzrdAutoGate` (default-on)
|
|
49
124
|
|
|
50
125
|
`installTwzrdAutoGate` is the one-liner form of "guard the raw fetch, then hand it to your
|
|
@@ -81,6 +156,23 @@ What happens on every HTTP 402 the raw fetch returns:
|
|
|
81
156
|
|
|
82
157
|
Non-402 responses pass through unchanged.
|
|
83
158
|
|
|
159
|
+
### Networks (Solana-deep, chain-neutral envelope)
|
|
160
|
+
|
|
161
|
+
The gate **recognizes** multi-chain 402s but only **reputation-scores Solana mainnet**.
|
|
162
|
+
|
|
163
|
+
| Network | Reputation scored? | Default policy (`unsupportedNetworkMode`) |
|
|
164
|
+
|---------|-------------------|-------------------------------------------|
|
|
165
|
+
| Solana mainnet | Yes — free preflight + merchant_card | allow/block from intel |
|
|
166
|
+
| Base / other EVM (`eip155:*`) | **No** | `observe` (default): `decision=unknown`, `policyAction=allow`, telemetry `unsupported_network_seen` |
|
|
167
|
+
| Base / EVM in `strict` mode | No | `policyAction=block` before sign |
|
|
168
|
+
|
|
169
|
+
This is intentional: Base listing abundance ≠ Solana behavioral history. Unsupported is never
|
|
170
|
+
represented as a TWZRD trust `allow`. Set `TWZRD_UNSUPPORTED_NETWORK_MODE=strict` (or
|
|
171
|
+
`{ unsupportedNetworkMode: "strict" }`) to hard-block unscored networks.
|
|
172
|
+
|
|
173
|
+
Dual-chain accepts still prefer the Solana entry for scoring (same as payment clients that
|
|
174
|
+
prefer Solana when available).
|
|
175
|
+
|
|
84
176
|
### Lower-level: `withTwzrdGuard`
|
|
85
177
|
|
|
86
178
|
`installTwzrdAutoGate` is built on `withTwzrdGuard` — the fetch wrapper itself, if you want to
|
|
@@ -258,14 +350,28 @@ if (!approved) abort(reason);
|
|
|
258
350
|
|
|
259
351
|
### `@x402/mcp` payment hook
|
|
260
352
|
|
|
261
|
-
|
|
262
|
-
|
|
353
|
+
The hook accepts the real `@x402/mcp` v2 `PaymentRequestedContext`
|
|
354
|
+
(`{ toolName, arguments, paymentRequired }`) — wire it directly:
|
|
263
355
|
|
|
264
|
-
|
|
265
|
-
|
|
356
|
+
```typescript
|
|
357
|
+
import { createx402MCPClient } from "@x402/mcp";
|
|
358
|
+
import { registerExactSvmScheme } from "@x402/svm/exact/client";
|
|
359
|
+
import { twzrdOnPaymentRequested } from "twzrd-x402-gate";
|
|
360
|
+
|
|
361
|
+
const client = createx402MCPClient({
|
|
362
|
+
name: "my-agent",
|
|
363
|
+
version: "1.0.0",
|
|
364
|
+
schemes: [/* e.g. registered SVM scheme */],
|
|
365
|
+
autoPayment: true,
|
|
366
|
+
onPaymentRequested: (ctx) => twzrdOnPaymentRequested(ctx), // false = deny before signing
|
|
266
367
|
});
|
|
267
368
|
```
|
|
268
369
|
|
|
370
|
+
The legacy flat shape (`{ accepts, context }`) is still accepted. Prior to
|
|
371
|
+
0.6.1, only the flat shape was read — wired into the real `@x402/mcp` runtime
|
|
372
|
+
the hook saw `accepts: undefined` and fail-closed-blocked every payment (safe,
|
|
373
|
+
but a 100% false-block).
|
|
374
|
+
|
|
269
375
|
### `wrapFetchWithTwzrdGate`
|
|
270
376
|
|
|
271
377
|
```typescript
|
|
@@ -287,6 +393,8 @@ A payment is **blocked** when:
|
|
|
287
393
|
|
|
288
394
|
`warn` is allowed unless overridden. Preflight network failure **fails closed** by default (a preflight outage blocks the payment, so an intel hiccup never silently approves a spend); set `failOpen: true` / `TWZRD_FAIL_OPEN=true` to opt into legacy allow-on-outage.
|
|
289
395
|
|
|
396
|
+
A 402 whose payment requirements yield **no identifiable seller wallet** (missing/empty `payTo`, or an unparseable `accepts[]`) is a different case from "unknown seller" — it always **blocks** with `reason: twzrd_unidentifiable_payment_recipient`, without ever calling the preflight network. This is unconditional (not affected by `failOpen`): `failOpen` governs what happens when the TWZRD *service* is unreachable, not what happens when the caller can't say who they're paying.
|
|
397
|
+
|
|
290
398
|
> **`can_spend` note:** the free preflight returns `can_spend=false` for most sellers
|
|
291
399
|
> not yet in the TWZRD corpus, including legitimate ones. The default is decision-only
|
|
292
400
|
> gating so unknown sellers on platforms like Agentic.Market are not blocked by default.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Publishable bin for twzrd-safe-fetch.
|
|
4
|
+
* Prefers compiled dist; falls back to tsx source in dev checkouts.
|
|
5
|
+
*/
|
|
6
|
+
import { spawnSync } from "node:child_process";
|
|
7
|
+
import { existsSync } from "node:fs";
|
|
8
|
+
import { dirname, join } from "node:path";
|
|
9
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
10
|
+
|
|
11
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
12
|
+
const root = join(__dirname, "..");
|
|
13
|
+
const dist = join(root, "dist", "safe-fetch.js");
|
|
14
|
+
const src = join(root, "src", "safe-fetch.ts");
|
|
15
|
+
|
|
16
|
+
if (existsSync(dist)) {
|
|
17
|
+
await import(pathToFileURL(dist).href);
|
|
18
|
+
} else if (existsSync(src)) {
|
|
19
|
+
const r = spawnSync(
|
|
20
|
+
"npx",
|
|
21
|
+
["--yes", "tsx", src, ...process.argv.slice(2)],
|
|
22
|
+
{ stdio: "inherit", cwd: root },
|
|
23
|
+
);
|
|
24
|
+
process.exit(r.status ?? 1);
|
|
25
|
+
} else {
|
|
26
|
+
console.error(
|
|
27
|
+
"twzrd-safe-fetch: missing dist/safe-fetch.js — run npm run build in twzrd-x402-gate",
|
|
28
|
+
);
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
package/dist/config.d.ts
CHANGED
|
@@ -9,6 +9,11 @@ export type ResolvedTwzrdGateConfig = {
|
|
|
9
9
|
refuseWashFlagged: boolean;
|
|
10
10
|
/** Soft cap USDC when wash_flagged; null = hard refuse */
|
|
11
11
|
washMaxUsdc: number | null;
|
|
12
|
+
/**
|
|
13
|
+
* Unscored-network policy (Base/EVM/…). Default observe.
|
|
14
|
+
* @see UnsupportedNetworkMode in network.ts
|
|
15
|
+
*/
|
|
16
|
+
unsupportedNetworkMode: "observe" | "strict";
|
|
12
17
|
fetch: typeof fetch;
|
|
13
18
|
onWarnUpsell?: (ctx: TwzrdUpsellContext) => void | Promise<void>;
|
|
14
19
|
};
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEtE,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,OAAO,CAAC;IACxB,gEAAgE;IAChE,iBAAiB,EAAE,OAAO,CAAC;IAC3B,0DAA0D;IAC1D,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,OAAO,KAAK,CAAC;IACpB,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,kBAAkB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClE,CAAC;AAYF,wBAAgB,aAAa,CAAC,SAAS,CAAC,EAAE,eAAe,GAAG,uBAAuB,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEtE,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,OAAO,CAAC;IACxB,gEAAgE;IAChE,iBAAiB,EAAE,OAAO,CAAC;IAC3B,0DAA0D;IAC1D,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B;;;OAGG;IACH,sBAAsB,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC7C,KAAK,EAAE,OAAO,KAAK,CAAC;IACpB,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,kBAAkB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClE,CAAC;AAYF,wBAAgB,aAAa,CAAC,SAAS,CAAC,EAAE,eAAe,GAAG,uBAAuB,CA0ElF"}
|
package/dist/config.js
CHANGED
|
@@ -43,6 +43,11 @@ export function resolveConfig(overrides) {
|
|
|
43
43
|
if (Number.isFinite(n) && n >= 0)
|
|
44
44
|
washMaxUsdc = n;
|
|
45
45
|
}
|
|
46
|
+
// Default observe: Base/EVM payments are allowed but marked decision=unknown
|
|
47
|
+
// (policy allow ≠ reputation allow). Strict blocks unscored networks before sign.
|
|
48
|
+
const envMode = (process.env.TWZRD_UNSUPPORTED_NETWORK_MODE ?? "").trim().toLowerCase();
|
|
49
|
+
const unsupportedNetworkMode = overrides?.unsupportedNetworkMode ??
|
|
50
|
+
(envMode === "strict" ? "strict" : "observe");
|
|
46
51
|
const fetchFn = overrides?.fetch ?? globalThis.fetch;
|
|
47
52
|
if (typeof fetchFn !== "function") {
|
|
48
53
|
throw new Error("[twzrd-x402-gate] fetch is not available; pass config.fetch");
|
|
@@ -55,6 +60,7 @@ export function resolveConfig(overrides) {
|
|
|
55
60
|
gateOnCanSpend,
|
|
56
61
|
refuseWashFlagged,
|
|
57
62
|
washMaxUsdc,
|
|
63
|
+
unsupportedNetworkMode,
|
|
58
64
|
fetch: fetchFn,
|
|
59
65
|
onWarnUpsell: overrides?.onWarnUpsell,
|
|
60
66
|
};
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/evaluate.d.ts
CHANGED
|
@@ -59,6 +59,10 @@ export type EvaluateX402Result = {
|
|
|
59
59
|
escalatedScore?: number | null;
|
|
60
60
|
/** the paid quick-tier label (Bronze/Silver/Gold/Platinum) from the escalation */
|
|
61
61
|
escalatedTier?: TwzrdTier | null;
|
|
62
|
+
network?: string;
|
|
63
|
+
networkSupported?: boolean;
|
|
64
|
+
reputationScored?: boolean;
|
|
65
|
+
policyAction?: "allow" | "block";
|
|
62
66
|
};
|
|
63
67
|
/**
|
|
64
68
|
* Evaluate an x402 resource before the buyer pays:
|
package/dist/evaluate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../src/evaluate.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,mBAAmB,GAAG,eAAe,GAAG;IAClD;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IAC/D;;;;;;;;;;;OAWG;IACH,cAAc,CAAC,EAAE;QACf,iHAAiH;QACjH,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,qFAAqF;QACrF,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,aAAa,GAAG,SAAS,CAAC;IACpC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,kBAAkB,CAAC;IACzB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+EAA+E;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,8FAA8F;IAC9F,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,6GAA6G;IAC7G,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,kFAAkF;IAClF,aAAa,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;CAClC,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,EACnB,mBAAmB,EAAE,uBAAuB,EAC5C,IAAI,GAAE,mBAAwB,GAC7B,OAAO,CAAC,kBAAkB,CAAC,
|
|
1
|
+
{"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../src/evaluate.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,mBAAmB,GAAG,eAAe,GAAG;IAClD;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IAC/D;;;;;;;;;;;OAWG;IACH,cAAc,CAAC,EAAE;QACf,iHAAiH;QACjH,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,qFAAqF;QACrF,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,aAAa,GAAG,SAAS,CAAC;IACpC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,kBAAkB,CAAC;IACzB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+EAA+E;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,8FAA8F;IAC9F,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,6GAA6G;IAC7G,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,kFAAkF;IAClF,aAAa,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;CAClC,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,EACnB,mBAAmB,EAAE,uBAAuB,EAC5C,IAAI,GAAE,mBAAwB,GAC7B,OAAO,CAAC,kBAAkB,CAAC,CAqI7B"}
|
package/dist/evaluate.js
CHANGED
|
@@ -26,6 +26,7 @@ export async function evaluate_x402_resource(resourceUrl, paymentRequirements, o
|
|
|
26
26
|
gateOnCanSpend: opts.gateOnCanSpend,
|
|
27
27
|
refuseWashFlagged: opts.refuseWashFlagged,
|
|
28
28
|
washMaxUsdc: opts.washMaxUsdc,
|
|
29
|
+
unsupportedNetworkMode: opts.unsupportedNetworkMode,
|
|
29
30
|
fetch: opts.fetch,
|
|
30
31
|
});
|
|
31
32
|
const { payTo, amountMicro, resource } = payToFromRequirements(paymentRequirements);
|
|
@@ -35,11 +36,18 @@ export async function evaluate_x402_resource(resourceUrl, paymentRequirements, o
|
|
|
35
36
|
payTo,
|
|
36
37
|
priceUsdc,
|
|
37
38
|
agentIntent: "evaluate_x402_resource",
|
|
39
|
+
// Evaluate the exact network on the requirement the pay client will use
|
|
40
|
+
// (pickRequirements prefers Solana when dual-listed).
|
|
41
|
+
chain: paymentRequirements.network,
|
|
38
42
|
},
|
|
39
43
|
// resolveConfig already embeds refuseWashFlagged / washMaxUsdc
|
|
40
44
|
config);
|
|
41
|
-
|
|
42
|
-
const
|
|
45
|
+
// Unscored networks: decision stays "unknown" — never map to reputation allow/warn/block.
|
|
46
|
+
const decision = (approval.verdict === "unknown"
|
|
47
|
+
? "unknown"
|
|
48
|
+
: (approval.card.decision ?? approval.verdict ?? "unknown"));
|
|
49
|
+
// Paid trust receipt is Solana-only product surface — omit for unscored nets.
|
|
50
|
+
const receiptUrl = payTo && approval.reputationScored === true
|
|
43
51
|
? `${config.intelBase}/v1/intel/trust/${encodeURIComponent(payTo)}`
|
|
44
52
|
: undefined;
|
|
45
53
|
const base = {
|
|
@@ -50,6 +58,10 @@ export async function evaluate_x402_resource(resourceUrl, paymentRequirements, o
|
|
|
50
58
|
card: approval.card,
|
|
51
59
|
failOpen: approval.failOpen,
|
|
52
60
|
receiptUrl,
|
|
61
|
+
network: approval.network,
|
|
62
|
+
networkSupported: approval.networkSupported,
|
|
63
|
+
reputationScored: approval.reputationScored,
|
|
64
|
+
policyAction: approval.policyAction,
|
|
53
65
|
};
|
|
54
66
|
// Autonomous risk-escalation: a *proceeding* `warn` (uncertain / unknown seller)
|
|
55
67
|
// is vetted by settling the cheap $0.001 quick tier and re-deciding on the paid
|
package/dist/evaluate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../src/evaluate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAkB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../src/evaluate.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,13 +2,17 @@ export { createTwzrdGate, defaultGate, type TwzrdGate } from "./gate.js";
|
|
|
2
2
|
export { resolveConfig, type ResolvedTwzrdGateConfig } from "./config.js";
|
|
3
3
|
export { evaluateReadinessCard, buildPreflightInput, twzrdPreflight, twzrdApprovePayment, type PolicyEvaluateInput, } from "./policy.js";
|
|
4
4
|
export { payToFromRequirements, priceUsdcFromAmountMicro, pickRequirements } from "./payto.js";
|
|
5
|
+
export { classifyNetwork, decideUnsupportedNetwork, amountBucket, type NetworkClass, type NetworkKind, type UnsupportedNetworkMode, type UnsupportedNetworkDecision, } from "./network.js";
|
|
6
|
+
export type { TwzrdGateDecision } from "./types.js";
|
|
5
7
|
export { fetchMerchantCard, applyWashFlaggedPolicy, type TwzrdMerchantCard, type WashPolicyInput, type WashPolicyResult, } from "./merchant-card.js";
|
|
6
8
|
export { twzrdOnPaymentRequested } from "./mcp-hook.js";
|
|
7
9
|
export { wrapFetchWithTwzrdGate } from "./wrap-fetch.js";
|
|
8
10
|
export { evaluate_x402_resource, type EvaluateX402Options, type EvaluateX402Result, } from "./evaluate.js";
|
|
9
11
|
export { withTwzrdGuard, type TwzrdGuardOptions } from "./with-guard.js";
|
|
10
12
|
export { installTwzrdAutoGate, type PayWrap, type InstallAutoGateOptions, } from "./auto-gate.js";
|
|
13
|
+
export { safeFetch, runAgentcashFetch, main as safeFetchMain, type SafeFetchOptions, type SafeFetchResult, } from "./safe-fetch.js";
|
|
14
|
+
export { installTwzrdX402ClientHook, twzrdBeforePaymentCreation, type X402ClientLike, type X402SelectedRequirements, type BeforePaymentCreationContext, type BeforePaymentCreationResult, type InstallX402ClientHookOptions, } from "./x402-client-hook.js";
|
|
11
15
|
export { quickCheck, QUICK_PRICE_USDC, type QuickCheckResult, type QuickCheckOptions, type TwzrdTier, } from "./quick.js";
|
|
12
16
|
export { createSponsoredX402Fetch, type SponsorSettle, type SponsoredX402Options, } from "./sponsored.js";
|
|
13
|
-
export type { TwzrdDecision, TwzrdReadinessCard, TwzrdPreflightInput, TwzrdGateConfig, TwzrdApproveContext, TwzrdApprovalResult, TwzrdUpsellContext, X402PaymentRequirements, X402PaymentRequiredBody, X402McpPaymentRequest, } from "./types.js";
|
|
17
|
+
export type { TwzrdDecision, TwzrdReadinessCard, TwzrdPreflightInput, TwzrdGateConfig, TwzrdApproveContext, TwzrdApprovalResult, TwzrdUpsellContext, X402PaymentRequirements, X402PaymentRequiredBody, X402McpPaymentRequest, X402McpPaymentRequestedContext, } from "./types.js";
|
|
14
18
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,KAAK,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,KAAK,mBAAmB,GACzB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC/F,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,gBAAgB,GACtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EACL,sBAAsB,EACtB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,GACxB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,cAAc,EAAE,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EACL,oBAAoB,EACpB,KAAK,OAAO,EACZ,KAAK,sBAAsB,GAC5B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,SAAS,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,wBAAwB,EACxB,KAAK,aAAa,EAClB,KAAK,oBAAoB,GAC1B,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,KAAK,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,KAAK,mBAAmB,GACzB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC/F,OAAO,EACL,eAAe,EACf,wBAAwB,EACxB,YAAY,EACZ,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,sBAAsB,EAC3B,KAAK,0BAA0B,GAChC,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,gBAAgB,GACtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EACL,sBAAsB,EACtB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,GACxB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,cAAc,EAAE,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EACL,oBAAoB,EACpB,KAAK,OAAO,EACZ,KAAK,sBAAsB,GAC5B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,SAAS,EACT,iBAAiB,EACjB,IAAI,IAAI,aAAa,EACrB,KAAK,gBAAgB,EACrB,KAAK,eAAe,GACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,EAC1B,KAAK,cAAc,EACnB,KAAK,wBAAwB,EAC7B,KAAK,4BAA4B,EACjC,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,GAClC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,SAAS,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,wBAAwB,EACxB,KAAK,aAAa,EAClB,KAAK,oBAAoB,GAC1B,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,EACrB,8BAA8B,GAC/B,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -6,12 +6,15 @@ export { createTwzrdGate, defaultGate } from "./gate.js";
|
|
|
6
6
|
export { resolveConfig } from "./config.js";
|
|
7
7
|
export { evaluateReadinessCard, buildPreflightInput, twzrdPreflight, twzrdApprovePayment, } from "./policy.js";
|
|
8
8
|
export { payToFromRequirements, priceUsdcFromAmountMicro, pickRequirements } from "./payto.js";
|
|
9
|
+
export { classifyNetwork, decideUnsupportedNetwork, amountBucket, } from "./network.js";
|
|
9
10
|
export { fetchMerchantCard, applyWashFlaggedPolicy, } from "./merchant-card.js";
|
|
10
11
|
export { twzrdOnPaymentRequested } from "./mcp-hook.js";
|
|
11
12
|
export { wrapFetchWithTwzrdGate } from "./wrap-fetch.js";
|
|
12
13
|
export { evaluate_x402_resource, } from "./evaluate.js";
|
|
13
14
|
export { withTwzrdGuard } from "./with-guard.js";
|
|
14
15
|
export { installTwzrdAutoGate, } from "./auto-gate.js";
|
|
16
|
+
export { safeFetch, runAgentcashFetch, main as safeFetchMain, } from "./safe-fetch.js";
|
|
17
|
+
export { installTwzrdX402ClientHook, twzrdBeforePaymentCreation, } from "./x402-client-hook.js";
|
|
15
18
|
export { quickCheck, QUICK_PRICE_USDC, } from "./quick.js";
|
|
16
19
|
export { createSponsoredX402Fetch, } from "./sponsored.js";
|
|
17
20
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,qFAAqF;AACrF,uFAAuF;AACvF,qFAAqF;AACrF,OAAO,EAAE,eAAe,EAAE,WAAW,EAAkB,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,aAAa,EAAgC,MAAM,aAAa,CAAC;AAC1E,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACd,mBAAmB,GAEpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC/F,OAAO,EACL,iBAAiB,EACjB,sBAAsB,GAIvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EACL,sBAAsB,GAGvB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,cAAc,EAA0B,MAAM,iBAAiB,CAAC;AACzE,OAAO,EACL,oBAAoB,GAGrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,UAAU,EACV,gBAAgB,GAIjB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,wBAAwB,GAGzB,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,qFAAqF;AACrF,uFAAuF;AACvF,qFAAqF;AACrF,OAAO,EAAE,eAAe,EAAE,WAAW,EAAkB,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,aAAa,EAAgC,MAAM,aAAa,CAAC;AAC1E,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACd,mBAAmB,GAEpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC/F,OAAO,EACL,eAAe,EACf,wBAAwB,EACxB,YAAY,GAKb,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,iBAAiB,EACjB,sBAAsB,GAIvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EACL,sBAAsB,GAGvB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,cAAc,EAA0B,MAAM,iBAAiB,CAAC;AACzE,OAAO,EACL,oBAAoB,GAGrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,SAAS,EACT,iBAAiB,EACjB,IAAI,IAAI,aAAa,GAGtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,GAM3B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,UAAU,EACV,gBAAgB,GAIjB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,wBAAwB,GAGzB,MAAM,gBAAgB,CAAC"}
|
package/dist/mcp-hook.d.ts
CHANGED
|
@@ -1,8 +1,27 @@
|
|
|
1
1
|
import type { ResolvedTwzrdGateConfig } from "./config.js";
|
|
2
|
-
import type { X402McpPaymentRequest } from "./types.js";
|
|
2
|
+
import type { X402McpPaymentRequest, X402McpPaymentRequestedContext } from "./types.js";
|
|
3
3
|
/**
|
|
4
|
-
* x402 MCP client hook. Wire as `onPaymentRequested` on
|
|
4
|
+
* x402 MCP client hook. Wire as `onPaymentRequested` on the @x402/mcp client
|
|
5
|
+
* (`new x402MCPClient(mcp, paymentClient, { onPaymentRequested })` or
|
|
6
|
+
* `createx402MCPClient({ ..., onPaymentRequested })`).
|
|
5
7
|
* Returns false to deny the payment, true to allow.
|
|
8
|
+
*
|
|
9
|
+
* Accepts BOTH context shapes:
|
|
10
|
+
* - the real @x402/mcp v2 PaymentRequestedContext:
|
|
11
|
+
* `{ toolName, arguments, paymentRequired: { accepts } }` — accepts[] is
|
|
12
|
+
* nested under paymentRequired (verified against @x402/mcp@2.17.0);
|
|
13
|
+
* - the legacy flat shape `{ accepts, context }` this package documented
|
|
14
|
+
* before this fix.
|
|
15
|
+
*
|
|
16
|
+
* Before this fix only the flat shape was read: wired into the real runtime,
|
|
17
|
+
* `req.accepts` was undefined, so every payment hit the unidentifiable-recipient
|
|
18
|
+
* fail-closed path — safe, but a 100% false-block. The nested shape is now
|
|
19
|
+
* detected first.
|
|
20
|
+
*
|
|
21
|
+
* For official @x402/core clients (not MCP), prefer `installTwzrdX402ClientHook`,
|
|
22
|
+
* which registers on the client's own `onBeforePaymentCreation` lifecycle hook.
|
|
23
|
+
*
|
|
24
|
+
* @see https://docs.x402.org/advanced-concepts/lifecycle-hooks
|
|
6
25
|
*/
|
|
7
|
-
export declare function twzrdOnPaymentRequested(req: X402McpPaymentRequest, config?: ResolvedTwzrdGateConfig): Promise<boolean>;
|
|
26
|
+
export declare function twzrdOnPaymentRequested(req: X402McpPaymentRequest | X402McpPaymentRequestedContext, config?: ResolvedTwzrdGateConfig): Promise<boolean>;
|
|
8
27
|
//# sourceMappingURL=mcp-hook.d.ts.map
|
package/dist/mcp-hook.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-hook.d.ts","sourceRoot":"","sources":["../src/mcp-hook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAG3D,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"mcp-hook.d.ts","sourceRoot":"","sources":["../src/mcp-hook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAG3D,OAAO,KAAK,EACV,qBAAqB,EACrB,8BAA8B,EAE/B,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,qBAAqB,GAAG,8BAA8B,EAC3D,MAAM,CAAC,EAAE,uBAAuB,GAC/B,OAAO,CAAC,OAAO,CAAC,CAyClB"}
|
package/dist/mcp-hook.js
CHANGED
|
@@ -1,22 +1,45 @@
|
|
|
1
1
|
import { payToFromRequirements, priceUsdcFromAmountMicro, pickRequirements } from "./payto.js";
|
|
2
2
|
import { twzrdApprovePayment } from "./policy.js";
|
|
3
3
|
/**
|
|
4
|
-
* x402 MCP client hook. Wire as `onPaymentRequested` on
|
|
4
|
+
* x402 MCP client hook. Wire as `onPaymentRequested` on the @x402/mcp client
|
|
5
|
+
* (`new x402MCPClient(mcp, paymentClient, { onPaymentRequested })` or
|
|
6
|
+
* `createx402MCPClient({ ..., onPaymentRequested })`).
|
|
5
7
|
* Returns false to deny the payment, true to allow.
|
|
8
|
+
*
|
|
9
|
+
* Accepts BOTH context shapes:
|
|
10
|
+
* - the real @x402/mcp v2 PaymentRequestedContext:
|
|
11
|
+
* `{ toolName, arguments, paymentRequired: { accepts } }` — accepts[] is
|
|
12
|
+
* nested under paymentRequired (verified against @x402/mcp@2.17.0);
|
|
13
|
+
* - the legacy flat shape `{ accepts, context }` this package documented
|
|
14
|
+
* before this fix.
|
|
15
|
+
*
|
|
16
|
+
* Before this fix only the flat shape was read: wired into the real runtime,
|
|
17
|
+
* `req.accepts` was undefined, so every payment hit the unidentifiable-recipient
|
|
18
|
+
* fail-closed path — safe, but a 100% false-block. The nested shape is now
|
|
19
|
+
* detected first.
|
|
20
|
+
*
|
|
21
|
+
* For official @x402/core clients (not MCP), prefer `installTwzrdX402ClientHook`,
|
|
22
|
+
* which registers on the client's own `onBeforePaymentCreation` lifecycle hook.
|
|
23
|
+
*
|
|
24
|
+
* @see https://docs.x402.org/advanced-concepts/lifecycle-hooks
|
|
6
25
|
*/
|
|
7
26
|
export async function twzrdOnPaymentRequested(req, config) {
|
|
8
|
-
const
|
|
27
|
+
const real = req;
|
|
28
|
+
const legacy = req;
|
|
29
|
+
const accepts = (real.paymentRequired?.accepts ?? legacy.accepts);
|
|
30
|
+
const toolName = real.toolName ?? legacy.context?.toolName;
|
|
31
|
+
const first = pickRequirements(accepts);
|
|
9
32
|
const { payTo, amountMicro, resource } = payToFromRequirements(first);
|
|
10
33
|
const priceUsdc = priceUsdcFromAmountMicro(amountMicro);
|
|
11
34
|
const chain = first.network ?? undefined;
|
|
12
35
|
try {
|
|
13
36
|
const { approved, card, reason } = await twzrdApprovePayment({
|
|
14
|
-
resourceUrl:
|
|
15
|
-
resourceName:
|
|
16
|
-
sellerWallet:
|
|
37
|
+
resourceUrl: legacy.context?.resource ?? resource,
|
|
38
|
+
resourceName: toolName,
|
|
39
|
+
sellerWallet: legacy.context?.sellerWallet,
|
|
17
40
|
payTo,
|
|
18
41
|
priceUsdc,
|
|
19
|
-
buyerWallet:
|
|
42
|
+
buyerWallet: legacy.context?.buyerWallet,
|
|
20
43
|
agentIntent: "x402_mcp_onPaymentRequested",
|
|
21
44
|
chain,
|
|
22
45
|
}, config);
|
package/dist/mcp-hook.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-hook.js","sourceRoot":"","sources":["../src/mcp-hook.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC/F,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-hook.js","sourceRoot":"","sources":["../src/mcp-hook.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC/F,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAOlD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,GAA2D,EAC3D,MAAgC;IAEhC,MAAM,IAAI,GAAG,GAAqC,CAAC;IACnD,MAAM,MAAM,GAAG,GAA4B,CAAC;IAC5C,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,OAAO,IAAI,MAAM,CAAC,OAAO,CAEnD,CAAC;IACd,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC;IAE3D,MAAM,KAAK,GAA4B,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACjE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,wBAAwB,CAAC,WAAW,CAAC,CAAC;IAExD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,IAAI,SAAS,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,mBAAmB,CAC1D;YACE,WAAW,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ,IAAI,QAAQ;YACjD,YAAY,EAAE,QAAQ;YACtB,YAAY,EAAE,MAAM,CAAC,OAAO,EAAE,YAAY;YAC1C,KAAK;YACL,SAAS;YACT,WAAW,EAAE,MAAM,CAAC,OAAO,EAAE,WAAW;YACxC,WAAW,EAAE,6BAA6B;YAC1C,KAAK;SACN,EACD,MAAM,CACP,CAAC;QAEF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,IAAI,CAAC,+BAA+B,EAAE,MAAM,EAAE;gBACpD,KAAK;gBACL,QAAQ;gBACR,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,WAAW,EAAE,IAAI,CAAC,WAAW;aAC9B,CAAC,CAAC;QACL,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC,MAAM,EAAE,QAAQ;YAAE,OAAO,KAAK,CAAC;QACpC,OAAO,IAAI,CAAC,CAAC,qBAAqB;IACpC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chain-neutral network classification for Path E.
|
|
3
|
+
*
|
|
4
|
+
* Reputation scoring is Solana-deep today. Other networks are *recognized*
|
|
5
|
+
* (we parse them) but not *scored*. Never invent a Base reputation from
|
|
6
|
+
* Solana history or catalog metadata.
|
|
7
|
+
*/
|
|
8
|
+
export type NetworkKind = "solana" | "evm" | "other" | "unknown";
|
|
9
|
+
export type NetworkClass = {
|
|
10
|
+
/** Raw network string from the payment requirement */
|
|
11
|
+
network: string | undefined;
|
|
12
|
+
kind: NetworkKind;
|
|
13
|
+
/** True when TWZRD has behavioral reputation for this network */
|
|
14
|
+
reputationScored: boolean;
|
|
15
|
+
/** True when we recognize the CAIP-2 / x402 network identifier shape */
|
|
16
|
+
networkSupported: boolean;
|
|
17
|
+
reason: string;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Classify an x402 `accepts[].network` value (optional payTo heuristic).
|
|
21
|
+
*
|
|
22
|
+
* Scored today: Solana mainnet (and generic "solana" / mainnet markers).
|
|
23
|
+
* Recognized but unscored: eip155:* (Base, Polygon, Arbitrum, …).
|
|
24
|
+
*
|
|
25
|
+
* When `network` is omitted (legacy integrators), default to Solana scoring
|
|
26
|
+
* unless `payTo` is a 0x EVM address — never invent Base reputation.
|
|
27
|
+
*/
|
|
28
|
+
export declare function classifyNetwork(network: string | undefined | null, payTo?: string | null): NetworkClass;
|
|
29
|
+
/**
|
|
30
|
+
* Policy action for an unscored (or unsupported) network.
|
|
31
|
+
* - observe (default): allow payment but never claim reputation approval
|
|
32
|
+
* - strict: block before signing
|
|
33
|
+
*/
|
|
34
|
+
export type UnsupportedNetworkMode = "observe" | "strict";
|
|
35
|
+
export type UnsupportedNetworkDecision = {
|
|
36
|
+
/** Never "allow" from intelligence — only policy */
|
|
37
|
+
decision: "unknown";
|
|
38
|
+
reason: string;
|
|
39
|
+
policyAction: "allow" | "block";
|
|
40
|
+
approved: boolean;
|
|
41
|
+
network: string | undefined;
|
|
42
|
+
networkSupported: boolean;
|
|
43
|
+
reputationScored: false;
|
|
44
|
+
kind: NetworkKind;
|
|
45
|
+
};
|
|
46
|
+
export declare function decideUnsupportedNetwork(cls: NetworkClass, mode: UnsupportedNetworkMode): UnsupportedNetworkDecision;
|
|
47
|
+
/** Telemetry-safe log line (no secrets). */
|
|
48
|
+
export declare function logUnsupportedNetwork(event: {
|
|
49
|
+
network?: string;
|
|
50
|
+
payTo?: string;
|
|
51
|
+
amountBucket?: string;
|
|
52
|
+
policyMode: UnsupportedNetworkMode;
|
|
53
|
+
policyAction: "allow" | "block";
|
|
54
|
+
adapter?: string;
|
|
55
|
+
}): void;
|
|
56
|
+
export declare function amountBucket(amountMicro: string | undefined): string;
|
|
57
|
+
//# sourceMappingURL=network.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../src/network.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,KAAK,GAAG,OAAO,GAAG,SAAS,CAAC;AAEjE,MAAM,MAAM,YAAY,GAAG;IACzB,sDAAsD;IACtD,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,IAAI,EAAE,WAAW,CAAC;IAClB,iEAAiE;IACjE,gBAAgB,EAAE,OAAO,CAAC;IAC1B,wEAAwE;IACxE,gBAAgB,EAAE,OAAO,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EAClC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GACpB,YAAY,CA6Ed;AAED;;;;GAIG;AACH,MAAM,MAAM,sBAAsB,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE1D,MAAM,MAAM,0BAA0B,GAAG;IACvC,oDAAoD;IACpD,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,OAAO,GAAG,OAAO,CAAC;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,gBAAgB,EAAE,KAAK,CAAC;IACxB,IAAI,EAAE,WAAW,CAAC;CACnB,CAAC;AAEF,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,sBAAsB,GAC3B,0BAA0B,CAY5B;AAED,4CAA4C;AAC5C,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,sBAAsB,CAAC;IACnC,YAAY,EAAE,OAAO,GAAG,OAAO,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,IAAI,CAiBP;AAED,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAUpE"}
|