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.
Files changed (93) hide show
  1. package/QUICKSTART.md +23 -6
  2. package/README.md +21 -14
  3. package/bin/twzrd-cold-start.js +69 -0
  4. package/dist/attempt-echo.d.ts +42 -0
  5. package/dist/attempt-echo.d.ts.map +1 -0
  6. package/dist/attempt-echo.js +170 -0
  7. package/dist/attempt-echo.js.map +1 -0
  8. package/dist/auto-gate.d.ts.map +1 -1
  9. package/dist/auto-gate.js +8 -4
  10. package/dist/auto-gate.js.map +1 -1
  11. package/dist/buyer-defaults.d.ts +4 -3
  12. package/dist/buyer-defaults.d.ts.map +1 -1
  13. package/dist/buyer-defaults.js +5 -4
  14. package/dist/buyer-defaults.js.map +1 -1
  15. package/dist/cloudflare-x402.d.ts +29 -0
  16. package/dist/cloudflare-x402.d.ts.map +1 -0
  17. package/dist/cloudflare-x402.js +31 -0
  18. package/dist/cloudflare-x402.js.map +1 -0
  19. package/dist/cold-start.d.ts +115 -0
  20. package/dist/cold-start.d.ts.map +1 -0
  21. package/dist/cold-start.js +461 -0
  22. package/dist/cold-start.js.map +1 -0
  23. package/dist/decision-token.d.ts +1 -1
  24. package/dist/delivery-capture.d.ts +4 -3
  25. package/dist/delivery-capture.d.ts.map +1 -1
  26. package/dist/delivery-capture.js +4 -3
  27. package/dist/delivery-capture.js.map +1 -1
  28. package/dist/evaluate.d.ts +16 -12
  29. package/dist/evaluate.d.ts.map +1 -1
  30. package/dist/evaluate.js +45 -47
  31. package/dist/evaluate.js.map +1 -1
  32. package/dist/foreign-key.d.ts +19 -0
  33. package/dist/foreign-key.d.ts.map +1 -0
  34. package/dist/foreign-key.js +61 -0
  35. package/dist/foreign-key.js.map +1 -0
  36. package/dist/index.d.ts +10 -1
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +9 -1
  39. package/dist/index.js.map +1 -1
  40. package/dist/merchant-card.d.ts +18 -3
  41. package/dist/merchant-card.d.ts.map +1 -1
  42. package/dist/merchant-card.js +22 -5
  43. package/dist/merchant-card.js.map +1 -1
  44. package/dist/network.d.ts +25 -6
  45. package/dist/network.d.ts.map +1 -1
  46. package/dist/network.js +45 -7
  47. package/dist/network.js.map +1 -1
  48. package/dist/paying-fetch.d.ts +17 -0
  49. package/dist/paying-fetch.d.ts.map +1 -0
  50. package/dist/paying-fetch.js +116 -0
  51. package/dist/paying-fetch.js.map +1 -0
  52. package/dist/payment-decision.js +1 -1
  53. package/dist/payment-decision.js.map +1 -1
  54. package/dist/policy-fetch.d.ts +18 -0
  55. package/dist/policy-fetch.d.ts.map +1 -0
  56. package/dist/policy-fetch.js +81 -0
  57. package/dist/policy-fetch.js.map +1 -0
  58. package/dist/policy-runtime.d.ts +3 -1
  59. package/dist/policy-runtime.d.ts.map +1 -1
  60. package/dist/policy-runtime.js +19 -1
  61. package/dist/policy-runtime.js.map +1 -1
  62. package/dist/policy.d.ts +10 -0
  63. package/dist/policy.d.ts.map +1 -1
  64. package/dist/policy.js +68 -2
  65. package/dist/policy.js.map +1 -1
  66. package/dist/record-leash-settle.d.ts +20 -0
  67. package/dist/record-leash-settle.d.ts.map +1 -0
  68. package/dist/record-leash-settle.js +25 -0
  69. package/dist/record-leash-settle.js.map +1 -0
  70. package/dist/seller-hook.d.ts.map +1 -1
  71. package/dist/seller-hook.js +6 -3
  72. package/dist/seller-hook.js.map +1 -1
  73. package/dist/trust-gate-reason.d.ts.map +1 -1
  74. package/dist/trust-gate-reason.js +1 -0
  75. package/dist/trust-gate-reason.js.map +1 -1
  76. package/dist/types.d.ts +46 -5
  77. package/dist/types.d.ts.map +1 -1
  78. package/dist/wash-default.d.ts +131 -0
  79. package/dist/wash-default.d.ts.map +1 -0
  80. package/dist/wash-default.js +307 -0
  81. package/dist/wash-default.js.map +1 -0
  82. package/dist/with-guard.d.ts +3 -3
  83. package/dist/with-guard.d.ts.map +1 -1
  84. package/dist/with-guard.js +6 -4
  85. package/dist/with-guard.js.map +1 -1
  86. package/dist/wrap-fetch.d.ts.map +1 -1
  87. package/dist/wrap-fetch.js +3 -1
  88. package/dist/wrap-fetch.js.map +1 -1
  89. package/dist/x402-client-hook.d.ts +3 -3
  90. package/dist/x402-client-hook.d.ts.map +1 -1
  91. package/dist/x402-client-hook.js +44 -39
  92. package/dist/x402-client-hook.js.map +1 -1
  93. 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.8` + stock PayAI client `x402-solana@3.0.0` (official
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.8 x402-solana@3.0.0
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.8 @x402/core @x402/fetch @x402/svm
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 warn + material amount
135
- buys the $0.05 V6 (or $0.001 quick below $2.50). Facilitator settle hooks stay
136
- free.
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.8
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.8
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 | 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. |
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 `/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.
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.8
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
- ### Auto-receipt on warn (revenue path)
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
- autoReceipt: true, // on warn or allow, auto-buy the $0.05 TWZRD trust receipt
676
- x402Fetch, // the paying fetch — TWZRD earns the fee on-chain
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
- every warn/allow verdict settles $0.05 USDC to TWZRD and returns a signed V7 trust credential
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` | Auto-buy $0.05 TWZRD receipt on warn/allow |
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 ($0.05 at material size) through your wallet with no further flag —
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. The merchant-facing payment still waits on the free
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":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAEzD,MAAM,CAAC,MAAM,iBAAiB,GAAG,eAAe,CAAC;AACjD,MAAM,CAAC,MAAM,wBAAwB,GAAG,kBAAkB,CAAC;AAI3D,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACzE,CAAC,CAAE,KAAc;QACjB,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED,SAAS,OAAO,CAAC,KAAc;IAC7B,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IACzB,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AACrC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,SAAkB;IAC1D,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACtC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC7C,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACrC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,OAAO,EAAE,GAAG,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iCAAiC,CAC/C,SAAkB,EAClB,OAAgB;IAEhB,MAAM,IAAI,GAAG,yBAAyB,CAAC,SAAS,CAAC,CAAC;IAClD,IAAI,CAAC,IAAI;QAAE,OAAO,OAAO,CAAC;IAC1B,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC/B,IAAI,CAAC,IAAI;QAAE,OAAO,OAAO,CAAC;IAC1B,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IAC5C,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAClD,IAAI,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,OAAO,CAAC;IAC9D,OAAO;QACL,GAAG,IAAI;QACP,UAAU,EAAE;YACV,GAAG,GAAG;YACN,CAAC,iBAAiB,CAAC,EAAE,IAAI;SAC1B;KACF,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,MAAc;IACnC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,2BAA2B,CACzC,MAAc,EACd,SAAkB;IAElB,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,OAAO,IAAI,IAAI;QAAE,OAAO,MAAM,CAAC;IACnC,MAAM,OAAO,GAAG,iCAAiC,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACtE,IAAI,OAAO,KAAK,OAAO;QAAE,OAAO,MAAM,CAAC;IACvC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,aAAa,CAAC,KAAkC,EAAE,IAAkC;IAC3F,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,GAAG,CAAC,IAAI,EAAE,MAAM,IAAI,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,IAAI,KAAK,EAAE,CAAC;IACxE,CAAC;IACD,IAAI,KAAK,YAAY,GAAG,EAAE,CAAC;QACzB,OAAO,GAAG,CAAC,IAAI,EAAE,MAAM,IAAI,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7E,CAAC;IACD,OAAO,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;AACxC,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAgB;IAC1C,OAAO,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;AAC9E,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAAmB;IAC3D,MAAM,IAAI,GAAG,IAAI,GAAG,EAAmB,CAAC;IAExC,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC1C,MAAM,IAAI,GAAG,KAAK,YAAY,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACzE,MAAM,GAAG,GAAG,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,SAAS,GAAgC,KAAK,CAAC;QACnD,IAAI,QAAQ,GAAG,IAAI,CAAC;QACpB,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACnC,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,OAAO,GAAG,2BAA2B,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;gBAC5D,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;oBACpB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBAC1C,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;wBAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;oBAChF,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;wBAAE,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;oBAChE,SAAS,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;oBAC3C,QAAQ,GAAG,SAAS,CAAC;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC9C,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACxB,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,2BAA2B,CAAC,IAAI,CAAC,CAAC;gBAC1D,IAAI,SAAS,EAAE,CAAC;oBACd,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;oBAC5B,OAAO,IAAI,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC;wBACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAM,CAAC,CAAC;oBACzC,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,+DAA+D;YACjE,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAI,MAAS;IACpD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC;IACzD,MAAM,IAAI,GAAI,MAA6C,CAAC,oBAAoB,CAAC;IACjF,IAAI,OAAO,IAAI,KAAK,UAAU;QAAE,OAAO,MAAM,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAGlB,CAAC;IACb,MAAM,OAAO,GAAG,KAAK,EAAE,eAAwB,EAAE,GAAG,IAAe,EAAE,EAAE;QACrE,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,eAAe,EAAE,GAAG,IAAI,CAAC,CAAC;QACtD,OAAO,iCAAiC,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IACrE,CAAC,CAAC;IACF,IAAI,CAAC;QACF,MAAuD,CAAC,oBAAoB,GAAG,OAAO,CAAC;IAC1F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"auto-gate.d.ts","sourceRoot":"","sources":["../src/auto-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,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;AAmJnF;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAWnE"}
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(raw);
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+material without a
164
- // second argument. payWrap(raw) is unguarded — no recursion into the gate.
165
- const x402Fetch = fetchOpts?.x402Fetch ?? target(raw);
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"');
@@ -1 +1 @@
1
- {"version":3,"file":"auto-gate.js","sourceRoot":"","sources":["../src/auto-gate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auto-gate.js","sourceRoot":"","sources":["../src/auto-gate.ts"],"names":[],"mappings":"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"}
@@ -7,11 +7,12 @@
7
7
  *
8
8
  * Ladder (when x402Fetch is present and flags are unset):
9
9
  * block → free refuse
10
- * warn + price >= $2.50 → $0.05 V6 (requireReceipt)
11
- * warn + price < $2.50 → $0.001 quick re-decide (escalateOnWarn)
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;;;;;;;;;;;;;;;GAeG;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"}
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"}
@@ -7,18 +7,19 @@
7
7
  *
8
8
  * Ladder (when x402Fetch is present and flags are unset):
9
9
  * block → free refuse
10
- * warn + price >= $2.50 → $0.05 V6 (requireReceipt)
11
- * warn + price < $2.50 → $0.001 quick re-decide (escalateOnWarn)
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: true,
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;;;;;;;;;;;;;;;GAeG;AAIH,wEAAwE;AACxE,MAAM,CAAC,MAAM,2BAA2B,GAAG,GAAG,CAAC;AAE/C,MAAM,CAAC,MAAM,6BAA6B,GAAyB;IACjE,YAAY,EAAE,2BAA2B;IACzC,MAAM,EAAE,IAAI;IACZ,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"}
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"}