@agent-fuel/sdk 0.1.0 → 0.2.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/CHANGELOG.md CHANGED
@@ -2,6 +2,28 @@
2
2
 
3
3
  All notable changes to `@agent-fuel/sdk` are documented here. Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this package follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
4
4
 
5
+ ## [0.2.0] — 2026-05-31
6
+
7
+ ### Added
8
+
9
+ - `pay({ agent, service, owner, amountUsdc, receiptHash, connection })` — atomic `spend` + `record_payment` in one tx, mirroring `Spender::pay()` in the Rust runtime. Vault burn and reputation accrual now land together or not at all; no half-states where USDC moved but the agent ↔ service link never updated.
10
+ - `requestSpend({ agent, owner, service, amountUsdc, connection })` — agent-initiated half of the over-limit approval flow. Returns the `pendingSpend` PDA so callers can poll for resolution.
11
+ - `registerService({ sponsor, service, name, category, serviceUri?, connection })` — register a new service on chain. Two-signer (sponsor pays rent, service is the long-lived identity).
12
+ - `pendingSpendPda(vault, nonce)` PDA helper.
13
+ - `PendingSpendAccount` type + decoder.
14
+ - Convenience wrappers on `AgentFuel`: `fuel.pay()`, `fuel.requestSpend()`, `fuel.registerService()` — same surface as the standalone functions, with the connection and agent supplied by the instance.
15
+
16
+ ### Changed
17
+
18
+ - Re-vendored IDLs against the latest on-chain deploys so the SDK sees `request_spend`, `approve_spend`, `cancel_spend`, `register_service`, and the new `pending_count` field on `CreditVault`.
19
+ - `CreditVaultAccount` now includes `pending_count: number` — the nonce burned by the next `request_spend`.
20
+
21
+ ## [0.1.1] — 2026-05-29
22
+
23
+ ### Changed
24
+
25
+ - Moved `@coral-xyz/anchor` and `@solana/spl-token` from `peerDependencies` to `dependencies`. Host apps no longer need to provide compatible versions; the SDK ships its own and isolates from version skew (notably anchor 0.29 vs 0.31, which caused `BN.init` assertions when consumed from Solana Agent Kit).
26
+
5
27
  ## [0.1.0] — 2026-05-27
6
28
 
