@remitmd/sdk 0.1.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/LICENSE +21 -0
- package/README.md +250 -0
- package/dist/a2a.d.ts +137 -0
- package/dist/a2a.d.ts.map +1 -0
- package/dist/a2a.js +121 -0
- package/dist/a2a.js.map +1 -0
- package/dist/client.d.ts +41 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +81 -0
- package/dist/client.js.map +1 -0
- package/dist/errors.d.ts +108 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +218 -0
- package/dist/errors.js.map +1 -0
- package/dist/http.d.ts +23 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +150 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/vercel-ai.d.ts +44 -0
- package/dist/integrations/vercel-ai.d.ts.map +1 -0
- package/dist/integrations/vercel-ai.js +175 -0
- package/dist/integrations/vercel-ai.js.map +1 -0
- package/dist/models/bounty.d.ts +22 -0
- package/dist/models/bounty.d.ts.map +1 -0
- package/dist/models/bounty.js +2 -0
- package/dist/models/bounty.js.map +1 -0
- package/dist/models/common.d.ts +78 -0
- package/dist/models/common.d.ts.map +1 -0
- package/dist/models/common.js +3 -0
- package/dist/models/common.js.map +1 -0
- package/dist/models/deposit.d.ts +13 -0
- package/dist/models/deposit.d.ts.map +1 -0
- package/dist/models/deposit.js +2 -0
- package/dist/models/deposit.js.map +1 -0
- package/dist/models/escrow.d.ts +16 -0
- package/dist/models/escrow.d.ts.map +1 -0
- package/dist/models/escrow.js +2 -0
- package/dist/models/escrow.js.map +1 -0
- package/dist/models/index.d.ts +9 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +9 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/invoice.d.ts +30 -0
- package/dist/models/invoice.d.ts.map +1 -0
- package/dist/models/invoice.js +2 -0
- package/dist/models/invoice.js.map +1 -0
- package/dist/models/reputation.d.ts +7 -0
- package/dist/models/reputation.d.ts.map +1 -0
- package/dist/models/reputation.js +2 -0
- package/dist/models/reputation.js.map +1 -0
- package/dist/models/stream.d.ts +15 -0
- package/dist/models/stream.d.ts.map +1 -0
- package/dist/models/stream.js +2 -0
- package/dist/models/stream.js.map +1 -0
- package/dist/models/tab.d.ts +21 -0
- package/dist/models/tab.d.ts.map +1 -0
- package/dist/models/tab.js +2 -0
- package/dist/models/tab.js.map +1 -0
- package/dist/provider.d.ts +135 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +218 -0
- package/dist/provider.js.map +1 -0
- package/dist/signer.d.ts +31 -0
- package/dist/signer.d.ts.map +1 -0
- package/dist/signer.js +35 -0
- package/dist/signer.js.map +1 -0
- package/dist/testing/local.d.ts +31 -0
- package/dist/testing/local.d.ts.map +1 -0
- package/dist/testing/local.js +100 -0
- package/dist/testing/local.js.map +1 -0
- package/dist/testing/mock.d.ts +95 -0
- package/dist/testing/mock.d.ts.map +1 -0
- package/dist/testing/mock.js +407 -0
- package/dist/testing/mock.js.map +1 -0
- package/dist/wallet.d.ts +162 -0
- package/dist/wallet.d.ts.map +1 -0
- package/dist/wallet.js +365 -0
- package/dist/wallet.js.map +1 -0
- package/dist/x402.d.ts +78 -0
- package/dist/x402.d.ts.map +1 -0
- package/dist/x402.js +151 -0
- package/dist/x402.js.map +1 -0
- package/eslint.config.js +27 -0
- package/package.json +39 -0
- package/src/a2a.ts +241 -0
- package/src/client.ts +104 -0
- package/src/errors.ts +261 -0
- package/src/http.ts +190 -0
- package/src/index.ts +94 -0
- package/src/integrations/vercel-ai.ts +213 -0
- package/src/models/bounty.ts +23 -0
- package/src/models/common.ts +106 -0
- package/src/models/deposit.ts +13 -0
- package/src/models/escrow.ts +16 -0
- package/src/models/index.ts +8 -0
- package/src/models/invoice.ts +32 -0
- package/src/models/reputation.ts +7 -0
- package/src/models/stream.ts +15 -0
- package/src/models/tab.ts +22 -0
- package/src/provider.ts +281 -0
- package/src/signer.ts +70 -0
- package/src/testing/local.ts +118 -0
- package/src/testing/mock.ts +507 -0
- package/src/wallet.ts +546 -0
- package/src/x402.ts +202 -0
- package/tests/acceptance/bounty.test.ts +82 -0
- package/tests/acceptance/deposit.test.ts +70 -0
- package/tests/acceptance/direct.test.ts +53 -0
- package/tests/acceptance/escrow.test.ts +67 -0
- package/tests/acceptance/setup.ts +113 -0
- package/tests/acceptance/stream.test.ts +98 -0
- package/tests/acceptance/tab.test.ts +108 -0
- package/tests/acceptance/x402.test.ts +140 -0
- package/tests/compliance/auth.ts +69 -0
- package/tests/compliance/escrows.ts +96 -0
- package/tests/compliance/helpers.ts +90 -0
- package/tests/compliance/payments.ts +69 -0
- package/tests/compliance/tabs.ts +52 -0
- package/tests/test_a2a.ts +151 -0
- package/tests/test_errors.ts +80 -0
- package/tests/test_golden_vectors.ts +162 -0
- package/tests/test_integrations.ts +115 -0
- package/tests/test_mock.ts +217 -0
- package/tests/test_permit.ts +216 -0
- package/tests/test_provider.ts +304 -0
- package/tests/test_wallet.ts +108 -0
- package/tests/test_x402.ts +302 -0
- package/tsconfig.json +19 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 remit-md
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
# remit.md TypeScript SDK
|
|
2
|
+
|
|
3
|
+
Universal payment protocol for AI agents — TypeScript/Node.js client library.
|
|
4
|
+
|
|
5
|
+
[](https://github.com/remit-md/sdk/actions/workflows/ci.yml)
|
|
6
|
+
[](https://www.npmjs.com/package/@remitmd/sdk)
|
|
7
|
+
|
|
8
|
+
## Installation
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
npm install @remitmd/sdk
|
|
12
|
+
# or
|
|
13
|
+
pnpm add @remitmd/sdk
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Quickstart
|
|
17
|
+
|
|
18
|
+
```typescript
|
|
19
|
+
import { Wallet } from "@remitmd/sdk";
|
|
20
|
+
|
|
21
|
+
// From environment variables (REMITMD_KEY, REMITMD_CHAIN)
|
|
22
|
+
const wallet = Wallet.fromEnv();
|
|
23
|
+
|
|
24
|
+
// Or with explicit key
|
|
25
|
+
const wallet = new Wallet({ privateKey: "0x...", chain: "base-sepolia" });
|
|
26
|
+
|
|
27
|
+
// Get contract addresses (cached per session)
|
|
28
|
+
const contracts = await wallet.getContracts();
|
|
29
|
+
|
|
30
|
+
// Sign a permit (gasless USDC approval) and pay
|
|
31
|
+
const permit = await wallet.signPermit(contracts.router, 1.50);
|
|
32
|
+
const tx = await wallet.payDirect("0xRecipient...", 1.50, "inference fee", { permit });
|
|
33
|
+
console.log(tx.txHash);
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Payment Models
|
|
37
|
+
|
|
38
|
+
### Permits (Gasless USDC Approval)
|
|
39
|
+
|
|
40
|
+
Every payment that moves USDC requires on-chain approval. Use `signPermit()` to sign an EIP-2612 permit off-chain — no gas, no approve transaction.
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
const contracts = await wallet.getContracts();
|
|
44
|
+
|
|
45
|
+
// signPermit(spender, amount, deadline?) — auto-fetches nonce from chain
|
|
46
|
+
const permit = await wallet.signPermit(contracts.router, 5.0);
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
The `spender` must match the contract handling the payment:
|
|
50
|
+
- Direct payment: `contracts.router`
|
|
51
|
+
- Escrow: `contracts.escrow`
|
|
52
|
+
- Tab: `contracts.tab`
|
|
53
|
+
- Stream: `contracts.stream`
|
|
54
|
+
- Bounty: `contracts.bounty`
|
|
55
|
+
- Deposit: `contracts.deposit`
|
|
56
|
+
|
|
57
|
+
### Direct Payment
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
const permit = await wallet.signPermit(contracts.router, 5.0);
|
|
61
|
+
const tx = await wallet.payDirect("0xRecipient...", 5.0, "AI task", { permit });
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Escrow
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
const permit = await wallet.signPermit(contracts.escrow, 100.0);
|
|
68
|
+
const escrow = await wallet.pay({
|
|
69
|
+
to: "0xContractor...",
|
|
70
|
+
amount: 100.0,
|
|
71
|
+
memo: "Code review",
|
|
72
|
+
}, { permit });
|
|
73
|
+
|
|
74
|
+
// Work happens...
|
|
75
|
+
await wallet.releaseEscrow(escrow.id); // pay the contractor
|
|
76
|
+
// or
|
|
77
|
+
await wallet.cancelEscrow(escrow.id); // refund yourself
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Metered Tab (off-chain billing)
|
|
81
|
+
|
|
82
|
+
```typescript
|
|
83
|
+
const permit = await wallet.signPermit(contracts.tab, 50);
|
|
84
|
+
const tab = await wallet.openTab({
|
|
85
|
+
to: "0xProvider...",
|
|
86
|
+
limit: 50,
|
|
87
|
+
perUnit: 0.003,
|
|
88
|
+
permit,
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
// Provider debits the tab for each API call — zero gas, instant
|
|
92
|
+
|
|
93
|
+
// One on-chain settlement when done
|
|
94
|
+
await wallet.closeTab(tab.id);
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Payment Stream
|
|
98
|
+
|
|
99
|
+
```typescript
|
|
100
|
+
const permit = await wallet.signPermit(contracts.stream, 10);
|
|
101
|
+
const stream = await wallet.openStream({
|
|
102
|
+
to: "0xWorker...",
|
|
103
|
+
rate: 0.001, // USDC per second
|
|
104
|
+
permit,
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
await wallet.closeStream(stream.id);
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Bounty
|
|
111
|
+
|
|
112
|
+
```typescript
|
|
113
|
+
const permit = await wallet.signPermit(contracts.bounty, 25);
|
|
114
|
+
const bounty = await wallet.postBounty({
|
|
115
|
+
amount: 25,
|
|
116
|
+
task: "Summarise top 10 EIPs of 2025",
|
|
117
|
+
deadline: 1700000000,
|
|
118
|
+
permit,
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
// Any agent can submit work; you decide the winner
|
|
122
|
+
await wallet.awardBounty(bounty.id, "0xWinner...");
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### Security Deposit
|
|
126
|
+
|
|
127
|
+
```typescript
|
|
128
|
+
const permit = await wallet.signPermit(contracts.deposit, 100);
|
|
129
|
+
const deposit = await wallet.placeDeposit({
|
|
130
|
+
to: "0xCounterpart...",
|
|
131
|
+
amount: 100,
|
|
132
|
+
expires: 86400, // 24 hours
|
|
133
|
+
permit,
|
|
134
|
+
});
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Testing with MockRemit
|
|
138
|
+
|
|
139
|
+
MockRemit gives you a zero-network, zero-latency test double. No API key needed.
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
import { MockRemit } from "@remitmd/sdk/testing";
|
|
143
|
+
|
|
144
|
+
const mock = new MockRemit();
|
|
145
|
+
const wallet = mock.wallet("0xAgent...");
|
|
146
|
+
|
|
147
|
+
const tx = await wallet.payDirect("0xProvider...", 0.003);
|
|
148
|
+
console.log(mock.wasPaid("0xProvider...", 0.003)); // true
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## All Methods
|
|
152
|
+
|
|
153
|
+
```typescript
|
|
154
|
+
// Contract discovery (cached per session)
|
|
155
|
+
wallet.getContracts() // Promise<ContractAddresses>
|
|
156
|
+
|
|
157
|
+
// Permits (gasless USDC approval)
|
|
158
|
+
wallet.signPermit(spender, amount, deadline?) // Promise<PermitSignature>
|
|
159
|
+
wallet.signUsdcPermit({ spender, value, deadline, ... }) // Promise<PermitSignature>
|
|
160
|
+
|
|
161
|
+
// Direct payment
|
|
162
|
+
wallet.payDirect(to, amount, memo?, { permit? }) // Promise<Transaction>
|
|
163
|
+
|
|
164
|
+
// Escrow
|
|
165
|
+
wallet.pay(invoice, { permit? }) // Promise<Escrow>
|
|
166
|
+
wallet.claimStart(invoiceId) // Promise<Transaction>
|
|
167
|
+
wallet.submitEvidence(invoiceId, uri, milestoneIndex?) // Promise<Transaction>
|
|
168
|
+
wallet.releaseEscrow(invoiceId) // Promise<Transaction>
|
|
169
|
+
wallet.releaseMilestone(invoiceId, index) // Promise<Transaction>
|
|
170
|
+
wallet.cancelEscrow(invoiceId) // Promise<Transaction>
|
|
171
|
+
wallet.getEscrow(invoiceId) // Promise<Escrow>
|
|
172
|
+
|
|
173
|
+
// Tabs
|
|
174
|
+
wallet.openTab({ to, limit, perUnit, expires?, permit? }) // Promise<Tab>
|
|
175
|
+
wallet.closeTab(tabId) // Promise<Transaction>
|
|
176
|
+
wallet.getTab(tabId) // Promise<Tab>
|
|
177
|
+
|
|
178
|
+
// Streams
|
|
179
|
+
wallet.openStream({ to, rate, maxDuration?, maxTotal?, permit? }) // Promise<Stream>
|
|
180
|
+
wallet.closeStream(streamId) // Promise<Transaction>
|
|
181
|
+
|
|
182
|
+
// Bounties
|
|
183
|
+
wallet.postBounty({ amount, task, deadline, permit?, ... }) // Promise<Bounty>
|
|
184
|
+
wallet.submitBounty(bountyId, evidenceUri) // Promise<Transaction>
|
|
185
|
+
wallet.awardBounty(bountyId, winner) // Promise<Transaction>
|
|
186
|
+
|
|
187
|
+
// Deposits
|
|
188
|
+
wallet.placeDeposit({ to, amount, expires, permit? }) // Promise<Deposit>
|
|
189
|
+
|
|
190
|
+
// Status & analytics
|
|
191
|
+
wallet.status() // Promise<WalletStatus>
|
|
192
|
+
wallet.balance() // Promise<number>
|
|
193
|
+
|
|
194
|
+
// Webhooks
|
|
195
|
+
wallet.registerWebhook(url, events, chains?) // Promise<Webhook>
|
|
196
|
+
wallet.listWebhooks() // Promise<Webhook[]>
|
|
197
|
+
wallet.deleteWebhook(id) // Promise<void>
|
|
198
|
+
|
|
199
|
+
// Operator links
|
|
200
|
+
wallet.createFundLink() // Promise<LinkResponse>
|
|
201
|
+
wallet.createWithdrawLink() // Promise<LinkResponse>
|
|
202
|
+
|
|
203
|
+
// Testnet
|
|
204
|
+
wallet.mint(amount) // Promise<{ tx_hash, balance }>
|
|
205
|
+
wallet.requestTestnetFunds() // Promise<Transaction> (deprecated)
|
|
206
|
+
|
|
207
|
+
// x402 (HTTP 402 auto-pay)
|
|
208
|
+
wallet.x402Fetch(url, maxAutoPayUsdc?, init?) // Promise<Response>
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
## x402 Support
|
|
212
|
+
|
|
213
|
+
The SDK has built-in support for the x402 HTTP payment protocol:
|
|
214
|
+
|
|
215
|
+
```typescript
|
|
216
|
+
// Auto-pay any 402 response up to 0.10 USDC
|
|
217
|
+
const response = await wallet.x402Fetch("https://api.example.com/data", 0.10);
|
|
218
|
+
const data = await response.json();
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
## Error Handling
|
|
222
|
+
|
|
223
|
+
All errors are structured with machine-readable codes and enriched details:
|
|
224
|
+
|
|
225
|
+
```typescript
|
|
226
|
+
try {
|
|
227
|
+
await wallet.payDirect("0xRecipient...", 100.0);
|
|
228
|
+
} catch (err) {
|
|
229
|
+
if (err instanceof RemitError) {
|
|
230
|
+
console.log(err.code); // "INSUFFICIENT_BALANCE"
|
|
231
|
+
console.log(err.message); // "Insufficient USDC balance: have $5.00, need $100.00"
|
|
232
|
+
// Enriched errors include actual numbers in details:
|
|
233
|
+
// err.details = {required: "100.00", available: "5.00",
|
|
234
|
+
// required_units: 100000000, available_units: 5000000}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
## Chains
|
|
240
|
+
|
|
241
|
+
```typescript
|
|
242
|
+
new Wallet({ privateKey: key, chain: "base" }) // Base mainnet (default)
|
|
243
|
+
new Wallet({ privateKey: key, chain: "base-sepolia" }) // Base Sepolia testnet
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
## License
|
|
247
|
+
|
|
248
|
+
MIT — see [LICENSE](LICENSE)
|
|
249
|
+
|
|
250
|
+
[Documentation](https://remit.md/docs) · [Protocol Spec](https://remit.md) · [GitHub](https://github.com/remit-md/sdk)
|
package/dist/a2a.d.ts
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A2A / AP2 — agent card discovery and A2A JSON-RPC task client.
|
|
3
|
+
*
|
|
4
|
+
* Spec: https://google.github.io/A2A/specification/
|
|
5
|
+
* AP2: https://ap2-protocol.org/
|
|
6
|
+
*/
|
|
7
|
+
import type { Signer } from "./signer.js";
|
|
8
|
+
export interface A2AExtension {
|
|
9
|
+
uri: string;
|
|
10
|
+
description: string;
|
|
11
|
+
required: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface A2ACapabilities {
|
|
14
|
+
streaming: boolean;
|
|
15
|
+
pushNotifications: boolean;
|
|
16
|
+
stateTransitionHistory: boolean;
|
|
17
|
+
extensions: A2AExtension[];
|
|
18
|
+
}
|
|
19
|
+
export interface A2ASkill {
|
|
20
|
+
id: string;
|
|
21
|
+
name: string;
|
|
22
|
+
description: string;
|
|
23
|
+
tags: string[];
|
|
24
|
+
}
|
|
25
|
+
export interface A2AFees {
|
|
26
|
+
standardBps: number;
|
|
27
|
+
preferredBps: number;
|
|
28
|
+
cliffUsd: number;
|
|
29
|
+
}
|
|
30
|
+
export interface A2AX402 {
|
|
31
|
+
settleEndpoint: string;
|
|
32
|
+
assets: Record<string, string>;
|
|
33
|
+
fees: A2AFees;
|
|
34
|
+
}
|
|
35
|
+
export interface AgentCard {
|
|
36
|
+
protocolVersion: string;
|
|
37
|
+
name: string;
|
|
38
|
+
description: string;
|
|
39
|
+
/** A2A JSON-RPC endpoint URL (POST). */
|
|
40
|
+
url: string;
|
|
41
|
+
version: string;
|
|
42
|
+
documentationUrl: string;
|
|
43
|
+
capabilities: A2ACapabilities;
|
|
44
|
+
authentication: unknown[];
|
|
45
|
+
skills: A2ASkill[];
|
|
46
|
+
x402: A2AX402;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Fetch and parse the A2A agent card from `baseUrl`/.well-known/agent-card.json.
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```ts
|
|
53
|
+
* const card = await discoverAgent("https://remit.md");
|
|
54
|
+
* console.log(card.name, card.url);
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
export declare function discoverAgent(baseUrl: string): Promise<AgentCard>;
|
|
58
|
+
export interface A2ATaskStatus {
|
|
59
|
+
state: "completed" | "failed" | "canceled" | "working" | string;
|
|
60
|
+
message?: {
|
|
61
|
+
text?: string;
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
export interface A2AArtifactPart {
|
|
65
|
+
kind: string;
|
|
66
|
+
data?: Record<string, unknown>;
|
|
67
|
+
}
|
|
68
|
+
export interface A2AArtifact {
|
|
69
|
+
name?: string;
|
|
70
|
+
parts: A2AArtifactPart[];
|
|
71
|
+
}
|
|
72
|
+
export interface A2ATask {
|
|
73
|
+
id: string;
|
|
74
|
+
status: A2ATaskStatus;
|
|
75
|
+
artifacts: A2AArtifact[];
|
|
76
|
+
}
|
|
77
|
+
/** Extract `txHash` from task artifacts, if present. */
|
|
78
|
+
export declare function getTaskTxHash(task: A2ATask): string | undefined;
|
|
79
|
+
export interface IntentMandate {
|
|
80
|
+
mandateId: string;
|
|
81
|
+
expiresAt: string;
|
|
82
|
+
issuer: string;
|
|
83
|
+
allowance: {
|
|
84
|
+
maxAmount: string;
|
|
85
|
+
currency: string;
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
export interface A2AClientOptions {
|
|
89
|
+
/** Full A2A endpoint URL from the agent card (e.g. ``"https://remit.md/a2a"``). */
|
|
90
|
+
endpoint: string;
|
|
91
|
+
signer: Signer;
|
|
92
|
+
chainId: number;
|
|
93
|
+
verifyingContract?: string;
|
|
94
|
+
}
|
|
95
|
+
export interface SendOptions {
|
|
96
|
+
to: string;
|
|
97
|
+
amount: number;
|
|
98
|
+
memo?: string;
|
|
99
|
+
mandate?: IntentMandate;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* A2A JSON-RPC client — send payments and manage tasks via the A2A protocol.
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* ```ts
|
|
106
|
+
* import { discoverAgent, A2AClient } from "@remitmd/sdk";
|
|
107
|
+
* import { PrivateKeySigner } from "@remitmd/sdk";
|
|
108
|
+
*
|
|
109
|
+
* const card = await discoverAgent("https://remit.md");
|
|
110
|
+
* const signer = new PrivateKeySigner(process.env.REMITMD_KEY!);
|
|
111
|
+
* const client = A2AClient.fromCard(card, signer);
|
|
112
|
+
* const task = await client.send({ to: "0xRecipient...", amount: 10 });
|
|
113
|
+
* console.log(task.status.state, getTaskTxHash(task));
|
|
114
|
+
* ```
|
|
115
|
+
*/
|
|
116
|
+
export declare class A2AClient {
|
|
117
|
+
private readonly _http;
|
|
118
|
+
private readonly _path;
|
|
119
|
+
constructor(opts: A2AClientOptions);
|
|
120
|
+
/** Convenience constructor from an :class:`AgentCard` and a signer. */
|
|
121
|
+
static fromCard(card: AgentCard, signer: Signer, opts?: {
|
|
122
|
+
chain?: string;
|
|
123
|
+
verifyingContract?: string;
|
|
124
|
+
}): A2AClient;
|
|
125
|
+
/**
|
|
126
|
+
* Send a direct USDC payment via ``message/send``.
|
|
127
|
+
*
|
|
128
|
+
* @returns :interface:`A2ATask` with ``status.state === "completed"`` on success.
|
|
129
|
+
*/
|
|
130
|
+
send(opts: SendOptions): Promise<A2ATask>;
|
|
131
|
+
/** Fetch the current state of an A2A task by ID. */
|
|
132
|
+
getTask(taskId: string): Promise<A2ATask>;
|
|
133
|
+
/** Cancel an in-progress A2A task. */
|
|
134
|
+
cancelTask(taskId: string): Promise<A2ATask>;
|
|
135
|
+
private _rpc;
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=a2a.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a2a.d.ts","sourceRoot":"","sources":["../src/a2a.ts"],"names":[],"mappings":"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"}
|
package/dist/a2a.js
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A2A / AP2 — agent card discovery and A2A JSON-RPC task client.
|
|
3
|
+
*
|
|
4
|
+
* Spec: https://google.github.io/A2A/specification/
|
|
5
|
+
* AP2: https://ap2-protocol.org/
|
|
6
|
+
*/
|
|
7
|
+
import { AuthenticatedClient } from "./http.js";
|
|
8
|
+
import { CHAIN_IDS } from "./client.js";
|
|
9
|
+
/**
|
|
10
|
+
* Fetch and parse the A2A agent card from `baseUrl`/.well-known/agent-card.json.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* const card = await discoverAgent("https://remit.md");
|
|
15
|
+
* console.log(card.name, card.url);
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export async function discoverAgent(baseUrl) {
|
|
19
|
+
const url = baseUrl.replace(/\/$/, "") + "/.well-known/agent-card.json";
|
|
20
|
+
const res = await fetch(url, { headers: { Accept: "application/json" } });
|
|
21
|
+
if (!res.ok) {
|
|
22
|
+
throw new Error(`Agent card discovery failed: HTTP ${res.status} ${res.statusText}`);
|
|
23
|
+
}
|
|
24
|
+
return (await res.json());
|
|
25
|
+
}
|
|
26
|
+
/** Extract `txHash` from task artifacts, if present. */
|
|
27
|
+
export function getTaskTxHash(task) {
|
|
28
|
+
for (const artifact of task.artifacts) {
|
|
29
|
+
for (const part of artifact.parts) {
|
|
30
|
+
const tx = part.data?.["txHash"];
|
|
31
|
+
if (typeof tx === "string")
|
|
32
|
+
return tx;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
// ─── A2A client ───────────────────────────────────────────────────────────────
|
|
38
|
+
/**
|
|
39
|
+
* A2A JSON-RPC client — send payments and manage tasks via the A2A protocol.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```ts
|
|
43
|
+
* import { discoverAgent, A2AClient } from "@remitmd/sdk";
|
|
44
|
+
* import { PrivateKeySigner } from "@remitmd/sdk";
|
|
45
|
+
*
|
|
46
|
+
* const card = await discoverAgent("https://remit.md");
|
|
47
|
+
* const signer = new PrivateKeySigner(process.env.REMITMD_KEY!);
|
|
48
|
+
* const client = A2AClient.fromCard(card, signer);
|
|
49
|
+
* const task = await client.send({ to: "0xRecipient...", amount: 10 });
|
|
50
|
+
* console.log(task.status.state, getTaskTxHash(task));
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export class A2AClient {
|
|
54
|
+
_http;
|
|
55
|
+
_path;
|
|
56
|
+
constructor(opts) {
|
|
57
|
+
const { endpoint, signer, chainId, verifyingContract = "" } = opts;
|
|
58
|
+
const parsed = new URL(endpoint);
|
|
59
|
+
const baseUrl = `${parsed.protocol}//${parsed.host}`;
|
|
60
|
+
this._path = parsed.pathname || "/a2a";
|
|
61
|
+
this._http = new AuthenticatedClient({ signer, baseUrl, chainId, verifyingContract });
|
|
62
|
+
}
|
|
63
|
+
/** Convenience constructor from an :class:`AgentCard` and a signer. */
|
|
64
|
+
static fromCard(card, signer, opts) {
|
|
65
|
+
const chain = opts?.chain ?? "base";
|
|
66
|
+
const chainId = CHAIN_IDS[chain] ?? CHAIN_IDS["base"];
|
|
67
|
+
return new A2AClient({
|
|
68
|
+
endpoint: card.url,
|
|
69
|
+
signer,
|
|
70
|
+
chainId,
|
|
71
|
+
verifyingContract: opts?.verifyingContract ?? "",
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Send a direct USDC payment via ``message/send``.
|
|
76
|
+
*
|
|
77
|
+
* @returns :interface:`A2ATask` with ``status.state === "completed"`` on success.
|
|
78
|
+
*/
|
|
79
|
+
async send(opts) {
|
|
80
|
+
const { to, amount, memo = "", mandate } = opts;
|
|
81
|
+
const nonce = crypto.randomUUID().replace(/-/g, "");
|
|
82
|
+
const messageId = crypto.randomUUID().replace(/-/g, "");
|
|
83
|
+
const message = {
|
|
84
|
+
messageId,
|
|
85
|
+
role: "user",
|
|
86
|
+
parts: [
|
|
87
|
+
{
|
|
88
|
+
kind: "data",
|
|
89
|
+
data: {
|
|
90
|
+
model: "direct",
|
|
91
|
+
to,
|
|
92
|
+
amount: amount.toFixed(2),
|
|
93
|
+
memo,
|
|
94
|
+
nonce,
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
};
|
|
99
|
+
if (mandate) {
|
|
100
|
+
message["metadata"] = { mandate };
|
|
101
|
+
}
|
|
102
|
+
return this._rpc("message/send", { message }, messageId);
|
|
103
|
+
}
|
|
104
|
+
/** Fetch the current state of an A2A task by ID. */
|
|
105
|
+
async getTask(taskId) {
|
|
106
|
+
return this._rpc("tasks/get", { id: taskId }, taskId.slice(0, 16));
|
|
107
|
+
}
|
|
108
|
+
/** Cancel an in-progress A2A task. */
|
|
109
|
+
async cancelTask(taskId) {
|
|
110
|
+
return this._rpc("tasks/cancel", { id: taskId }, taskId.slice(0, 16));
|
|
111
|
+
}
|
|
112
|
+
async _rpc(method, params, callId) {
|
|
113
|
+
const body = { jsonrpc: "2.0", id: callId, method, params };
|
|
114
|
+
const data = await this._http.post(this._path, body);
|
|
115
|
+
if (data.error) {
|
|
116
|
+
throw new Error(`A2A error: ${data.error.message ?? JSON.stringify(data.error)}`);
|
|
117
|
+
}
|
|
118
|
+
return (data.result ?? data);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=a2a.js.map
|
package/dist/a2a.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a2a.js","sourceRoot":"","sources":["../src/a2a.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RemitClient — read-only operations, no private key required.
|
|
3
|
+
*/
|
|
4
|
+
import type { WalletStatus, Reputation, ContractAddresses } from "./models/index.js";
|
|
5
|
+
import type { Invoice } from "./models/invoice.js";
|
|
6
|
+
import type { Escrow } from "./models/escrow.js";
|
|
7
|
+
import type { Tab } from "./models/tab.js";
|
|
8
|
+
import type { Stream } from "./models/stream.js";
|
|
9
|
+
import type { Bounty } from "./models/bounty.js";
|
|
10
|
+
import type { Deposit } from "./models/deposit.js";
|
|
11
|
+
export declare const CHAIN_IDS: Record<string, number>;
|
|
12
|
+
export interface RemitClientOptions {
|
|
13
|
+
chain?: string;
|
|
14
|
+
testnet?: boolean;
|
|
15
|
+
apiUrl?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare class RemitClient {
|
|
18
|
+
#private;
|
|
19
|
+
protected readonly _chain: string;
|
|
20
|
+
protected readonly _apiUrl: string;
|
|
21
|
+
protected readonly _chainId: number;
|
|
22
|
+
constructor(options?: RemitClientOptions);
|
|
23
|
+
protected _fetch<T>(path: string): Promise<T>;
|
|
24
|
+
getInvoice(invoiceId: string): Promise<Invoice>;
|
|
25
|
+
getEscrow(invoiceId: string): Promise<Escrow>;
|
|
26
|
+
getTab(tabId: string): Promise<Tab>;
|
|
27
|
+
getStream(streamId: string): Promise<Stream>;
|
|
28
|
+
getBounty(bountyId: string): Promise<Bounty>;
|
|
29
|
+
getDeposit(depositId: string): Promise<Deposit>;
|
|
30
|
+
getStatus(wallet: string): Promise<WalletStatus>;
|
|
31
|
+
getReputation(wallet: string): Promise<Reputation>;
|
|
32
|
+
/** Get deployed contract addresses. Cached for the lifetime of this client instance. */
|
|
33
|
+
getContracts(): Promise<ContractAddresses>;
|
|
34
|
+
listBounties(options?: {
|
|
35
|
+
status?: string;
|
|
36
|
+
limit?: number;
|
|
37
|
+
poster?: string;
|
|
38
|
+
submitter?: string;
|
|
39
|
+
}): Promise<Bounty[]>;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACrF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAOnD,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAI5C,CAAC;AAEF,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,WAAW;;IACtB,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAClC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACnC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAGxB,OAAO,GAAE,kBAAuB;cAQ5B,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAUnD,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAI/C,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI7C,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAInC,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI5C,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI5C,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAI/C,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAIhD,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAIlD,wFAAwF;IAClF,YAAY,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAOhD,YAAY,CAAC,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAUxH"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RemitClient — read-only operations, no private key required.
|
|
3
|
+
*/
|
|
4
|
+
const DEFAULT_API_URLS = {
|
|
5
|
+
base: "https://api.remit.md/api/v0",
|
|
6
|
+
"base-sepolia": "https://testnet.remit.md/api/v0",
|
|
7
|
+
localhost: "http://localhost:3000/api/v0",
|
|
8
|
+
};
|
|
9
|
+
export const CHAIN_IDS = {
|
|
10
|
+
base: 8453,
|
|
11
|
+
"base-sepolia": 84532,
|
|
12
|
+
localhost: 31337,
|
|
13
|
+
};
|
|
14
|
+
export class RemitClient {
|
|
15
|
+
_chain;
|
|
16
|
+
_apiUrl;
|
|
17
|
+
_chainId;
|
|
18
|
+
#contractsCache = null;
|
|
19
|
+
constructor(options = {}) {
|
|
20
|
+
const { chain = "base", testnet = false, apiUrl } = options;
|
|
21
|
+
this._chain = testnet && !chain.includes("sepolia") ? `${chain}-sepolia` : chain;
|
|
22
|
+
this._apiUrl =
|
|
23
|
+
apiUrl ?? DEFAULT_API_URLS[this._chain] ?? DEFAULT_API_URLS["base"];
|
|
24
|
+
this._chainId = CHAIN_IDS[this._chain] ?? CHAIN_IDS["base"];
|
|
25
|
+
}
|
|
26
|
+
async _fetch(path) {
|
|
27
|
+
const response = await fetch(`${this._apiUrl}${path}`, {
|
|
28
|
+
headers: { "Content-Type": "application/json" },
|
|
29
|
+
});
|
|
30
|
+
if (!response.ok) {
|
|
31
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
32
|
+
}
|
|
33
|
+
return (await response.json());
|
|
34
|
+
}
|
|
35
|
+
getInvoice(invoiceId) {
|
|
36
|
+
return this._fetch(`/invoices/${invoiceId}`);
|
|
37
|
+
}
|
|
38
|
+
getEscrow(invoiceId) {
|
|
39
|
+
return this._fetch(`/escrows/${invoiceId}`);
|
|
40
|
+
}
|
|
41
|
+
getTab(tabId) {
|
|
42
|
+
return this._fetch(`/tabs/${tabId}`);
|
|
43
|
+
}
|
|
44
|
+
getStream(streamId) {
|
|
45
|
+
return this._fetch(`/streams/${streamId}`);
|
|
46
|
+
}
|
|
47
|
+
getBounty(bountyId) {
|
|
48
|
+
return this._fetch(`/bounties/${bountyId}`);
|
|
49
|
+
}
|
|
50
|
+
getDeposit(depositId) {
|
|
51
|
+
return this._fetch(`/deposits/${depositId}`);
|
|
52
|
+
}
|
|
53
|
+
getStatus(wallet) {
|
|
54
|
+
return this._fetch(`/status/${wallet}`);
|
|
55
|
+
}
|
|
56
|
+
getReputation(wallet) {
|
|
57
|
+
return this._fetch(`/reputation/${wallet}`);
|
|
58
|
+
}
|
|
59
|
+
/** Get deployed contract addresses. Cached for the lifetime of this client instance. */
|
|
60
|
+
async getContracts() {
|
|
61
|
+
if (this.#contractsCache)
|
|
62
|
+
return this.#contractsCache;
|
|
63
|
+
const contracts = await this._fetch("/contracts");
|
|
64
|
+
this.#contractsCache = contracts;
|
|
65
|
+
return contracts;
|
|
66
|
+
}
|
|
67
|
+
listBounties(options = {}) {
|
|
68
|
+
const params = new URLSearchParams();
|
|
69
|
+
if (options.status)
|
|
70
|
+
params.set("status", options.status);
|
|
71
|
+
if (options.limit)
|
|
72
|
+
params.set("limit", String(options.limit));
|
|
73
|
+
if (options.poster)
|
|
74
|
+
params.set("poster", options.poster);
|
|
75
|
+
if (options.submitter)
|
|
76
|
+
params.set("submitter", options.submitter);
|
|
77
|
+
const qs = params.toString();
|
|
78
|
+
return this._fetch(`/bounties${qs ? `?${qs}` : ""}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|