twzrd-x402-gate 0.5.3 → 0.6.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 +118 -1
- package/dist/config.d.ts +5 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +10 -0
- package/dist/config.js.map +1 -1
- package/dist/decision-token.d.ts +80 -0
- package/dist/decision-token.d.ts.map +1 -0
- package/dist/decision-token.js +107 -0
- package/dist/decision-token.js.map +1 -0
- package/dist/evaluate.d.ts.map +1 -1
- package/dist/evaluate.js +1 -0
- package/dist/evaluate.js.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/intent-adapters.d.ts +62 -0
- package/dist/intent-adapters.d.ts.map +1 -0
- package/dist/intent-adapters.js +66 -0
- package/dist/intent-adapters.js.map +1 -0
- package/dist/intent.d.ts +69 -0
- package/dist/intent.d.ts.map +1 -0
- package/dist/intent.js +82 -0
- package/dist/intent.js.map +1 -0
- package/dist/policy-runtime.d.ts +88 -0
- package/dist/policy-runtime.d.ts.map +1 -0
- package/dist/policy-runtime.js +169 -0
- package/dist/policy-runtime.js.map +1 -0
- package/dist/policy.d.ts.map +1 -1
- package/dist/policy.js +10 -1
- package/dist/policy.js.map +1 -1
- package/dist/types.d.ts +18 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/version.d.ts +6 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +6 -0
- package/dist/version.js.map +1 -0
- package/dist/with-guard.d.ts.map +1 -1
- package/dist/with-guard.js +2 -0
- package/dist/with-guard.js.map +1 -1
- package/dist/x402-client-hook.d.ts +38 -0
- package/dist/x402-client-hook.d.ts.map +1 -1
- package/dist/x402-client-hook.js +68 -5
- package/dist/x402-client-hook.js.map +1 -1
- package/package.json +18 -8
package/README.md
CHANGED
|
@@ -18,7 +18,11 @@ const client = new x402Client();
|
|
|
18
18
|
client.register("solana:*", new ExactSvmScheme(svmSigner));
|
|
19
19
|
// Optional: client.register("eip155:*", new ExactEvmScheme(evmSigner));
|
|
20
20
|
|
|
21
|
-
installTwzrdX402ClientHook(client, {
|
|
21
|
+
installTwzrdX402ClientHook(client, {
|
|
22
|
+
gateOnCanSpend: false, // decision-only default (warn allowed)
|
|
23
|
+
refuseWashFlagged: true,
|
|
24
|
+
});
|
|
25
|
+
// Strict opt-in: gateOnCanSpend: true — also block when can_spend=false
|
|
22
26
|
// → onBeforePaymentCreation: scores selectedRequirements, abort if policy denies
|
|
23
27
|
|
|
24
28
|
const fetchWithPayment = wrapFetchWithPayment(fetch, client);
|
|
@@ -89,6 +93,92 @@ Dogfood:
|
|
|
89
93
|
npm install twzrd-x402-gate
|
|
90
94
|
```
|
|
91
95
|
|
|
96
|
+
## TWZRD Payment Control (protocol-neutral authorization core)
|
|
97
|
+
|
|
98
|
+
The gate now ships a protocol-neutral policy runtime underneath the x402 surface.
|
|
99
|
+
Defining invariant: **a signer path that calls `assertIntentApproved` will not sign
|
|
100
|
+
an intent that differs from what TWZRD evaluated.** (Honest scope: TWZRD does not
|
|
101
|
+
own third-party wallets - the binding is enforceable exactly where the check runs
|
|
102
|
+
before the signer, not as a claim over arbitrary wallet internals.)
|
|
103
|
+
|
|
104
|
+
```typescript
|
|
105
|
+
import {
|
|
106
|
+
evaluateIntent,
|
|
107
|
+
assertIntentApproved,
|
|
108
|
+
createLocalDecisionSigner,
|
|
109
|
+
createDecisionRegistry,
|
|
110
|
+
x402RequirementsToIntent, // or ap2CheckoutToIntent
|
|
111
|
+
} from "twzrd-x402-gate";
|
|
112
|
+
|
|
113
|
+
const signer = createLocalDecisionSigner();
|
|
114
|
+
const registry = createDecisionRegistry(); // consume-once
|
|
115
|
+
|
|
116
|
+
const intent = x402RequirementsToIntent(selectedRequirements, { resourceUrl });
|
|
117
|
+
const token = await evaluateIntent(intent, {
|
|
118
|
+
signer,
|
|
119
|
+
mandate, // user/company mandate (purpose, ceilings, resource scope)
|
|
120
|
+
policy, // local hard controls (caps, lists, recurring checks)
|
|
121
|
+
intelligence: twzrdIntel, // optional remote counterparty intelligence
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
// Wallet-side, immediately before signing the EXACT intent:
|
|
125
|
+
assertIntentApproved(intentBeingSigned, token, {
|
|
126
|
+
registry, // replay / consume-once
|
|
127
|
+
publicKeyPem: signer.publicKeyPem, // signature verification
|
|
128
|
+
});
|
|
129
|
+
// throws INTENT_HASH_MISMATCH | DECISION_EXPIRED | DECISION_NOT_ALLOW |
|
|
130
|
+
// DECISION_REPLAYED | BAD_SIGNATURE -> the signer is never invoked
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
- `PaymentIntent` v1 (frozen): protocol `x402 | ap2 | ucp | mpp | direct` +
|
|
134
|
+
network/asset/amount/payTo + resource + facilitator + mandate + recurrence
|
|
135
|
+
context, bound into one canonical `tiv1:` intent hash.
|
|
136
|
+
- Decisions are signed, expiring `DecisionToken`s - "policy version X approved
|
|
137
|
+
this exact transaction at this timestamp", auditable offline.
|
|
138
|
+
- A **block is a signed decision**, not an exception - refusals audit the same
|
|
139
|
+
way approvals do.
|
|
140
|
+
- Local hard controls (mandate scope, ceilings, allow/blocklists, cumulative
|
|
141
|
+
caps, recurring price checks) never depend on API availability; remote
|
|
142
|
+
intelligence (wash/fleet, counterparty score) plugs in via a provider.
|
|
143
|
+
- The category test lives in
|
|
144
|
+
[`test/payment-control.test.ts`](./test/payment-control.test.ts): a mandate
|
|
145
|
+
permits software under $100, a $12 checkout is approved, orchestration
|
|
146
|
+
mutates `payTo` after approval, the wallet refuses on hash mismatch,
|
|
147
|
+
`signerInvocationCount === 0`, and both the decision and the refusal verify
|
|
148
|
+
from audit records alone.
|
|
149
|
+
|
|
150
|
+
### On the client hook (opt-in)
|
|
151
|
+
|
|
152
|
+
`installTwzrdX402ClientHook` wires the runtime into the official
|
|
153
|
+
`onBeforePaymentCreation` seat. Pass `paymentControl` to build the canonical
|
|
154
|
+
intent, run the policy runtime (with the hook's own preflight fed in as remote
|
|
155
|
+
intelligence), and surface a signed, intent-bound `PaymentDecision`:
|
|
156
|
+
|
|
157
|
+
```typescript
|
|
158
|
+
import { installTwzrdX402ClientHook, createLocalDecisionSigner } from "twzrd-x402-gate";
|
|
159
|
+
|
|
160
|
+
const signer = createLocalDecisionSigner();
|
|
161
|
+
installTwzrdX402ClientHook(client, {
|
|
162
|
+
paymentControl: {
|
|
163
|
+
signer,
|
|
164
|
+
mandate, // optional user/company mandate
|
|
165
|
+
policy: { maxAmountUsd: "50" }, // optional local hard controls
|
|
166
|
+
},
|
|
167
|
+
onDecision: ({ intent, decision }) => handOff(intent, decision), // → assertIntentApproved
|
|
168
|
+
});
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
- **Tighten-only composition:** a `paymentControl` block aborts even when the
|
|
172
|
+
legacy preflight allowed; it never loosens a legacy denial.
|
|
173
|
+
- **Opt-in:** with `paymentControl` unset the hook behaves exactly as before.
|
|
174
|
+
- x402 wire amounts (USDC micro units) are converted to the decimal USD the
|
|
175
|
+
runtime expects before policy evaluation. (The `x402RequirementsToIntent`
|
|
176
|
+
adapter still passes the raw wire amount through into the decimal `amount`
|
|
177
|
+
field — a latent unit bug fixed at the hook boundary here; the adapter fix is
|
|
178
|
+
a follow-up.)
|
|
179
|
+
- Hook binding test:
|
|
180
|
+
[`test/intent-binding.test.ts`](./test/intent-binding.test.ts).
|
|
181
|
+
|
|
92
182
|
### Experimental CLI: `twzrd-safe-fetch` (AgentCash advisory pre-check)
|
|
93
183
|
|
|
94
184
|
> **Not a challenge-bound firewall.** Classification: `advisory_precheck`.
|
|
@@ -413,6 +503,33 @@ A 402 whose payment requirements yield **no identifiable seller wallet** (missin
|
|
|
413
503
|
| `x402Fetch` | — | — | x402-capable fetch for `autoReceipt` |
|
|
414
504
|
| `onReceipt` | — | — | Callback after receipt is captured |
|
|
415
505
|
| `disabled` (`installTwzrdAutoGate` only) | `TWZRD_AUTO_GATE=0`/`false` | `false` | Bypass the guard entirely — `payWrap` gets the raw, unguarded fetch |
|
|
506
|
+
| `attribution` | `TWZRD_ATTRIBUTION_INTEGRATION` + `TWZRD_ATTRIBUTION_RUN_ID` | — | Opt-in run attribution (see below) |
|
|
507
|
+
|
|
508
|
+
## Run attribution (optional, for integration correlation)
|
|
509
|
+
|
|
510
|
+
When you set `attribution`, the gate stamps **only the TWZRD preflight request** (never the
|
|
511
|
+
paid `/v1/intel/trust` call or the resource fetch) with correlation headers:
|
|
512
|
+
|
|
513
|
+
```
|
|
514
|
+
X-TWZRD-Integration: <integration>
|
|
515
|
+
X-TWZRD-Run-Id: <runId>
|
|
516
|
+
X-TWZRD-Client: twzrd-x402-gate/<version>
|
|
517
|
+
```
|
|
518
|
+
|
|
519
|
+
```ts
|
|
520
|
+
installTwzrdAutoGate((guarded) => wrapFetchWithPayment(guarded, wallet), {
|
|
521
|
+
attribution: {
|
|
522
|
+
integration: "payai-x402-solana-pr38",
|
|
523
|
+
runId: crypto.randomUUID(), // echo this in your transcript / issue comment
|
|
524
|
+
},
|
|
525
|
+
});
|
|
526
|
+
```
|
|
527
|
+
|
|
528
|
+
This is **correlation evidence, not proof of adoption** — the `runId` is caller-supplied and
|
|
529
|
+
spoofable. A run counts as an external execution only when the same `runId` (1) appears in the
|
|
530
|
+
integrator's own transcript, (2) is observed server-side with a real policy decision, and (3)
|
|
531
|
+
comes from non-internal lineage. No PII, secret, wallet, or payload is added; both fields must
|
|
532
|
+
be set or nothing is stamped.
|
|
416
533
|
|
|
417
534
|
## Compatibility note
|
|
418
535
|
|
package/dist/config.d.ts
CHANGED
|
@@ -16,6 +16,11 @@ export type ResolvedTwzrdGateConfig = {
|
|
|
16
16
|
unsupportedNetworkMode: "observe" | "strict";
|
|
17
17
|
fetch: typeof fetch;
|
|
18
18
|
onWarnUpsell?: (ctx: TwzrdUpsellContext) => void | Promise<void>;
|
|
19
|
+
/** Opt-in preflight run attribution (see TwzrdGateConfig.attribution). */
|
|
20
|
+
attribution?: {
|
|
21
|
+
integration: string;
|
|
22
|
+
runId: string;
|
|
23
|
+
};
|
|
19
24
|
};
|
|
20
25
|
export declare function resolveConfig(overrides?: TwzrdGateConfig): ResolvedTwzrdGateConfig;
|
|
21
26
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEtE,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,OAAO,CAAC;IACxB,gEAAgE;IAChE,iBAAiB,EAAE,OAAO,CAAC;IAC3B,0DAA0D;IAC1D,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B;;;OAGG;IACH,sBAAsB,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC7C,KAAK,EAAE,OAAO,KAAK,CAAC;IACpB,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,kBAAkB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEtE,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,OAAO,CAAC;IACxB,gEAAgE;IAChE,iBAAiB,EAAE,OAAO,CAAC;IAC3B,0DAA0D;IAC1D,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B;;;OAGG;IACH,sBAAsB,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC7C,KAAK,EAAE,OAAO,KAAK,CAAC;IACpB,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,kBAAkB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,0EAA0E;IAC1E,WAAW,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CACtD,CAAC;AAYF,wBAAgB,aAAa,CAAC,SAAS,CAAC,EAAE,eAAe,GAAG,uBAAuB,CAuFlF"}
|
package/dist/config.js
CHANGED
|
@@ -52,6 +52,15 @@ export function resolveConfig(overrides) {
|
|
|
52
52
|
if (typeof fetchFn !== "function") {
|
|
53
53
|
throw new Error("[twzrd-x402-gate] fetch is not available; pass config.fetch");
|
|
54
54
|
}
|
|
55
|
+
// Opt-in preflight attribution. Sent ONLY when both fields resolve (no partial
|
|
56
|
+
// stamping). Overrides win; env fallback (TWZRD_ATTRIBUTION_INTEGRATION +
|
|
57
|
+
// TWZRD_ATTRIBUTION_RUN_ID) exists for the zero-spend harness.
|
|
58
|
+
let attribution;
|
|
59
|
+
const attrIntegration = overrides?.attribution?.integration ?? process.env.TWZRD_ATTRIBUTION_INTEGRATION;
|
|
60
|
+
const attrRunId = overrides?.attribution?.runId ?? process.env.TWZRD_ATTRIBUTION_RUN_ID;
|
|
61
|
+
if (attrIntegration && attrRunId) {
|
|
62
|
+
attribution = { integration: attrIntegration, runId: attrRunId };
|
|
63
|
+
}
|
|
55
64
|
return {
|
|
56
65
|
intelBase,
|
|
57
66
|
preflightMinScore,
|
|
@@ -63,6 +72,7 @@ export function resolveConfig(overrides) {
|
|
|
63
72
|
unsupportedNetworkMode,
|
|
64
73
|
fetch: fetchFn,
|
|
65
74
|
onWarnUpsell: overrides?.onWarnUpsell,
|
|
75
|
+
attribution,
|
|
66
76
|
};
|
|
67
77
|
}
|
|
68
78
|
//# sourceMappingURL=config.js.map
|
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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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TWZRD Payment Control — signed, expiring DecisionTokens + intent binding.
|
|
3
|
+
*
|
|
4
|
+
* A DecisionToken is not "we checked this merchant earlier". It is:
|
|
5
|
+
* "at this timestamp, policy version X approved this EXACT transaction".
|
|
6
|
+
* The wallet (or payment client) must verify, before signing:
|
|
7
|
+
*
|
|
8
|
+
* hash(intent being signed) === token.intentHash
|
|
9
|
+
*
|
|
10
|
+
* plus expiry, decision === allow, signature, and consume-once. Any mismatch
|
|
11
|
+
* means refuse — the signer is never invoked.
|
|
12
|
+
*/
|
|
13
|
+
import { type PaymentIntent } from "./intent.js";
|
|
14
|
+
export type PaymentDecisionVerdict = "allow" | "warn" | "block";
|
|
15
|
+
export type DecisionConstraints = {
|
|
16
|
+
maxAmount?: string;
|
|
17
|
+
allowedAssets?: string[];
|
|
18
|
+
requireHumanApproval?: boolean;
|
|
19
|
+
};
|
|
20
|
+
export type PaymentDecision = {
|
|
21
|
+
decision: PaymentDecisionVerdict;
|
|
22
|
+
reasonCodes: string[];
|
|
23
|
+
intentHash: string;
|
|
24
|
+
policyVersion: string;
|
|
25
|
+
decisionId: string;
|
|
26
|
+
/** ISO-8601. Tokens are short-lived by design. */
|
|
27
|
+
expiresAt: string;
|
|
28
|
+
constraints?: DecisionConstraints;
|
|
29
|
+
/** Signer key identifier (for rotation / audit). */
|
|
30
|
+
keyId: string;
|
|
31
|
+
/** base64 Ed25519 signature over the domain-separated canonical payload. */
|
|
32
|
+
signature: string;
|
|
33
|
+
};
|
|
34
|
+
export type DecisionSigner = {
|
|
35
|
+
keyId: string;
|
|
36
|
+
sign(preimage: Uint8Array): Uint8Array | Promise<Uint8Array>;
|
|
37
|
+
/** PEM (SPKI) for local verification; remote signers publish theirs. */
|
|
38
|
+
publicKeyPem?: string;
|
|
39
|
+
};
|
|
40
|
+
/** Everything signed — the token minus the signature itself. */
|
|
41
|
+
export declare function decisionPreimage(token: Omit<PaymentDecision, "signature">): Buffer;
|
|
42
|
+
/**
|
|
43
|
+
* Local Ed25519 decision signer. Pass a PKCS#8 PEM to pin a key; otherwise an
|
|
44
|
+
* ephemeral keypair is generated (fine for tests and per-process runtimes).
|
|
45
|
+
*/
|
|
46
|
+
export declare function createLocalDecisionSigner(options?: {
|
|
47
|
+
privateKeyPem?: string;
|
|
48
|
+
keyId?: string;
|
|
49
|
+
}): DecisionSigner & {
|
|
50
|
+
publicKeyPem: string;
|
|
51
|
+
};
|
|
52
|
+
export declare function signDecision(unsigned: Omit<PaymentDecision, "signature" | "keyId">, signer: DecisionSigner): Promise<PaymentDecision>;
|
|
53
|
+
export declare function verifyDecisionSignature(token: PaymentDecision, publicKeyPem: string): boolean;
|
|
54
|
+
export type BindingErrorCode = "INTENT_HASH_MISMATCH" | "DECISION_EXPIRED" | "DECISION_NOT_ALLOW" | "DECISION_REPLAYED" | "BAD_SIGNATURE";
|
|
55
|
+
export declare class TwzrdIntentBindingError extends Error {
|
|
56
|
+
readonly code: BindingErrorCode;
|
|
57
|
+
readonly decisionId: string;
|
|
58
|
+
constructor(code: BindingErrorCode, decisionId: string, detail: string);
|
|
59
|
+
}
|
|
60
|
+
export type DecisionRegistry = {
|
|
61
|
+
/** True exactly once per decisionId; false on every replay. */
|
|
62
|
+
consume(decisionId: string): boolean;
|
|
63
|
+
};
|
|
64
|
+
/** In-process consume-once ledger. Entries expire with the tokens. */
|
|
65
|
+
export declare function createDecisionRegistry(): DecisionRegistry;
|
|
66
|
+
export type AssertIntentApprovedOptions = {
|
|
67
|
+
now?: number;
|
|
68
|
+
/** Enforce consume-once semantics (recommended for anything non-idempotent). */
|
|
69
|
+
registry?: DecisionRegistry;
|
|
70
|
+
/** Verify the token signature against this key before trusting it. */
|
|
71
|
+
publicKeyPem?: string;
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* The wallet-side check. Call with the EXACT intent about to be signed.
|
|
75
|
+
* Throws TwzrdIntentBindingError on any violation; returns void when the
|
|
76
|
+
* signature may proceed. A caught error means: do not invoke the signer.
|
|
77
|
+
*/
|
|
78
|
+
export declare function assertIntentApproved(intent: PaymentIntent, token: PaymentDecision, options?: AssertIntentApprovedOptions): void;
|
|
79
|
+
export declare function newDecisionId(): string;
|
|
80
|
+
//# sourceMappingURL=decision-token.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decision-token.d.ts","sourceRoot":"","sources":["../src/decision-token.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAYH,OAAO,EAA6B,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAI5E,MAAM,MAAM,sBAAsB,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;AAEhE,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,sBAAsB,CAAC;IACjC,WAAW,EAAE,MAAM,EAAE,CAAC;IAEtB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAC;IAElB,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAElC,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,QAAQ,EAAE,UAAU,GAAG,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7D,wEAAwE;IACxE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,gEAAgE;AAChE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,GAAG,MAAM,CAKlF;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,CAAC,EAAE;IAClD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,cAAc,GAAG;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,CAe5C;AAED,wBAAsB,YAAY,CAChC,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,GAAG,OAAO,CAAC,EACtD,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,eAAe,CAAC,CAM1B;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,eAAe,EACtB,YAAY,EAAE,MAAM,GACnB,OAAO,CAYT;AAMD,MAAM,MAAM,gBAAgB,GACxB,sBAAsB,GACtB,kBAAkB,GAClB,oBAAoB,GACpB,mBAAmB,GACnB,eAAe,CAAC;AAEpB,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;gBAChB,IAAI,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAMvE;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,+DAA+D;IAC/D,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;CACtC,CAAC;AAEF,sEAAsE;AACtE,wBAAgB,sBAAsB,IAAI,gBAAgB,CASzD;AAED,MAAM,MAAM,2BAA2B,GAAG;IACxC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gFAAgF;IAChF,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,eAAe,EACtB,OAAO,CAAC,EAAE,2BAA2B,GACpC,IAAI,CA2CN;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TWZRD Payment Control — signed, expiring DecisionTokens + intent binding.
|
|
3
|
+
*
|
|
4
|
+
* A DecisionToken is not "we checked this merchant earlier". It is:
|
|
5
|
+
* "at this timestamp, policy version X approved this EXACT transaction".
|
|
6
|
+
* The wallet (or payment client) must verify, before signing:
|
|
7
|
+
*
|
|
8
|
+
* hash(intent being signed) === token.intentHash
|
|
9
|
+
*
|
|
10
|
+
* plus expiry, decision === allow, signature, and consume-once. Any mismatch
|
|
11
|
+
* means refuse — the signer is never invoked.
|
|
12
|
+
*/
|
|
13
|
+
import { createPrivateKey, createPublicKey, generateKeyPairSync, randomUUID, sign as edSign, verify as edVerify, } from "node:crypto";
|
|
14
|
+
import { canonicalJson, intentHash } from "./intent.js";
|
|
15
|
+
const DECISION_DOMAIN = "twzrd-decision-v1\n";
|
|
16
|
+
/** Everything signed — the token minus the signature itself. */
|
|
17
|
+
export function decisionPreimage(token) {
|
|
18
|
+
return Buffer.concat([
|
|
19
|
+
Buffer.from(DECISION_DOMAIN, "utf8"),
|
|
20
|
+
Buffer.from(canonicalJson(token), "utf8"),
|
|
21
|
+
]);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Local Ed25519 decision signer. Pass a PKCS#8 PEM to pin a key; otherwise an
|
|
25
|
+
* ephemeral keypair is generated (fine for tests and per-process runtimes).
|
|
26
|
+
*/
|
|
27
|
+
export function createLocalDecisionSigner(options) {
|
|
28
|
+
let privateKey;
|
|
29
|
+
if (options?.privateKeyPem) {
|
|
30
|
+
privateKey = createPrivateKey(options.privateKeyPem);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
({ privateKey } = generateKeyPairSync("ed25519"));
|
|
34
|
+
}
|
|
35
|
+
const publicKeyPem = createPublicKey(privateKey)
|
|
36
|
+
.export({ type: "spki", format: "pem" })
|
|
37
|
+
.toString();
|
|
38
|
+
return {
|
|
39
|
+
keyId: options?.keyId ?? "local-ed25519",
|
|
40
|
+
publicKeyPem,
|
|
41
|
+
sign: (preimage) => edSign(null, Buffer.from(preimage), privateKey),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export async function signDecision(unsigned, signer) {
|
|
45
|
+
const payload = { ...unsigned, keyId: signer.keyId };
|
|
46
|
+
const signature = Buffer.from(await signer.sign(decisionPreimage(payload))).toString("base64");
|
|
47
|
+
return { ...payload, signature };
|
|
48
|
+
}
|
|
49
|
+
export function verifyDecisionSignature(token, publicKeyPem) {
|
|
50
|
+
const { signature, ...payload } = token;
|
|
51
|
+
try {
|
|
52
|
+
return edVerify(null, decisionPreimage(payload), createPublicKey(publicKeyPem), Buffer.from(signature, "base64"));
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export class TwzrdIntentBindingError extends Error {
|
|
59
|
+
code;
|
|
60
|
+
decisionId;
|
|
61
|
+
constructor(code, decisionId, detail) {
|
|
62
|
+
super(`[twzrd] ${code}: ${detail} (decisionId=${decisionId})`);
|
|
63
|
+
this.name = "TwzrdIntentBindingError";
|
|
64
|
+
this.code = code;
|
|
65
|
+
this.decisionId = decisionId;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/** In-process consume-once ledger. Entries expire with the tokens. */
|
|
69
|
+
export function createDecisionRegistry() {
|
|
70
|
+
const consumed = new Set();
|
|
71
|
+
return {
|
|
72
|
+
consume(decisionId) {
|
|
73
|
+
if (consumed.has(decisionId))
|
|
74
|
+
return false;
|
|
75
|
+
consumed.add(decisionId);
|
|
76
|
+
return true;
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* The wallet-side check. Call with the EXACT intent about to be signed.
|
|
82
|
+
* Throws TwzrdIntentBindingError on any violation; returns void when the
|
|
83
|
+
* signature may proceed. A caught error means: do not invoke the signer.
|
|
84
|
+
*/
|
|
85
|
+
export function assertIntentApproved(intent, token, options) {
|
|
86
|
+
const now = options?.now ?? Date.now();
|
|
87
|
+
if (options?.publicKeyPem && !verifyDecisionSignature(token, options.publicKeyPem)) {
|
|
88
|
+
throw new TwzrdIntentBindingError("BAD_SIGNATURE", token.decisionId, "decision token signature did not verify");
|
|
89
|
+
}
|
|
90
|
+
if (token.decision !== "allow" && token.decision !== "warn") {
|
|
91
|
+
throw new TwzrdIntentBindingError("DECISION_NOT_ALLOW", token.decisionId, `decision is ${token.decision}`);
|
|
92
|
+
}
|
|
93
|
+
if (now >= Date.parse(token.expiresAt)) {
|
|
94
|
+
throw new TwzrdIntentBindingError("DECISION_EXPIRED", token.decisionId, `expired at ${token.expiresAt}`);
|
|
95
|
+
}
|
|
96
|
+
const actual = intentHash(intent);
|
|
97
|
+
if (actual !== token.intentHash) {
|
|
98
|
+
throw new TwzrdIntentBindingError("INTENT_HASH_MISMATCH", token.decisionId, `approved ${token.intentHash} but signing ${actual}`);
|
|
99
|
+
}
|
|
100
|
+
if (options?.registry && !options.registry.consume(token.decisionId)) {
|
|
101
|
+
throw new TwzrdIntentBindingError("DECISION_REPLAYED", token.decisionId, "decision token already consumed");
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
export function newDecisionId() {
|
|
105
|
+
return randomUUID();
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=decision-token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decision-token.js","sourceRoot":"","sources":["../src/decision-token.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;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;CAClC,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,EACnB,mBAAmB,EAAE,uBAAuB,EAC5C,IAAI,GAAE,mBAAwB,GAC7B,OAAO,CAAC,kBAAkB,CAAC,
|
|
1
|
+
{"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../src/evaluate.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,mBAAmB,GAAG,eAAe,GAAG;IAClD;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IAC/D;;;;;;;;;;;OAWG;IACH,cAAc,CAAC,EAAE;QACf,iHAAiH;QACjH,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,qFAAqF;QACrF,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,aAAa,GAAG,SAAS,CAAC;IACpC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,kBAAkB,CAAC;IACzB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+EAA+E;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,8FAA8F;IAC9F,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,6GAA6G;IAC7G,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,kFAAkF;IAClF,aAAa,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;CAClC,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,EACnB,mBAAmB,EAAE,uBAAuB,EAC5C,IAAI,GAAE,mBAAwB,GAC7B,OAAO,CAAC,kBAAkB,CAAC,CAsI7B"}
|
package/dist/evaluate.js
CHANGED
|
@@ -28,6 +28,7 @@ export async function evaluate_x402_resource(resourceUrl, paymentRequirements, o
|
|
|
28
28
|
washMaxUsdc: opts.washMaxUsdc,
|
|
29
29
|
unsupportedNetworkMode: opts.unsupportedNetworkMode,
|
|
30
30
|
fetch: opts.fetch,
|
|
31
|
+
attribution: opts.attribution,
|
|
31
32
|
});
|
|
32
33
|
const { payTo, amountMicro, resource } = payToFromRequirements(paymentRequirements);
|
|
33
34
|
const priceUsdc = priceUsdcFromAmountMicro(amountMicro);
|
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;AA0ExD;;;;;;;;;;;;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,sBAAsB,EAAE,IAAI,CAAC,sBAAsB;QACnD,KAAK,EAAE,IAAI,CAAC,KAAK;
|
|
1
|
+
{"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../src/evaluate.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -11,8 +11,12 @@ export { evaluate_x402_resource, type EvaluateX402Options, type EvaluateX402Resu
|
|
|
11
11
|
export { withTwzrdGuard, type TwzrdGuardOptions } from "./with-guard.js";
|
|
12
12
|
export { installTwzrdAutoGate, type PayWrap, type InstallAutoGateOptions, } from "./auto-gate.js";
|
|
13
13
|
export { safeFetch, runAgentcashFetch, main as safeFetchMain, type SafeFetchOptions, type SafeFetchResult, } from "./safe-fetch.js";
|
|
14
|
-
export { installTwzrdX402ClientHook, twzrdBeforePaymentCreation, type X402ClientLike, type X402SelectedRequirements, type BeforePaymentCreationContext, type BeforePaymentCreationResult, type InstallX402ClientHookOptions, } from "./x402-client-hook.js";
|
|
14
|
+
export { installTwzrdX402ClientHook, twzrdBeforePaymentCreation, type X402ClientLike, type X402SelectedRequirements, type BeforePaymentCreationContext, type BeforePaymentCreationResult, type InstallX402ClientHookOptions, type X402PaymentControlOptions, } from "./x402-client-hook.js";
|
|
15
15
|
export { quickCheck, QUICK_PRICE_USDC, type QuickCheckResult, type QuickCheckOptions, type TwzrdTier, } from "./quick.js";
|
|
16
16
|
export { createSponsoredX402Fetch, type SponsorSettle, type SponsoredX402Options, } from "./sponsored.js";
|
|
17
17
|
export type { TwzrdDecision, TwzrdReadinessCard, TwzrdPreflightInput, TwzrdGateConfig, TwzrdApproveContext, TwzrdApprovalResult, TwzrdUpsellContext, X402PaymentRequirements, X402PaymentRequiredBody, X402McpPaymentRequest, X402McpPaymentRequestedContext, } from "./types.js";
|
|
18
|
+
export { canonicalJson, intentHash, toMicroUsd, INTENT_HASH_PREFIX, type PaymentIntent, type PaymentProtocol, } from "./intent.js";
|
|
19
|
+
export { assertIntentApproved, createDecisionRegistry, createLocalDecisionSigner, decisionPreimage, newDecisionId, signDecision, verifyDecisionSignature, TwzrdIntentBindingError, type AssertIntentApprovedOptions, type BindingErrorCode, type DecisionConstraints, type DecisionRegistry, type DecisionSigner, type PaymentDecision, type PaymentDecisionVerdict, } from "./decision-token.js";
|
|
20
|
+
export { createMemorySpendLedger, evaluateIntent, POLICY_VERSION, type CounterpartyIntelligence, type EvaluateIntentOptions, type IntelligenceProvider, type Mandate, type SpendLedger, type SpendPolicy, } from "./policy-runtime.js";
|
|
21
|
+
export { ap2CheckoutToIntent, x402RequirementsToIntent, type Ap2Cart, type Ap2UserMandate, type X402IntentContext, } from "./intent-adapters.js";
|
|
18
22
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,KAAK,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,KAAK,mBAAmB,GACzB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC/F,OAAO,EACL,eAAe,EACf,wBAAwB,EACxB,YAAY,EACZ,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,sBAAsB,EAC3B,KAAK,0BAA0B,GAChC,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,gBAAgB,GACtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EACL,sBAAsB,EACtB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,GACxB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,cAAc,EAAE,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EACL,oBAAoB,EACpB,KAAK,OAAO,EACZ,KAAK,sBAAsB,GAC5B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,SAAS,EACT,iBAAiB,EACjB,IAAI,IAAI,aAAa,EACrB,KAAK,gBAAgB,EACrB,KAAK,eAAe,GACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,EAC1B,KAAK,cAAc,EACnB,KAAK,wBAAwB,EAC7B,KAAK,4BAA4B,EACjC,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -17,4 +17,9 @@ export { safeFetch, runAgentcashFetch, main as safeFetchMain, } from "./safe-fet
|
|
|
17
17
|
export { installTwzrdX402ClientHook, twzrdBeforePaymentCreation, } from "./x402-client-hook.js";
|
|
18
18
|
export { quickCheck, QUICK_PRICE_USDC, } from "./quick.js";
|
|
19
19
|
export { createSponsoredX402Fetch, } from "./sponsored.js";
|
|
20
|
+
/* ── TWZRD Payment Control (protocol-neutral authorization core) ── */
|
|
21
|
+
export { canonicalJson, intentHash, toMicroUsd, INTENT_HASH_PREFIX, } from "./intent.js";
|
|
22
|
+
export { assertIntentApproved, createDecisionRegistry, createLocalDecisionSigner, decisionPreimage, newDecisionId, signDecision, verifyDecisionSignature, TwzrdIntentBindingError, } from "./decision-token.js";
|
|
23
|
+
export { createMemorySpendLedger, evaluateIntent, POLICY_VERSION, } from "./policy-runtime.js";
|
|
24
|
+
export { ap2CheckoutToIntent, x402RequirementsToIntent, } from "./intent-adapters.js";
|
|
20
25
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,qFAAqF;AACrF,uFAAuF;AACvF,qFAAqF;AACrF,OAAO,EAAE,eAAe,EAAE,WAAW,EAAkB,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,aAAa,EAAgC,MAAM,aAAa,CAAC;AAC1E,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACd,mBAAmB,GAEpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC/F,OAAO,EACL,eAAe,EACf,wBAAwB,EACxB,YAAY,GAKb,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,iBAAiB,EACjB,sBAAsB,GAIvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EACL,sBAAsB,GAGvB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,cAAc,EAA0B,MAAM,iBAAiB,CAAC;AACzE,OAAO,EACL,oBAAoB,GAGrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,SAAS,EACT,iBAAiB,EACjB,IAAI,IAAI,aAAa,GAGtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,qFAAqF;AACrF,uFAAuF;AACvF,qFAAqF;AACrF,OAAO,EAAE,eAAe,EAAE,WAAW,EAAkB,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,aAAa,EAAgC,MAAM,aAAa,CAAC;AAC1E,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACd,mBAAmB,GAEpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC/F,OAAO,EACL,eAAe,EACf,wBAAwB,EACxB,YAAY,GAKb,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,iBAAiB,EACjB,sBAAsB,GAIvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EACL,sBAAsB,GAGvB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,cAAc,EAA0B,MAAM,iBAAiB,CAAC;AACzE,OAAO,EACL,oBAAoB,GAGrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,SAAS,EACT,iBAAiB,EACjB,IAAI,IAAI,aAAa,GAGtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,GAO3B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,UAAU,EACV,gBAAgB,GAIjB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,wBAAwB,GAGzB,MAAM,gBAAgB,CAAC;AAexB,uEAAuE;AACvE,OAAO,EACL,aAAa,EACb,UAAU,EACV,UAAU,EACV,kBAAkB,GAGnB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,yBAAyB,EACzB,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,uBAAuB,EACvB,uBAAuB,GAQxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,uBAAuB,EACvB,cAAc,EACd,cAAc,GAOf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,mBAAmB,EACnB,wBAAwB,GAIzB,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TWZRD Payment Control — protocol adapters into PaymentIntent v1.
|
|
3
|
+
*
|
|
4
|
+
* Adapters normalize protocol-specific payment shapes into the one canonical
|
|
5
|
+
* intent the policy runtime evaluates. The x402 adapter keeps the existing
|
|
6
|
+
* gate's behavior available on the new core; the AP2/UCP adapter is the
|
|
7
|
+
* non-x402 reference — it exists to prove the runtime combines a USER MANDATE
|
|
8
|
+
* with counterparty risk, not merely that it parses another crypto request.
|
|
9
|
+
*/
|
|
10
|
+
import type { PaymentIntent } from "./intent.js";
|
|
11
|
+
import type { Mandate } from "./policy-runtime.js";
|
|
12
|
+
import type { X402SelectedRequirements } from "./x402-client-hook.js";
|
|
13
|
+
export type X402IntentContext = {
|
|
14
|
+
/** Resource URL when the requirement omits `resource` (v2 top-level). */
|
|
15
|
+
resourceUrl?: string;
|
|
16
|
+
method?: string;
|
|
17
|
+
facilitator?: string;
|
|
18
|
+
agent?: PaymentIntent["agent"];
|
|
19
|
+
purpose?: string;
|
|
20
|
+
};
|
|
21
|
+
/** Normalize a selected x402 payment requirement (v1 or v2 field names). */
|
|
22
|
+
export declare function x402RequirementsToIntent(req: X402SelectedRequirements, ctx?: X402IntentContext): PaymentIntent;
|
|
23
|
+
/**
|
|
24
|
+
* Minimal AP2-style cart: what an agent is about to check out under a user
|
|
25
|
+
* mandate. Field names follow the AP2 mandate/cart split — the mandate says
|
|
26
|
+
* what MAY be spent; the cart is the concrete transaction.
|
|
27
|
+
*/
|
|
28
|
+
export type Ap2Cart = {
|
|
29
|
+
merchantId: string;
|
|
30
|
+
/** Settlement destination (merchant account / wallet). */
|
|
31
|
+
payTo: string;
|
|
32
|
+
currency: string;
|
|
33
|
+
total: string;
|
|
34
|
+
items?: Array<{
|
|
35
|
+
sku?: string;
|
|
36
|
+
description?: string;
|
|
37
|
+
price?: string;
|
|
38
|
+
}>;
|
|
39
|
+
checkoutUrl?: string;
|
|
40
|
+
category?: string;
|
|
41
|
+
recurring?: boolean;
|
|
42
|
+
priorCharge?: string;
|
|
43
|
+
};
|
|
44
|
+
export type Ap2UserMandate = {
|
|
45
|
+
mandateId: string;
|
|
46
|
+
/** Purchase categories the user authorized (e.g. ["software"]). */
|
|
47
|
+
categories?: string[];
|
|
48
|
+
maxPerTransaction?: string;
|
|
49
|
+
monthlyCeiling?: string;
|
|
50
|
+
merchantAllowPrefixes?: string[];
|
|
51
|
+
expiresAt?: string;
|
|
52
|
+
};
|
|
53
|
+
/** Cart -> canonical intent. The mandate rides along for the policy runtime. */
|
|
54
|
+
export declare function ap2CheckoutToIntent(cart: Ap2Cart, mandate: Ap2UserMandate, options?: {
|
|
55
|
+
network?: string;
|
|
56
|
+
agentId?: string;
|
|
57
|
+
organization?: string;
|
|
58
|
+
}): {
|
|
59
|
+
intent: PaymentIntent;
|
|
60
|
+
mandate: Mandate;
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=intent-adapters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intent-adapters.d.ts","sourceRoot":"","sources":["../src/intent-adapters.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAMtE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,yEAAyE;IACzE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,4EAA4E;AAC5E,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,wBAAwB,EAC7B,GAAG,CAAC,EAAE,iBAAiB,GACtB,aAAa,CAmBf;AAMD;;;;GAIG;AACH,MAAM,MAAM,OAAO,GAAG;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,gFAAgF;AAChF,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,cAAc,EACvB,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GACtE;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CA+B7C"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TWZRD Payment Control — protocol adapters into PaymentIntent v1.
|
|
3
|
+
*
|
|
4
|
+
* Adapters normalize protocol-specific payment shapes into the one canonical
|
|
5
|
+
* intent the policy runtime evaluates. The x402 adapter keeps the existing
|
|
6
|
+
* gate's behavior available on the new core; the AP2/UCP adapter is the
|
|
7
|
+
* non-x402 reference — it exists to prove the runtime combines a USER MANDATE
|
|
8
|
+
* with counterparty risk, not merely that it parses another crypto request.
|
|
9
|
+
*/
|
|
10
|
+
/** Normalize a selected x402 payment requirement (v1 or v2 field names). */
|
|
11
|
+
export function x402RequirementsToIntent(req, ctx) {
|
|
12
|
+
const payTo = req.payTo ?? req.pay_to;
|
|
13
|
+
const amount = req.amount ?? req.maxAmountRequired;
|
|
14
|
+
if (!payTo)
|
|
15
|
+
throw new Error("[twzrd] x402 requirement missing payTo");
|
|
16
|
+
if (!amount)
|
|
17
|
+
throw new Error("[twzrd] x402 requirement missing amount");
|
|
18
|
+
return {
|
|
19
|
+
protocol: "x402",
|
|
20
|
+
network: req.network ?? "unknown",
|
|
21
|
+
asset: req.asset ?? "unknown",
|
|
22
|
+
amount,
|
|
23
|
+
payTo,
|
|
24
|
+
resource: {
|
|
25
|
+
url: req.resource ?? ctx?.resourceUrl,
|
|
26
|
+
method: ctx?.method,
|
|
27
|
+
},
|
|
28
|
+
facilitator: ctx?.facilitator,
|
|
29
|
+
agent: ctx?.agent,
|
|
30
|
+
context: ctx?.purpose ? { purpose: ctx.purpose } : undefined,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/** Cart -> canonical intent. The mandate rides along for the policy runtime. */
|
|
34
|
+
export function ap2CheckoutToIntent(cart, mandate, options) {
|
|
35
|
+
const intent = {
|
|
36
|
+
protocol: "ap2",
|
|
37
|
+
network: options?.network ?? "fiat:card",
|
|
38
|
+
asset: cart.currency,
|
|
39
|
+
amount: cart.total,
|
|
40
|
+
payTo: cart.payTo,
|
|
41
|
+
resource: {
|
|
42
|
+
url: cart.checkoutUrl,
|
|
43
|
+
operation: `checkout:${cart.merchantId}`,
|
|
44
|
+
},
|
|
45
|
+
agent: {
|
|
46
|
+
id: options?.agentId,
|
|
47
|
+
organization: options?.organization,
|
|
48
|
+
mandateId: mandate.mandateId,
|
|
49
|
+
},
|
|
50
|
+
context: {
|
|
51
|
+
purpose: cart.category,
|
|
52
|
+
recurring: cart.recurring,
|
|
53
|
+
priorSpend: cart.priorCharge,
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
const normalizedMandate = {
|
|
57
|
+
mandateId: mandate.mandateId,
|
|
58
|
+
purposes: mandate.categories,
|
|
59
|
+
maxPerTransactionUsd: mandate.maxPerTransaction,
|
|
60
|
+
monthlyCeilingUsd: mandate.monthlyCeiling,
|
|
61
|
+
resourceAllow: mandate.merchantAllowPrefixes,
|
|
62
|
+
expiresAt: mandate.expiresAt,
|
|
63
|
+
};
|
|
64
|
+
return { intent, mandate: normalizedMandate };
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=intent-adapters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intent-adapters.js","sourceRoot":"","sources":["../src/intent-adapters.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAmBH,4EAA4E;AAC5E,MAAM,UAAU,wBAAwB,CACtC,GAA6B,EAC7B,GAAuB;IAEvB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,CAAC;IACtC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,iBAAiB,CAAC;IACnD,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACtE,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IACxE,OAAO;QACL,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,SAAS;QACjC,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,SAAS;QAC7B,MAAM;QACN,KAAK;QACL,QAAQ,EAAE;YACR,GAAG,EAAE,GAAG,CAAC,QAAQ,IAAI,GAAG,EAAE,WAAW;YACrC,MAAM,EAAE,GAAG,EAAE,MAAM;SACpB;QACD,WAAW,EAAE,GAAG,EAAE,WAAW;QAC7B,KAAK,EAAE,GAAG,EAAE,KAAK;QACjB,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS;KAC7D,CAAC;AACJ,CAAC;AAkCD,gFAAgF;AAChF,MAAM,UAAU,mBAAmB,CACjC,IAAa,EACb,OAAuB,EACvB,OAAuE;IAEvE,MAAM,MAAM,GAAkB;QAC5B,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,WAAW;QACxC,KAAK,EAAE,IAAI,CAAC,QAAQ;QACpB,MAAM,EAAE,IAAI,CAAC,KAAK;QAClB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,QAAQ,EAAE;YACR,GAAG,EAAE,IAAI,CAAC,WAAW;YACrB,SAAS,EAAE,YAAY,IAAI,CAAC,UAAU,EAAE;SACzC;QACD,KAAK,EAAE;YACL,EAAE,EAAE,OAAO,EAAE,OAAO;YACpB,YAAY,EAAE,OAAO,EAAE,YAAY;YACnC,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B;QACD,OAAO,EAAE;YACP,OAAO,EAAE,IAAI,CAAC,QAAQ;YACtB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,UAAU,EAAE,IAAI,CAAC,WAAW;SAC7B;KACF,CAAC;IACF,MAAM,iBAAiB,GAAY;QACjC,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,QAAQ,EAAE,OAAO,CAAC,UAAU;QAC5B,oBAAoB,EAAE,OAAO,CAAC,iBAAiB;QAC/C,iBAAiB,EAAE,OAAO,CAAC,cAAc;QACzC,aAAa,EAAE,OAAO,CAAC,qBAAqB;QAC5C,SAAS,EAAE,OAAO,CAAC,SAAS;KAC7B,CAAC;IACF,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAChD,CAAC"}
|