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 CHANGED
@@ -1,15 +1,57 @@
1
1
  # twzrd-x402-gate
2
2
 
3
- Agent-side x402 **firewall**. TWZRD sits in the path before any 402 payment leaves your
4
- agent's wallet — free preflight + free merchant_card wash refuse before USDC moves.
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/svm";
48
+ import { wrapFetchWithPayment } from "@x402/fetch"; // or @x402/svm helper
9
49
 
10
- const payingFetch = installTwzrdAutoGate((guarded) => wrapFetchWithPayment(guarded, buyerWallet));
11
- // Every 402 gated BEFORE your client signs → free preflight + free merchant_card wash check → throws on block.
12
- const response = await payingFetch("https://api.exa.ai/search");
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 (live, free only): `npm run wash-dogfood` → [`examples/wash-refuse-dogfood.ts`](./examples/wash-refuse-dogfood.ts).
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
- ```typescript
262
- import { defaultGate } from "twzrd-x402-gate";
353
+ The hook accepts the real `@x402/mcp` v2 `PaymentRequestedContext`
354
+ (`{ toolName, arguments, paymentRequired }`) wire it directly:
263
355
 
264
- const client = createX402MCPClient({
265
- onPaymentRequested: defaultGate.onPaymentRequested, // returns false to deny
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
  };
@@ -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,CAkElF"}
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
  };
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -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:
@@ -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,CAsH7B"}
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
- const decision = (approval.card.decision ?? "unknown");
42
- const receiptUrl = payTo
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
@@ -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;AAsExD;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,WAAmB,EACnB,mBAA4C,EAC5C,OAA4B,EAAE;IAE9B,MAAM,MAAM,GAAG,aAAa,CAAC;QAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;QACzC,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,mEAAmE;QACnE,6EAA6E;QAC7E,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;QACzC,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAC,CAAC;IAEH,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,qBAAqB,CAAC,mBAAmB,CAAC,CAAC;IACpF,MAAM,SAAS,GAAG,wBAAwB,CAAC,WAAW,CAAC,CAAC;IAExD,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CACxC;QACE,WAAW,EAAE,QAAQ,IAAI,WAAW;QACpC,KAAK;QACL,SAAS;QACT,WAAW,EAAE,wBAAwB;KACtC;IACD,+DAA+D;IAC/D,MAAM,CACP,CAAC;IAEF,MAAM,QAAQ,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,IAAI,SAAS,CAA8B,CAAC;IACpF,MAAM,UAAU,GAAG,KAAK;QACtB,CAAC,CAAC,GAAG,MAAM,CAAC,SAAS,mBAAmB,kBAAkB,CAAC,KAAK,CAAC,EAAE;QACnE,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,IAAI,GAAuB;QAC/B,QAAQ;QACR,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI;QAC7C,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,UAAU;KACX,CAAC;IAEF,iFAAiF;IACjF,gFAAgF;IAChF,mFAAmF;IACnF,mFAAmF;IACnF,wEAAwE;IACxE,IACE,IAAI,CAAC,cAAc;QACnB,OAAO,IAAI,CAAC,SAAS,KAAK,UAAU;QACpC,KAAK;QACL,QAAQ,KAAK,MAAM;QACnB,IAAI,CAAC,QAAQ;QACb,CAAC,SAAS,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,YAAY,IAAI,CAAC,CAAC,EAC3D,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,eAAe,IAAI,MAAM,CAAC,iBAAiB,CAAC;QAC9E,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE;YACpC,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAC;QACH,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YAC5C,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC;YACzC,OAAO;gBACL,GAAG,IAAI;gBACP,QAAQ,EAAE,WAAW;gBACrB,UAAU,EAAE,KAAK,CAAC,KAAK;gBACvB,SAAS,EAAE,IAAI;gBACf,cAAc,EAAE,KAAK,CAAC,KAAK;gBAC3B,aAAa,EAAE,KAAK,CAAC,IAAI;gBACzB,MAAM,EAAE,WAAW;oBACjB,CAAC,CAAC,gDAAgD,KAAK,CAAC,KAAK,OAAO,KAAK,GAAG;oBAC5E,CAAC,CAAC,gDAAgD,KAAK,CAAC,KAAK,MAAM,KAAK,GAAG;aAC9E,CAAC;QACJ,CAAC;QACD,6EAA6E;QAC7E,OAAO,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;IAC5D,CAAC;IAED,qEAAqE;IACrE,2EAA2E;IAC3E,IACE,IAAI,CAAC,WAAW;QAChB,OAAO,IAAI,CAAC,SAAS,KAAK,UAAU;QACpC,KAAK;QACL,QAAQ,KAAK,OAAO,EACpB,CAAC;QACD,IAAI,CAAC;YACH,qFAAqF;YACrF,MAAM,OAAO,GAA2B,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;YACvE,IAAI,OAAO,QAAQ,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;gBAC7C,OAAO,CAAC,sBAAsB,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YACjE,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAC/B,GAAG,MAAM,CAAC,SAAS,mBAAmB,kBAAkB,CAAC,KAAK,CAAC,EAAE,EACjE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAC3B,CAAC;YACF,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAK9B,CAAC;gBACF,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC;gBACnC,MAAM,QAAQ,GAAG,OAAO,EAAE,QAA+C,CAAC;gBAC1E,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,OAAO,QAAQ,EAAE,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBAC5H,MAAM,WAAW,GAAG,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC;gBAClD,IAAI,IAAI,CAAC,SAAS;oBAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBAChD,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,kBAAkB,EAAE,WAAW,EAAE,CAAC;YAC9E,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,2EAA2E;QAC7E,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,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
@@ -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,GACtB,MAAM,YAAY,CAAC"}
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"}
@@ -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 createX402MCPClient.
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
@@ -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,EAAE,qBAAqB,EAA2B,MAAM,YAAY,CAAC;AAEjF;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,qBAAqB,EAC1B,MAAM,CAAC,EAAE,uBAAuB,GAC/B,OAAO,CAAC,OAAO,CAAC,CAkClB"}
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 createX402MCPClient.
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 first = pickRequirements(req.accepts);
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: req.context?.resource ?? resource,
15
- resourceName: req.context?.toolName,
16
- sellerWallet: req.context?.sellerWallet,
37
+ resourceUrl: legacy.context?.resource ?? resource,
38
+ resourceName: toolName,
39
+ sellerWallet: legacy.context?.sellerWallet,
17
40
  payTo,
18
41
  priceUsdc,
19
- buyerWallet: req.context?.buyerWallet,
42
+ buyerWallet: legacy.context?.buyerWallet,
20
43
  agentIntent: "x402_mcp_onPaymentRequested",
21
44
  chain,
22
45
  }, config);
@@ -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;AAGlD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,GAA0B,EAC1B,MAAgC;IAEhC,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,OAAqD,CAAC,CAAC;IAC1F,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,GAAG,CAAC,OAAO,EAAE,QAAQ,IAAI,QAAQ;YAC9C,YAAY,EAAE,GAAG,CAAC,OAAO,EAAE,QAAQ;YACnC,YAAY,EAAE,GAAG,CAAC,OAAO,EAAE,YAAY;YACvC,KAAK;YACL,SAAS;YACT,WAAW,EAAE,GAAG,CAAC,OAAO,EAAE,WAAW;YACrC,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"}
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"}