7
29
  First public release. Six-method surface for AI agents to read reputation, pay services from a credit vault, and stream live events — plus an x402 fetch wrapper.
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  TypeScript SDK for [Agent Fuel](https://github.com/TODO/agent_fuel) — credit vault + reputation primitives for AI agents on Solana.
4
4
 
5
- > **Status:** `0.1.0-alpha.0`. Full read/write/stream surface live. Publishing to npm lands in the next slice ([phases.md](../../docs/phases.md)).
5
+ > **Status:** `0.1.0`. Full read/write/stream surface live, published to npm with provenance.
6
6
 
7
7
  ## The six functions
8
8
 
@@ -38,7 +38,7 @@ const fuel = new AgentFuel({
38
38
  owner: new PublicKey("..."), // the wallet that funded your vault
39
39
  cluster: "devnet",
40
40
  rpc: "https://api.devnet.solana.com",
41
- apiBase: "http://localhost:8080", // your Agent Fuel backend
41
+ apiBase: "https://api.agentfuel.online", // your Agent Fuel backend
42
42
  });
43
43
  ```
44
44
 
@@ -167,6 +167,19 @@ npm run lint
167
167
  npm run build # emits dist/ (ESM + CJS + .d.ts) via tsup
168
168
  ```
169
169
 
170
+ ### Bootstrapping a devnet sandbox
171
+
172
+ `npm run devnet:bootstrap` provisions a complete devnet environment in one command: deploys a test USDC mint, mints initial supply to the owner, registers a service, initializes an agent profile, creates + funds a vault, and verifies the whole graph by reading it back through the SDK.
173
+
174
+ ```bash
175
+ npm run build # bootstrap imports from dist/
176
+ npm run devnet:bootstrap
177
+ ```
178
+
179
+ Defaults to the Solana CLI keypair at `~/.config/solana/id.json` as the owner-agent identity (needs ~0.05 SOL on devnet — `solana airdrop 1 --url devnet` if low). Generates the service + mint keypairs under `~/.config/agent-fuel/`, idempotently — reruns after a partial failure are safe.
180
+
181
+ The script writes a `devnet-config.json` manifest with every pubkey + path, and prints the exact env-var block to copy into the [x402-quickstart](./examples/x402-quickstart/) example for a real end-to-end `spend()` against devnet.
182
+
170
183
  ### Refreshing the IDLs
171
184
 
172
185
  The IDLs under `src/idl/` are committed copies — the SDK build, CI, and downstream consumers never depend on `anchor build`. When the Anchor programs change, re-vendor manually and commit:
@@ -11,6 +11,200 @@ var credit_vault_default = {
11
11
  repository: "https://github.com/TODO/agent_fuel"
12
12
  },
13
13
  instructions: [
14
+ {
15
+ name: "approve_spend",
16
+ discriminator: [
17
+ 248,
18
+ 201,
19
+ 151,
20
+ 15,
21
+ 28,
22
+ 162,
23
+ 112,
24
+ 90
25
+ ],
26
+ accounts: [
27
+ {
28
+ name: "owner",
29
+ writable: true,
30
+ signer: true,
31
+ relations: [
32
+ "vault"
33
+ ]
34
+ },
35
+ {
36
+ name: "vault",
37
+ writable: true,
38
+ pda: {
39
+ seeds: [
40
+ {
41
+ kind: "const",
42
+ value: [
43
+ 118,
44
+ 97,
45
+ 117,
46
+ 108,
47
+ 116
48
+ ]
49
+ },
50
+ {
51
+ kind: "account",
52
+ path: "owner"
53
+ },
54
+ {
55
+ kind: "account",
56
+ path: "vault.agent",
57
+ account: "CreditVault"
58
+ }
59
+ ]
60
+ }
61
+ },
62
+ {
63
+ name: "policy",
64
+ writable: true,
65
+ pda: {
66
+ seeds: [
67
+ {
68
+ kind: "const",
69
+ value: [
70
+ 112,
71
+ 111,
72
+ 108,
73
+ 105,
74
+ 99,
75
+ 121
76
+ ]
77
+ },
78
+ {
79
+ kind: "account",
80
+ path: "vault"
81
+ }
82
+ ]
83
+ }
84
+ },
85
+ {
86
+ name: "pending_spend",
87
+ writable: true,
88
+ pda: {
89
+ seeds: [
90
+ {
91
+ kind: "const",
92
+ value: [
93
+ 112,
94
+ 101,
95
+ 110,
96
+ 100,
97
+ 105,
98
+ 110,
99
+ 103
100
+ ]
101
+ },
102
+ {
103
+ kind: "account",
104
+ path: "vault"
105
+ },
106
+ {
107
+ kind: "account",
108
+ path: "pending_spend.nonce",
109
+ account: "PendingSpend"
110
+ }
111
+ ]
112
+ }
113
+ },
114
+ {
115
+ name: "vault_token_account",
116
+ writable: true
117
+ },
118
+ {
119
+ name: "service_token_account",
120
+ writable: true
121
+ },
122
+ {
123
+ name: "token_program",
124
+ address: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
125
+ }
126
+ ],
127
+ args: []
128
+ },
129
+ {
130
+ name: "cancel_spend",
131
+ discriminator: [
132
+ 122,
133
+ 254,
134
+ 101,
135
+ 132,
136
+ 241,
137
+ 232,
138
+ 205,
139
+ 179
140
+ ],
141
+ accounts: [
142
+ {
143
+ name: "owner",
144
+ writable: true,
145
+ signer: true,
146
+ relations: [
147
+ "vault"
148
+ ]
149
+ },
150
+ {
151
+ name: "vault",
152
+ pda: {
153
+ seeds: [
154
+ {
155
+ kind: "const",
156
+ value: [
157
+ 118,
158
+ 97,
159
+ 117,
160
+ 108,
161
+ 116
162
+ ]
163
+ },
164
+ {
165
+ kind: "account",
166
+ path: "owner"
167
+ },
168
+ {
169
+ kind: "account",
170
+ path: "vault.agent",
171
+ account: "CreditVault"
172
+ }
173
+ ]
174
+ }
175
+ },
176
+ {
177
+ name: "pending_spend",
178
+ writable: true,
179
+ pda: {
180
+ seeds: [
181
+ {
182
+ kind: "const",
183
+ value: [
184
+ 112,
185
+ 101,
186
+ 110,
187
+ 100,
188
+ 105,
189
+ 110,
190
+ 103
191
+ ]
192
+ },
193
+ {
194
+ kind: "account",
195
+ path: "vault"
196
+ },
197
+ {
198
+ kind: "account",
199
+ path: "pending_spend.nonce",
200
+ account: "PendingSpend"
201
+ }
202
+ ]
203
+ }
204
+ }
205
+ ],
206
+ args: []
207
+ },
14
208
  {
15
209
  name: "claim",
16
210
  discriminator: [
@@ -417,6 +611,104 @@ var credit_vault_default = {
417
611
  ],
418
612
  args: []
419
613
  },
614
+ {
615
+ name: "request_spend",
616
+ discriminator: [
617
+ 127,
618
+ 12,
619
+ 23,
620
+ 75,
621
+ 137,
622
+ 178,
623
+ 148,
624
+ 71
625
+ ],
626
+ accounts: [
627
+ {
628
+ name: "agent",
629
+ writable: true,
630
+ signer: true,
631
+ relations: [
632
+ "vault"
633
+ ]
634
+ },
635
+ {
636
+ name: "vault",
637
+ writable: true,
638
+ pda: {
639
+ seeds: [
640
+ {
641
+ kind: "const",
642
+ value: [
643
+ 118,
644
+ 97,
645
+ 117,
646
+ 108,
647
+ 116
648
+ ]
649
+ },
650
+ {
651
+ kind: "account",
652
+ path: "vault.owner",
653
+ account: "CreditVault"
654
+ },
655
+ {
656
+ kind: "account",
657
+ path: "vault.agent",
658
+ account: "CreditVault"
659
+ }
660
+ ]
661
+ }
662
+ },
663
+ {
664
+ name: "service_token_account",
665
+ docs: [
666
+ "The recipient token account. We only need it for its `owner` field",
667
+ "(the service pubkey we record in PendingSpend); mint constraint is",
668
+ "belt-and-suspenders since `approve_spend` re-checks both."
669
+ ]
670
+ },
671
+ {
672
+ name: "pending_spend",
673
+ writable: true,
674
+ pda: {
675
+ seeds: [
676
+ {
677
+ kind: "const",
678
+ value: [
679
+ 112,
680
+ 101,
681
+ 110,
682
+ 100,
683
+ 105,
684
+ 110,
685
+ 103
686
+ ]
687
+ },
688
+ {
689
+ kind: "account",
690
+ path: "vault"
691
+ },
692
+ {
693
+ kind: "account",
694
+ path: "vault.pending_count",
695
+ account: "CreditVault"
696
+ }
697
+ ]
698
+ }
699
+ },
700
+ {
701
+ name: "system_program",
702
+ address: "11111111111111111111111111111111"
703
+ }
704
+ ],
705
+ args: [
706
+ {
707
+ name: "amount_usdc",
708
+ type: "u64"
709
+ }
710
+ ]
711
+ },
420
712
  {
421
713
  name: "spend",
422
714
  discriminator: [
@@ -742,6 +1034,19 @@ var credit_vault_default = {
742
1034
  70
743
1035
  ]
744
1036
  },
1037
+ {
1038
+ name: "PendingSpend",
1039
+ discriminator: [
1040
+ 193,
1041
+ 205,
1042
+ 85,
1043
+ 66,
1044
+ 25,
1045
+ 3,
1046
+ 67,
1047
+ 134
1048
+ ]
1049
+ },
745
1050
  {
746
1051
  name: "SpendPolicy",
747
1052
  discriminator: [
@@ -796,6 +1101,32 @@ var credit_vault_default = {
796
1101
  161
797
1102
  ]
798
1103
  },
1104
+ {
1105
+ name: "SpendRejected",
1106
+ discriminator: [
1107
+ 22,
1108
+ 233,
1109
+ 208,
1110
+ 109,
1111
+ 202,
1112
+ 231,
1113
+ 175,
1114
+ 22
1115
+ ]
1116
+ },
1117
+ {
1118
+ name: "SpendRequested",
1119
+ discriminator: [
1120
+ 144,
1121
+ 207,
1122
+ 254,
1123
+ 247,
1124
+ 81,
1125
+ 146,
1126
+ 84,
1127
+ 87
1128
+ ]
1129
+ },
799
1130
  {
800
1131
  name: "Spent",
801
1132
  discriminator: [
@@ -912,6 +1243,16 @@ var credit_vault_default = {
912
1243
  code: 6009,
913
1244
  name: "PostPayDisabled",
914
1245
  msg: "Post-pay claims are disabled for this vault"
1246
+ },
1247
+ {
1248
+ code: 6010,
1249
+ name: "PendingSpendVaultMismatch",
1250
+ msg: "Pending spend belongs to a different vault"
1251
+ },
1252
+ {
1253
+ code: 6011,
1254
+ name: "PendingNonceOverflow",
1255
+ msg: "Pending spend counter would overflow"
915
1256
  }
916
1257
  ],
917
1258
  types: [
@@ -1000,12 +1341,22 @@ var credit_vault_default = {
1000
1341
  name: "bump",
1001
1342
  type: "u8"
1002
1343
  },
1344
+ {
1345
+ name: "pending_count",
1346
+ docs: [
1347
+ "Monotonic counter used as a PDA seed for PendingSpend accounts so",
1348
+ "every approval request gets a unique deterministic address.",
1349
+ "Borrowed 8 bytes from the original 64-byte padding so the account",
1350
+ "size stays at `ACCOUNT_SIZE` and existing vaults need no migration."
1351
+ ],
1352
+ type: "u64"
1353
+ },
1003
1354
  {
1004
1355
  name: "_padding",
1005
1356
  type: {
1006
1357
  array: [
1007
1358
  "u8",
1008
- 64
1359
+ 56
1009
1360
  ]
1010
1361
  }
1011
1362
  }
@@ -1040,6 +1391,65 @@ var credit_vault_default = {
1040
1391
  ]
1041
1392
  }
1042
1393
  },
1394
+ {
1395
+ name: "PendingSpend",
1396
+ docs: [
1397
+ "A spend request that exceeded one of the policy's rate limits. The agent",
1398
+ "creates this account by calling `request_spend`; the owner reviews from",
1399
+ "the mobile Alerts tab and either calls `approve_spend` (PDA-signed CPI",
1400
+ "transfer, account closed) or `cancel_spend` (account closed, no transfer).",
1401
+ "",
1402
+ 'Seeded by `["pending", vault, nonce_le]` where `nonce` is the value of',
1403
+ "`vault.pending_count` at request time, so each request has a unique",
1404
+ "deterministic address that both the agent and the owner can derive."
1405
+ ],
1406
+ type: {
1407
+ kind: "struct",
1408
+ fields: [
1409
+ {
1410
+ name: "vault",
1411
+ type: "pubkey"
1412
+ },
1413
+ {
1414
+ name: "agent",
1415
+ type: "pubkey"
1416
+ },
1417
+ {
1418
+ name: "service",
1419
+ docs: [
1420
+ "Owner of the destination token account (mirrors how `Spent` records",
1421
+ "service: `service_token_account.owner`)."
1422
+ ],
1423
+ type: "pubkey"
1424
+ },
1425
+ {
1426
+ name: "amount_usdc",
1427
+ type: "u64"
1428
+ },
1429
+ {
1430
+ name: "requested_slot",
1431
+ type: "u64"
1432
+ },
1433
+ {
1434
+ name: "nonce",
1435
+ type: "u64"
1436
+ },
1437
+ {
1438
+ name: "bump",
1439
+ type: "u8"
1440
+ },
1441
+ {
1442
+ name: "_padding",
1443
+ type: {
1444
+ array: [
1445
+ "u8",
1446
+ 31
1447
+ ]
1448
+ }
1449
+ }
1450
+ ]
1451
+ }
1452
+ },
1043
1453
  {
1044
1454
  name: "PolicyUpdated",
1045
1455
  type: {
@@ -1143,6 +1553,70 @@ var credit_vault_default = {
1143
1553
  ]
1144
1554
  }
1145
1555
  },
1556
+ {
1557
+ name: "SpendRejected",
1558
+ type: {
1559
+ kind: "struct",
1560
+ fields: [
1561
+ {
1562
+ name: "vault",
1563
+ type: "pubkey"
1564
+ },
1565
+ {
1566
+ name: "owner",
1567
+ type: "pubkey"
1568
+ },
1569
+ {
1570
+ name: "pending_spend",
1571
+ type: "pubkey"
1572
+ },
1573
+ {
1574
+ name: "nonce",
1575
+ type: "u64"
1576
+ },
1577
+ {
1578
+ name: "slot",
1579
+ type: "u64"
1580
+ }
1581
+ ]
1582
+ }
1583
+ },
1584
+ {
1585
+ name: "SpendRequested",
1586
+ type: {
1587
+ kind: "struct",
1588
+ fields: [
1589
+ {
1590
+ name: "vault",
1591
+ type: "pubkey"
1592
+ },
1593
+ {
1594
+ name: "agent",
1595
+ type: "pubkey"
1596
+ },
1597
+ {
1598
+ name: "service",
1599
+ type: "pubkey"
1600
+ },
1601
+ {
1602
+ name: "pending_spend",
1603
+ type: "pubkey"
1604
+ },
1605
+ {
1606
+ name: "amount_usdc",
1607
+ type: "u64"
1608
+ },
1609
+ {
1610
+ name: "nonce",
1611
+ type: "u64"
1612
+ },
1613
+ {
1614
+ name: "slot",
1615
+ type: "u64"
1616
+ }
1617
+ ]
1618
+ }
1619
+ },
1146
1620
  {
1147
1621
  name: "Spent",
1148
1622
  type: {