@atrib/agent 0.2.6 → 0.2.8
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 +29 -9
- package/dist/adapters/cloudflare-agent.d.ts +14 -8
- package/dist/adapters/cloudflare-agent.d.ts.map +1 -1
- package/dist/adapters/cloudflare-agent.js +43 -15
- package/dist/adapters/cloudflare-agent.js.map +1 -1
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +34 -29
- package/dist/middleware.js.map +1 -1
- package/dist/transaction.d.ts +8 -35
- package/dist/transaction.d.ts.map +1 -1
- package/dist/transaction.js +238 -14
- package/dist/transaction.js.map +1 -1
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# `@atrib/agent`
|
|
2
2
|
|
|
3
|
-
**Verifiable agent actions, client side.
|
|
3
|
+
**Verifiable agent actions, client side. Outbound MCP tool calls carry atrib/W3C context, consume upstream signed records, record local gap nodes, and emit signed fallback transaction records when commerce closes. Works with every major MCP framework. Sits above every major agent payment protocol so commerce-closing evidence can join the same trace.**
|
|
4
4
|
|
|
5
|
-
`@atrib/agent` is the client-side half of the [atrib protocol](https://github.com/creatornader/atrib/blob/main/atrib-spec.md).
|
|
5
|
+
`@atrib/agent` is the client-side half of the [atrib protocol](https://github.com/creatornader/atrib/blob/main/atrib-spec.md). It keeps outbound MCP calls in the atrib session lifecycle: context goes out, upstream atrib tokens come back in, unsigned hops become local gap nodes, and transaction-shaped responses can produce signed agent-side fallback records. Ordinary `tool_call` records are signed at the tool boundary by `@atrib/mcp`, `@atrib/mcp-wrap`, or an instrumented upstream server.
|
|
6
6
|
|
|
7
|
-
You set up one `atrib()` interceptor, plug it into your framework's adapter, and every outbound `tools/call` from that point on carries W3C trace context, an atrib chain token, and the full atrib session lifecycle. When a payment completes
|
|
7
|
+
You set up one `atrib()` interceptor, plug it into your framework's adapter, and every outbound `tools/call` from that point on carries W3C trace context, an atrib chain token, and the full atrib session lifecycle. When a payment completes through a supported commerce protocol, the interceptor can consume an upstream atrib record or emit an agent-side fallback `transaction` record. When commerce never closes the chain, the substrate still serves recall, audit, and cross-agent provenance.
|
|
8
8
|
|
|
9
9
|
Two coverage surfaces define what you get:
|
|
10
10
|
|
|
@@ -26,7 +26,7 @@ Two coverage surfaces define what you get:
|
|
|
26
26
|
|
|
27
27
|
## Coverage Matrix 2: Agent Payment Protocols
|
|
28
28
|
|
|
29
|
-
`@atrib/agent` sits **above** every major agent payment protocol. It does not implement payments, move money, or enforce transactions; it detects transaction events in the response flow of whichever payment protocol your agent is using, and writes a
|
|
29
|
+
`@atrib/agent` sits **above** every major agent payment protocol. It does not implement payments, move money, or enforce transactions; it detects transaction events in the response flow of whichever payment protocol your agent is using, and writes a fallback transaction record when no upstream atrib token already closed the chain. **You do not choose a payment protocol at install time**; the detection logic for all six (ACP, UCP, x402, MPP, AP2, a2a-x402) runs simultaneously and fires on whichever one your tool responses happen to carry. The fallback record carries an agent `signers[]` entry over the atrib transaction bytes. Counterparty signatures and payment-receipt evidence are verifier inputs when the protocol supplies them; [D052](https://github.com/creatornader/atrib/blob/main/DECISIONS.md#d052-cross-attestation-requirement-for-transaction-records)-aware verifiers still flag records that do not meet the required cross-attestation bar.
|
|
30
30
|
|
|
31
31
|
All detection logic lives in `packages/agent/src/transaction.ts` and runs against unit tests for each protocol's published spec.
|
|
32
32
|
|
|
@@ -36,7 +36,7 @@ All detection logic lives in `packages/agent/src/transaction.ts` and runs agains
|
|
|
36
36
|
| **UCP**. Universal Commerce Protocol | `github.com/universal-commerce-protocol/ucp` | Same shape as ACP + top-level `ucp.version` envelope | [§1.7.2](https://github.com/creatornader/atrib/blob/main/atrib-spec.md#172-ucp-universal-commerce-protocol) |
|
|
37
37
|
| **x402** | Coinbase. `github.com/coinbase/x402` | HTTP `PAYMENT-RESPONSE` header (v2) or legacy `X-PAYMENT-RESPONSE` (v1) on the 200 response | [§1.7.3](https://github.com/creatornader/atrib/blob/main/atrib-spec.md#173-x402) |
|
|
38
38
|
| **MPP**. Machine Payments Protocol | Tempo Labs / Stripe; IETF `draft-ryan-httpauth-payment-01` | HTTP `Payment-Receipt` header on 200 success response | [§1.7.4](https://github.com/creatornader/atrib/blob/main/atrib-spec.md#174-mpp-machine-payments-protocol) |
|
|
39
|
-
| **AP2**.
|
|
39
|
+
| **AP2**. Agentic Payment Protocol | Google; `github.com/google-agentic-commerce/AP2` | Successful AP2 `PaymentReceipt` or `CheckoutReceipt`; v0.1 `ap2.mandates.PaymentMandate` remains a fallback | [§1.7.5](https://github.com/creatornader/atrib/blob/main/atrib-spec.md#175-ap2-and-a2a-x402) |
|
|
40
40
|
| **a2a-x402** | Google. `github.com/google-agentic-commerce/a2a-x402` | A2A task `status.message.metadata["x402.payment.status"] === "payment-completed"` + `receipts[].success === true` | [§1.7.5](https://github.com/creatornader/atrib/blob/main/atrib-spec.md#175-ap2-and-a2a-x402) (reported as AP2 crypto path) |
|
|
41
41
|
|
|
42
42
|
**The linking mechanism is the same across all six:** the session `context_id` (16-byte anchor, equal to the W3C OTel trace-id by default) travels with the outbound payment request; via `X-atrib-Context` HTTP header for protocols that don't expose a free-form metadata field, or via `params._meta.atrib` for any payment protocol running over MCP transport. When the merchant's side sees the payment-completed signal, atrib writes a transaction record with that `context_id`, and the attribution graph can reconstruct the full chain from contributing tool calls → transaction → settlement.
|
|
@@ -97,9 +97,29 @@ HTTP/1.1 200 OK
|
|
|
97
97
|
Payment-Receipt: eyJzdGF0dXMiOiJzdWNjZXNzIn0
|
|
98
98
|
```
|
|
99
99
|
|
|
100
|
-
#### AP2: Google
|
|
100
|
+
#### AP2: Google Agentic Payment Protocol (v0.2)
|
|
101
101
|
|
|
102
|
-
Detected from
|
|
102
|
+
Detected from successful AP2 receipts. Current AP2 uses Checkout and Payment Mandates for authorization, then returns signed Checkout Receipts and Payment Receipts when a verifier accepts or rejects the mandate. atrib treats the successful receipt as the transaction close signal.
|
|
103
|
+
|
|
104
|
+
AP2 receipt JWT signatures remain verifier evidence. They are not counted as transaction `signers[]` unless an AP2 participant also signs the atrib transaction record bytes. See [D098](https://github.com/creatornader/atrib/blob/main/DECISIONS.md#d098-ap2-receipts-stay-external-evidence-for-cross-attestation).
|
|
105
|
+
|
|
106
|
+
Decoded receipt objects are detected when they carry `status: "Success"` and the required AP2 fields. Signed receipt JWTs are detected in AP2 sample result envelopes when the envelope has `status: "success"` plus `payment_receipt` or `checkout_receipt`.
|
|
107
|
+
|
|
108
|
+
For Path 2 fallback transaction records, AP2 detection also returns a protocol-specific `contentId` when stable identity fields are visible. Decoded Payment Receipts take priority, then compact payment receipt JWT hashes, decoded Checkout Receipts, compact checkout receipt JWT hashes, legacy AP2 PaymentMandates, and a2a-x402 transaction receipts. If none are present, middleware falls back to the MCP server URL plus `"checkout"` like before.
|
|
109
|
+
|
|
110
|
+
```json
|
|
111
|
+
{
|
|
112
|
+
"status": "success",
|
|
113
|
+
"order_id": "order_123",
|
|
114
|
+
"checkout_receipt": "eyJhbGciOiJFUzI1NiJ9.eyJzdGF0dXMiOiJTdWNjZXNzIn0.signature"
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Mandate-only payloads are not detected, including `vct: "mandate.payment.1"` and `vct: "mandate.checkout.1"`. Mandates authorize a future action; they do not prove the verifier accepted it.
|
|
119
|
+
|
|
120
|
+
Verifier-side AP2 / Verifiable Intent checks live in `@atrib/verify`, not this detector. Use `verifyAp2ViEvidence()` for decoded receipts or `verifyAp2ViEvidenceAsync()` for compact signed receipt JWTs when a merchant or auditor needs to validate AP2 receipt references, VI SD-JWT signatures, `sd_hash` links, disclosure digests, delegated agent keys, and checkout/payment binding after detection.
|
|
121
|
+
|
|
122
|
+
The older AP2 v0.1 DataPart shape remains supported as a compatibility fallback:
|
|
103
123
|
|
|
104
124
|
```json
|
|
105
125
|
{
|
|
@@ -119,11 +139,11 @@ Detected from an A2A `Message` containing a `DataPart` whose `data` object has t
|
|
|
119
139
|
}
|
|
120
140
|
```
|
|
121
141
|
|
|
122
|
-
`IntentMandate` and `CartMandate` are
|
|
142
|
+
`IntentMandate` and `CartMandate` are still not detected; they are upstream funnel events, not transaction events.
|
|
123
143
|
|
|
124
144
|
#### a2a-x402: Google AP2 crypto path
|
|
125
145
|
|
|
126
|
-
Detected from an A2A `task` whose `status.message.metadata` contains `"x402.payment.status": "payment-completed"` **and** at least one entry in `"x402.payment.receipts"` with `success: true`. A `payment-completed` status with no successful receipt does NOT detect (a failed receipt is not a transaction). Reported as `protocol: 'AP2'` because a2a-x402 is the AP2 crypto path, not a separate protocol.
|
|
146
|
+
Detected from an A2A `task` whose `status.message.metadata` contains `"x402.payment.status": "payment-completed"` **and** at least one entry in `"x402.payment.receipts"` with `success: true`. A `payment-completed` status with no successful receipt does NOT detect (a failed receipt is not a transaction). Reported as `protocol: 'AP2'` because a2a-x402 is the AP2 crypto path, not a separate protocol. When a successful receipt exposes a transaction id, Path 2 uses that receipt identity for the AP2 `contentId`; otherwise it uses the generic AP2 fallback.
|
|
127
147
|
|
|
128
148
|
```json
|
|
129
149
|
{
|
|
@@ -16,17 +16,23 @@ export interface CloudflareAgentLike {
|
|
|
16
16
|
client: unknown;
|
|
17
17
|
url?: URL | string;
|
|
18
18
|
}>;
|
|
19
|
+
listServers?: () => Array<{
|
|
20
|
+
id: string;
|
|
21
|
+
name: string;
|
|
22
|
+
server_url?: string | null;
|
|
23
|
+
}>;
|
|
19
24
|
};
|
|
20
25
|
}
|
|
21
26
|
/** Options for `attributeCloudflareAgentMcp`. */
|
|
22
27
|
export interface AttributeCloudflareAgentMcpOptions {
|
|
23
|
-
/** The atrib interceptor that should observe
|
|
28
|
+
/** The atrib interceptor that should observe MCP client calls on this agent. */
|
|
24
29
|
interceptor: ToolCallInterceptor;
|
|
25
30
|
/**
|
|
26
|
-
* Optional override map of server name → canonical serverUrl.
|
|
27
|
-
*
|
|
28
|
-
* to `wrapMcpClient`. If a
|
|
29
|
-
* derives serverUrl from
|
|
31
|
+
* Optional override map of server id or server name → canonical serverUrl.
|
|
32
|
+
* If a key appears here, the helper passes that URL as the `serverUrl`
|
|
33
|
+
* option to `wrapMcpClient`. If a key is missing from this map, the helper
|
|
34
|
+
* derives serverUrl from Cloudflare's stored server row, then from the
|
|
35
|
+
* connection's own `url`.
|
|
30
36
|
*
|
|
31
37
|
* Override when the upstream URL the agent connects to is not the canonical
|
|
32
38
|
* URL you want to record in attribution records (e.g. you're hitting a
|
|
@@ -35,9 +41,9 @@ export interface AttributeCloudflareAgentMcpOptions {
|
|
|
35
41
|
serverUrls?: Record<string, string>;
|
|
36
42
|
}
|
|
37
43
|
/**
|
|
38
|
-
* Wrap every currently-connected MCP client on a Cloudflare Agent with atrib
|
|
39
|
-
*
|
|
40
|
-
* were already wrapped). Idempotent. safe to call multiple times.
|
|
44
|
+
* Wrap every currently-connected MCP client on a Cloudflare Agent with atrib's
|
|
45
|
+
* agent interceptor. Returns the number of connections wrapped (excluding ones
|
|
46
|
+
* that were already wrapped). Idempotent. safe to call multiple times.
|
|
41
47
|
*
|
|
42
48
|
* Call this in `onStart()` after your `addMcpServer()` calls. If you add more
|
|
43
49
|
* MCP servers later (in a message handler, after OAuth, etc.), call again.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloudflare-agent.d.ts","sourceRoot":"","sources":["../../src/adapters/cloudflare-agent.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cloudflare-agent.d.ts","sourceRoot":"","sources":["../../src/adapters/cloudflare-agent.ts"],"names":[],"mappings":"AAkEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAkB3D;;;;;;;;;;GAUG;AACH,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE;QACH,cAAc,EAAE,MAAM,CACpB,MAAM,EACN;YACE,MAAM,EAAE,OAAO,CAAA;YACf,GAAG,CAAC,EAAE,GAAG,GAAG,MAAM,CAAA;SACnB,CACF,CAAA;QACD,WAAW,CAAC,EAAE,MAAM,KAAK,CAAC;YACxB,EAAE,EAAE,MAAM,CAAA;YACV,IAAI,EAAE,MAAM,CAAA;YACZ,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;SAC3B,CAAC,CAAA;KACH,CAAA;CACF;AAED,iDAAiD;AACjD,MAAM,WAAW,kCAAkC;IACjD,gFAAgF;IAChF,WAAW,EAAE,mBAAmB,CAAA;IAEhC;;;;;;;;;;OAUG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACpC;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,mBAAmB,EAC1B,OAAO,EAAE,kCAAkC,GAC1C,MAAM,CAsFR"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
/**
|
|
3
|
-
* Adapter:
|
|
3
|
+
* Adapter: route Cloudflare Agent MCP client calls through atrib's agent
|
|
4
|
+
* interceptor.
|
|
4
5
|
*
|
|
5
6
|
* Cloudflare's `agents` package exposes two MCP integration surfaces:
|
|
6
7
|
*
|
|
@@ -14,15 +15,19 @@
|
|
|
14
15
|
* 2. **Client-side `Agent.addMcpServer`**. your `Agent` (or `AIChatAgent`)
|
|
15
16
|
* connects to one or more upstream MCP servers via `this.addMcpServer(name, url)`.
|
|
16
17
|
* Cloudflare's `MCPClientManager` constructs an `@modelcontextprotocol/sdk`
|
|
17
|
-
* Client per upstream and stores it on `agent.mcp.mcpConnections[
|
|
18
|
+
* Client per upstream and stores it on `agent.mcp.mcpConnections[id].client`.
|
|
18
19
|
* Tool invocations flow through `MCPClientManager.callTool()` which
|
|
19
|
-
* delegates straight to `mcpConnections[serverId].client.callTool(...)
|
|
20
|
-
*
|
|
20
|
+
* delegates straight to `mcpConnections[serverId].client.callTool(...)`.
|
|
21
|
+
* Verified against `agents@0.13.3`.
|
|
21
22
|
*
|
|
22
23
|
* This file is the helper for surface (2). It walks `agent.mcp.mcpConnections`
|
|
23
24
|
* after the agent has finished registering its upstream MCP servers and
|
|
24
25
|
* replaces each connection's `client` field with one wrapped by `wrapMcpClient`.
|
|
25
|
-
* Subsequent tool calls
|
|
26
|
+
* Subsequent tool calls carry atrib/W3C context, consume upstream attribution
|
|
27
|
+
* tokens, record unsigned gap nodes, and emit agent-side fallback transaction
|
|
28
|
+
* records when a response matches a known commerce close signal. Ordinary
|
|
29
|
+
* tool_call records still come from the upstream MCP server when it is wrapped
|
|
30
|
+
* with `@atrib/mcp`.
|
|
26
31
|
*
|
|
27
32
|
* Usage:
|
|
28
33
|
*
|
|
@@ -53,7 +58,8 @@
|
|
|
53
58
|
* Per spec §5.8 (degradation contract), if any single connection fails to wrap
|
|
54
59
|
* (missing `client` field, unexpected shape), the helper logs a warning with
|
|
55
60
|
* the `atrib:` prefix and skips it without throwing. The agent's tool calls
|
|
56
|
-
* continue to work. they just won't
|
|
61
|
+
* continue to work. they just won't carry agent-side atrib context or fallback
|
|
62
|
+
* transaction detection for that connection.
|
|
57
63
|
*/
|
|
58
64
|
import { wrapMcpClient } from './mcp-client.js';
|
|
59
65
|
/** Runtime check that an unknown value structurally matches MinimalMcpClient. */
|
|
@@ -69,9 +75,9 @@ function isMinimalMcpClient(v) {
|
|
|
69
75
|
*/
|
|
70
76
|
const ATRIB_WRAPPED = Symbol.for('atrib.cloudflare.wrapped');
|
|
71
77
|
/**
|
|
72
|
-
* Wrap every currently-connected MCP client on a Cloudflare Agent with atrib
|
|
73
|
-
*
|
|
74
|
-
* were already wrapped). Idempotent. safe to call multiple times.
|
|
78
|
+
* Wrap every currently-connected MCP client on a Cloudflare Agent with atrib's
|
|
79
|
+
* agent interceptor. Returns the number of connections wrapped (excluding ones
|
|
80
|
+
* that were already wrapped). Idempotent. safe to call multiple times.
|
|
75
81
|
*
|
|
76
82
|
* Call this in `onStart()` after your `addMcpServer()` calls. If you add more
|
|
77
83
|
* MCP servers later (in a message handler, after OAuth, etc.), call again.
|
|
@@ -84,22 +90,44 @@ export function attributeCloudflareAgentMcp(agent, options) {
|
|
|
84
90
|
return 0;
|
|
85
91
|
}
|
|
86
92
|
let wrapped = 0;
|
|
87
|
-
|
|
93
|
+
const serversById = new Map();
|
|
94
|
+
try {
|
|
95
|
+
const servers = agent.mcp.listServers?.();
|
|
96
|
+
if (Array.isArray(servers)) {
|
|
97
|
+
for (const server of servers) {
|
|
98
|
+
if (typeof server.id === 'string') {
|
|
99
|
+
serversById.set(server.id, {
|
|
100
|
+
name: server.name,
|
|
101
|
+
server_url: server.server_url,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
console.warn('atrib: failed to read Cloudflare MCP server list, falling back to connection URLs', err);
|
|
109
|
+
}
|
|
110
|
+
for (const [connectionId, conn] of Object.entries(connections)) {
|
|
88
111
|
try {
|
|
89
112
|
if (!conn || !isMinimalMcpClient(conn.client)) {
|
|
90
|
-
console.warn(`atrib: connection '${
|
|
113
|
+
console.warn(`atrib: connection '${connectionId}' has no client field, skipping`);
|
|
91
114
|
continue;
|
|
92
115
|
}
|
|
93
116
|
// Skip already-wrapped clients (idempotency)
|
|
94
117
|
if (conn.client[ATRIB_WRAPPED] === true) {
|
|
95
118
|
continue;
|
|
96
119
|
}
|
|
97
|
-
// Derive serverUrl:
|
|
98
|
-
|
|
120
|
+
// Derive serverUrl:
|
|
121
|
+
// explicit override by id > explicit override by server name >
|
|
122
|
+
// Cloudflare stored server row > connection URL > undefined.
|
|
123
|
+
const server = serversById.get(connectionId);
|
|
124
|
+
let serverUrl = options.serverUrls?.[connectionId] ??
|
|
125
|
+
(server?.name ? options.serverUrls?.[server.name] : undefined) ??
|
|
126
|
+
(typeof server?.server_url === 'string' ? server.server_url : undefined);
|
|
99
127
|
if (!serverUrl && conn.url) {
|
|
100
128
|
try {
|
|
101
129
|
const u = conn.url instanceof URL ? conn.url : new URL(conn.url);
|
|
102
|
-
serverUrl = u.
|
|
130
|
+
serverUrl = u.href;
|
|
103
131
|
}
|
|
104
132
|
catch {
|
|
105
133
|
// URL parse failed; let wrapMcpClient fall back to no serverUrl
|
|
@@ -116,7 +144,7 @@ export function attributeCloudflareAgentMcp(agent, options) {
|
|
|
116
144
|
catch (err) {
|
|
117
145
|
// §5.8 degradation contract: never let a single bad connection break
|
|
118
146
|
// the whole agent. Log and continue.
|
|
119
|
-
console.warn(`atrib: failed to wrap MCP connection '${
|
|
147
|
+
console.warn(`atrib: failed to wrap MCP connection '${connectionId}', skipping:`, err);
|
|
120
148
|
}
|
|
121
149
|
}
|
|
122
150
|
return wrapped;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloudflare-agent.js","sourceRoot":"","sources":["../../src/adapters/cloudflare-agent.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC
|
|
1
|
+
{"version":3,"file":"cloudflare-agent.js","sourceRoot":"","sources":["../../src/adapters/cloudflare-agent.ts"],"names":[],"mappings":"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"}
|
package/dist/middleware.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAI5C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAEtD,yDAAyD;AACzD,MAAM,WAAW,iBAAiB;IAChC,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B,wDAAwD;IACxD,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACnC,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAChC,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACjC,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;CAClC;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,gBAAgB,CACd,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IACnC;;;OAGG;IACH,mBAAmB,CACjB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,OAAO,EACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACjD,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;QAC5C,OAAO,CAAC,EAAE,OAAO,CAAA;QACjB,iFAAiF;QACjF,SAAS,CAAC,EAAE,MAAM,CAAA;KACnB,GACA,IAAI,CAAA;IACP,sDAAsD;IACtD,sBAAsB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAAA;IACtE,yDAAyD;IACzD,WAAW,IAAI,OAAO,EAAE,CAAA;IACxB,qCAAqC;IACrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB;AAED;;;;;;;GAOG;AACH,wBAAgB,KAAK,CAAC,OAAO,GAAE,iBAAsB,GAAG,mBAAmB,
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAI5C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAEtD,yDAAyD;AACzD,MAAM,WAAW,iBAAiB;IAChC,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B,wDAAwD;IACxD,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACnC,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAChC,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACjC,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;CAClC;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,gBAAgB,CACd,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IACnC;;;OAGG;IACH,mBAAmB,CACjB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,OAAO,EACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACjD,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;QAC5C,OAAO,CAAC,EAAE,OAAO,CAAA;QACjB,iFAAiF;QACjF,SAAS,CAAC,EAAE,MAAM,CAAA;KACnB,GACA,IAAI,CAAA;IACP,sDAAsD;IACtD,sBAAsB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAAA;IACtE,yDAAyD;IACzD,WAAW,IAAI,OAAO,EAAE,CAAA;IACxB,qCAAqC;IACrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB;AAED;;;;;;;GAOG;AACH,wBAAgB,KAAK,CAAC,OAAO,GAAE,iBAAsB,GAAG,mBAAmB,CAqN1E"}
|
package/dist/middleware.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Wraps an agent or MCP client to automatically manage attribution
|
|
6
6
|
* context across tool calls. Zero ongoing surface area.
|
|
7
7
|
*/
|
|
8
|
-
import { base64urlDecode, base64urlEncode,
|
|
8
|
+
import { base64urlDecode, base64urlEncode, signTransactionRecord, getPublicKey, computeContentId, hexEncode, genesisChainRoot, createSubmissionQueue, } from '@atrib/mcp';
|
|
9
9
|
import { createSession, buildOutboundMeta, accumulateInboundContext } from './session.js';
|
|
10
10
|
import { detectTransaction } from './transaction.js';
|
|
11
11
|
import { initializeSessionPolicy } from './policy.js';
|
|
@@ -153,9 +153,11 @@ export function atrib(options = {}) {
|
|
|
153
153
|
addRuntimeWarning('transaction_detected_by_heuristic');
|
|
154
154
|
}
|
|
155
155
|
// Emit transaction record asynchronously
|
|
156
|
-
const emission = emitTransactionRecord(toolName, detection, callOptions?.serverUrl, session, privateKey, publicKeyReady, () => publicKeyB64, queue)
|
|
156
|
+
const emission = emitTransactionRecord(toolName, detection, callOptions?.serverUrl, session, privateKey, publicKeyReady, () => publicKeyB64, queue)
|
|
157
|
+
.catch((err) => {
|
|
157
158
|
console.warn('atrib: transaction emission failed', err);
|
|
158
|
-
})
|
|
159
|
+
})
|
|
160
|
+
.finally(() => {
|
|
159
161
|
const idx = pendingEmissions.indexOf(emission);
|
|
160
162
|
if (idx !== -1)
|
|
161
163
|
pendingEmissions.splice(idx, 1);
|
|
@@ -195,6 +197,7 @@ export function atrib(options = {}) {
|
|
|
195
197
|
* Derives content_id per protocol:
|
|
196
198
|
* - ACP/UCP: checkout URL from response, tool_name = "checkout"
|
|
197
199
|
* - x402/MPP: HTTP endpoint URL, tool_name = "checkout"
|
|
200
|
+
* - AP2: protocol-specific receipt or mandate identity when present
|
|
198
201
|
* - Heuristic: MCP server URL of tool, actual tool_name
|
|
199
202
|
*/
|
|
200
203
|
async function emitTransactionRecord(toolName, detection, callServerUrl, session, privateKey, publicKeyReady, publicKeyB64Getter, queue) {
|
|
@@ -204,32 +207,34 @@ async function emitTransactionRecord(toolName, detection, callServerUrl, session
|
|
|
204
207
|
throw new Error('public key not ready');
|
|
205
208
|
}
|
|
206
209
|
// Derive content_id per protocol (§5.4.5)
|
|
207
|
-
let contentIdServerUrl;
|
|
208
|
-
let contentIdToolName;
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
210
|
+
let contentIdServerUrl = '';
|
|
211
|
+
let contentIdToolName = '';
|
|
212
|
+
if (!detection.contentId) {
|
|
213
|
+
switch (detection.protocol) {
|
|
214
|
+
case 'ACP':
|
|
215
|
+
case 'UCP':
|
|
216
|
+
contentIdServerUrl = detection.checkoutUrl ?? callServerUrl ?? '';
|
|
217
|
+
contentIdToolName = 'checkout';
|
|
218
|
+
break;
|
|
219
|
+
case 'x402':
|
|
220
|
+
case 'MPP':
|
|
221
|
+
// Use the HTTP endpoint URL that returned Payment-Receipt
|
|
222
|
+
contentIdServerUrl = callServerUrl ?? '';
|
|
223
|
+
contentIdToolName = 'checkout';
|
|
224
|
+
break;
|
|
225
|
+
case 'AP2':
|
|
226
|
+
contentIdServerUrl = callServerUrl ?? '';
|
|
227
|
+
contentIdToolName = 'checkout';
|
|
228
|
+
break;
|
|
229
|
+
case 'heuristic':
|
|
230
|
+
default:
|
|
231
|
+
// Heuristic: weakest case, use the MCP server URL of the tool that was called
|
|
232
|
+
contentIdServerUrl = callServerUrl ?? '';
|
|
233
|
+
contentIdToolName = toolName;
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
231
236
|
}
|
|
232
|
-
const contentId = computeContentId(contentIdServerUrl, contentIdToolName);
|
|
237
|
+
const contentId = detection.contentId ?? computeContentId(contentIdServerUrl, contentIdToolName);
|
|
233
238
|
// §1.2.3: chain_root for genesis records
|
|
234
239
|
const chainRoot = session.latestContext
|
|
235
240
|
? `sha256:${hexEncode(session.latestContext.recordHash)}`
|
|
@@ -245,7 +250,7 @@ async function emitTransactionRecord(toolName, detection, callServerUrl, session
|
|
|
245
250
|
signature: '',
|
|
246
251
|
session_token: session.sessionToken,
|
|
247
252
|
};
|
|
248
|
-
const signed = await
|
|
253
|
+
const signed = await signTransactionRecord(record, privateKey);
|
|
249
254
|
// Submit immediately. transaction records are the closing anchor
|
|
250
255
|
queue.submit(signed, 'high');
|
|
251
256
|
}
|
package/dist/middleware.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC;;;;;GAKG;AAEH,OAAO,EACL,eAAe,EACf,eAAe,EACf,
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"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"}
|
package/dist/transaction.d.ts
CHANGED
|
@@ -1,37 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Transaction detection (§5.4.5).
|
|
3
|
-
*
|
|
4
|
-
* Detects transaction events from response shapes for ACP, UCP, x402, MPP,
|
|
5
|
-
* AP2, and heuristic tool name matching.
|
|
6
|
-
*
|
|
7
|
-
* Protocol shape sources (verified 2026-04-06):
|
|
8
|
-
* - ACP: github.com/agentic-commerce-protocol/agentic-commerce-protocol
|
|
9
|
-
* rfcs/rfc.agentic_checkout.md
|
|
10
|
-
* - UCP: github.com/universal-commerce-protocol/ucp
|
|
11
|
-
* docs/specification/checkout-rest.md (version 2026-01-11)
|
|
12
|
-
* - AP2: github.com/google-agentic-commerce/ap2 (v0.1). A2A Message with a
|
|
13
|
-
* DataPart containing the key `ap2.mandates.PaymentMandate`. AP2 does
|
|
14
|
-
* NOT currently use W3C Verifiable Credentials despite earlier drafts
|
|
15
|
-
* of this code and the atrib spec assuming it would.
|
|
16
|
-
* - a2a-x402: github.com/google-agentic-commerce/a2a-x402. extension that
|
|
17
|
-
* layers x402 crypto payments over A2A. Detection signal is
|
|
18
|
-
* `status.message.metadata["x402.payment.status"] === "payment-completed"`
|
|
19
|
-
* with at least one `success: true` entry in
|
|
20
|
-
* `status.message.metadata["x402.payment.receipts"]`. Both shapes are
|
|
21
|
-
* reported as `protocol: 'AP2'` since a2a-x402 IS the AP2 crypto path.
|
|
22
|
-
* - x402: github.com/coinbase/x402. response header `PAYMENT-RESPONSE` (v2)
|
|
23
|
-
* or `X-PAYMENT-RESPONSE` (v1 legacy). Value is base64-encoded JSON
|
|
24
|
-
* with shape { success: bool, transaction, network, payer, requirements }.
|
|
25
|
-
* - MPP: IETF draft-ryan-httpauth-payment-01 ("The 'Payment' HTTP Authentication
|
|
26
|
-
* Scheme"), per Section 5.3. Response header is `Payment-Receipt` on a
|
|
27
|
-
* 200 success after the client retries with Authorization: Payment.
|
|
28
|
-
* Value is base64url-nopad JSON with required field { status: "success",
|
|
29
|
-
* method, timestamp, reference }.
|
|
30
|
-
*
|
|
31
|
-
* x402 and MPP are DIFFERENT protocols that use DIFFERENT headers. Earlier
|
|
32
|
-
* versions of this code conflated them on a fictitious shared `Payment-Receipt`
|
|
33
|
-
* header. see DECISIONS.md D016 for the verification trail.
|
|
34
|
-
*/
|
|
35
1
|
export type TransactionProtocol = 'ACP' | 'UCP' | 'x402' | 'MPP' | 'AP2' | 'heuristic';
|
|
36
2
|
export interface TransactionDetection {
|
|
37
3
|
detected: boolean;
|
|
@@ -40,10 +6,17 @@ export interface TransactionDetection {
|
|
|
40
6
|
* For Path 2 content_id derivation (§5.4.5):
|
|
41
7
|
* - ACP/UCP: the order permalink URL from the response (if present)
|
|
42
8
|
* - x402/MPP: not available here (caller must use HTTP endpoint URL)
|
|
43
|
-
* - AP2:
|
|
9
|
+
* - AP2: usually null because AP2 identity is carried in `contentId`
|
|
44
10
|
* - Heuristic: not available here (caller uses MCP server URL)
|
|
45
11
|
*/
|
|
46
12
|
checkoutUrl: string | null;
|
|
13
|
+
/**
|
|
14
|
+
* Optional protocol-specific content_id. AP2 can expose stable receipt or
|
|
15
|
+
* mandate identifiers directly in the response; the detector hashes the
|
|
16
|
+
* canonical identity ladder and returns the final content_id here. Null
|
|
17
|
+
* means the caller should keep the generic §5.4.5 fallback.
|
|
18
|
+
*/
|
|
19
|
+
contentId: string | null;
|
|
47
20
|
}
|
|
48
21
|
/**
|
|
49
22
|
* Detect whether a tool call response contains a transaction signal (§5.4.5).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../src/transaction.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../src/transaction.ts"],"names":[],"mappings":"AA0CA,MAAM,MAAM,mBAAmB,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,WAAW,CAAA;AAEtF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAAA;IACpC;;;;;;OAMG;IACH,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B;;;;;OAKG;IACH,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AAgOD;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,OAAO,EACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAC3C,oBAAoB,CAiJtB"}
|
package/dist/transaction.js
CHANGED
|
@@ -1,4 +1,42 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
/**
|
|
3
|
+
* Transaction detection (§5.4.5).
|
|
4
|
+
*
|
|
5
|
+
* Detects transaction events from response shapes for ACP, UCP, x402, MPP,
|
|
6
|
+
* AP2, and heuristic tool name matching.
|
|
7
|
+
*
|
|
8
|
+
* Protocol shape sources (verified 2026-05-27):
|
|
9
|
+
* - ACP: github.com/agentic-commerce-protocol/agentic-commerce-protocol
|
|
10
|
+
* rfcs/rfc.agentic_checkout.md
|
|
11
|
+
* - UCP: github.com/universal-commerce-protocol/ucp
|
|
12
|
+
* docs/specification/checkout-rest.md (version 2026-01-11)
|
|
13
|
+
* - AP2: github.com/google-agentic-commerce/AP2 (v0.2). Current AP2 uses
|
|
14
|
+
* SD-JWT Mandates for authorization and signed CheckoutReceipt /
|
|
15
|
+
* PaymentReceipt JWTs for acceptance. Detection fires on successful
|
|
16
|
+
* receipt shapes, not mandate-only payloads. The legacy v0.1 A2A
|
|
17
|
+
* DataPart key `ap2.mandates.PaymentMandate` remains supported as a
|
|
18
|
+
* compatibility fallback.
|
|
19
|
+
* - a2a-x402: github.com/google-agentic-commerce/a2a-x402. extension that
|
|
20
|
+
* layers x402 crypto payments over A2A. Detection signal is
|
|
21
|
+
* `status.message.metadata["x402.payment.status"] === "payment-completed"`
|
|
22
|
+
* with at least one `success: true` entry in
|
|
23
|
+
* `status.message.metadata["x402.payment.receipts"]`. Both shapes are
|
|
24
|
+
* reported as `protocol: 'AP2'` since a2a-x402 is the AP2 crypto path.
|
|
25
|
+
* - x402: github.com/coinbase/x402. response header `PAYMENT-RESPONSE` (v2)
|
|
26
|
+
* or `X-PAYMENT-RESPONSE` (v1 legacy). Value is base64-encoded JSON
|
|
27
|
+
* with shape { success: bool, transaction, network, payer, requirements }.
|
|
28
|
+
* - MPP: IETF draft-ryan-httpauth-payment-01 ("The 'Payment' HTTP Authentication
|
|
29
|
+
* Scheme"), per Section 5.3. Response header is `Payment-Receipt` on a
|
|
30
|
+
* 200 success after the client retries with Authorization: Payment.
|
|
31
|
+
* Value is base64url-nopad JSON with required field { status: "success",
|
|
32
|
+
* method, timestamp, reference }.
|
|
33
|
+
*
|
|
34
|
+
* x402 and MPP are different protocols that use different headers. Earlier
|
|
35
|
+
* versions of this code conflated them on a fictitious shared `Payment-Receipt`
|
|
36
|
+
* header. see DECISIONS.md D016 for the verification trail.
|
|
37
|
+
*/
|
|
38
|
+
import canonicalize from 'canonicalize';
|
|
39
|
+
import { hexEncode, sha256 } from '@atrib/mcp';
|
|
2
40
|
const HEURISTIC_KEYWORDS = [
|
|
3
41
|
'create_order',
|
|
4
42
|
'complete_checkout',
|
|
@@ -7,6 +45,175 @@ const HEURISTIC_KEYWORDS = [
|
|
|
7
45
|
'purchase',
|
|
8
46
|
'checkout',
|
|
9
47
|
];
|
|
48
|
+
const AP2_PAYMENT_RECEIPT_KEYS = ['ap2.PaymentReceipt', 'payment_receipt'];
|
|
49
|
+
const AP2_CHECKOUT_RECEIPT_KEYS = ['ap2.CheckoutReceipt', 'checkout_receipt'];
|
|
50
|
+
const AP2_RECEIPT_SCAN_LIMIT = 80;
|
|
51
|
+
const textEncoder = new TextEncoder();
|
|
52
|
+
function isRecord(value) {
|
|
53
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
54
|
+
}
|
|
55
|
+
function isString(value) {
|
|
56
|
+
return typeof value === 'string';
|
|
57
|
+
}
|
|
58
|
+
function isNonEmptyString(value) {
|
|
59
|
+
return typeof value === 'string' && value.length > 0;
|
|
60
|
+
}
|
|
61
|
+
function detection(protocol, checkoutUrl = null, contentId = null) {
|
|
62
|
+
return { detected: true, protocol, checkoutUrl, contentId };
|
|
63
|
+
}
|
|
64
|
+
function noDetection() {
|
|
65
|
+
return { detected: false, protocol: null, checkoutUrl: null, contentId: null };
|
|
66
|
+
}
|
|
67
|
+
function sha256Utf8(value) {
|
|
68
|
+
return `sha256:${hexEncode(sha256(textEncoder.encode(value)))}`;
|
|
69
|
+
}
|
|
70
|
+
function ap2ContentId(source, fields) {
|
|
71
|
+
const canonical = canonicalize({
|
|
72
|
+
protocol: 'AP2',
|
|
73
|
+
version: 1,
|
|
74
|
+
source,
|
|
75
|
+
fields,
|
|
76
|
+
});
|
|
77
|
+
if (!canonical)
|
|
78
|
+
return null;
|
|
79
|
+
return sha256Utf8(canonical);
|
|
80
|
+
}
|
|
81
|
+
function ap2ObjectHash(value) {
|
|
82
|
+
const canonical = canonicalize(value);
|
|
83
|
+
if (!canonical)
|
|
84
|
+
return null;
|
|
85
|
+
return sha256Utf8(canonical);
|
|
86
|
+
}
|
|
87
|
+
function hasAp2SuccessStatus(record) {
|
|
88
|
+
return record['status'] === 'Success' || record['status'] === 'success';
|
|
89
|
+
}
|
|
90
|
+
function looksLikeCompactJwt(value) {
|
|
91
|
+
return isNonEmptyString(value) && value.split('.').length === 3;
|
|
92
|
+
}
|
|
93
|
+
function isAp2PaymentReceiptObject(value) {
|
|
94
|
+
if (!isRecord(value))
|
|
95
|
+
return false;
|
|
96
|
+
return (value['status'] === 'Success' &&
|
|
97
|
+
isString(value['iss']) &&
|
|
98
|
+
typeof value['iat'] === 'number' &&
|
|
99
|
+
isNonEmptyString(value['reference']) &&
|
|
100
|
+
isNonEmptyString(value['payment_id']) &&
|
|
101
|
+
isNonEmptyString(value['psp_confirmation_id']) &&
|
|
102
|
+
isNonEmptyString(value['network_confirmation_id']));
|
|
103
|
+
}
|
|
104
|
+
function isAp2CheckoutReceiptObject(value) {
|
|
105
|
+
if (!isRecord(value))
|
|
106
|
+
return false;
|
|
107
|
+
return (value['status'] === 'Success' &&
|
|
108
|
+
isString(value['iss']) &&
|
|
109
|
+
typeof value['iat'] === 'number' &&
|
|
110
|
+
isNonEmptyString(value['reference']) &&
|
|
111
|
+
isNonEmptyString(value['order_id']));
|
|
112
|
+
}
|
|
113
|
+
function ap2PaymentReceiptCandidate(value) {
|
|
114
|
+
if (!isAp2PaymentReceiptObject(value) || !isRecord(value))
|
|
115
|
+
return null;
|
|
116
|
+
const contentId = ap2ContentId('payment_receipt', {
|
|
117
|
+
iss: value['iss'],
|
|
118
|
+
reference: value['reference'],
|
|
119
|
+
payment_id: value['payment_id'],
|
|
120
|
+
psp_confirmation_id: value['psp_confirmation_id'],
|
|
121
|
+
network_confirmation_id: value['network_confirmation_id'],
|
|
122
|
+
});
|
|
123
|
+
return contentId ? { contentId, priority: 10 } : null;
|
|
124
|
+
}
|
|
125
|
+
function ap2CheckoutReceiptCandidate(value) {
|
|
126
|
+
if (!isAp2CheckoutReceiptObject(value) || !isRecord(value))
|
|
127
|
+
return null;
|
|
128
|
+
const contentId = ap2ContentId('checkout_receipt', {
|
|
129
|
+
iss: value['iss'],
|
|
130
|
+
reference: value['reference'],
|
|
131
|
+
order_id: value['order_id'],
|
|
132
|
+
});
|
|
133
|
+
return contentId ? { contentId, priority: 30 } : null;
|
|
134
|
+
}
|
|
135
|
+
function ap2ReceiptJwtCandidate(value, source) {
|
|
136
|
+
if (!looksLikeCompactJwt(value))
|
|
137
|
+
return null;
|
|
138
|
+
const contentId = ap2ContentId(source, { jwt_hash: sha256Utf8(value) });
|
|
139
|
+
if (!contentId)
|
|
140
|
+
return null;
|
|
141
|
+
return { contentId, priority: source === 'payment_receipt_jwt' ? 20 : 40 };
|
|
142
|
+
}
|
|
143
|
+
function ap2ReceiptFieldCandidate(record, keys, objectCandidate, jwtSource) {
|
|
144
|
+
for (const key of keys) {
|
|
145
|
+
const value = record[key];
|
|
146
|
+
const object = objectCandidate(value);
|
|
147
|
+
if (object)
|
|
148
|
+
return object;
|
|
149
|
+
if (hasAp2SuccessStatus(record)) {
|
|
150
|
+
const jwt = ap2ReceiptJwtCandidate(value, jwtSource);
|
|
151
|
+
if (jwt)
|
|
152
|
+
return jwt;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
function chooseBetterAp2Candidate(current, candidate) {
|
|
158
|
+
if (!candidate)
|
|
159
|
+
return current;
|
|
160
|
+
if (!current || candidate.priority < current.priority)
|
|
161
|
+
return candidate;
|
|
162
|
+
return current;
|
|
163
|
+
}
|
|
164
|
+
function findAp2V02ReceiptContentId(value) {
|
|
165
|
+
const queue = [value];
|
|
166
|
+
const seen = new Set();
|
|
167
|
+
let scanned = 0;
|
|
168
|
+
let best = null;
|
|
169
|
+
while (queue.length > 0 && scanned < AP2_RECEIPT_SCAN_LIMIT) {
|
|
170
|
+
const current = queue.shift();
|
|
171
|
+
scanned += 1;
|
|
172
|
+
if (Array.isArray(current)) {
|
|
173
|
+
for (const item of current)
|
|
174
|
+
queue.push(item);
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
if (!isRecord(current))
|
|
178
|
+
continue;
|
|
179
|
+
if (seen.has(current))
|
|
180
|
+
continue;
|
|
181
|
+
seen.add(current);
|
|
182
|
+
best = chooseBetterAp2Candidate(best, ap2PaymentReceiptCandidate(current));
|
|
183
|
+
best = chooseBetterAp2Candidate(best, ap2CheckoutReceiptCandidate(current));
|
|
184
|
+
best = chooseBetterAp2Candidate(best, ap2ReceiptFieldCandidate(current, AP2_PAYMENT_RECEIPT_KEYS, ap2PaymentReceiptCandidate, 'payment_receipt_jwt'));
|
|
185
|
+
best = chooseBetterAp2Candidate(best, ap2ReceiptFieldCandidate(current, AP2_CHECKOUT_RECEIPT_KEYS, ap2CheckoutReceiptCandidate, 'checkout_receipt_jwt'));
|
|
186
|
+
for (const nested of Object.values(current)) {
|
|
187
|
+
if (isRecord(nested) || Array.isArray(nested))
|
|
188
|
+
queue.push(nested);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return best?.contentId ?? null;
|
|
192
|
+
}
|
|
193
|
+
function legacyAp2MandateContentId(value) {
|
|
194
|
+
const mandateHash = ap2ObjectHash(value);
|
|
195
|
+
if (!mandateHash)
|
|
196
|
+
return null;
|
|
197
|
+
return ap2ContentId('legacy_payment_mandate', { mandate_hash: mandateHash });
|
|
198
|
+
}
|
|
199
|
+
function a2aX402ContentId(receipts) {
|
|
200
|
+
if (!Array.isArray(receipts))
|
|
201
|
+
return null;
|
|
202
|
+
for (const receipt of receipts) {
|
|
203
|
+
if (!isRecord(receipt) || receipt['success'] !== true)
|
|
204
|
+
continue;
|
|
205
|
+
const transaction = receipt['transaction'];
|
|
206
|
+
if (!isNonEmptyString(transaction))
|
|
207
|
+
continue;
|
|
208
|
+
const fields = { transaction };
|
|
209
|
+
if (isNonEmptyString(receipt['network']))
|
|
210
|
+
fields['network'] = receipt['network'];
|
|
211
|
+
if (isNonEmptyString(receipt['payer']))
|
|
212
|
+
fields['payer'] = receipt['payer'];
|
|
213
|
+
return ap2ContentId('a2a_x402_receipt', fields);
|
|
214
|
+
}
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
10
217
|
/**
|
|
11
218
|
* Detect whether a tool call response contains a transaction signal (§5.4.5).
|
|
12
219
|
*/
|
|
@@ -24,14 +231,14 @@ export function detectTransaction(toolName, response, headers) {
|
|
|
24
231
|
const ucpEnvelope = resp['ucp'];
|
|
25
232
|
const isUcp = !!ucpEnvelope && typeof ucpEnvelope['version'] === 'string';
|
|
26
233
|
const checkoutUrl = typeof order['permalink_url'] === 'string' ? order['permalink_url'] : null;
|
|
27
|
-
return
|
|
234
|
+
return detection(isUcp ? 'UCP' : 'ACP', checkoutUrl);
|
|
28
235
|
}
|
|
29
236
|
// ACP webhook event shapes (server → merchant): order_create / order_update.
|
|
30
237
|
// { type: "order_create", data: { type: "order", checkout_session_id, permalink_url, status, refunds } }
|
|
31
238
|
if (resp['type'] === 'order_create' || resp['type'] === 'order_update') {
|
|
32
239
|
const data = resp['data'];
|
|
33
240
|
const checkoutUrl = typeof data?.['permalink_url'] === 'string' ? data['permalink_url'] : null;
|
|
34
|
-
return
|
|
241
|
+
return detection('ACP', checkoutUrl);
|
|
35
242
|
}
|
|
36
243
|
}
|
|
37
244
|
// x402 and MPP: distinct protocols, distinct response headers.
|
|
@@ -50,14 +257,30 @@ export function detectTransaction(toolName, response, headers) {
|
|
|
50
257
|
}
|
|
51
258
|
// x402. accept v2 and v1 names
|
|
52
259
|
if (lower['payment-response'] || lower['x-payment-response']) {
|
|
53
|
-
return
|
|
260
|
+
return detection('x402');
|
|
54
261
|
}
|
|
55
262
|
// MPP. IETF draft Payment-Receipt header
|
|
56
263
|
if (lower['payment-receipt']) {
|
|
57
|
-
return
|
|
264
|
+
return detection('MPP');
|
|
58
265
|
}
|
|
59
266
|
}
|
|
60
|
-
// AP2 v0.
|
|
267
|
+
// AP2 v0.2. Successful CheckoutReceipt / PaymentReceipt is the close signal.
|
|
268
|
+
// Mandates authorize the action and are kept out of transaction detection.
|
|
269
|
+
// Sources:
|
|
270
|
+
// - docs/ap2/specification.md: Checkout/Payment Receipt returned on completion
|
|
271
|
+
// - code/sdk/schemas/ap2/payment_receipt.json
|
|
272
|
+
// - code/sdk/schemas/ap2/checkout_receipt.json
|
|
273
|
+
// Shapes:
|
|
274
|
+
// - { status: "success", payment_receipt: "<signed JWT>" }
|
|
275
|
+
// - { status: "success", checkout_receipt: "<signed JWT>" }
|
|
276
|
+
// - { parts: [{ kind: "data", data: { "ap2.PaymentReceipt": { status: "Success", ... } } }] }
|
|
277
|
+
if (resp) {
|
|
278
|
+
const ap2Content = findAp2V02ReceiptContentId(resp);
|
|
279
|
+
if (ap2Content) {
|
|
280
|
+
return detection('AP2', null, ap2Content);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
// AP2 v0.1 compatibility. PaymentMandate Message inside an A2A DataPart.
|
|
61
284
|
// Source: github.com/google-agentic-commerce/ap2 docs/specification.md
|
|
62
285
|
// Shape: { ..., parts: [{ kind: "data", data: { "ap2.mandates.PaymentMandate": {...} } }, ...] }
|
|
63
286
|
if (resp) {
|
|
@@ -69,7 +292,8 @@ export function detectTransaction(toolName, response, headers) {
|
|
|
69
292
|
if (data &&
|
|
70
293
|
typeof data === 'object' &&
|
|
71
294
|
'ap2.mandates.PaymentMandate' in data) {
|
|
72
|
-
|
|
295
|
+
const mandate = data['ap2.mandates.PaymentMandate'];
|
|
296
|
+
return detection('AP2', null, legacyAp2MandateContentId(mandate));
|
|
73
297
|
}
|
|
74
298
|
}
|
|
75
299
|
}
|
|
@@ -85,11 +309,11 @@ export function detectTransaction(toolName, response, headers) {
|
|
|
85
309
|
const metadata = statusMessage?.['metadata'];
|
|
86
310
|
if (metadata && metadata['x402.payment.status'] === 'payment-completed') {
|
|
87
311
|
const receipts = metadata['x402.payment.receipts'];
|
|
88
|
-
if (Array.isArray(receipts)
|
|
89
|
-
receipts.some((r) => r
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
312
|
+
if (Array.isArray(receipts)) {
|
|
313
|
+
const accepted = receipts.some((r) => isRecord(r) && r['success'] === true);
|
|
314
|
+
if (accepted) {
|
|
315
|
+
return detection('AP2', null, a2aX402ContentId(receipts));
|
|
316
|
+
}
|
|
93
317
|
}
|
|
94
318
|
}
|
|
95
319
|
}
|
|
@@ -110,14 +334,14 @@ export function detectTransaction(toolName, response, headers) {
|
|
|
110
334
|
// so no credentialSubject check needed. For v1 string form: type is just
|
|
111
335
|
// "VerifiableCredential" so we need credentialSubject to confirm it's a PaymentMandate.
|
|
112
336
|
if (isVcArray || (isVcStringLegacy && subjectIsPaymentMandate)) {
|
|
113
|
-
return
|
|
337
|
+
return detection('AP2', null, legacyAp2MandateContentId(resp));
|
|
114
338
|
}
|
|
115
339
|
}
|
|
116
340
|
// Heuristic: tool name keywords (last resort)
|
|
117
341
|
const lowerName = toolName.toLowerCase();
|
|
118
342
|
if (HEURISTIC_KEYWORDS.some((k) => lowerName.includes(k))) {
|
|
119
|
-
return
|
|
343
|
+
return detection('heuristic');
|
|
120
344
|
}
|
|
121
|
-
return
|
|
345
|
+
return noDetection();
|
|
122
346
|
}
|
|
123
347
|
//# sourceMappingURL=transaction.js.map
|
package/dist/transaction.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction.js","sourceRoot":"","sources":["../src/transaction.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"transaction.js","sourceRoot":"","sources":["../src/transaction.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atrib/agent",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.8",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -33,13 +33,13 @@
|
|
|
33
33
|
"@noble/ed25519": "^3.1.0",
|
|
34
34
|
"@noble/hashes": "^2.2.0",
|
|
35
35
|
"canonicalize": "^3.0.0",
|
|
36
|
-
"@atrib/mcp": "0.
|
|
37
|
-
"@atrib/verify": "0.
|
|
36
|
+
"@atrib/mcp": "0.13.0",
|
|
37
|
+
"@atrib/verify": "0.4.0"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
|
-
"@types/node": "^25.
|
|
40
|
+
"@types/node": "^25.9.1",
|
|
41
41
|
"typescript": "^6.0.3",
|
|
42
|
-
"vitest": "^4.1.
|
|
42
|
+
"vitest": "^4.1.7"
|
|
43
43
|
},
|
|
44
44
|
"repository": {
|
|
45
45
|
"type": "git",
|