@rebelfi/agent-sdk 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. package/README.md +337 -0
  2. package/dist/amount-utils.d.ts +9 -0
  3. package/dist/amount-utils.js +80 -0
  4. package/dist/amount-utils.js.map +1 -0
  5. package/dist/cjs/amount-utils.js +87 -0
  6. package/dist/cjs/amount-utils.js.map +1 -0
  7. package/dist/cjs/cli.js +189 -0
  8. package/dist/cjs/cli.js.map +1 -0
  9. package/dist/cjs/client.js +49 -0
  10. package/dist/cjs/client.js.map +1 -0
  11. package/dist/cjs/commands/account.js +250 -0
  12. package/dist/cjs/commands/account.js.map +1 -0
  13. package/dist/cjs/commands/auth.js +78 -0
  14. package/dist/cjs/commands/auth.js.map +1 -0
  15. package/dist/cjs/commands/balance.js +15 -0
  16. package/dist/cjs/commands/balance.js.map +1 -0
  17. package/dist/cjs/commands/cancel.js +34 -0
  18. package/dist/cjs/commands/cancel.js.map +1 -0
  19. package/dist/cjs/commands/chat.js +15 -0
  20. package/dist/cjs/commands/chat.js.map +1 -0
  21. package/dist/cjs/commands/claim.js +34 -0
  22. package/dist/cjs/commands/claim.js.map +1 -0
  23. package/dist/cjs/commands/config.js +29 -0
  24. package/dist/cjs/commands/config.js.map +1 -0
  25. package/dist/cjs/commands/contacts.js +29 -0
  26. package/dist/cjs/commands/contacts.js.map +1 -0
  27. package/dist/cjs/commands/init.js +43 -0
  28. package/dist/cjs/commands/init.js.map +1 -0
  29. package/dist/cjs/commands/orders.js +167 -0
  30. package/dist/cjs/commands/orders.js.map +1 -0
  31. package/dist/cjs/commands/pay.js +41 -0
  32. package/dist/cjs/commands/pay.js.map +1 -0
  33. package/dist/cjs/commands/payments.js +27 -0
  34. package/dist/cjs/commands/payments.js.map +1 -0
  35. package/dist/cjs/commands/wallet.js +69 -0
  36. package/dist/cjs/commands/wallet.js.map +1 -0
  37. package/dist/cjs/config.js +91 -0
  38. package/dist/cjs/config.js.map +1 -0
  39. package/dist/cjs/contacts.js +87 -0
  40. package/dist/cjs/contacts.js.map +1 -0
  41. package/dist/cjs/errors.js +93 -0
  42. package/dist/cjs/errors.js.map +1 -0
  43. package/dist/cjs/index.js +64 -0
  44. package/dist/cjs/index.js.map +1 -0
  45. package/dist/cjs/intent/chains.js +29 -0
  46. package/dist/cjs/intent/chains.js.map +1 -0
  47. package/dist/cjs/intent/constraints.js +46 -0
  48. package/dist/cjs/intent/constraints.js.map +1 -0
  49. package/dist/cjs/intent/helpers.js +34 -0
  50. package/dist/cjs/intent/helpers.js.map +1 -0
  51. package/dist/cjs/intent/index.js +99 -0
  52. package/dist/cjs/intent/index.js.map +1 -0
  53. package/dist/cjs/intent/matcher.js +119 -0
  54. package/dist/cjs/intent/matcher.js.map +1 -0
  55. package/dist/cjs/intent/program-registry.js +68 -0
  56. package/dist/cjs/intent/program-registry.js.map +1 -0
  57. package/dist/cjs/intent/token-registry.js +99 -0
  58. package/dist/cjs/intent/token-registry.js.map +1 -0
  59. package/dist/cjs/intent/types.js +3 -0
  60. package/dist/cjs/intent/types.js.map +1 -0
  61. package/dist/cjs/orders/evaluate.js +168 -0
  62. package/dist/cjs/orders/evaluate.js.map +1 -0
  63. package/dist/cjs/orders/index.js +14 -0
  64. package/dist/cjs/orders/index.js.map +1 -0
  65. package/dist/cjs/orders/store.js +47 -0
  66. package/dist/cjs/orders/store.js.map +1 -0
  67. package/dist/cjs/orders/sugar.js +35 -0
  68. package/dist/cjs/orders/sugar.js.map +1 -0
  69. package/dist/cjs/orders/types.js +3 -0
  70. package/dist/cjs/orders/types.js.map +1 -0
  71. package/dist/cjs/output.js +47 -0
  72. package/dist/cjs/output.js.map +1 -0
  73. package/dist/cjs/package.json +1 -0
  74. package/dist/cjs/transfers.js +15 -0
  75. package/dist/cjs/transfers.js.map +1 -0
  76. package/dist/cjs/validate.js +77 -0
  77. package/dist/cjs/validate.js.map +1 -0
  78. package/dist/cjs/verify/decoders/ata.js +19 -0
  79. package/dist/cjs/verify/decoders/ata.js.map +1 -0
  80. package/dist/cjs/verify/decoders/compute-budget.js +32 -0
  81. package/dist/cjs/verify/decoders/compute-budget.js.map +1 -0
  82. package/dist/cjs/verify/decoders/handshake.js +180 -0
  83. package/dist/cjs/verify/decoders/handshake.js.map +1 -0
  84. package/dist/cjs/verify/decoders/jupiter.js +39 -0
  85. package/dist/cjs/verify/decoders/jupiter.js.map +1 -0
  86. package/dist/cjs/verify/decoders/memo.js +12 -0
  87. package/dist/cjs/verify/decoders/memo.js.map +1 -0
  88. package/dist/cjs/verify/decoders/silkysig.js +162 -0
  89. package/dist/cjs/verify/decoders/silkysig.js.map +1 -0
  90. package/dist/cjs/verify/decoders/spl-token.js +125 -0
  91. package/dist/cjs/verify/decoders/spl-token.js.map +1 -0
  92. package/dist/cjs/verify/decoders/system.js +87 -0
  93. package/dist/cjs/verify/decoders/system.js.map +1 -0
  94. package/dist/cjs/verify/flags.js +87 -0
  95. package/dist/cjs/verify/flags.js.map +1 -0
  96. package/dist/cjs/verify/index.js +384 -0
  97. package/dist/cjs/verify/index.js.map +1 -0
  98. package/dist/cjs/verify/registry.js +24 -0
  99. package/dist/cjs/verify/registry.js.map +1 -0
  100. package/dist/cjs/verify/rpc.js +52 -0
  101. package/dist/cjs/verify/rpc.js.map +1 -0
  102. package/dist/cli.d.ts +2 -0
  103. package/dist/cli.js +224 -0
  104. package/dist/cli.js.map +1 -0
  105. package/dist/client.d.ts +7 -0
  106. package/dist/client.js +43 -0
  107. package/dist/client.js.map +1 -0
  108. package/dist/commands/account.d.ts +21 -0
  109. package/dist/commands/account.js +239 -0
  110. package/dist/commands/account.js.map +1 -0
  111. package/dist/commands/auth.d.ts +5 -0
  112. package/dist/commands/auth.js +70 -0
  113. package/dist/commands/auth.js.map +1 -0
  114. package/dist/commands/balance.d.ts +3 -0
  115. package/dist/commands/balance.js +12 -0
  116. package/dist/commands/balance.js.map +1 -0
  117. package/dist/commands/cancel.d.ts +3 -0
  118. package/dist/commands/cancel.js +28 -0
  119. package/dist/commands/cancel.js.map +1 -0
  120. package/dist/commands/chat.d.ts +1 -0
  121. package/dist/commands/chat.js +12 -0
  122. package/dist/commands/chat.js.map +1 -0
  123. package/dist/commands/claim.d.ts +3 -0
  124. package/dist/commands/claim.js +28 -0
  125. package/dist/commands/claim.js.map +1 -0
  126. package/dist/commands/config.d.ts +3 -0
  127. package/dist/commands/config.js +24 -0
  128. package/dist/commands/config.js.map +1 -0
  129. package/dist/commands/contacts.d.ts +4 -0
  130. package/dist/commands/contacts.js +23 -0
  131. package/dist/commands/contacts.js.map +1 -0
  132. package/dist/commands/init.d.ts +1 -0
  133. package/dist/commands/init.js +37 -0
  134. package/dist/commands/init.js.map +1 -0
  135. package/dist/commands/orders.d.ts +19 -0
  136. package/dist/commands/orders.js +157 -0
  137. package/dist/commands/orders.js.map +1 -0
  138. package/dist/commands/pay.d.ts +4 -0
  139. package/dist/commands/pay.js +35 -0
  140. package/dist/commands/pay.js.map +1 -0
  141. package/dist/commands/payments.d.ts +4 -0
  142. package/dist/commands/payments.js +23 -0
  143. package/dist/commands/payments.js.map +1 -0
  144. package/dist/commands/wallet.d.ts +7 -0
  145. package/dist/commands/wallet.js +61 -0
  146. package/dist/commands/wallet.js.map +1 -0
  147. package/dist/config.d.ts +40 -0
  148. package/dist/config.js +74 -0
  149. package/dist/config.js.map +1 -0
  150. package/dist/contacts.d.ts +15 -0
  151. package/dist/contacts.js +74 -0
  152. package/dist/contacts.js.map +1 -0
  153. package/dist/errors.d.ts +14 -0
  154. package/dist/errors.js +87 -0
  155. package/dist/errors.js.map +1 -0
  156. package/dist/index.d.ts +18 -0
  157. package/dist/index.js +14 -0
  158. package/dist/index.js.map +1 -0
  159. package/dist/intent/chains.d.ts +7 -0
  160. package/dist/intent/chains.js +24 -0
  161. package/dist/intent/chains.js.map +1 -0
  162. package/dist/intent/constraints.d.ts +8 -0
  163. package/dist/intent/constraints.js +43 -0
  164. package/dist/intent/constraints.js.map +1 -0
  165. package/dist/intent/helpers.d.ts +6 -0
  166. package/dist/intent/helpers.js +27 -0
  167. package/dist/intent/helpers.js.map +1 -0
  168. package/dist/intent/index.d.ts +11 -0
  169. package/dist/intent/index.js +87 -0
  170. package/dist/intent/index.js.map +1 -0
  171. package/dist/intent/matcher.d.ts +8 -0
  172. package/dist/intent/matcher.js +116 -0
  173. package/dist/intent/matcher.js.map +1 -0
  174. package/dist/intent/program-registry.d.ts +13 -0
  175. package/dist/intent/program-registry.js +65 -0
  176. package/dist/intent/program-registry.js.map +1 -0
  177. package/dist/intent/token-registry.d.ts +17 -0
  178. package/dist/intent/token-registry.js +96 -0
  179. package/dist/intent/token-registry.js.map +1 -0
  180. package/dist/intent/types.d.ts +89 -0
  181. package/dist/intent/types.js +2 -0
  182. package/dist/intent/types.js.map +1 -0
  183. package/dist/orders/evaluate.d.ts +28 -0
  184. package/dist/orders/evaluate.js +165 -0
  185. package/dist/orders/evaluate.js.map +1 -0
  186. package/dist/orders/index.d.ts +7 -0
  187. package/dist/orders/index.js +4 -0
  188. package/dist/orders/index.js.map +1 -0
  189. package/dist/orders/store.d.ts +9 -0
  190. package/dist/orders/store.js +37 -0
  191. package/dist/orders/store.js.map +1 -0
  192. package/dist/orders/sugar.d.ts +13 -0
  193. package/dist/orders/sugar.js +32 -0
  194. package/dist/orders/sugar.js.map +1 -0
  195. package/dist/orders/types.d.ts +37 -0
  196. package/dist/orders/types.js +2 -0
  197. package/dist/orders/types.js.map +1 -0
  198. package/dist/output.d.ts +4 -0
  199. package/dist/output.js +42 -0
  200. package/dist/output.js.map +1 -0
  201. package/dist/transfers.d.ts +32 -0
  202. package/dist/transfers.js +12 -0
  203. package/dist/transfers.js.map +1 -0
  204. package/dist/validate.d.ts +8 -0
  205. package/dist/validate.js +69 -0
  206. package/dist/validate.js.map +1 -0
  207. package/dist/verify/decoders/ata.d.ts +5 -0
  208. package/dist/verify/decoders/ata.js +16 -0
  209. package/dist/verify/decoders/ata.js.map +1 -0
  210. package/dist/verify/decoders/compute-budget.d.ts +5 -0
  211. package/dist/verify/decoders/compute-budget.js +29 -0
  212. package/dist/verify/decoders/compute-budget.js.map +1 -0
  213. package/dist/verify/decoders/handshake.d.ts +5 -0
  214. package/dist/verify/decoders/handshake.js +177 -0
  215. package/dist/verify/decoders/handshake.js.map +1 -0
  216. package/dist/verify/decoders/jupiter.d.ts +5 -0
  217. package/dist/verify/decoders/jupiter.js +36 -0
  218. package/dist/verify/decoders/jupiter.js.map +1 -0
  219. package/dist/verify/decoders/memo.d.ts +5 -0
  220. package/dist/verify/decoders/memo.js +9 -0
  221. package/dist/verify/decoders/memo.js.map +1 -0
  222. package/dist/verify/decoders/silkysig.d.ts +5 -0
  223. package/dist/verify/decoders/silkysig.js +159 -0
  224. package/dist/verify/decoders/silkysig.js.map +1 -0
  225. package/dist/verify/decoders/spl-token.d.ts +5 -0
  226. package/dist/verify/decoders/spl-token.js +122 -0
  227. package/dist/verify/decoders/spl-token.js.map +1 -0
  228. package/dist/verify/decoders/system.d.ts +5 -0
  229. package/dist/verify/decoders/system.js +84 -0
  230. package/dist/verify/decoders/system.js.map +1 -0
  231. package/dist/verify/flags.d.ts +3 -0
  232. package/dist/verify/flags.js +83 -0
  233. package/dist/verify/flags.js.map +1 -0
  234. package/dist/verify/index.d.ts +75 -0
  235. package/dist/verify/index.js +380 -0
  236. package/dist/verify/index.js.map +1 -0
  237. package/dist/verify/registry.d.ts +13 -0
  238. package/dist/verify/registry.js +21 -0
  239. package/dist/verify/registry.js.map +1 -0
  240. package/dist/verify/rpc.d.ts +14 -0
  241. package/dist/verify/rpc.js +48 -0
  242. package/dist/verify/rpc.js.map +1 -0
  243. package/package.json +85 -0
