twzrd-x402-gate 0.9.8 → 0.9.10
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/QUICKSTART.md +23 -6
- package/README.md +21 -14
- package/bin/twzrd-cold-start.js +69 -0
- package/dist/attempt-echo.d.ts +42 -0
- package/dist/attempt-echo.d.ts.map +1 -0
- package/dist/attempt-echo.js +170 -0
- package/dist/attempt-echo.js.map +1 -0
- package/dist/auto-gate.d.ts.map +1 -1
- package/dist/auto-gate.js +8 -4
- package/dist/auto-gate.js.map +1 -1
- package/dist/buyer-defaults.d.ts +4 -3
- package/dist/buyer-defaults.d.ts.map +1 -1
- package/dist/buyer-defaults.js +5 -4
- package/dist/buyer-defaults.js.map +1 -1
- package/dist/cloudflare-x402.d.ts +29 -0
- package/dist/cloudflare-x402.d.ts.map +1 -0
- package/dist/cloudflare-x402.js +31 -0
- package/dist/cloudflare-x402.js.map +1 -0
- package/dist/cold-start.d.ts +115 -0
- package/dist/cold-start.d.ts.map +1 -0
- package/dist/cold-start.js +461 -0
- package/dist/cold-start.js.map +1 -0
- package/dist/decision-token.d.ts +1 -1
- package/dist/delivery-capture.d.ts +4 -3
- package/dist/delivery-capture.d.ts.map +1 -1
- package/dist/delivery-capture.js +4 -3
- package/dist/delivery-capture.js.map +1 -1
- package/dist/evaluate.d.ts +16 -12
- package/dist/evaluate.d.ts.map +1 -1
- package/dist/evaluate.js +45 -47
- package/dist/evaluate.js.map +1 -1
- package/dist/foreign-key.d.ts +19 -0
- package/dist/foreign-key.d.ts.map +1 -0
- package/dist/foreign-key.js +61 -0
- package/dist/foreign-key.js.map +1 -0
- package/dist/index.d.ts +10 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/merchant-card.d.ts +18 -3
- package/dist/merchant-card.d.ts.map +1 -1
- package/dist/merchant-card.js +22 -5
- package/dist/merchant-card.js.map +1 -1
- package/dist/network.d.ts +25 -6
- package/dist/network.d.ts.map +1 -1
- package/dist/network.js +45 -7
- package/dist/network.js.map +1 -1
- package/dist/paying-fetch.d.ts +17 -0
- package/dist/paying-fetch.d.ts.map +1 -0
- package/dist/paying-fetch.js +116 -0
- package/dist/paying-fetch.js.map +1 -0
- package/dist/payment-decision.js +1 -1
- package/dist/payment-decision.js.map +1 -1
- package/dist/policy-fetch.d.ts +18 -0
- package/dist/policy-fetch.d.ts.map +1 -0
- package/dist/policy-fetch.js +81 -0
- package/dist/policy-fetch.js.map +1 -0
- package/dist/policy-runtime.d.ts +3 -1
- package/dist/policy-runtime.d.ts.map +1 -1
- package/dist/policy-runtime.js +19 -1
- package/dist/policy-runtime.js.map +1 -1
- package/dist/policy.d.ts +10 -0
- package/dist/policy.d.ts.map +1 -1
- package/dist/policy.js +68 -2
- package/dist/policy.js.map +1 -1
- package/dist/record-leash-settle.d.ts +20 -0
- package/dist/record-leash-settle.d.ts.map +1 -0
- package/dist/record-leash-settle.js +25 -0
- package/dist/record-leash-settle.js.map +1 -0
- package/dist/seller-hook.d.ts.map +1 -1
- package/dist/seller-hook.js +6 -3
- package/dist/seller-hook.js.map +1 -1
- package/dist/trust-gate-reason.d.ts.map +1 -1
- package/dist/trust-gate-reason.js +1 -0
- package/dist/trust-gate-reason.js.map +1 -1
- package/dist/types.d.ts +46 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/wash-default.d.ts +131 -0
- package/dist/wash-default.d.ts.map +1 -0
- package/dist/wash-default.js +307 -0
- package/dist/wash-default.js.map +1 -0
- package/dist/with-guard.d.ts +3 -3
- package/dist/with-guard.d.ts.map +1 -1
- package/dist/with-guard.js +6 -4
- package/dist/with-guard.js.map +1 -1
- package/dist/wrap-fetch.d.ts.map +1 -1
- package/dist/wrap-fetch.js +3 -1
- package/dist/wrap-fetch.js.map +1 -1
- package/dist/x402-client-hook.d.ts +3 -3
- package/dist/x402-client-hook.d.ts.map +1 -1
- package/dist/x402-client-hook.js +44 -39
- package/dist/x402-client-hook.js.map +1 -1
- package/package.json +21 -15
package/QUICKSTART.md
CHANGED
|
@@ -6,13 +6,13 @@ is unreachable the gate never *invents* a wash flag. A failed preflight, or a me
|
|
|
6
6
|
outage on a scored path, blocks by default (`TWZRD_FAIL_OPEN=true` to allow). A reachable
|
|
7
7
|
card with no wash signal still proceeds.
|
|
8
8
|
|
|
9
|
-
**Pin:** `twzrd-x402-gate@0.9.
|
|
9
|
+
**Pin:** `twzrd-x402-gate@0.9.10` + stock PayAI client `x402-solana@3.0.0` (official
|
|
10
10
|
`beforePayment` seat). `@x402/core` Path E remains supported; refuse script is fallback.
|
|
11
11
|
|
|
12
12
|
## 1. Stock PayAI client (default seat — copy-paste)
|
|
13
13
|
|
|
14
14
|
```bash
|
|
15
|
-
npm install twzrd-x402-gate@0.9.
|
|
15
|
+
npm install twzrd-x402-gate@0.9.10 x402-solana@3.0.0
|
|
16
16
|
```
|
|
17
17
|
|
|
18
18
|
> **ESM-only.** The package ships `import` conditions only — a CommonJS
|
|
@@ -37,7 +37,7 @@ Then: `await client.fetch("https://merchant.example/paid");`
|
|
|
37
37
|
## 1b. Official `@x402/core` client (Path E)
|
|
38
38
|
|
|
39
39
|
```bash
|
|
40
|
-
npm install twzrd-x402-gate@0.9.
|
|
40
|
+
npm install twzrd-x402-gate@0.9.10 @x402/core @x402/fetch @x402/svm
|
|
41
41
|
```
|
|
42
42
|
|
|
43
43
|
```typescript
|
|
@@ -77,6 +77,22 @@ The factory itself does not read `TWZRD_AUTO_GATE`; use the AutoGate seat if you
|
|
|
77
77
|
want the env kill switch re-read per call. You cannot `installTwzrdAutoGate(client)`
|
|
78
78
|
after `createPayKitClient` — PayKit only accepts the hook at construction.
|
|
79
79
|
|
|
80
|
+
## 1d. Cold-start a foreign diet (0 USDC)
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
npx twzrd-cold-start
|
|
84
|
+
# policy.json: default-deny allowlist of foreign 402 hosts
|
|
85
|
+
# signer_invocation_count: 0, usdc_spent: 0
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Probes a pinned foreign GET 402 diet (not `*.twzrd`), scores each `payTo` with
|
|
89
|
+
`evaluate_x402_resource` (wash refuse), writes `policy.json`, hops once from
|
|
90
|
+
the resource join. Does not spend. `--spend` is refused. Seat AutoGate on the
|
|
91
|
+
payer with
|
|
92
|
+
`beforePayment: installTwzrdAutoGate("x402-solana", { refuseWashFlagged: true })`
|
|
93
|
+
using that policy as the host allowlist. Live proof (needs egress):
|
|
94
|
+
`npm run cold-start-live`.
|
|
95
|
+
|
|
80
96
|
## 2. Prove it blocked something (spends nothing)
|
|
81
97
|
|
|
82
98
|
Hello-world that closes from this package (needs a prior **repo-root** `npm ci`
|
|
@@ -131,9 +147,10 @@ createTwzrdBeforePaymentHook({
|
|
|
131
147
|
|
|
132
148
|
## 3b. Turn on Path A (buyer cash, not the rail)
|
|
133
149
|
|
|
134
|
-
Refuse stays free until you wire a paying fetch. Then
|
|
135
|
-
|
|
136
|
-
|
|
150
|
+
Refuse stays free until you wire a paying fetch. Then a proceeding `warn`
|
|
151
|
+
settles the first paid hop: `GET /v1/intel/quick/{payTo}` at $0.001. Optional
|
|
152
|
+
V7 `$0.05` `/trust` stays on material allow or explicit `autoReceipt`.
|
|
153
|
+
Facilitator settle hooks stay free.
|
|
137
154
|
|
|
138
155
|
```typescript
|
|
139
156
|
import { wrapFetchWithPayment } from "@x402/svm";
|
package/README.md
CHANGED
|
@@ -80,7 +80,7 @@ transfer on-chain. Wash/sybil edges are primarily discounted in TWZRD scoring, n
|
|
|
80
80
|
revenue refusal.
|
|
81
81
|
|
|
82
82
|
```bash
|
|
83
|
-
npm install twzrd-x402-gate@0.9.
|
|
83
|
+
npm install twzrd-x402-gate@0.9.10
|
|
84
84
|
```
|
|
85
85
|
|
|
86
86
|
```typescript
|
|
@@ -125,7 +125,7 @@ Fixture-backed SVM extract tests live in `test/seller-hook.test.ts` +
|
|
|
125
125
|
Install the published gate and run against wash fixtures:
|
|
126
126
|
|
|
127
127
|
```bash
|
|
128
|
-
npm install twzrd-x402-gate@0.9.
|
|
128
|
+
npm install twzrd-x402-gate@0.9.10
|
|
129
129
|
# from package root after install, or from a checkout:
|
|
130
130
|
npm run wash-dogfood
|
|
131
131
|
```
|
|
@@ -269,7 +269,7 @@ Canonical path for every agent that spends USDC on Solana x402:
|
|
|
269
269
|
|------|------|------|----------------|
|
|
270
270
|
| 1 | `POST /v1/intel/preflight` | free | `decision=block` → refuse (`twzrd_decision_block`). Score floor / optional `can_spend` also deny. |
|
|
271
271
|
| 2 | `GET /v1/intel/merchant_card/{payTo}` | free | `wash_flagged: true` → refuse by default (`twzrd_wash_flagged`). **Only tightens** step 1. |
|
|
272
|
-
| 3 |
|
|
272
|
+
| 3 | First paid hop `quickCheck` | $0.001 | On `warn`: `GET /v1/intel/quick/{payTo}`. Optional V7: `GET /v1/intel/trust/{payTo}` at $0.05 (`autoReceipt` / material allow). Never required for the free refuse path. |
|
|
273
273
|
| 4 | Pay (or refuse) | resource price | Only if steps 1–2 approved (and any opt-in paid escalate did not block). |
|
|
274
274
|
|
|
275
275
|
**Fail-open (no invent):**
|
|
@@ -286,7 +286,7 @@ Canonical path for every agent that spends USDC on Solana x402:
|
|
|
286
286
|
- `wash_flagged=true` + `washMaxUsdc` set + `priceUsdc <= cap` → allow, `washCapped=true`, reason `twzrd_wash_capped_{price}_le_{cap}`.
|
|
287
287
|
- `wash_flagged=true` + price above cap (or price unknown) → refuse with `twzrd_wash_flagged_above_cap_*`.
|
|
288
288
|
|
|
289
|
-
**Order note:** `onWarnUpsell` (points at paid
|
|
289
|
+
**Order note:** `onWarnUpsell` (points at first paid hop `GET /v1/intel/quick` $0.001) 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. Optional V7 `GET /v1/intel/trust` $0.05 stays `autoReceipt` / `requireReceipt` / `escalateOnWarn:false`.
|
|
290
290
|
|
|
291
291
|
Dogfood (one public live proof path):
|
|
292
292
|
- Free only (wash refuse): `npm run wash-dogfood` → [`examples/wash-refuse-dogfood.ts`](./examples/wash-refuse-dogfood.ts)
|
|
@@ -297,7 +297,7 @@ Dogfood (one public live proof path):
|
|
|
297
297
|
## Install
|
|
298
298
|
|
|
299
299
|
```bash
|
|
300
|
-
npm install twzrd-x402-gate@0.9.
|
|
300
|
+
npm install twzrd-x402-gate@0.9.10
|
|
301
301
|
```
|
|
302
302
|
|
|
303
303
|
Do not hardcode a version in this doc — every past pin here (**0.5.4**, **0.7.1**, **0.8.5**,
|
|
@@ -668,12 +668,19 @@ Opt out of wash refuse: `withTwzrdGuard(fetch, { refuseWashFlagged: false })` or
|
|
|
668
668
|
|
|
669
669
|
Non-402 responses pass through unchanged.
|
|
670
670
|
|
|
671
|
-
###
|
|
671
|
+
### First paid hop on warn (revenue path)
|
|
672
|
+
|
|
673
|
+
Wiring `x402Fetch` turns on buyer defaults: a proceeding `warn` settles
|
|
674
|
+
`GET /v1/intel/quick/{payTo}` at **$0.001** (escalateOnWarn). That is the first paid hop.
|
|
675
|
+
|
|
676
|
+
Optional V7 — `autoReceipt` or material-allow `requireReceipt` — buys
|
|
677
|
+
`GET /v1/intel/trust/{payTo}` at $0.05 for a signed credential. Opt out of the
|
|
678
|
+
cheap hop with `escalateOnWarn: false` if the host explicitly wants /trust first.
|
|
672
679
|
|
|
673
680
|
```typescript
|
|
674
681
|
const safeFetch = withTwzrdGuard(x402Fetch, {
|
|
675
|
-
|
|
676
|
-
|
|
682
|
+
x402Fetch, // warn → $0.001 /quick first
|
|
683
|
+
autoReceipt: true, // optional V7: also buy $0.05 /trust on allow (not after /quick)
|
|
677
684
|
onReceipt: (receipt, tx) => {
|
|
678
685
|
// receipt is a twzrd_receipt (V7 + ERC-8004 reputation_credential)
|
|
679
686
|
console.log("Trust receipt captured:", tx);
|
|
@@ -681,9 +688,8 @@ const safeFetch = withTwzrdGuard(x402Fetch, {
|
|
|
681
688
|
});
|
|
682
689
|
```
|
|
683
690
|
|
|
684
|
-
`autoReceipt` is **off by default** — it spends the **buyer's** USDC, so you opt in. When on
|
|
685
|
-
|
|
686
|
-
for the counterparty before you pay the resource.
|
|
691
|
+
`autoReceipt` is **off by default** — it spends the **buyer's** USDC, so you opt in. When on
|
|
692
|
+
and `/quick` did not already settle, warn/allow can buy the $0.05 V7 credential.
|
|
687
693
|
|
|
688
694
|
**`x402Fetch` is yours to supply** (this package is dependency-free). Wire the proven
|
|
689
695
|
`@x402/svm` sponsored-feePayer client — the same one `twzrd-mcp-server` uses:
|
|
@@ -902,7 +908,7 @@ A 402 whose payment requirements yield **no identifiable seller wallet** (missin
|
|
|
902
908
|
| `blockDecisions` | `TWZRD_BLOCK_DECISIONS` | `block` | Decisions that throw |
|
|
903
909
|
| `failOpen` | `TWZRD_FAIL_OPEN` | `false` | `true` opts into legacy allow-on-outage; default blocks (fail-closed) |
|
|
904
910
|
| `gateOnCanSpend` | `TWZRD_GATE_ON_CAN_SPEND` | `false` | Also block when `can_spend=false` |
|
|
905
|
-
| `autoReceipt` | — | `false` |
|
|
911
|
+
| `autoReceipt` | — | `false` | Optional V7: auto-buy $0.05 `/trust` when `/quick` did not already settle |
|
|
906
912
|
| `x402Fetch` | — | — | x402-capable fetch for `autoReceipt` |
|
|
907
913
|
| `onReceipt` | — | — | Callback after receipt is captured |
|
|
908
914
|
| `disabled` (`installTwzrdAutoGate` only) | `TWZRD_AUTO_GATE=0`/`false` | `false` | Bypass the guard entirely — `payWrap` gets the raw, unguarded fetch |
|
|
@@ -997,9 +1003,10 @@ The gate path only ever calls free endpoints — the preflight plus, by default
|
|
|
997
1003
|
(`quickCheck`, `autoReceipt`) is otherwise opt-in, with one documented
|
|
998
1004
|
exception (QUICKSTART 3b): on the fetch / payWrap seat, wiring a paying fetch
|
|
999
1005
|
auto-enables buyer Path A, so a proceeding `warn` settles the $0.001 quick
|
|
1000
|
-
tier (
|
|
1006
|
+
tier (`GET /v1/intel/quick/{payTo}`) through your wallet with no further flag —
|
|
1001
1007
|
opt out with `escalateOnWarn: false`, `requireReceipt: false`, or by leaving
|
|
1002
|
-
`x402Fetch` unwired.
|
|
1008
|
+
`x402Fetch` unwired. Optional V7 `/trust` at $0.05 stays on material allow or
|
|
1009
|
+
explicit `autoReceipt`. The merchant-facing payment still waits on the free
|
|
1003
1010
|
preflight's verdict.
|
|
1004
1011
|
|
|
1005
1012
|
## License
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Cold-start buyer loop — zero spend.
|
|
4
|
+
*
|
|
5
|
+
* Probe a pinned foreign x402 diet, run AutoGate (refuse wash) before any
|
|
6
|
+
* signer, write default-deny policy.json, hop once from the resource join.
|
|
7
|
+
* Nothing here signs or spends. Self-serve transcript, not EXTERNAL_RUN.
|
|
8
|
+
*
|
|
9
|
+
* Usage (after npm run build, or from the published package):
|
|
10
|
+
* npx twzrd-cold-start
|
|
11
|
+
* node node_modules/twzrd-x402-gate/bin/twzrd-cold-start.js --no-hop
|
|
12
|
+
*/
|
|
13
|
+
import { dirname, join } from "node:path";
|
|
14
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
15
|
+
import { existsSync } from "node:fs";
|
|
16
|
+
|
|
17
|
+
const pkgRoot = join(dirname(fileURLToPath(import.meta.url)), "..");
|
|
18
|
+
|
|
19
|
+
async function loadCli() {
|
|
20
|
+
const dist = join(pkgRoot, "dist", "cold-start.js");
|
|
21
|
+
if (existsSync(dist)) return import(pathToFileURL(dist).href);
|
|
22
|
+
console.error(
|
|
23
|
+
"twzrd-cold-start: run `npm run build` in twzrd-x402-gate or install the published package",
|
|
24
|
+
);
|
|
25
|
+
process.exit(2);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
async function main() {
|
|
29
|
+
const { parseArgs, runColdStart, USAGE, HelpError } = await loadCli();
|
|
30
|
+
let args;
|
|
31
|
+
try {
|
|
32
|
+
args = parseArgs(process.argv.slice(2));
|
|
33
|
+
} catch (e) {
|
|
34
|
+
if (e instanceof HelpError || (e instanceof Error && e.name === "HelpError")) {
|
|
35
|
+
console.log(e.message);
|
|
36
|
+
process.exit(0);
|
|
37
|
+
}
|
|
38
|
+
console.error(`twzrd-cold-start: ${e instanceof Error ? e.message : e}`);
|
|
39
|
+
console.error(USAGE);
|
|
40
|
+
process.exit(2);
|
|
41
|
+
}
|
|
42
|
+
const { log, info } = console;
|
|
43
|
+
console.log = (...a) => console.error(...a);
|
|
44
|
+
console.info = (...a) => console.error(...a);
|
|
45
|
+
let run;
|
|
46
|
+
try {
|
|
47
|
+
run = await runColdStart(args);
|
|
48
|
+
} finally {
|
|
49
|
+
console.log = log;
|
|
50
|
+
console.info = info;
|
|
51
|
+
}
|
|
52
|
+
const { transcript, exitCode } = run;
|
|
53
|
+
console.log(JSON.stringify(transcript, null, 2));
|
|
54
|
+
if (transcript.ok) {
|
|
55
|
+
console.error(
|
|
56
|
+
`OK: cold-start ${transcript.allowlisted_count} allowlisted, signer_invocation_count=0, usdc_spent=0 — self-serve, not EXTERNAL_RUN`,
|
|
57
|
+
);
|
|
58
|
+
} else {
|
|
59
|
+
console.error(
|
|
60
|
+
"FAIL: no diet host scored a 402 (signer_invocation_count=0, usdc_spent=0) — self-serve, not EXTERNAL_RUN",
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
process.exit(exitCode);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
main().catch((e) => {
|
|
67
|
+
console.error("twzrd-cold-start FAILED", e instanceof Error ? e.message : e);
|
|
68
|
+
process.exit(1);
|
|
69
|
+
});
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Funnel join-key pass-through for paying clients.
|
|
3
|
+
*
|
|
4
|
+
* Server 402s (PR #2819) emit `extensions.twzrd_attempt` on PAYMENT-REQUIRED.
|
|
5
|
+
* `@x402/fetch` / `@x402/core` createPaymentPayload drops unknown extensions,
|
|
6
|
+
* so every paid retry lands as a new singleton in `x402_funnel_events`.
|
|
7
|
+
*
|
|
8
|
+
* This module copies the challenge's `twzrd_attempt` onto the retry payload.
|
|
9
|
+
* It never mints a key. No challenge key → no stamp.
|
|
10
|
+
*/
|
|
11
|
+
export declare const ATTEMPT_EXTENSION = "twzrd_attempt";
|
|
12
|
+
export declare const ATTEMPT_EXTENSION_SCHEMA = "twzrd.attempt.v1";
|
|
13
|
+
type Dict = Record<string, unknown>;
|
|
14
|
+
/**
|
|
15
|
+
* Read `extensions.twzrd_attempt` from a decoded PAYMENT-REQUIRED / 402 body.
|
|
16
|
+
* Header-first callers should parse PAYMENT-REQUIRED before passing the object.
|
|
17
|
+
* Returns null when the challenge did not carry a key — never invents one.
|
|
18
|
+
*/
|
|
19
|
+
export declare function twzrdAttemptFromChallenge(challenge: unknown): Dict | null;
|
|
20
|
+
/**
|
|
21
|
+
* Embed the challenge's `twzrd_attempt` on a payment payload. Idempotent:
|
|
22
|
+
* an already-present non-empty `attempt_key` is left alone. Never mints.
|
|
23
|
+
*/
|
|
24
|
+
export declare function stampTwzrdAttemptOnPaymentPayload(challenge: unknown, payload: unknown): unknown;
|
|
25
|
+
/** Decode PAYMENT-SIGNATURE / X-PAYMENT, stamp `twzrd_attempt`, re-encode. */
|
|
26
|
+
export declare function stampPaymentSignatureHeader(header: string, challenge: unknown): string;
|
|
27
|
+
/**
|
|
28
|
+
* Fetch wrapper: remember `twzrd_attempt` from a 402 (PAYMENT-REQUIRED header
|
|
29
|
+
* first, JSON body fallback) and stamp it onto the retry's PAYMENT-SIGNATURE.
|
|
30
|
+
*
|
|
31
|
+
* Sits under `wrapFetchWithPayment` so the official adapter's retry is joined
|
|
32
|
+
* even when createPaymentPayload itself drops extensions.
|
|
33
|
+
*/
|
|
34
|
+
export declare function wrapFetchEchoTwzrdAttempt(inner: typeof fetch): typeof fetch;
|
|
35
|
+
/**
|
|
36
|
+
* Wrap `createPaymentPayload` so `@x402/fetch` retries carry `twzrd_attempt`
|
|
37
|
+
* inside the encoded PAYMENT-SIGNATURE, not only on the HTTP wrapper.
|
|
38
|
+
* No-op when the object has no such method (plain signers).
|
|
39
|
+
*/
|
|
40
|
+
export declare function wrapX402ClientEchoAttempt<T>(client: T): T;
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=attempt-echo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attempt-echo.d.ts","sourceRoot":"","sources":["../src/attempt-echo.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,eAAO,MAAM,iBAAiB,kBAAkB,CAAC;AACjD,eAAO,MAAM,wBAAwB,qBAAqB,CAAC;AAE3D,KAAK,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAcpC;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,GAAG,IAAI,CAUzE;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,CAC/C,SAAS,EAAE,OAAO,EAClB,OAAO,EAAE,OAAO,GACf,OAAO,CAeT;AAUD,8EAA8E;AAC9E,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,OAAO,GACjB,MAAM,CAMR;AAgBD;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,KAAK,GAAG,OAAO,KAAK,CAuC3E;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAkBzD"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Funnel join-key pass-through for paying clients.
|
|
3
|
+
*
|
|
4
|
+
* Server 402s (PR #2819) emit `extensions.twzrd_attempt` on PAYMENT-REQUIRED.
|
|
5
|
+
* `@x402/fetch` / `@x402/core` createPaymentPayload drops unknown extensions,
|
|
6
|
+
* so every paid retry lands as a new singleton in `x402_funnel_events`.
|
|
7
|
+
*
|
|
8
|
+
* This module copies the challenge's `twzrd_attempt` onto the retry payload.
|
|
9
|
+
* It never mints a key. No challenge key → no stamp.
|
|
10
|
+
*/
|
|
11
|
+
import { paymentRequiredFromResponse } from "./payto.js";
|
|
12
|
+
export const ATTEMPT_EXTENSION = "twzrd_attempt";
|
|
13
|
+
export const ATTEMPT_EXTENSION_SCHEMA = "twzrd.attempt.v1";
|
|
14
|
+
function asRecord(value) {
|
|
15
|
+
return value !== null && typeof value === "object" && !Array.isArray(value)
|
|
16
|
+
? value
|
|
17
|
+
: null;
|
|
18
|
+
}
|
|
19
|
+
function clipKey(value) {
|
|
20
|
+
if (typeof value !== "string")
|
|
21
|
+
return null;
|
|
22
|
+
const key = value.trim();
|
|
23
|
+
return key.length > 0 ? key : null;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Read `extensions.twzrd_attempt` from a decoded PAYMENT-REQUIRED / 402 body.
|
|
27
|
+
* Header-first callers should parse PAYMENT-REQUIRED before passing the object.
|
|
28
|
+
* Returns null when the challenge did not carry a key — never invents one.
|
|
29
|
+
*/
|
|
30
|
+
export function twzrdAttemptFromChallenge(challenge) {
|
|
31
|
+
const root = asRecord(challenge);
|
|
32
|
+
if (!root)
|
|
33
|
+
return null;
|
|
34
|
+
const ext = asRecord(root.extensions);
|
|
35
|
+
if (!ext)
|
|
36
|
+
return null;
|
|
37
|
+
const att = asRecord(ext[ATTEMPT_EXTENSION]);
|
|
38
|
+
if (!att)
|
|
39
|
+
return null;
|
|
40
|
+
const key = clipKey(att.attempt_key);
|
|
41
|
+
if (!key)
|
|
42
|
+
return null;
|
|
43
|
+
return { ...att, attempt_key: key };
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Embed the challenge's `twzrd_attempt` on a payment payload. Idempotent:
|
|
47
|
+
* an already-present non-empty `attempt_key` is left alone. Never mints.
|
|
48
|
+
*/
|
|
49
|
+
export function stampTwzrdAttemptOnPaymentPayload(challenge, payload) {
|
|
50
|
+
const echo = twzrdAttemptFromChallenge(challenge);
|
|
51
|
+
if (!echo)
|
|
52
|
+
return payload;
|
|
53
|
+
const root = asRecord(payload);
|
|
54
|
+
if (!root)
|
|
55
|
+
return payload;
|
|
56
|
+
const ext = asRecord(root.extensions) ?? {};
|
|
57
|
+
const existing = asRecord(ext[ATTEMPT_EXTENSION]);
|
|
58
|
+
if (existing && clipKey(existing.attempt_key))
|
|
59
|
+
return payload;
|
|
60
|
+
return {
|
|
61
|
+
...root,
|
|
62
|
+
extensions: {
|
|
63
|
+
...ext,
|
|
64
|
+
[ATTEMPT_EXTENSION]: echo,
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function decodeB64Json(header) {
|
|
69
|
+
try {
|
|
70
|
+
return JSON.parse(Buffer.from(header, "base64").toString("utf8"));
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/** Decode PAYMENT-SIGNATURE / X-PAYMENT, stamp `twzrd_attempt`, re-encode. */
|
|
77
|
+
export function stampPaymentSignatureHeader(header, challenge) {
|
|
78
|
+
const decoded = decodeB64Json(header);
|
|
79
|
+
if (decoded == null)
|
|
80
|
+
return header;
|
|
81
|
+
const stamped = stampTwzrdAttemptOnPaymentPayload(challenge, decoded);
|
|
82
|
+
if (stamped === decoded)
|
|
83
|
+
return header;
|
|
84
|
+
return Buffer.from(JSON.stringify(stamped), "utf8").toString("base64");
|
|
85
|
+
}
|
|
86
|
+
function requestMapKey(input, init) {
|
|
87
|
+
if (typeof input === "string") {
|
|
88
|
+
return `${(init?.method ?? "GET").toString().toUpperCase()} ${input}`;
|
|
89
|
+
}
|
|
90
|
+
if (input instanceof URL) {
|
|
91
|
+
return `${(init?.method ?? "GET").toString().toUpperCase()} ${input.href}`;
|
|
92
|
+
}
|
|
93
|
+
return `${input.method} ${input.url}`;
|
|
94
|
+
}
|
|
95
|
+
function paymentHeaderValue(headers) {
|
|
96
|
+
return headers.get("PAYMENT-SIGNATURE") || headers.get("X-PAYMENT") || null;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Fetch wrapper: remember `twzrd_attempt` from a 402 (PAYMENT-REQUIRED header
|
|
100
|
+
* first, JSON body fallback) and stamp it onto the retry's PAYMENT-SIGNATURE.
|
|
101
|
+
*
|
|
102
|
+
* Sits under `wrapFetchWithPayment` so the official adapter's retry is joined
|
|
103
|
+
* even when createPaymentPayload itself drops extensions.
|
|
104
|
+
*/
|
|
105
|
+
export function wrapFetchEchoTwzrdAttempt(inner) {
|
|
106
|
+
const last = new Map();
|
|
107
|
+
return async (input, init) => {
|
|
108
|
+
const mapKey = requestMapKey(input, init);
|
|
109
|
+
const peek = input instanceof Request ? input : new Request(input, init);
|
|
110
|
+
const sig = paymentHeaderValue(peek.headers);
|
|
111
|
+
let callInput = input;
|
|
112
|
+
let callInit = init;
|
|
113
|
+
if (sig) {
|
|
114
|
+
const challenge = last.get(mapKey);
|
|
115
|
+
if (challenge) {
|
|
116
|
+
const stamped = stampPaymentSignatureHeader(sig, challenge);
|
|
117
|
+
if (stamped !== sig) {
|
|
118
|
+
const headers = new Headers(peek.headers);
|
|
119
|
+
if (headers.get("PAYMENT-SIGNATURE"))
|
|
120
|
+
headers.set("PAYMENT-SIGNATURE", stamped);
|
|
121
|
+
if (headers.get("X-PAYMENT"))
|
|
122
|
+
headers.set("X-PAYMENT", stamped);
|
|
123
|
+
callInput = new Request(peek, { headers });
|
|
124
|
+
callInit = undefined;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const resp = await inner(callInput, callInit);
|
|
129
|
+
if (resp.status === 402) {
|
|
130
|
+
try {
|
|
131
|
+
const challenge = await paymentRequiredFromResponse(resp);
|
|
132
|
+
if (challenge) {
|
|
133
|
+
last.set(mapKey, challenge);
|
|
134
|
+
while (last.size > 256) {
|
|
135
|
+
last.delete(last.keys().next().value);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
/* echo is advisory — never fail-close a 402 on a bad header */
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return resp;
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Wrap `createPaymentPayload` so `@x402/fetch` retries carry `twzrd_attempt`
|
|
148
|
+
* inside the encoded PAYMENT-SIGNATURE, not only on the HTTP wrapper.
|
|
149
|
+
* No-op when the object has no such method (plain signers).
|
|
150
|
+
*/
|
|
151
|
+
export function wrapX402ClientEchoAttempt(client) {
|
|
152
|
+
if (!client || typeof client !== "object")
|
|
153
|
+
return client;
|
|
154
|
+
const orig = client.createPaymentPayload;
|
|
155
|
+
if (typeof orig !== "function")
|
|
156
|
+
return client;
|
|
157
|
+
const bound = orig.bind(client);
|
|
158
|
+
const wrapped = async (paymentRequired, ...rest) => {
|
|
159
|
+
const payload = await bound(paymentRequired, ...rest);
|
|
160
|
+
return stampTwzrdAttemptOnPaymentPayload(paymentRequired, payload);
|
|
161
|
+
};
|
|
162
|
+
try {
|
|
163
|
+
client.createPaymentPayload = wrapped;
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
return client;
|
|
167
|
+
}
|
|
168
|
+
return client;
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=attempt-echo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attempt-echo.js","sourceRoot":"","sources":["../src/attempt-echo.ts"],"names":[],"mappings":"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"}
|
package/dist/auto-gate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-gate.d.ts","sourceRoot":"","sources":["../src/auto-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;
|
|
1
|
+
{"version":3,"file":"auto-gate.d.ts","sourceRoot":"","sources":["../src/auto-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAGH,OAAO,EAAkB,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAIL,KAAK,4BAA4B,EACjC,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,EACjC,KAAK,cAAc,EACnB,KAAK,wBAAwB,EAC7B,KAAK,8BAA8B,EACpC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAEL,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,YAAY,EAClB,MAAM,eAAe,CAAC;AAEvB;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG,CAAC,YAAY,EAAE,OAAO,KAAK,KAAK,OAAO,KAAK,CAAC;AAEnE,MAAM,MAAM,0BAA0B,GAAG;IACvC;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG,iBAAiB,GACzD,0BAA0B,GAAG;IAC3B;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,KAAK,CAAC;CACzB,CAAC;AAEJ,kFAAkF;AAClF,MAAM,MAAM,sBAAsB,GAAG,2BAA2B,CAAC;AAEjE,MAAM,MAAM,0BAA0B,GAAG,4BAA4B,GACnE,0BAA0B,CAAC;AAE7B,MAAM,MAAM,yBAAyB,GAAG,qBAAqB,GAC3D,0BAA0B,CAAC;AAS7B,8DAA8D;AAC9D,wBAAgB,uBAAuB,CAAC,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAOjF;AAcD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,2BAA2B,GACpC,OAAO,KAAK,CAAC;AAEhB;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,cAAc,EACtB,OAAO,CAAC,EAAE,0BAA0B,GACnC,cAAc,CAAC;AAElB;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,KAAK,EACd,OAAO,EAAE,yBAAyB,GACjC,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,qBAAqB,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;AAE5F;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,aAAa,EACtB,OAAO,CAAC,EAAE,0BAA0B,GACnC,CACD,YAAY,EAAE,wBAAwB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChE,OAAO,CAAC,EAAE,8BAA8B,KACrC,OAAO,CAAC,2BAA2B,CAAC,CAAC;AAE1C;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,SAAS,EAClB,OAAO,CAAC,EAAE,0BAA0B,GACnC,CAAC,OAAO,EAAE,4BAA4B,KAAK,OAAO,CAAC,2BAA2B,CAAC,CAAC;AAsJnF;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAWnE"}
|
package/dist/auto-gate.js
CHANGED
|
@@ -29,6 +29,7 @@
|
|
|
29
29
|
* and — the direction that matters — a fetch composed WHILE the switch was
|
|
30
30
|
* off stays ungated after it is cleared. Rebuild it either way.
|
|
31
31
|
*/
|
|
32
|
+
import { wrapFetchEchoTwzrdAttempt, wrapX402ClientEchoAttempt } from "./attempt-echo.js";
|
|
32
33
|
import { withTwzrdGuard } from "./with-guard.js";
|
|
33
34
|
import { createTwzrdBeforePaymentHook, createTwzrdPayKitBeforePaymentHook, installTwzrdX402ClientHook, } from "./x402-client-hook.js";
|
|
34
35
|
import { createTwzrdMppOnChallenge, } from "./mpp-hook.js";
|
|
@@ -101,6 +102,8 @@ export function installTwzrdAutoGate(target, options) {
|
|
|
101
102
|
// so an env-off install is inert while the switch is set and gates once it
|
|
102
103
|
// clears. Trade-off: a paymentControl misconfig now throws at install even
|
|
103
104
|
// under the kill switch, i.e. fails fast instead of silently passing through.
|
|
105
|
+
// Echo is not a gate — join-key pass-through stays on when policy is off.
|
|
106
|
+
wrapX402ClientEchoAttempt(target);
|
|
104
107
|
if (x402Opts?.disabled === true) {
|
|
105
108
|
return target;
|
|
106
109
|
}
|
|
@@ -156,13 +159,14 @@ export function installTwzrdAutoGate(target, options) {
|
|
|
156
159
|
if (isPayWrap(target)) {
|
|
157
160
|
const fetchOpts = options;
|
|
158
161
|
const raw = fetchOpts?.rawFetch ?? globalThis.fetch;
|
|
162
|
+
const echoing = wrapFetchEchoTwzrdAttempt(raw);
|
|
159
163
|
if (isTwzrdAutoGateDisabled(fetchOpts)) {
|
|
160
|
-
return target(
|
|
164
|
+
return target(echoing);
|
|
161
165
|
}
|
|
162
166
|
// The payWrap they already supply is a paying fetch. Use it as Path A
|
|
163
|
-
// x402Fetch so the canonical install fires warn
|
|
164
|
-
// second argument. payWrap(
|
|
165
|
-
const x402Fetch = fetchOpts?.x402Fetch ?? target(
|
|
167
|
+
// x402Fetch so the canonical install fires warn → $0.001 /quick without a
|
|
168
|
+
// second argument. payWrap(echoing) is unguarded — no recursion into the gate.
|
|
169
|
+
const x402Fetch = fetchOpts?.x402Fetch ?? target(echoing);
|
|
166
170
|
return target(withTwzrdGuard(raw, { ...fetchOpts, x402Fetch }));
|
|
167
171
|
}
|
|
168
172
|
throw new TypeError('[twzrd-x402-gate] installTwzrdAutoGate: expected a PayWrap function, an x402 client with onBeforePaymentCreation, or the string "mpp" / "x402-solana" / "pay-kit"');
|
package/dist/auto-gate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-gate.js","sourceRoot":"","sources":["../src/auto-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAE,cAAc,EAA0B,MAAM,iBAAiB,CAAC;AACzE,OAAO,EACL,4BAA4B,EAC5B,kCAAkC,EAClC,0BAA0B,GAO3B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,yBAAyB,GAI1B,MAAM,eAAe,CAAC;AAoCvB;;6CAE6C;AAC7C,MAAM,cAAc,GAAG,IAAI,OAAO,EAAgC,CAAC;AAEnE,8DAA8D;AAC9D,MAAM,UAAU,uBAAuB,CAAC,OAAgC;IACtE,IAAI,OAAO,EAAE,QAAQ,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IACzC,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IAClD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IAC5C,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IAClD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,SAAS,CAAC,CAAU;IAC3B,OAAO,OAAO,CAAC,KAAK,UAAU,CAAC;AACjC,CAAC;AAED,SAAS,gBAAgB,CAAC,CAAU;IAClC,OAAO,CACL,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,KAAK,QAAQ;QACrB,OAAQ,CAAoB,CAAC,uBAAuB,KAAK,UAAU,CACpE,CAAC;AACJ,CAAC;AA6ED,MAAM,UAAU,oBAAoB,CAClC,MAAoE,EACpE,OAA8F;IAU9F,wEAAwE;IACxE,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,MAAM,OAAO,GAAG,OAAoC,CAAC;QACrD,sEAAsE;QACtE,IAAI,OAAO,EAAE,QAAQ,KAAK,IAAI,EAAE,CAAC;YAC/B,OAAO,KAAK,EACV,UAAwB,EACxB,OAA8B,EACD,EAAE,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC/D,CAAC;QACD,4EAA4E;QAC5E,6EAA6E;QAC7E,6EAA6E;QAC7E,gDAAgD;QAChD,MAAM,KAAK,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC;QACjD,OAAO,KAAK,EACV,SAAuB,EACvB,OAA8B,EACD,EAAE,CAC/B,uBAAuB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC9F,CAAC;IAED,sEAAsE;IACtE,IAAI,MAAM,KAAK,aAAa,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,OAAiD,CAAC;QAClE,IAAI,OAAO,EAAE,QAAQ,KAAK,IAAI,EAAE,CAAC;YAC/B,OAAO,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC;QAC/B,CAAC;QACD,6EAA6E;QAC7E,MAAM,KAAK,GAAG,4BAA4B,CAAC,OAAO,CAAC,CAAC;QACpD,OAAO,KAAK,EACV,YAAgE,EAChE,OAAwC,EACF,EAAE,CACxC,uBAAuB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAChF,CAAC;IAED,wEAAwE;IACxE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,OAAiD,CAAC;QACrE,IAAI,UAAU,EAAE,QAAQ,KAAK,IAAI,EAAE,CAAC;YAClC,OAAO,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC;QAC/B,CAAC;QACD,MAAM,KAAK,GAAG,kCAAkC,CAAC,UAAU,CAAC,CAAC;QAC7D,OAAO,KAAK,EACV,OAAqC,EACC,EAAE,CACxC,uBAAuB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrE,CAAC;IAED,wEAAwE;IACxE,IAAI,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,OAAiD,CAAC;QACnE,4EAA4E;QAC5E,0EAA0E;QAC1E,4EAA4E;QAC5E,0EAA0E;QAC1E,6EAA6E;QAC7E,2EAA2E;QAC3E,2EAA2E;QAC3E,8EAA8E;QAC9E,IAAI,QAAQ,EAAE,QAAQ,KAAK,IAAI,EAAE,CAAC;YAChC,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,IAAI,cAAc,CAAC,GAAG,CAAC,MAAgB,CAAC,EAAE,CAAC;YACzC,OAAO,CAAC,IAAI,CACV,oIAAoI,CACrI,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GAAuB,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QACtD,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,MAAgB,CAAC,CAAC;QACpD,IAAI,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;YAC1B,cAAc,CAAC,GAAG,CAAC,MAAgB,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QAEnD,2EAA2E;QAC3E,sEAAsE;QACtE,uEAAuE;QACvE,yCAAyC;QACzC,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;QACxF,MAAM,YAAY,GAAG,MAAM,CAAC,uBAAuB,CAAC;QACpD,MAAM,gBAAgB,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACxB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YACjC,IAAI,KAAK,CAAC,QAAQ,IAAI,uBAAuB,EAAE,EAAE,CAAC;gBAChD,OAAO,SAAS,CAAC,CAAC,oBAAoB;YACxC,CAAC;YACD,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC,CAAC,CAA8C,CAAC;QACnD,MAAM,CAAC,uBAAuB,GAAG,OAAO,CAAC;QAEzC,IAAI,CAAC;YACH,0BAA0B,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC/C,CAAC;gBAAS,CAAC;YACT,IAAI,OAAO;gBAAE,MAAM,CAAC,uBAAuB,GAAG,YAAY,CAAC;;gBACtD,OAAQ,MAAkC,CAAC,uBAAuB,CAAC;YACxE,yEAAyE;YACzE,uEAAuE;YACvE,wEAAwE;YACxE,0CAA0C;YAC1C,EAAE;YACF,2EAA2E;YAC3E,0EAA0E;YAC1E,mEAAmE;YACnE,kEAAkE;YAClE,uEAAuE;YACvE,oEAAoE;YACpE,IAAI,MAAM,CAAC,uBAAuB,KAAK,OAAO,EAAE,CAAC;gBAC/C,MAAM,CAAC,uBAAuB,GAAG,YAAY,CAAC;YAChD,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,wEAAwE;IACxE,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QACtB,MAAM,SAAS,GAAG,OAAkD,CAAC;QACrE,MAAM,GAAG,GAAG,SAAS,EAAE,QAAQ,IAAI,UAAU,CAAC,KAAK,CAAC;QACpD,IAAI,uBAAuB,CAAC,SAAS,CAAC,EAAE,CAAC;YACvC,OAAO,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"auto-gate.js","sourceRoot":"","sources":["../src/auto-gate.ts"],"names":[],"mappings":"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"}
|
package/dist/buyer-defaults.d.ts
CHANGED
|
@@ -7,11 +7,12 @@
|
|
|
7
7
|
*
|
|
8
8
|
* Ladder (when x402Fetch is present and flags are unset):
|
|
9
9
|
* block → free refuse
|
|
10
|
-
* warn
|
|
11
|
-
*
|
|
12
|
-
* allow + price >= $2.50 → $0.05 V6
|
|
10
|
+
* warn (any price) → $0.001 GET /quick (escalateOnWarn)
|
|
11
|
+
* allow + price >= $2.50 → optional V7 $0.05 GET /trust (requireReceipt)
|
|
13
12
|
* allow + price < $2.50 → free proceed
|
|
14
13
|
*
|
|
14
|
+
* First paid hop is always /quick on warn. $0.05 /trust is opt-in V7
|
|
15
|
+
* (material allow, autoReceipt, or escalateOnWarn: false + requireReceipt).
|
|
15
16
|
* Opt out: `requireReceipt: false` and/or `escalateOnWarn: false`.
|
|
16
17
|
*/
|
|
17
18
|
import type { RequireReceiptPolicy } from "./receipt-policy.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buyer-defaults.d.ts","sourceRoot":"","sources":["../src/buyer-defaults.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"buyer-defaults.d.ts","sourceRoot":"","sources":["../src/buyer-defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAEhE,wEAAwE;AACxE,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAE/C,eAAO,MAAM,6BAA6B,EAAE,oBAK3C,CAAC;AAEF,eAAO,MAAM,8BAA8B;;CAE1C,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAC3B,KAAK,GACL;IACE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEN,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,GAAG,oBAAoB,CAAC;IAChD,cAAc,CAAC,EAAE,mBAAmB,CAAC;CACtC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,eAAe,GAAG,eAAe,CAUhF"}
|
package/dist/buyer-defaults.js
CHANGED
|
@@ -7,18 +7,19 @@
|
|
|
7
7
|
*
|
|
8
8
|
* Ladder (when x402Fetch is present and flags are unset):
|
|
9
9
|
* block → free refuse
|
|
10
|
-
* warn
|
|
11
|
-
*
|
|
12
|
-
* allow + price >= $2.50 → $0.05 V6
|
|
10
|
+
* warn (any price) → $0.001 GET /quick (escalateOnWarn)
|
|
11
|
+
* allow + price >= $2.50 → optional V7 $0.05 GET /trust (requireReceipt)
|
|
13
12
|
* allow + price < $2.50 → free proceed
|
|
14
13
|
*
|
|
14
|
+
* First paid hop is always /quick on warn. $0.05 /trust is opt-in V7
|
|
15
|
+
* (material allow, autoReceipt, or escalateOnWarn: false + requireReceipt).
|
|
15
16
|
* Opt out: `requireReceipt: false` and/or `escalateOnWarn: false`.
|
|
16
17
|
*/
|
|
17
18
|
/** ROI break-even from productization (0.05 lookup vs ~2% bad rate). */
|
|
18
19
|
export const DEFAULT_BUYER_MATERIAL_USDC = 2.5;
|
|
19
20
|
export const DEFAULT_BUYER_REQUIRE_RECEIPT = {
|
|
20
21
|
minSpendUsdc: DEFAULT_BUYER_MATERIAL_USDC,
|
|
21
|
-
onWarn:
|
|
22
|
+
onWarn: false,
|
|
22
23
|
hard: true,
|
|
23
24
|
materialWarnOnly: true,
|
|
24
25
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buyer-defaults.js","sourceRoot":"","sources":["../src/buyer-defaults.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"buyer-defaults.js","sourceRoot":"","sources":["../src/buyer-defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,wEAAwE;AACxE,MAAM,CAAC,MAAM,2BAA2B,GAAG,GAAG,CAAC;AAE/C,MAAM,CAAC,MAAM,6BAA6B,GAAyB;IACjE,YAAY,EAAE,2BAA2B;IACzC,MAAM,EAAE,KAAK;IACb,IAAI,EAAE,IAAI;IACV,gBAAgB,EAAE,IAAI;CACvB,CAAC;AAEF,MAAM,CAAC,MAAM,8BAA8B,GAAG;IAC5C,YAAY,EAAE,CAAC;CAChB,CAAC;AAeF;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAqB;IAC7D,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC;IACtD,MAAM,IAAI,GAAoB,EAAE,GAAG,IAAI,EAAE,CAAC;IAC1C,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACtC,IAAI,CAAC,cAAc,GAAG,EAAE,GAAG,6BAA6B,EAAE,CAAC;IAC7D,CAAC;IACD,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACtC,IAAI,CAAC,cAAc,GAAG,EAAE,GAAG,8BAA8B,EAAE,CAAC;IAC9D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare Agents x402 approval adapter.
|
|
3
|
+
*
|
|
4
|
+
* Cloudflare's `withX402Client(...).callTool(onPaymentRequired, ...)` asks the
|
|
5
|
+
* caller to approve a payment before it constructs and submits the payment
|
|
6
|
+
* payload. This adapter turns that callback into the same TWZRD decision used
|
|
7
|
+
* by the generic MCP hook.
|
|
8
|
+
*
|
|
9
|
+
* This is an approval boundary, not a claim that Base has TWZRD behavioral
|
|
10
|
+
* reputation. Base/EVM stays `decision=unknown`: observe permits it and strict
|
|
11
|
+
* refuses it before the Cloudflare client pays.
|
|
12
|
+
*/
|
|
13
|
+
import type { TwzrdGateConfig, X402PaymentRequiredBody } from "./types.js";
|
|
14
|
+
/** Dependency-free structural shape passed to Cloudflare's callback. */
|
|
15
|
+
export type CloudflareX402PaymentRequirements = X402PaymentRequiredBody & {
|
|
16
|
+
resource?: string;
|
|
17
|
+
description?: string;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Build a Cloudflare `onPaymentRequired` callback.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* const approvePayment = createTwzrdCloudflareX402Approval({
|
|
24
|
+
* unsupportedNetworkMode: "strict",
|
|
25
|
+
* });
|
|
26
|
+
* await client.callTool(approvePayment, { name: "paid_tool", arguments: {} });
|
|
27
|
+
*/
|
|
28
|
+
export declare function createTwzrdCloudflareX402Approval(options?: TwzrdGateConfig): (paymentRequirements: CloudflareX402PaymentRequirements) => Promise<boolean>;
|
|
29
|
+
//# sourceMappingURL=cloudflare-x402.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudflare-x402.d.ts","sourceRoot":"","sources":["../src/cloudflare-x402.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE3E,wEAAwE;AACxE,MAAM,MAAM,iCAAiC,GAAG,uBAAuB,GAAG;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,iCAAiC,CAC/C,OAAO,CAAC,EAAE,eAAe,GACxB,CAAC,mBAAmB,EAAE,iCAAiC,KAAK,OAAO,CAAC,OAAO,CAAC,CAU9E"}
|