twzrd-x402-gate 0.3.0 → 0.5.0
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 +90 -18
- package/dist/auto-gate.d.ts +48 -0
- package/dist/auto-gate.d.ts.map +1 -0
- package/dist/auto-gate.js +34 -0
- package/dist/auto-gate.js.map +1 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +16 -0
- package/dist/config.js.map +1 -1
- package/dist/evaluate.d.ts.map +1 -1
- package/dist/evaluate.js +5 -1
- package/dist/evaluate.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/merchant-card.d.ts +52 -0
- package/dist/merchant-card.d.ts.map +1 -0
- package/dist/merchant-card.js +69 -0
- package/dist/merchant-card.js.map +1 -0
- package/dist/policy.d.ts.map +1 -1
- package/dist/policy.js +44 -1
- package/dist/policy.js.map +1 -1
- package/dist/types.d.ts +17 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/with-guard.d.ts.map +1 -1
- package/dist/with-guard.js +4 -0
- package/dist/with-guard.js.map +1 -1
- package/dist/wrap-fetch.d.ts.map +1 -1
- package/dist/wrap-fetch.js +4 -2
- package/dist/wrap-fetch.js.map +1 -1
- package/package.json +5 -4
package/README.md
CHANGED
|
@@ -1,44 +1,112 @@
|
|
|
1
1
|
# twzrd-x402-gate
|
|
2
2
|
|
|
3
3
|
Agent-side x402 **firewall**. TWZRD sits in the path before any 402 payment leaves your
|
|
4
|
-
agent's wallet — free preflight
|
|
4
|
+
agent's wallet — free preflight + free merchant_card wash refuse before USDC moves.
|
|
5
5
|
|
|
6
6
|
```typescript
|
|
7
|
-
import {
|
|
7
|
+
import { installTwzrdAutoGate } from "twzrd-x402-gate";
|
|
8
|
+
import { wrapFetchWithPayment } from "@x402/svm";
|
|
8
9
|
|
|
9
|
-
const
|
|
10
|
-
// Every 402
|
|
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");
|
|
11
13
|
```
|
|
12
14
|
|
|
15
|
+
## Buyer flow (trustless, fail-open) — locked sequence
|
|
16
|
+
|
|
17
|
+
Canonical path for every agent that spends USDC on Solana x402:
|
|
18
|
+
|
|
19
|
+
| Step | Call | Cost | What gates pay |
|
|
20
|
+
|------|------|------|----------------|
|
|
21
|
+
| 1 | `POST /v1/intel/preflight` | free | `decision=block` → refuse (`twzrd_decision_block`). Score floor / optional `can_spend` also deny. |
|
|
22
|
+
| 2 | `GET /v1/intel/merchant_card/{payTo}` | free | `wash_flagged: true` → refuse by default (`twzrd_wash_flagged`). **Only tightens** step 1. |
|
|
23
|
+
| 3 | Optional paid trust | $0.05 / $0.001 | On `warn` or high-value: `GET /v1/intel/trust/{payTo}` or `quickCheck`. Never required for the free refuse path. |
|
|
24
|
+
| 4 | Pay (or refuse) | resource price | Only if steps 1–2 approved (and any opt-in paid escalate did not block). |
|
|
25
|
+
|
|
26
|
+
**Fail-open (no invent):**
|
|
27
|
+
- Preflight HTTP/network error → default fail-closed in gate 0.2+ (`TWZRD_FAIL_OPEN=true` restores legacy allow-on-outage).
|
|
28
|
+
- Merchant card unreachable / non-2xx / missing `wash_flagged` → `washFlagged=null` → **do not refuse on wash** (preflight decision stands).
|
|
29
|
+
- Only a successful card with `wash_flagged: true` triggers wash refuse or soft cap.
|
|
30
|
+
|
|
31
|
+
**Wash policy (exact):**
|
|
32
|
+
- Prior preflight deny → unchanged (wash never loosens a block).
|
|
33
|
+
- `refuseWashFlagged=false` or wash not true → keep preflight approval.
|
|
34
|
+
- `wash_flagged=true` + no cap → `approved=false`, `reason=twzrd_wash_flagged`, `verdict=block`.
|
|
35
|
+
- `wash_flagged=true` + `washMaxUsdc` set + `priceUsdc <= cap` → allow, `washCapped=true`, reason `twzrd_wash_capped_{price}_le_{cap}`.
|
|
36
|
+
- `wash_flagged=true` + price above cap (or price unknown) → refuse with `twzrd_wash_flagged_above_cap_*`.
|
|
37
|
+
|
|
38
|
+
**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
|
+
|
|
40
|
+
Dogfood (live, free only): `npm run wash-dogfood` → [`examples/wash-refuse-dogfood.ts`](./examples/wash-refuse-dogfood.ts).
|
|
41
|
+
|
|
13
42
|
## Install
|
|
14
43
|
|
|
15
44
|
```bash
|
|
16
45
|
npm install twzrd-x402-gate
|
|
17
46
|
```
|
|
18
47
|
|
|
19
|
-
## Quickstart: `
|
|
48
|
+
## Quickstart: `installTwzrdAutoGate` (default-on)
|
|
20
49
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
50
|
+
`installTwzrdAutoGate` is the one-liner form of "guard the raw fetch, then hand it to your
|
|
51
|
+
x402 client." It takes a `payWrap` function — whatever composes your paying client on top of
|
|
52
|
+
a fetch — and returns a fetch that's already gated: a blocked seller throws before your client
|
|
53
|
+
ever gets a chance to sign.
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
import { installTwzrdAutoGate } from "twzrd-x402-gate";
|
|
57
|
+
import { wrapFetchWithPayment } from "@x402/svm";
|
|
58
|
+
|
|
59
|
+
const payingFetch = installTwzrdAutoGate((guarded) => wrapFetchWithPayment(guarded, buyerWallet));
|
|
60
|
+
|
|
61
|
+
// Use payingFetch everywhere you'd call a paid resource:
|
|
62
|
+
const response = await payingFetch("https://api.exa.ai/search");
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
`payWrap` receives the **guarded** fetch (the guard has already run by the time your client
|
|
66
|
+
sees a 402) — this is the only correct composition order. Building it the other way round
|
|
67
|
+
(guarding an already-paying fetch) is a no-op; see [Compatibility note](#compatibility-note).
|
|
68
|
+
Any x402 client that composes over an underlying `fetch` works the same way — swap in
|
|
69
|
+
whatever `payWrap` your client's API expects (agentcash, ClawRouter, PayAI, a custom
|
|
70
|
+
`@x402/svm` scheme, etc.).
|
|
71
|
+
|
|
72
|
+
Default **ON**. Disable with `TWZRD_AUTO_GATE=0` (env, deploy-time kill switch) or
|
|
73
|
+
`{ disabled: true }` (per-call, e.g. in tests) — the raw fetch is handed straight to
|
|
74
|
+
`payWrap`, unguarded.
|
|
75
|
+
|
|
76
|
+
What happens on every HTTP 402 the raw fetch returns:
|
|
77
|
+
1. Reads the Solana-network entry from `accepts[]` (falls back to first entry) to get the seller wallet.
|
|
78
|
+
2. Calls `POST /v1/intel/preflight` — free, no auth. `decision=block` (or score floor) throws — `payWrap`'s client never signs.
|
|
79
|
+
3. Calls `GET /v1/intel/merchant_card/{payTo}` — free, no auth. `wash_flagged: true` refuses by default (only tightens step 2; fail-open if the card is unreachable — no invent).
|
|
80
|
+
4. Otherwise returns the 402 to `payWrap`'s client, which pays normally.
|
|
81
|
+
|
|
82
|
+
Non-402 responses pass through unchanged.
|
|
83
|
+
|
|
84
|
+
### Lower-level: `withTwzrdGuard`
|
|
85
|
+
|
|
86
|
+
`installTwzrdAutoGate` is built on `withTwzrdGuard` — the fetch wrapper itself, if you want to
|
|
87
|
+
manage the raw/paying composition yourself:
|
|
24
88
|
|
|
25
89
|
```typescript
|
|
26
90
|
import { withTwzrdGuard } from "twzrd-x402-gate";
|
|
27
|
-
import {
|
|
91
|
+
import { wrapFetchWithPayment } from "@x402/svm";
|
|
28
92
|
|
|
29
|
-
|
|
30
|
-
const
|
|
31
|
-
const safeFetch =
|
|
93
|
+
const raw = globalThis.fetch; // MUST still surface HTTP 402
|
|
94
|
+
const guarded = withTwzrdGuard(raw); // guard sits upstream
|
|
95
|
+
const safeFetch = wrapFetchWithPayment(guarded, buyerWallet);
|
|
32
96
|
|
|
33
|
-
// Use safeFetch everywhere you'd call a paid resource:
|
|
34
97
|
const response = await safeFetch("https://api.exa.ai/search");
|
|
35
98
|
```
|
|
36
99
|
|
|
37
100
|
What the guard does on HTTP 402:
|
|
38
101
|
1. Reads the Solana-network entry from `accepts[]` (falls back to first entry) to get the seller wallet.
|
|
39
|
-
2.
|
|
40
|
-
3. `
|
|
41
|
-
|
|
102
|
+
2. Free `POST /v1/intel/preflight` — `decision=block` / score floor deny.
|
|
103
|
+
3. Free `GET /v1/intel/merchant_card/{payTo}` — `wash_flagged:true` **refuses by default**
|
|
104
|
+
(`reason: twzrd_wash_flagged`). Fail-open if the card is unreachable (no invent).
|
|
105
|
+
4. If approved: returns the original 402 for the x402 client to pay.
|
|
106
|
+
|
|
107
|
+
Opt out of wash refuse: `withTwzrdGuard(fetch, { refuseWashFlagged: false })` or
|
|
108
|
+
`TWZRD_REFUSE_WASH_FLAGGED=0`. Soft cap instead of hard refuse: `washMaxUsdc` /
|
|
109
|
+
`TWZRD_WASH_MAX_USDC`.
|
|
42
110
|
|
|
43
111
|
Non-402 responses pass through unchanged.
|
|
44
112
|
|
|
@@ -236,12 +304,16 @@ A payment is **blocked** when:
|
|
|
236
304
|
| `autoReceipt` | — | `false` | Auto-buy $0.05 TWZRD receipt on warn/allow |
|
|
237
305
|
| `x402Fetch` | — | — | x402-capable fetch for `autoReceipt` |
|
|
238
306
|
| `onReceipt` | — | — | Callback after receipt is captured |
|
|
307
|
+
| `disabled` (`installTwzrdAutoGate` only) | `TWZRD_AUTO_GATE=0`/`false` | `false` | Bypass the guard entirely — `payWrap` gets the raw, unguarded fetch |
|
|
239
308
|
|
|
240
309
|
## Compatibility note
|
|
241
310
|
|
|
242
311
|
**Proxied x402 clients** (AgentCash's `.fetch`, ClawRouter `:8402`): these clients handle
|
|
243
|
-
402 internally and return 200. The guard never sees a 402
|
|
244
|
-
|
|
312
|
+
402 internally and return 200. The guard never sees a 402 if it wraps the client's *output* —
|
|
313
|
+
it must wrap the client's *input*. `installTwzrdAutoGate` enforces this composition order by
|
|
314
|
+
construction: it guards the raw fetch first, then hands the guarded fetch to your `payWrap`.
|
|
315
|
+
If you're composing `withTwzrdGuard` manually instead, pass the raw (non-paying) fetch to
|
|
316
|
+
`withTwzrdGuard`, then wrap its output in your x402 client — never the reverse. Or call
|
|
245
317
|
`evaluate_x402_resource` explicitly before routing through the proxy.
|
|
246
318
|
|
|
247
319
|
## Why pre-spend, not post-pay
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { type TwzrdGuardOptions } from "./with-guard.js";
|
|
2
|
+
/**
|
|
3
|
+
* Takes a guarded (pre-pay-checked) fetch and returns the fetch your agent actually
|
|
4
|
+
* calls — i.e. your x402 client composed on top of the guard (agentcash, ClawRouter,
|
|
5
|
+
* @x402/svm, PayAI, etc.).
|
|
6
|
+
*/
|
|
7
|
+
export type PayWrap = (guardedFetch: typeof fetch) => typeof fetch;
|
|
8
|
+
export type InstallAutoGateOptions = TwzrdGuardOptions & {
|
|
9
|
+
/**
|
|
10
|
+
* The RAW (non-paying) fetch to guard. This MUST be a fetch that still surfaces
|
|
11
|
+
* HTTP 402 — do not pass an already-paying client here (see compatibility note
|
|
12
|
+
* in README: proxied clients like AgentCash/.fetch resolve 402 internally and
|
|
13
|
+
* return 200, so the guard would never see the block condition).
|
|
14
|
+
* Default: globalThis.fetch.
|
|
15
|
+
*/
|
|
16
|
+
rawFetch?: typeof fetch;
|
|
17
|
+
/**
|
|
18
|
+
* Force-disable the gate (payWrap gets the raw fetch, unguarded). Mirrors
|
|
19
|
+
* TWZRD_AUTO_GATE=0 / "false". Prefer the env var for a deploy-time kill switch;
|
|
20
|
+
* use this for tests.
|
|
21
|
+
*/
|
|
22
|
+
disabled?: boolean;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Default-on composition helper: guards the RAW fetch with the free TWZRD preflight,
|
|
26
|
+
* THEN hands the guarded fetch to your payment wrapper. This is the one-liner form of
|
|
27
|
+
* the two-step pattern documented in the README:
|
|
28
|
+
*
|
|
29
|
+
* const raw = globalThis.fetch;
|
|
30
|
+
* const gated = withTwzrdGuard(raw);
|
|
31
|
+
* const paying = payWrap(gated);
|
|
32
|
+
*
|
|
33
|
+
* Composing it this way by construction rules out the common mis-wiring of guarding
|
|
34
|
+
* an already-paying fetch (which returns 200 and never gives the guard a 402 to act on).
|
|
35
|
+
*
|
|
36
|
+
* Default ON — a blocked seller throws before payWrap's client ever signs. Opt out with
|
|
37
|
+
* TWZRD_AUTO_GATE=0 (env) or { disabled: true } (per-call), e.g. for a local dev harness
|
|
38
|
+
* that intentionally wants the unguarded fetch.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* import { installTwzrdAutoGate } from "twzrd-x402-gate";
|
|
42
|
+
* import { wrapFetchWithPayment } from "@x402/svm";
|
|
43
|
+
*
|
|
44
|
+
* const payingFetch = installTwzrdAutoGate((guarded) => wrapFetchWithPayment(guarded, buyerWallet));
|
|
45
|
+
* await payingFetch("https://api.exa.ai/search"); // blocked sellers throw before signing
|
|
46
|
+
*/
|
|
47
|
+
export declare function installTwzrdAutoGate(payWrap: PayWrap, options?: InstallAutoGateOptions): typeof fetch;
|
|
48
|
+
//# sourceMappingURL=auto-gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-gate.d.ts","sourceRoot":"","sources":["../src/auto-gate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzE;;;;GAIG;AACH,MAAM,MAAM,OAAO,GAAG,CAAC,YAAY,EAAE,OAAO,KAAK,KAAK,OAAO,KAAK,CAAC;AAEnE,MAAM,MAAM,sBAAsB,GAAG,iBAAiB,GAAG;IACvD;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,OAAO,KAAK,CAAC;IACxB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,KAAK,CAQd"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { withTwzrdGuard } from "./with-guard.js";
|
|
2
|
+
/**
|
|
3
|
+
* Default-on composition helper: guards the RAW fetch with the free TWZRD preflight,
|
|
4
|
+
* THEN hands the guarded fetch to your payment wrapper. This is the one-liner form of
|
|
5
|
+
* the two-step pattern documented in the README:
|
|
6
|
+
*
|
|
7
|
+
* const raw = globalThis.fetch;
|
|
8
|
+
* const gated = withTwzrdGuard(raw);
|
|
9
|
+
* const paying = payWrap(gated);
|
|
10
|
+
*
|
|
11
|
+
* Composing it this way by construction rules out the common mis-wiring of guarding
|
|
12
|
+
* an already-paying fetch (which returns 200 and never gives the guard a 402 to act on).
|
|
13
|
+
*
|
|
14
|
+
* Default ON — a blocked seller throws before payWrap's client ever signs. Opt out with
|
|
15
|
+
* TWZRD_AUTO_GATE=0 (env) or { disabled: true } (per-call), e.g. for a local dev harness
|
|
16
|
+
* that intentionally wants the unguarded fetch.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* import { installTwzrdAutoGate } from "twzrd-x402-gate";
|
|
20
|
+
* import { wrapFetchWithPayment } from "@x402/svm";
|
|
21
|
+
*
|
|
22
|
+
* const payingFetch = installTwzrdAutoGate((guarded) => wrapFetchWithPayment(guarded, buyerWallet));
|
|
23
|
+
* await payingFetch("https://api.exa.ai/search"); // blocked sellers throw before signing
|
|
24
|
+
*/
|
|
25
|
+
export function installTwzrdAutoGate(payWrap, options) {
|
|
26
|
+
const raw = options?.rawFetch ?? globalThis.fetch;
|
|
27
|
+
const envDisabled = process.env.TWZRD_AUTO_GATE === "0" || process.env.TWZRD_AUTO_GATE === "false";
|
|
28
|
+
const disabled = options?.disabled ?? envDisabled;
|
|
29
|
+
if (disabled)
|
|
30
|
+
return payWrap(raw);
|
|
31
|
+
const guarded = withTwzrdGuard(raw, options);
|
|
32
|
+
return payWrap(guarded);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=auto-gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-gate.js","sourceRoot":"","sources":["../src/auto-gate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAA0B,MAAM,iBAAiB,CAAC;AA0BzE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAgB,EAChB,OAAgC;IAEhC,MAAM,GAAG,GAAG,OAAO,EAAE,QAAQ,IAAI,UAAU,CAAC,KAAK,CAAC;IAClD,MAAM,WAAW,GACf,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,OAAO,CAAC;IACjF,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,WAAW,CAAC;IAClD,IAAI,QAAQ;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC7C,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;AAC1B,CAAC"}
|
package/dist/config.d.ts
CHANGED
|
@@ -5,6 +5,10 @@ export type ResolvedTwzrdGateConfig = {
|
|
|
5
5
|
blockDecisions: Set<string>;
|
|
6
6
|
failOpen: boolean;
|
|
7
7
|
gateOnCanSpend: boolean;
|
|
8
|
+
/** Default true: refuse when free merchant_card.wash_flagged */
|
|
9
|
+
refuseWashFlagged: boolean;
|
|
10
|
+
/** Soft cap USDC when wash_flagged; null = hard refuse */
|
|
11
|
+
washMaxUsdc: number | null;
|
|
8
12
|
fetch: typeof fetch;
|
|
9
13
|
onWarnUpsell?: (ctx: TwzrdUpsellContext) => void | Promise<void>;
|
|
10
14
|
};
|
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,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,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"}
|
package/dist/config.js
CHANGED
|
@@ -29,6 +29,20 @@ export function resolveConfig(overrides) {
|
|
|
29
29
|
const gateOnCanSpend = overrides?.gateOnCanSpend ??
|
|
30
30
|
(process.env.TWZRD_GATE_ON_CAN_SPEND === "true" ||
|
|
31
31
|
process.env.TWZRD_GATE_ON_CAN_SPEND === "1");
|
|
32
|
+
// Default true: free merchant_card.wash_flagged → refuse pay (trustless step 3).
|
|
33
|
+
// Opt out: refuseWashFlagged:false or TWZRD_REFUSE_WASH_FLAGGED=0|false.
|
|
34
|
+
const refuseWashEnv = process.env.TWZRD_REFUSE_WASH_FLAGGED;
|
|
35
|
+
const refuseWashFlagged = overrides?.refuseWashFlagged ??
|
|
36
|
+
!(refuseWashEnv === "0" || refuseWashEnv === "false");
|
|
37
|
+
let washMaxUsdc = null;
|
|
38
|
+
if (overrides?.washMaxUsdc != null && Number.isFinite(overrides.washMaxUsdc)) {
|
|
39
|
+
washMaxUsdc = overrides.washMaxUsdc;
|
|
40
|
+
}
|
|
41
|
+
else if (process.env.TWZRD_WASH_MAX_USDC != null && process.env.TWZRD_WASH_MAX_USDC !== "") {
|
|
42
|
+
const n = Number(process.env.TWZRD_WASH_MAX_USDC);
|
|
43
|
+
if (Number.isFinite(n) && n >= 0)
|
|
44
|
+
washMaxUsdc = n;
|
|
45
|
+
}
|
|
32
46
|
const fetchFn = overrides?.fetch ?? globalThis.fetch;
|
|
33
47
|
if (typeof fetchFn !== "function") {
|
|
34
48
|
throw new Error("[twzrd-x402-gate] fetch is not available; pass config.fetch");
|
|
@@ -39,6 +53,8 @@ export function resolveConfig(overrides) {
|
|
|
39
53
|
blockDecisions,
|
|
40
54
|
failOpen,
|
|
41
55
|
gateOnCanSpend,
|
|
56
|
+
refuseWashFlagged,
|
|
57
|
+
washMaxUsdc,
|
|
42
58
|
fetch: fetchFn,
|
|
43
59
|
onWarnUpsell: overrides?.onWarnUpsell,
|
|
44
60
|
};
|
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.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;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"}
|
package/dist/evaluate.js
CHANGED
|
@@ -24,6 +24,8 @@ export async function evaluate_x402_resource(resourceUrl, paymentRequirements, o
|
|
|
24
24
|
// Decision-only gate: unknown sellers score warn (~45), not block.
|
|
25
25
|
// Gating on can_spend would block every Agentic.Market seller not in corpus.
|
|
26
26
|
gateOnCanSpend: opts.gateOnCanSpend,
|
|
27
|
+
refuseWashFlagged: opts.refuseWashFlagged,
|
|
28
|
+
washMaxUsdc: opts.washMaxUsdc,
|
|
27
29
|
fetch: opts.fetch,
|
|
28
30
|
});
|
|
29
31
|
const { payTo, amountMicro, resource } = payToFromRequirements(paymentRequirements);
|
|
@@ -33,7 +35,9 @@ export async function evaluate_x402_resource(resourceUrl, paymentRequirements, o
|
|
|
33
35
|
payTo,
|
|
34
36
|
priceUsdc,
|
|
35
37
|
agentIntent: "evaluate_x402_resource",
|
|
36
|
-
},
|
|
38
|
+
},
|
|
39
|
+
// resolveConfig already embeds refuseWashFlagged / washMaxUsdc
|
|
40
|
+
config);
|
|
37
41
|
const decision = (approval.card.decision ?? "unknown");
|
|
38
42
|
const receiptUrl = payTo
|
|
39
43
|
? `${config.intelBase}/v1/intel/trust/${encodeURIComponent(payTo)}`
|
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;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,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,
|
|
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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,10 +2,12 @@ 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 { fetchMerchantCard, applyWashFlaggedPolicy, type TwzrdMerchantCard, type WashPolicyInput, type WashPolicyResult, } from "./merchant-card.js";
|
|
5
6
|
export { twzrdOnPaymentRequested } from "./mcp-hook.js";
|
|
6
7
|
export { wrapFetchWithTwzrdGate } from "./wrap-fetch.js";
|
|
7
8
|
export { evaluate_x402_resource, type EvaluateX402Options, type EvaluateX402Result, } from "./evaluate.js";
|
|
8
9
|
export { withTwzrdGuard, type TwzrdGuardOptions } from "./with-guard.js";
|
|
10
|
+
export { installTwzrdAutoGate, type PayWrap, type InstallAutoGateOptions, } from "./auto-gate.js";
|
|
9
11
|
export { quickCheck, QUICK_PRICE_USDC, type QuickCheckResult, type QuickCheckOptions, type TwzrdTier, } from "./quick.js";
|
|
10
12
|
export { createSponsoredX402Fetch, type SponsorSettle, type SponsoredX402Options, } from "./sponsored.js";
|
|
11
13
|
export type { TwzrdDecision, TwzrdReadinessCard, TwzrdPreflightInput, TwzrdGateConfig, TwzrdApproveContext, TwzrdApprovalResult, TwzrdUpsellContext, X402PaymentRequirements, X402PaymentRequiredBody, X402McpPaymentRequest, } from "./types.js";
|
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,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,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,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"}
|
package/dist/index.js
CHANGED
|
@@ -6,10 +6,12 @@ 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 { fetchMerchantCard, applyWashFlaggedPolicy, } from "./merchant-card.js";
|
|
9
10
|
export { twzrdOnPaymentRequested } from "./mcp-hook.js";
|
|
10
11
|
export { wrapFetchWithTwzrdGate } from "./wrap-fetch.js";
|
|
11
12
|
export { evaluate_x402_resource, } from "./evaluate.js";
|
|
12
13
|
export { withTwzrdGuard } from "./with-guard.js";
|
|
14
|
+
export { installTwzrdAutoGate, } from "./auto-gate.js";
|
|
13
15
|
export { quickCheck, QUICK_PRICE_USDC, } from "./quick.js";
|
|
14
16
|
export { createSponsoredX402Fetch, } from "./sponsored.js";
|
|
15
17
|
//# 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,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,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,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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Free merchant card client — wash refuse default for buyer agents.
|
|
3
|
+
*
|
|
4
|
+
* GET /v1/intel/merchant_card/{wallet} is free, no auth. Fail-open: network /
|
|
5
|
+
* non-2xx / invalid JSON → null (do not invent wash_flagged).
|
|
6
|
+
*/
|
|
7
|
+
export type TwzrdMerchantCard = {
|
|
8
|
+
merchant?: string;
|
|
9
|
+
wash_flagged?: boolean;
|
|
10
|
+
wash_label?: string | null;
|
|
11
|
+
provider_reputation_tier?: string | null;
|
|
12
|
+
in_corpus?: boolean;
|
|
13
|
+
catalog_enriched?: boolean;
|
|
14
|
+
[key: string]: unknown;
|
|
15
|
+
};
|
|
16
|
+
export declare function fetchMerchantCard(wallet: string, opts: {
|
|
17
|
+
intelBase: string;
|
|
18
|
+
fetch: typeof fetch;
|
|
19
|
+
}): Promise<TwzrdMerchantCard | null>;
|
|
20
|
+
export type WashPolicyInput = {
|
|
21
|
+
/** Prior approval from readiness / preflight policy */
|
|
22
|
+
approved: boolean;
|
|
23
|
+
reason: string;
|
|
24
|
+
/** From free merchant_card.wash_flagged; null/undefined = signal unavailable */
|
|
25
|
+
washFlagged: boolean | null | undefined;
|
|
26
|
+
/** Resource price in USDC when known */
|
|
27
|
+
priceUsdc?: number | null;
|
|
28
|
+
/**
|
|
29
|
+
* When true (default), refuse payment if washFlagged === true.
|
|
30
|
+
* When false, ignore the wash signal.
|
|
31
|
+
*/
|
|
32
|
+
refuseWashFlagged: boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Soft alternative to hard refuse: if wash_flagged and priceUsdc <= washMaxUsdc,
|
|
35
|
+
* allow with reason twzrd_wash_capped. If wash_flagged and price above cap (or
|
|
36
|
+
* price unknown), refuse. Only applies when refuseWashFlagged is true and
|
|
37
|
+
* washMaxUsdc is a finite number >= 0.
|
|
38
|
+
*/
|
|
39
|
+
washMaxUsdc?: number | null;
|
|
40
|
+
};
|
|
41
|
+
export type WashPolicyResult = {
|
|
42
|
+
approved: boolean;
|
|
43
|
+
reason: string;
|
|
44
|
+
washFlagged: boolean | null;
|
|
45
|
+
washCapped?: boolean;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Pure wash policy. Only tightens: never turns a prior deny into allow.
|
|
49
|
+
* Fail-open on missing wash signal (null/undefined) — no invent.
|
|
50
|
+
*/
|
|
51
|
+
export declare function applyWashFlaggedPolicy(input: WashPolicyInput): WashPolicyResult;
|
|
52
|
+
//# sourceMappingURL=merchant-card.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merchant-card.d.ts","sourceRoot":"","sources":["../src/merchant-card.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,wBAAwB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;AAEF,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,KAAK,CAAA;CAAE,GAC/C,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAgBnC;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,uDAAuD;IACvD,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,gFAAgF;IAChF,WAAW,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;IACxC,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B;;;OAGG;IACH,iBAAiB,EAAE,OAAO,CAAC;IAC3B;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5B,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,CA4C/E"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Free merchant card client — wash refuse default for buyer agents.
|
|
3
|
+
*
|
|
4
|
+
* GET /v1/intel/merchant_card/{wallet} is free, no auth. Fail-open: network /
|
|
5
|
+
* non-2xx / invalid JSON → null (do not invent wash_flagged).
|
|
6
|
+
*/
|
|
7
|
+
export async function fetchMerchantCard(wallet, opts) {
|
|
8
|
+
const w = (wallet || "").trim();
|
|
9
|
+
if (!w)
|
|
10
|
+
return null;
|
|
11
|
+
try {
|
|
12
|
+
const url = `${opts.intelBase.replace(/\/+$/, "")}/v1/intel/merchant_card/${encodeURIComponent(w)}`;
|
|
13
|
+
const resp = await opts.fetch(url, {
|
|
14
|
+
method: "GET",
|
|
15
|
+
headers: { accept: "application/json" },
|
|
16
|
+
});
|
|
17
|
+
if (!resp.ok)
|
|
18
|
+
return null;
|
|
19
|
+
const body = (await resp.json());
|
|
20
|
+
if (!body || typeof body !== "object")
|
|
21
|
+
return null;
|
|
22
|
+
return body;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Pure wash policy. Only tightens: never turns a prior deny into allow.
|
|
30
|
+
* Fail-open on missing wash signal (null/undefined) — no invent.
|
|
31
|
+
*/
|
|
32
|
+
export function applyWashFlaggedPolicy(input) {
|
|
33
|
+
const washFlagged = typeof input.washFlagged === "boolean" ? input.washFlagged : null;
|
|
34
|
+
if (!input.approved) {
|
|
35
|
+
return { approved: false, reason: input.reason, washFlagged };
|
|
36
|
+
}
|
|
37
|
+
if (!input.refuseWashFlagged || washFlagged !== true) {
|
|
38
|
+
return { approved: true, reason: input.reason, washFlagged };
|
|
39
|
+
}
|
|
40
|
+
const cap = typeof input.washMaxUsdc === "number" && Number.isFinite(input.washMaxUsdc)
|
|
41
|
+
? input.washMaxUsdc
|
|
42
|
+
: null;
|
|
43
|
+
if (cap != null) {
|
|
44
|
+
const price = typeof input.priceUsdc === "number" && Number.isFinite(input.priceUsdc)
|
|
45
|
+
? input.priceUsdc
|
|
46
|
+
: null;
|
|
47
|
+
if (price != null && price <= cap) {
|
|
48
|
+
return {
|
|
49
|
+
approved: true,
|
|
50
|
+
reason: `twzrd_wash_capped_${price}_le_${cap}`,
|
|
51
|
+
washFlagged: true,
|
|
52
|
+
washCapped: true,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
approved: false,
|
|
57
|
+
reason: price == null
|
|
58
|
+
? `twzrd_wash_flagged_above_cap_unknown_price_max_${cap}`
|
|
59
|
+
: `twzrd_wash_flagged_above_cap_${price}_gt_${cap}`,
|
|
60
|
+
washFlagged: true,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
approved: false,
|
|
65
|
+
reason: "twzrd_wash_flagged",
|
|
66
|
+
washFlagged: true,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=merchant-card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merchant-card.js","sourceRoot":"","sources":["../src/merchant-card.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAc,EACd,IAAgD;IAEhD,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,2BAA2B,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;QACpG,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;YACjC,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;SACxC,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAC1B,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAsB,CAAC;QACtD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AA+BD;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAsB;IAC3D,MAAM,WAAW,GACf,OAAO,KAAK,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;IAEpE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACpB,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;IAChE,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,iBAAiB,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACrD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;IAC/D,CAAC;IAED,MAAM,GAAG,GACP,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC;QACzE,CAAC,CAAC,KAAK,CAAC,WAAW;QACnB,CAAC,CAAC,IAAI,CAAC;IAEX,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QAChB,MAAM,KAAK,GACT,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC;YACrE,CAAC,CAAC,KAAK,CAAC,SAAS;YACjB,CAAC,CAAC,IAAI,CAAC;QACX,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;YAClC,OAAO;gBACL,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE,qBAAqB,KAAK,OAAO,GAAG,EAAE;gBAC9C,WAAW,EAAE,IAAI;gBACjB,UAAU,EAAE,IAAI;aACjB,CAAC;QACJ,CAAC;QACD,OAAO;YACL,QAAQ,EAAE,KAAK;YACf,MAAM,EACJ,KAAK,IAAI,IAAI;gBACX,CAAC,CAAC,kDAAkD,GAAG,EAAE;gBACzD,CAAC,CAAC,gCAAgC,KAAK,OAAO,GAAG,EAAE;YACvD,WAAW,EAAE,IAAI;SAClB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE,oBAAoB;QAC5B,WAAW,EAAE,IAAI;KAClB,CAAC;AACJ,CAAC"}
|
package/dist/policy.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,uBAAuB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAK1E,OAAO,KAAK,EACV,mBAAmB,EACnB,mBAAmB,EAEnB,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,kBAAkB,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,kFAAkF;IAClF,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,mBAAmB,GAAG,mBAAmB,CAgCrF;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,GAAG,mBAAmB,CAYrF;AAED,wBAAsB,cAAc,CAClC,KAAK,EAAE,mBAAmB,EAC1B,MAAM,CAAC,EAAE,uBAAuB,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CAoB7B;AAED,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,mBAAmB,EAC5B,MAAM,CAAC,EAAE,uBAAuB,GAC/B,OAAO,CAAC,mBAAmB,CAAC,CAyF9B"}
|
package/dist/policy.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { resolveConfig } from "./config.js";
|
|
2
|
+
import { applyWashFlaggedPolicy, fetchMerchantCard, } from "./merchant-card.js";
|
|
2
3
|
/**
|
|
3
4
|
* Pure policy — no network. Mirrors scripts/twzrd_gate_agentcash_fetch.sh semantics.
|
|
4
5
|
*/
|
|
@@ -85,7 +86,49 @@ export async function twzrdApprovePayment(context, config) {
|
|
|
85
86
|
priceUsdc: card.full_report_price_usdc ?? 0.05,
|
|
86
87
|
});
|
|
87
88
|
}
|
|
88
|
-
|
|
89
|
+
// Trustless step 3: free merchant_card wash refuse (default on).
|
|
90
|
+
// Only tightens; fail-open when card is unreachable (washFlagged=null).
|
|
91
|
+
let washFlagged = null;
|
|
92
|
+
let washCapped;
|
|
93
|
+
let approved = result.approved;
|
|
94
|
+
let reason = result.reason;
|
|
95
|
+
let verdict = result.verdict;
|
|
96
|
+
if (cfg.refuseWashFlagged) {
|
|
97
|
+
const seller = card.seller_wallet ?? context.sellerWallet ?? context.payTo;
|
|
98
|
+
if (seller) {
|
|
99
|
+
const mcard = await fetchMerchantCard(seller, {
|
|
100
|
+
intelBase: cfg.intelBase,
|
|
101
|
+
fetch: cfg.fetch,
|
|
102
|
+
});
|
|
103
|
+
if (mcard && typeof mcard.wash_flagged === "boolean") {
|
|
104
|
+
washFlagged = mcard.wash_flagged;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const wash = applyWashFlaggedPolicy({
|
|
108
|
+
approved,
|
|
109
|
+
reason,
|
|
110
|
+
washFlagged,
|
|
111
|
+
priceUsdc: context.priceUsdc,
|
|
112
|
+
refuseWashFlagged: cfg.refuseWashFlagged,
|
|
113
|
+
washMaxUsdc: cfg.washMaxUsdc,
|
|
114
|
+
});
|
|
115
|
+
approved = wash.approved;
|
|
116
|
+
reason = wash.reason;
|
|
117
|
+
washFlagged = wash.washFlagged;
|
|
118
|
+
washCapped = wash.washCapped;
|
|
119
|
+
if (!approved && wash.washFlagged === true) {
|
|
120
|
+
verdict = "block";
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
...result,
|
|
125
|
+
approved,
|
|
126
|
+
reason,
|
|
127
|
+
verdict,
|
|
128
|
+
preflightId: card.preflight_id,
|
|
129
|
+
washFlagged,
|
|
130
|
+
washCapped,
|
|
131
|
+
};
|
|
89
132
|
}
|
|
90
133
|
catch (err) {
|
|
91
134
|
if (!cfg.failOpen) {
|
package/dist/policy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAgC,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -44,6 +44,19 @@ export type TwzrdGateConfig = {
|
|
|
44
44
|
* policy documented for ClawRouter/BlockRun in the twzrd-clawrouter skill.
|
|
45
45
|
*/
|
|
46
46
|
gateOnCanSpend?: boolean;
|
|
47
|
+
/**
|
|
48
|
+
* After free preflight, also GET free merchant_card for payTo and refuse
|
|
49
|
+
* when wash_flagged=true. Default: true (trustless step 3 open default).
|
|
50
|
+
* Fail-open if the card is unreachable — never invent wash. Opt out with
|
|
51
|
+
* refuseWashFlagged:false or TWZRD_REFUSE_WASH_FLAGGED=0.
|
|
52
|
+
*/
|
|
53
|
+
refuseWashFlagged?: boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Soft cap instead of hard refuse: when wash_flagged and priceUsdc <= this,
|
|
56
|
+
* allow (reason twzrd_wash_capped_*). Above the cap (or unknown price) refuse.
|
|
57
|
+
* Only applies when refuseWashFlagged is true. Env: TWZRD_WASH_MAX_USDC.
|
|
58
|
+
*/
|
|
59
|
+
washMaxUsdc?: number;
|
|
47
60
|
/** Custom fetch (for tests or non-Node runtimes). Default: global fetch */
|
|
48
61
|
fetch?: typeof fetch;
|
|
49
62
|
/**
|
|
@@ -85,6 +98,10 @@ export type TwzrdApprovalResult = {
|
|
|
85
98
|
failOpen?: boolean;
|
|
86
99
|
/** Server-issued preflight id, threaded from the preflight for verify->act funnel attribution. */
|
|
87
100
|
preflightId?: number;
|
|
101
|
+
/** Free merchant_card.wash_flagged when fetched; null if unavailable / fail-open */
|
|
102
|
+
washFlagged?: boolean | null;
|
|
103
|
+
/** true when wash_flagged but payment allowed under washMaxUsdc */
|
|
104
|
+
washCapped?: boolean;
|
|
88
105
|
};
|
|
89
106
|
export type X402PaymentRequirements = {
|
|
90
107
|
payTo?: string;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/with-guard.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"with-guard.d.ts","sourceRoot":"","sources":["../src/with-guard.ts"],"names":[],"mappings":"AACA,OAAO,EAA0B,KAAK,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEjF,OAAO,KAAK,EACV,eAAe,EAGhB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,iBAAiB,GAAG,eAAe,GAC7C,IAAI,CAAC,mBAAmB,EAAE,aAAa,GAAG,WAAW,GAAG,WAAW,GAAG,gBAAgB,CAAC,CAAC;AAW1F;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,OAAO,KAAK,EACxB,IAAI,CAAC,EAAE,iBAAiB,GACvB,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"with-guard.d.ts","sourceRoot":"","sources":["../src/with-guard.ts"],"names":[],"mappings":"AACA,OAAO,EAA0B,KAAK,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEjF,OAAO,KAAK,EACV,eAAe,EAGhB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,iBAAiB,GAAG,eAAe,GAC7C,IAAI,CAAC,mBAAmB,EAAE,aAAa,GAAG,WAAW,GAAG,WAAW,GAAG,gBAAgB,CAAC,CAAC;AAW1F;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,OAAO,KAAK,EACxB,IAAI,CAAC,EAAE,iBAAiB,GACvB,OAAO,KAAK,CAoDd"}
|
package/dist/with-guard.js
CHANGED
|
@@ -34,6 +34,8 @@ export function withTwzrdGuard(innerFetch, opts) {
|
|
|
34
34
|
blockDecisions: opts?.blockDecisions,
|
|
35
35
|
failOpen: opts?.failOpen,
|
|
36
36
|
gateOnCanSpend: opts?.gateOnCanSpend,
|
|
37
|
+
refuseWashFlagged: opts?.refuseWashFlagged,
|
|
38
|
+
washMaxUsdc: opts?.washMaxUsdc,
|
|
37
39
|
fetch: opts?.fetch ?? innerFetch,
|
|
38
40
|
});
|
|
39
41
|
return async (input, init) => {
|
|
@@ -56,6 +58,8 @@ export function withTwzrdGuard(innerFetch, opts) {
|
|
|
56
58
|
blockDecisions: config.blockDecisions,
|
|
57
59
|
failOpen: config.failOpen,
|
|
58
60
|
gateOnCanSpend: config.gateOnCanSpend,
|
|
61
|
+
refuseWashFlagged: config.refuseWashFlagged,
|
|
62
|
+
washMaxUsdc: config.washMaxUsdc ?? undefined,
|
|
59
63
|
fetch: config.fetch,
|
|
60
64
|
autoReceipt: opts?.autoReceipt,
|
|
61
65
|
x402Fetch: opts?.x402Fetch,
|
package/dist/with-guard.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"with-guard.js","sourceRoot":"","sources":["../src/with-guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAA4B,MAAM,eAAe,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAarE,SAAS,UAAU,CAAC,KAAiB;IACnC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,KAAK,YAAY,GAAG;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC;IAC5C,OAAO,KAAK,CAAC,GAAG,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,cAAc,CAC5B,UAAwB,EACxB,IAAwB;IAExB,oEAAoE;IACpE,MAAM,MAAM,GAAG,aAAa,CAAC;QAC3B,SAAS,EAAE,IAAI,EAAE,SAAS;QAC1B,iBAAiB,EAAE,IAAI,EAAE,iBAAiB;QAC1C,cAAc,EAAE,IAAI,EAAE,cAAc;QACpC,QAAQ,EAAE,IAAI,EAAE,QAAQ;QACxB,cAAc,EAAE,IAAI,EAAE,cAAc;QACpC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,UAAU;KACjC,CAAC,CAAC;IAEH,OAAO,KAAK,EAAE,KAAiB,EAAE,IAAgB,EAAqB,EAAE;QACtE,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC3C,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QAErC,IAAI,IAAI,GAA4B,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAA4B,CAAC;QAChE,CAAC;QAAC,MAAM,CAAC;YACP,0DAA0D;YAC1D,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAqD,CAAC,CAAC;QAC3F,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QAE9B,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,GAAG,EAAE,KAAK,EAAE;YACtD,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;YAC3C,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,WAAW,EAAE,IAAI,EAAE,WAAW;YAC9B,SAAS,EAAE,IAAI,EAAE,SAAS;YAC1B,SAAS,EAAE,IAAI,EAAE,SAAS;YAC1B,cAAc,EAAE,IAAI,EAAE,cAAc;SACrC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,EAAE,KAAK,EAAE,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;YAC/C,MAAM,IAAI,KAAK,CACb,kCAAkC,MAAM,CAAC,MAAM,UAAU,KAAK,IAAI,SAAS,QAAQ,GAAG,EAAE,CACzF,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"with-guard.js","sourceRoot":"","sources":["../src/with-guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAA4B,MAAM,eAAe,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAarE,SAAS,UAAU,CAAC,KAAiB;IACnC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,KAAK,YAAY,GAAG;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC;IAC5C,OAAO,KAAK,CAAC,GAAG,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,cAAc,CAC5B,UAAwB,EACxB,IAAwB;IAExB,oEAAoE;IACpE,MAAM,MAAM,GAAG,aAAa,CAAC;QAC3B,SAAS,EAAE,IAAI,EAAE,SAAS;QAC1B,iBAAiB,EAAE,IAAI,EAAE,iBAAiB;QAC1C,cAAc,EAAE,IAAI,EAAE,cAAc;QACpC,QAAQ,EAAE,IAAI,EAAE,QAAQ;QACxB,cAAc,EAAE,IAAI,EAAE,cAAc;QACpC,iBAAiB,EAAE,IAAI,EAAE,iBAAiB;QAC1C,WAAW,EAAE,IAAI,EAAE,WAAW;QAC9B,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,UAAU;KACjC,CAAC,CAAC;IAEH,OAAO,KAAK,EAAE,KAAiB,EAAE,IAAgB,EAAqB,EAAE;QACtE,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC3C,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QAErC,IAAI,IAAI,GAA4B,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAA4B,CAAC;QAChE,CAAC;QAAC,MAAM,CAAC;YACP,0DAA0D;YAC1D,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAqD,CAAC,CAAC;QAC3F,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QAE9B,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,GAAG,EAAE,KAAK,EAAE;YACtD,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;YAC3C,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;YAC3C,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,SAAS;YAC5C,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,WAAW,EAAE,IAAI,EAAE,WAAW;YAC9B,SAAS,EAAE,IAAI,EAAE,SAAS;YAC1B,SAAS,EAAE,IAAI,EAAE,SAAS;YAC1B,cAAc,EAAE,IAAI,EAAE,cAAc;SACrC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,EAAE,KAAK,EAAE,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;YAC/C,MAAM,IAAI,KAAK,CACb,kCAAkC,MAAM,CAAC,MAAM,UAAU,KAAK,IAAI,SAAS,QAAQ,GAAG,EAAE,CACzF,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/wrap-fetch.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrap-fetch.d.ts","sourceRoot":"","sources":["../src/wrap-fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"wrap-fetch.d.ts","sourceRoot":"","sources":["../src/wrap-fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAkB3D;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,OAAO,KAAK,EACxB,MAAM,CAAC,EAAE,uBAAuB,GAC/B,OAAO,KAAK,CAiCd"}
|
package/dist/wrap-fetch.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { payToFromRequirements, pickRequirements } from "./payto.js";
|
|
1
|
+
import { payToFromRequirements, pickRequirements, priceUsdcFromAmountMicro, } from "./payto.js";
|
|
2
2
|
import { twzrdApprovePayment } from "./policy.js";
|
|
3
3
|
function requestUrl(input) {
|
|
4
4
|
if (typeof input === "string")
|
|
@@ -25,11 +25,13 @@ export function wrapFetchWithTwzrdGate(innerFetch, config) {
|
|
|
25
25
|
return resp;
|
|
26
26
|
}
|
|
27
27
|
const first = pickRequirements(body.accepts);
|
|
28
|
-
const { payTo, resource } = payToFromRequirements(first);
|
|
28
|
+
const { payTo, resource, amountMicro } = payToFromRequirements(first);
|
|
29
29
|
const url = requestUrl(input);
|
|
30
|
+
const priceUsdc = priceUsdcFromAmountMicro(amountMicro);
|
|
30
31
|
const { approved, reason } = await twzrdApprovePayment({
|
|
31
32
|
resourceUrl: resource ?? url,
|
|
32
33
|
payTo,
|
|
34
|
+
priceUsdc,
|
|
33
35
|
agentIntent: "wrapFetch_402_gate",
|
|
34
36
|
}, config);
|
|
35
37
|
if (!approved) {
|
package/dist/wrap-fetch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrap-fetch.js","sourceRoot":"","sources":["../src/wrap-fetch.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"wrap-fetch.js","sourceRoot":"","sources":["../src/wrap-fetch.ts"],"names":[],"mappings":"AACA,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAMlD,SAAS,UAAU,CAAC,KAAiB;IACnC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,KAAK,YAAY,GAAG;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC;IAC5C,OAAO,KAAK,CAAC,GAAG,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CACpC,UAAwB,EACxB,MAAgC;IAEhC,OAAO,KAAK,EAAE,KAAiB,EAAE,IAAgB,EAAqB,EAAE;QACtE,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC3C,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QAErC,IAAI,IAAI,GAA4B,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAA4B,CAAC;QAChE,CAAC;QAAC,MAAM,CAAC;YACP,uEAAuE;YACvE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAqD,CAAC,CAAC;QAC3F,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;QACtE,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,SAAS,GAAG,wBAAwB,CAAC,WAAW,CAAC,CAAC;QAExD,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,mBAAmB,CACpD;YACE,WAAW,EAAE,QAAQ,IAAI,GAAG;YAC5B,KAAK;YACL,SAAS;YACT,WAAW,EAAE,oBAAoB;SAClC,EACD,MAAM,CACP,CAAC;QAEF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,UAAU,KAAK,QAAQ,GAAG,EAAE,CAAC,CAAC;QAClF,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "twzrd-x402-gate",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Buyer-side x402 trust gate. Run a free TWZRD preflight (ReadinessCard) before signing USDC to any x402 merchant, and autonomously escalate a `warn` to a $0.001 paid trust check that re-decides — blocking the spend on bad paid intel, no human in the loop. Wraps fetch (HTTP 402) and the @x402/mcp onPaymentRequested hook. BREAKING(0.2.0): fail-closed by default — set TWZRD_FAIL_OPEN=true to restore legacy allow-on-outage behavior.",
|
|
3
|
+
"version": "0.5.0",
|
|
4
|
+
"description": "Buyer-side x402 trust gate. Run a free TWZRD preflight (ReadinessCard) before signing USDC to any x402 merchant, and autonomously escalate a `warn` to a $0.001 paid trust check that re-decides — blocking the spend on bad paid intel, no human in the loop. Default refuse when free merchant_card.wash_flagged (opt out TWZRD_REFUSE_WASH_FLAGGED=0). Wraps fetch (HTTP 402) and the @x402/mcp onPaymentRequested hook. installTwzrdAutoGate(payWrap) is the default-on one-liner: guards the raw fetch, then hands it to your x402 client, so the correct guard-before-pay composition can't be built backwards. BREAKING(0.2.0): fail-closed by default — set TWZRD_FAIL_OPEN=true to restore legacy allow-on-outage behavior.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
@@ -19,10 +19,11 @@
|
|
|
19
19
|
"build": "tsc",
|
|
20
20
|
"prepublishOnly": "tsc",
|
|
21
21
|
"typecheck": "tsc --noEmit",
|
|
22
|
-
"test": "tsx test/policy.test.ts && tsx test/wrap-fetch.test.ts && tsx test/mcp-hook.test.ts && tsx test/attribution.test.ts && tsx test/auto-receipt.test.ts && tsx test/quick.test.ts && tsx test/sponsored.test.ts && tsx test/escalation.test.ts",
|
|
22
|
+
"test": "tsx test/policy.test.ts && tsx test/wrap-fetch.test.ts && tsx test/mcp-hook.test.ts && tsx test/attribution.test.ts && tsx test/auto-receipt.test.ts && tsx test/quick.test.ts && tsx test/sponsored.test.ts && tsx test/escalation.test.ts && tsx test/wash-refuse.test.ts && tsx test/auto-gate.test.ts",
|
|
23
23
|
"guard-demo": "tsx examples/agentic-market-gate.ts",
|
|
24
24
|
"autoreceipt-demo": "tsx examples/auto-receipt.ts --dry-run",
|
|
25
|
-
"sponsored-demo": "tsx examples/sponsored-payer.ts --dry-run"
|
|
25
|
+
"sponsored-demo": "tsx examples/sponsored-payer.ts --dry-run",
|
|
26
|
+
"wash-dogfood": "tsx examples/wash-refuse-dogfood.ts"
|
|
26
27
|
},
|
|
27
28
|
"keywords": [
|
|
28
29
|
"x402",
|