package/README.md ADDED
@@ -0,0 +1,337 @@
1
+ <h1 align="center">@rebelfi/agent-sdk</h1>
2
+
3
+ <p align="center">
4
+ <strong>Give your AI agent a bank account on Solana. One command.</strong>
5
+ </p>
6
+
7
+ <p align="center">
8
+ <a href="https://www.npmjs.com/package/@rebelfi/agent-sdk"><img src="https://img.shields.io/npm/v/@rebelfi/agent-sdk" alt="npm version" /></a>
9
+ <a href="https://www.npmjs.com/package/@rebelfi/agent-sdk"><img src="https://img.shields.io/npm/dm/@rebelfi/agent-sdk" alt="npm downloads" /></a>
10
+ <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="License: MIT" /></a>
11
+ <a href="https://github.com/silkysquad/silk/stargazers"><img src="https://img.shields.io/github/stars/silkysquad/silk?style=social" alt="GitHub stars" /></a>
12
+ </p>
13
+
14
+ ---
15
+
16
+ TypeScript SDK and CLI for AI agent payments on Solana. Policy-controlled accounts with on-chain spending limits, time-locked escrow transfers, transaction verification, and conditional payment flows — for Claude, GPT, LangChain, and any autonomous agent.
17
+
18
+ ## Why This Exists
19
+
20
+ Giving an agent a wallet keypair is like handing an employee an envelope of cash. It works, technically. But one hallucination, one prompt injection, one compromised dependency — and the entire balance is gone in a single transaction.
21
+
22
+ Current mitigations are all inadequate:
23
+
24
+ | Approach | Problem |
25
+ |----------|---------|
26
+ | Human-in-the-loop | Defeats the purpose of automation |
27
+ | Rate limits in agent code | Not enforceable — the agent can be modified or bypassed |
28
+ | Custodial APIs | You're trusting a third party with your funds |
29
+
30
+ **The insight:** agent financial safety is an infrastructure problem, not an AI alignment problem.
31
+
32
+ RebelFi replaces wallets with **policy-controlled accounts** — on-chain Solana programs that enforce spending rules at the protocol level. The chain itself rejects transactions that exceed limits. Not the agent's code. Not an API layer. Not a human reviewer.
33
+
34
+ ```
35
+ Agent: "Send $10,000 to some address"
36
+ Chain: Transaction rejected. Operator limit: $100/tx.
37
+ ```
38
+
39
+ Prompt injection can't drain funds beyond policy limits. Hallucinating agents can't make catastrophic financial decisions. Compromised agent keys are damage-limited by policy. Humans set policies once, then trust the chain — not the agent.
40
+
41
+ ## Quick Start
42
+
43
+ ```bash
44
+ npm install @rebelfi/agent-sdk
45
+
46
+ # Initialize — creates a wallet and agent ID
47
+ rebel init
48
+
49
+ # Switch to devnet for testing
50
+ rebel config set-cluster devnet
51
+
52
+ # Fund your wallet (devnet only)
53
+ rebel wallet fund --sol --usdc
54
+
55
+ # Send your first payment
56
+ rebel pay <recipient> 10 --memo "first payment"
57
+ ```
58
+
59
+ That's it. Wallet created, funded, payment sent — under 2 minutes.
60
+
61
+ ## Features
62
+
63
+ ### Policy-Controlled Accounts
64
+
65
+ Managed token accounts with operator delegation and per-transaction spending limits. Account owners (humans) set policies; agents operate within them.
66
+
67
+ ```bash
68
+ # Discover your on-chain account
69
+ rebel account sync
70
+
71
+ # Check balance and policy info
72
+ rebel account status
73
+ # → Balance: 500.00 USDC | Policy: max $100.00/tx
74
+
75
+ # Send within limits — works
76
+ rebel account send <recipient> 50
77
+
78
+ # Exceed limits — rejected on-chain
79
+ rebel account send <recipient> 200
80
+ # → REJECTED: amount $200.00 exceeds per-transaction limit of $100.00
81
+ ```
82
+
83
+ ### Escrow Payments
84
+
85
+ Time-locked USDC transfers via the Handshake protocol. Sender deposits to escrow, recipient claims. Sender can cancel before claim.
86
+
87
+ ```bash
88
+ rebel pay <recipient> 25 --memo "Invoice #42"
89
+ rebel claim <transferPda>
90
+ rebel cancel <transferPda>
91
+ rebel payments list
92
+ ```
93
+
94
+ ### Transaction Verification
95
+
96
+ Decode and analyze any Solana transaction before signing. Supports System, SPL Token, ATA, Compute Budget, Memo, Handshake, RebelSig, and Jupiter programs.
97
+
98
+ ```typescript
99
+ import { analyzeTransaction, verifyIntent } from '@rebelfi/agent-sdk';
100
+
101
+ // Human-readable breakdown of any transaction
102
+ const analysis = await analyzeTransaction(txBase64);
103
+ console.log(analysis.summary);
104
+ // → "Handshake transfer of 100 USDC from Alice to Bob"
105
+
106
+ // Verify a transaction matches your intent
107
+ const result = await verifyIntent(txBase64, {
108
+ type: 'transfer_from_account',
109
+ owner: 'owner...',
110
+ recipient: 'recipient...',
111
+ amount: '50',
112
+ token: 'USDC',
113
+ });
114
+
115
+ if (!result.verified) {
116
+ console.error('Mismatch:', result.discrepancies);
117
+ }
118
+ ```
119
+
120
+ Risk flags are surfaced automatically:
121
+
122
+ | Severity | Example |
123
+ |----------|---------|
124
+ | `error` | Unknown program in transaction |
125
+ | `warning` | Fee payer differs from signer |
126
+ | `info` | Priority fee set |
127
+
128
+ ### Cross-Chain Intent Framework
129
+
130
+ Type-safe intent definitions with constraint support. Currently implements Solana, extensible to EVM chains.
131
+
132
+ ```typescript
133
+ import type { SingleIntent } from '@rebelfi/agent-sdk';
134
+
135
+ const swap: SingleIntent = {
136
+ chain: 'solana',
137
+ signer: 'agent...',
138
+ action: 'swap',
139
+ tokenIn: { tokenSymbol: 'USDC' },
140
+ tokenOut: { tokenSymbol: 'SOL' },
141
+ amountIn: { lte: '500' }, // constrained amounts
142
+ slippage: 0.5,
143
+ };
144
+ ```
145
+
146
+ Supported actions: `transfer`, `swap`, `stake`, `lend`, `borrow`, `approve`, `withdraw`, `custom`.
147
+
148
+ ### Conditional Flows
149
+
150
+ Multi-step workflows with conditions, intents, and compute steps. Built-in templates for common patterns.
151
+
152
+ ```bash
153
+ # Limit order: buy SOL when price drops below $120
154
+ rebel flows create limit-order \
155
+ --sell "500 USDC" --buy SOL --price 120 \
156
+ --slippage 0.5 --expires 7d
157
+
158
+ rebel flows list
159
+ rebel flows evaluate # run heartbeat
160
+ ```
161
+
162
+ Conditions: `price_below`, `price_above`, `time_reached`, `balance_above`.
163
+
164
+ ### Contacts
165
+
166
+ Local address book for named recipients.
167
+
168
+ ```bash
169
+ rebel contacts add alice <address>
170
+ rebel pay alice 10 # resolves by name
171
+ ```
172
+
173
+ ## How It Works
174
+
175
+ ```
176
+ Your Agent (Claude, GPT, LangChain, CrewAI, custom)
177
+
178
+
179
+ rebel CLI / @rebelfi/agent-sdk library
180
+
181
+ ├── Local wallet management (keys never leave your machine)
182
+ ├── Transaction verification (decode before signing)
183
+ ├── Intent matching and risk flagging
184
+
185
+
186
+ RebelFi API (transaction builder)
187
+
188
+
189
+ Solana
190
+ ├── Handshake — time-locked escrow transfers
191
+ └── RebelSig — policy-controlled accounts with operator delegation
192
+ ```
193
+
194
+ Private keys never leave the agent's machine. The API builds unsigned transactions; the SDK signs locally and submits.
195
+
196
+ ## Comparison
197
+
198
+ | | rebel | Raw @solana/web3.js | Centralized Payment APIs |
199
+ |---|---|---|---|
200
+ | Spending limits | On-chain enforced per-tx | None | API-level (bypassable) |
201
+ | Prompt injection safe | Chain rejects over-limit txs | Full key access, no limits | Trust the provider |
202
+ | Escrow payments | Built-in (Handshake) | Build from scratch | Varies |
203
+ | Self-custody | Yes, local keys | Yes | No |
204
+ | Tx verification | Built-in decoder + risk flags | Manual parsing | N/A |
205
+ | Time to first payment | 2 minutes | Hours | Minutes |
206
+ | Open source | MIT | Yes | Usually no |
207
+
208
+ ## Use With AI Agents
209
+
210
+ The SDK is designed for AI agent frameworks. Here's a typical integration pattern:
211
+
212
+ ```typescript
213
+ import {
214
+ loadConfig,
215
+ getApiUrl,
216
+ getApiKey,
217
+ createHttpClient,
218
+ verifyIntent,
219
+ } from '@rebelfi/agent-sdk';
220
+
221
+ // In your Claude/GPT/LangChain tool handler
222
+ async function handlePayment(recipient: string, amount: number, memo: string) {
223
+ const config = loadConfig();
224
+ const client = createHttpClient({
225
+ baseUrl: getApiUrl(config),
226
+ apiKey: getApiKey(config),
227
+ });
228
+
229
+ // Build, verify, sign, submit
230
+ // Policy-controlled — agent can't exceed human-set limits
231
+ const res = await client.post('/api/transfer/create', {
232
+ recipient,
233
+ amount,
234
+ memo,
235
+ });
236
+
237
+ // Verify the transaction matches your intent before signing
238
+ const check = await verifyIntent(res.data.transaction, {
239
+ type: 'create_transfer',
240
+ sender: config.wallets[0].address,
241
+ recipient,
242
+ amount: String(amount),
243
+ token: 'USDC',
244
+ });
245
+
246
+ if (!check.verified) throw new Error('Transaction mismatch');
247
+ return res.data;
248
+ }
249
+ ```
250
+
251
+ Works with **Claude** (tool use / MCP), **GPT** (function calling), **LangChain**, **CrewAI**, **AutoGPT**, and any framework that supports tool/function definitions.
252
+
253
+ ### MCP Integration
254
+
255
+ The SDK can be exposed as an [MCP (Model Context Protocol)](https://modelcontextprotocol.io) server, giving Claude, Cursor, and other AI coding tools direct access to payments, account management, and transaction verification as tools. Build your own MCP wrapper or check the docs for the reference implementation.
256
+
257
+ ## CLI Reference
258
+
259
+ | Command | Description |
260
+ |---------|-------------|
261
+ | `rebel init` | Create wallet + agent ID |
262
+ | `rebel auth register\|status\|revoke` | API key management |
263
+ | `rebel wallet create\|list\|fund` | Wallet operations |
264
+ | `rebel balance` | Check balances |
265
+ | `rebel pay <to> <amount>` | Send USDC payment |
266
+ | `rebel claim <pda>` | Claim a received payment |
267
+ | `rebel cancel <pda>` | Cancel a sent payment |
268
+ | `rebel payments list\|get` | Payment history |
269
+ | `rebel account sync\|status\|events\|deposit\|withdraw\|send` | RebelSig account |
270
+ | `rebel contacts add\|remove\|list\|get` | Address book |
271
+ | `rebel flows create\|list\|get\|cancel\|evaluate` | Conditional flows |
272
+ | `rebel config set-cluster\|get-cluster\|reset-cluster` | Configuration |
273
+ | `rebel chat <message>` | Support chat |
274
+
275
+ All commands support `--human` for human-readable output (default is JSON).
276
+
277
+ ## Library API
278
+
279
+ ```typescript
280
+ import {
281
+ // Config & client
282
+ loadConfig, saveConfig, getWallet, getApiUrl, getApiKey,
283
+ createHttpClient,
284
+
285
+ // Contacts
286
+ loadContacts, addContact, resolveRecipient,
287
+
288
+ // Transaction verification (V1 — Solana)
289
+ analyzeTransaction, verifyIntent,
290
+
291
+ // Intent framework (V2 — cross-chain)
292
+ verifyIntent as verifyIntentV2,
293
+ evaluateConstraint,
294
+
295
+ // Flows
296
+ loadFlows, addFlow, executeHeartbeat, createLimitOrder,
297
+
298
+ // Errors
299
+ SdkError, toSdkError,
300
+ } from '@rebelfi/agent-sdk';
301
+ ```
302
+
303
+ ## Environment Variables
304
+
305
+ | Variable | Description |
306
+ |----------|-------------|
307
+ | `REBEL_API_URL` | Override the API endpoint |
308
+ | `REBEL_API_KEY` | Provide API key without local config |
309
+
310
+ ## Development
311
+
312
+ ```bash
313
+ bun run build # Dual ESM + CJS build
314
+ bun run dev # TypeScript watch mode
315
+ bun run test # Vitest (single run)
316
+ bun run test:watch # Vitest watch mode
317
+ bun run clean # Remove dist/
318
+ ```
319
+
320
+ ## Links
321
+
322
+ - [Documentation](https://docs.silkyway.ai)
323
+ - [GitHub Issues](https://github.com/silkysquad/silk/issues)
324
+ - [npm](https://www.npmjs.com/package/@rebelfi/agent-sdk)
325
+ - [Twitter](https://x.com/silkyway)
326
+
327
+ ---
328
+
329
+ <p align="center">
330
+ If you find this useful, please consider giving it a star — it helps others discover the project.
331
+ <br /><br />
332
+ <a href="https://github.com/silkysquad/silk">Star on GitHub</a>
333
+ </p>
334
+
335
+ ## License
336
+
337
+ MIT
@@ -0,0 +1,9 @@
1
+ export interface DecimalValue {
2
+ int: bigint;
3
+ scale: number;
4
+ }
5
+ export declare function parseDecimal(value: string | number): DecimalValue | null;
6
+ export declare function compareDecimals(a: DecimalValue, b: DecimalValue): number;
7
+ export declare function formatUnits(amount: bigint, decimals: number): string;
8
+ export declare function withinRelativeTolerance(expected: DecimalValue, actual: DecimalValue, tolerance: DecimalValue): boolean;
9
+ export declare function extractAmountFromHuman(amountHuman: string | undefined): string | null;
@@ -0,0 +1,80 @@
1
+ const DECIMAL_RE = /^-?\d+(?:\.\d+)?$/;
2
+ export function parseDecimal(value) {
3
+ const input = String(value).trim();
4
+ if (!DECIMAL_RE.test(input)) {
5
+ return null;
6
+ }
7
+ const negative = input.startsWith('-');
8
+ const unsigned = negative ? input.slice(1) : input;
9
+ const [wholeRaw, fractionRaw = ''] = unsigned.split('.');
10
+ const whole = stripLeadingZeros(wholeRaw);
11
+ const fraction = stripTrailingZeros(fractionRaw);
12
+ const digits = `${whole}${fraction}`;
13
+ const int = BigInt(digits === '' ? '0' : digits) * (negative ? -1n : 1n);
14
+ return { int, scale: fraction.length };
15
+ }
16
+ export function compareDecimals(a, b) {
17
+ const scale = Math.max(a.scale, b.scale);
18
+ const aInt = scaleDecimal(a, scale);
19
+ const bInt = scaleDecimal(b, scale);
20
+ if (aInt === bInt)
21
+ return 0;
22
+ return aInt > bInt ? 1 : -1;
23
+ }
24
+ export function formatUnits(amount, decimals) {
25
+ if (decimals <= 0) {
26
+ return amount.toString();
27
+ }
28
+ const negative = amount < 0n;
29
+ const absAmount = negative ? -amount : amount;
30
+ const base = 10n ** BigInt(decimals);
31
+ const whole = absAmount / base;
32
+ const fraction = absAmount % base;
33
+ if (fraction === 0n) {
34
+ return `${negative ? '-' : ''}${whole.toString()}`;
35
+ }
36
+ const fractionStr = fraction.toString().padStart(decimals, '0').replace(/0+$/, '');
37
+ return `${negative ? '-' : ''}${whole.toString()}.${fractionStr}`;
38
+ }
39
+ export function withinRelativeTolerance(expected, actual, tolerance) {
40
+ if (tolerance.int < 0n)
41
+ return false;
42
+ const valueScale = Math.max(expected.scale, actual.scale);
43
+ const expectedInt = scaleDecimal(expected, valueScale);
44
+ const actualInt = scaleDecimal(actual, valueScale);
45
+ if (expectedInt === 0n) {
46
+ return actualInt === 0n;
47
+ }
48
+ const diff = abs(actualInt - expectedInt);
49
+ const tolDen = 10n ** BigInt(tolerance.scale);
50
+ const lhs = diff * tolDen;
51
+ const rhs = abs(expectedInt) * tolerance.int;
52
+ return lhs <= rhs;
53
+ }
54
+ export function extractAmountFromHuman(amountHuman) {
55
+ if (!amountHuman)
56
+ return null;
57
+ const [amount] = amountHuman.trim().split(/\s+/);
58
+ if (!amount || !DECIMAL_RE.test(amount)) {
59
+ return null;
60
+ }
61
+ return amount;
62
+ }
63
+ function scaleDecimal(value, targetScale) {
64
+ if (targetScale < value.scale) {
65
+ throw new Error('targetScale must be >= current scale');
66
+ }
67
+ const multiplier = 10n ** BigInt(targetScale - value.scale);
68
+ return value.int * multiplier;
69
+ }
70
+ function stripLeadingZeros(value) {
71
+ const stripped = value.replace(/^0+/, '');
72
+ return stripped === '' ? '0' : stripped;
73
+ }
74
+ function stripTrailingZeros(value) {
75
+ return value.replace(/0+$/, '');
76
+ }
77
+ function abs(value) {
78
+ return value < 0n ? -value : value;
79
+ }
80
+ //# sourceMappingURL=amount-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"amount-utils.js","sourceRoot":"","sources":["../src/amount-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseDecimal = parseDecimal;
4
+ exports.compareDecimals = compareDecimals;
5
+ exports.formatUnits = formatUnits;
6
+ exports.withinRelativeTolerance = withinRelativeTolerance;
7
+ exports.extractAmountFromHuman = extractAmountFromHuman;
8
+ const DECIMAL_RE = /^-?\d+(?:\.\d+)?$/;
9
+ function parseDecimal(value) {
10
+ const input = String(value).trim();
11
+ if (!DECIMAL_RE.test(input)) {
12
+ return null;
13
+ }
14
+ const negative = input.startsWith('-');
15
+ const unsigned = negative ? input.slice(1) : input;
16
+ const [wholeRaw, fractionRaw = ''] = unsigned.split('.');
17
+ const whole = stripLeadingZeros(wholeRaw);
18
+ const fraction = stripTrailingZeros(fractionRaw);
19
+ const digits = `${whole}${fraction}`;
20
+ const int = BigInt(digits === '' ? '0' : digits) * (negative ? -1n : 1n);
21
+ return { int, scale: fraction.length };
22
+ }
23
+ function compareDecimals(a, b) {
24
+ const scale = Math.max(a.scale, b.scale);
25
+ const aInt = scaleDecimal(a, scale);
26
+ const bInt = scaleDecimal(b, scale);
27
+ if (aInt === bInt)
28
+ return 0;
29
+ return aInt > bInt ? 1 : -1;
30
+ }
31
+ function formatUnits(amount, decimals) {
32
+ if (decimals <= 0) {
33
+ return amount.toString();
34
+ }
35
+ const negative = amount < 0n;
36
+ const absAmount = negative ? -amount : amount;
37
+ const base = 10n ** BigInt(decimals);
38
+ const whole = absAmount / base;
39
+ const fraction = absAmount % base;
40
+ if (fraction === 0n) {
41
+ return `${negative ? '-' : ''}${whole.toString()}`;
42
+ }
43
+ const fractionStr = fraction.toString().padStart(decimals, '0').replace(/0+$/, '');
44
+ return `${negative ? '-' : ''}${whole.toString()}.${fractionStr}`;
45
+ }
46
+ function withinRelativeTolerance(expected, actual, tolerance) {
47
+ if (tolerance.int < 0n)
48
+ return false;
49
+ const valueScale = Math.max(expected.scale, actual.scale);
50
+ const expectedInt = scaleDecimal(expected, valueScale);
51
+ const actualInt = scaleDecimal(actual, valueScale);
52
+ if (expectedInt === 0n) {
53
+ return actualInt === 0n;
54
+ }
55
+ const diff = abs(actualInt - expectedInt);
56
+ const tolDen = 10n ** BigInt(tolerance.scale);
57
+ const lhs = diff * tolDen;
58
+ const rhs = abs(expectedInt) * tolerance.int;
59
+ return lhs <= rhs;
60
+ }
61
+ function extractAmountFromHuman(amountHuman) {
62
+ if (!amountHuman)
63
+ return null;
64
+ const [amount] = amountHuman.trim().split(/\s+/);
65
+ if (!amount || !DECIMAL_RE.test(amount)) {
66
+ return null;
67
+ }
68
+ return amount;
69
+ }
70
+ function scaleDecimal(value, targetScale) {
71
+ if (targetScale < value.scale) {
72
+ throw new Error('targetScale must be >= current scale');
73
+ }
74
+ const multiplier = 10n ** BigInt(targetScale - value.scale);
75
+ return value.int * multiplier;
76
+ }
77
+ function stripLeadingZeros(value) {
78
+ const stripped = value.replace(/^0+/, '');
79
+ return stripped === '' ? '0' : stripped;
80
+ }
81
+ function stripTrailingZeros(value) {
82
+ return value.replace(/0+$/, '');
83
+ }
84
+ function abs(value) {
85
+ return value < 0n ? -value : value;
86
+ }
87
+ //# sourceMappingURL=amount-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"amount-utils.js","sourceRoot":"","sources":["../../src/amount-utils.ts"],"names":[],"mappings":"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"}