@sardis/ai-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/CHANGELOG.md +44 -0
- package/LICENSE +21 -0
- package/README.md +257 -0
- package/dist/chunk-BVUWWUQU.js +454 -0
- package/dist/chunk-BVUWWUQU.js.map +1 -0
- package/dist/chunk-LMCXCW32.js +216 -0
- package/dist/chunk-LMCXCW32.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/provider.d.ts +140 -0
- package/dist/provider.js +4 -0
- package/dist/provider.js.map +1 -0
- package/dist/tools.d.ts +64 -0
- package/dist/tools.js +3 -0
- package/dist/tools.js.map +1 -0
- package/dist/types-Cdb1Gu2W.d.ts +192 -0
- package/package.json +87 -0
|
@@ -0,0 +1,454 @@
|
|
|
1
|
+
import { tool } from 'ai';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
|
|
4
|
+
// src/tools.ts
|
|
5
|
+
var PaymentParamsSchema = z.object({
|
|
6
|
+
/** Recipient address or merchant identifier */
|
|
7
|
+
to: z.string().describe("Recipient wallet address or merchant ID"),
|
|
8
|
+
/** Amount in USD */
|
|
9
|
+
amount: z.number().positive().describe("Payment amount in USD"),
|
|
10
|
+
/** Token to use (default: USDC) */
|
|
11
|
+
token: z.string().optional().default("USDC").describe("Token to use for payment"),
|
|
12
|
+
/** Chain to execute on */
|
|
13
|
+
chain: z.enum(["base", "polygon", "ethereum", "arbitrum", "optimism"]).optional().default("base").describe("Blockchain network"),
|
|
14
|
+
/** Payment description/memo */
|
|
15
|
+
memo: z.string().optional().describe("Description or memo for the payment"),
|
|
16
|
+
/** Merchant name for policy checks */
|
|
17
|
+
merchant: z.string().optional().describe("Merchant name for policy validation"),
|
|
18
|
+
/** Merchant category code */
|
|
19
|
+
category: z.string().optional().describe('Merchant category code (e.g., "software", "travel")'),
|
|
20
|
+
/** Idempotency key to prevent duplicates */
|
|
21
|
+
idempotencyKey: z.string().optional().describe("Unique key to prevent duplicate payments")
|
|
22
|
+
});
|
|
23
|
+
var HoldParamsSchema = z.object({
|
|
24
|
+
/** Amount to hold in USD */
|
|
25
|
+
amount: z.number().positive().describe("Hold amount in USD"),
|
|
26
|
+
/** Merchant name */
|
|
27
|
+
merchant: z.string().describe("Merchant name for the hold"),
|
|
28
|
+
/** Hold expiration in hours (default: 24) */
|
|
29
|
+
expiresInHours: z.number().optional().default(24).describe("Hours until hold expires"),
|
|
30
|
+
/** Description of the hold purpose */
|
|
31
|
+
description: z.string().optional().describe("Description of what the hold is for")
|
|
32
|
+
});
|
|
33
|
+
var CaptureParamsSchema = z.object({
|
|
34
|
+
/** Hold ID to capture */
|
|
35
|
+
holdId: z.string().describe("ID of the hold to capture"),
|
|
36
|
+
/** Amount to capture (defaults to full hold amount) */
|
|
37
|
+
amount: z.number().positive().optional().describe("Amount to capture (partial capture if less than hold)")
|
|
38
|
+
});
|
|
39
|
+
var PolicyCheckParamsSchema = z.object({
|
|
40
|
+
/** Amount to check */
|
|
41
|
+
amount: z.number().positive().describe("Amount to check against policy"),
|
|
42
|
+
/** Merchant name */
|
|
43
|
+
merchant: z.string().optional().describe("Merchant name for policy check"),
|
|
44
|
+
/** Merchant category */
|
|
45
|
+
category: z.string().optional().describe("Merchant category for policy check")
|
|
46
|
+
});
|
|
47
|
+
var BalanceParamsSchema = z.object({
|
|
48
|
+
/** Token to check (default: USDC) */
|
|
49
|
+
token: z.string().optional().default("USDC").describe("Token to check balance for"),
|
|
50
|
+
/** Chain to check */
|
|
51
|
+
chain: z.string().optional().describe("Specific chain to check balance on")
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
// src/tools.ts
|
|
55
|
+
var SardisToolClient = class {
|
|
56
|
+
apiKey;
|
|
57
|
+
walletId;
|
|
58
|
+
agentId;
|
|
59
|
+
baseUrl;
|
|
60
|
+
simulationMode;
|
|
61
|
+
maxPaymentAmount;
|
|
62
|
+
blockedCategories;
|
|
63
|
+
allowedMerchants;
|
|
64
|
+
resolvedAgentId;
|
|
65
|
+
resolvingAgentId;
|
|
66
|
+
constructor(config) {
|
|
67
|
+
this.apiKey = config.apiKey;
|
|
68
|
+
this.walletId = config.walletId;
|
|
69
|
+
this.agentId = config.agentId;
|
|
70
|
+
this.baseUrl = (config.baseUrl || "https://api.sardis.network").replace(/\/$/, "");
|
|
71
|
+
this.simulationMode = config.simulationMode || false;
|
|
72
|
+
this.maxPaymentAmount = config.maxPaymentAmount;
|
|
73
|
+
this.blockedCategories = config.blockedCategories || [];
|
|
74
|
+
this.allowedMerchants = config.allowedMerchants;
|
|
75
|
+
}
|
|
76
|
+
async request(method, path, body) {
|
|
77
|
+
const response = await fetch(`${this.baseUrl}${path}`, {
|
|
78
|
+
method,
|
|
79
|
+
headers: {
|
|
80
|
+
"X-API-Key": this.apiKey,
|
|
81
|
+
"Content-Type": "application/json",
|
|
82
|
+
...this.simulationMode && { "X-Simulation-Mode": "true" }
|
|
83
|
+
},
|
|
84
|
+
body: body ? JSON.stringify(body) : void 0
|
|
85
|
+
});
|
|
86
|
+
if (!response.ok) {
|
|
87
|
+
const error = await response.json().catch(() => null);
|
|
88
|
+
const message = error && typeof error === "object" && ("message" in error || "detail" in error) && // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
89
|
+
(error.message || error.detail) || `API error: ${response.status}`;
|
|
90
|
+
throw new Error(message);
|
|
91
|
+
}
|
|
92
|
+
return await response.json();
|
|
93
|
+
}
|
|
94
|
+
async getEffectiveAgentId() {
|
|
95
|
+
if (this.agentId) return this.agentId;
|
|
96
|
+
if (this.resolvedAgentId) return this.resolvedAgentId;
|
|
97
|
+
if (!this.resolvingAgentId) {
|
|
98
|
+
this.resolvingAgentId = (async () => {
|
|
99
|
+
const wallet = await this.request(
|
|
100
|
+
"GET",
|
|
101
|
+
`/api/v2/wallets/${this.walletId}`
|
|
102
|
+
);
|
|
103
|
+
if (!wallet.agent_id) {
|
|
104
|
+
throw new Error("Wallet has no agent_id");
|
|
105
|
+
}
|
|
106
|
+
this.resolvedAgentId = wallet.agent_id;
|
|
107
|
+
return wallet.agent_id;
|
|
108
|
+
})();
|
|
109
|
+
}
|
|
110
|
+
return this.resolvingAgentId;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Local policy pre-check before API call.
|
|
114
|
+
*/
|
|
115
|
+
preCheckPolicy(amount, merchant, category) {
|
|
116
|
+
if (this.maxPaymentAmount && amount > this.maxPaymentAmount) {
|
|
117
|
+
return {
|
|
118
|
+
allowed: false,
|
|
119
|
+
reason: `Amount $${amount} exceeds maximum allowed payment of $${this.maxPaymentAmount}`
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
if (category && this.blockedCategories.includes(category.toLowerCase())) {
|
|
123
|
+
return {
|
|
124
|
+
allowed: false,
|
|
125
|
+
reason: `Category "${category}" is blocked by policy`
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
if (this.allowedMerchants && merchant) {
|
|
129
|
+
if (!this.allowedMerchants.includes(merchant.toLowerCase())) {
|
|
130
|
+
return {
|
|
131
|
+
allowed: false,
|
|
132
|
+
reason: `Merchant "${merchant}" is not in the allowed list`
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return { allowed: true };
|
|
137
|
+
}
|
|
138
|
+
async executePayment(params) {
|
|
139
|
+
const preCheck = this.preCheckPolicy(params.amount, params.merchant, params.category);
|
|
140
|
+
if (!preCheck.allowed) {
|
|
141
|
+
return {
|
|
142
|
+
success: false,
|
|
143
|
+
amount: params.amount,
|
|
144
|
+
token: params.token || "USDC",
|
|
145
|
+
chain: params.chain || "base",
|
|
146
|
+
status: "failed",
|
|
147
|
+
error: preCheck.reason,
|
|
148
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
try {
|
|
152
|
+
const result = await this.request("POST", `/api/v2/wallets/${this.walletId}/transfer`, {
|
|
153
|
+
destination: params.to,
|
|
154
|
+
amount: params.amount,
|
|
155
|
+
token: params.token || "USDC",
|
|
156
|
+
chain: params.chain || "base",
|
|
157
|
+
domain: params.merchant || "unknown",
|
|
158
|
+
memo: params.memo
|
|
159
|
+
});
|
|
160
|
+
return {
|
|
161
|
+
success: true,
|
|
162
|
+
transactionId: result.ledger_tx_id,
|
|
163
|
+
txHash: result.tx_hash,
|
|
164
|
+
amount: params.amount,
|
|
165
|
+
token: params.token || "USDC",
|
|
166
|
+
chain: params.chain || "base",
|
|
167
|
+
status: result.status === "submitted" ? "pending" : result.status,
|
|
168
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
169
|
+
};
|
|
170
|
+
} catch (error) {
|
|
171
|
+
return {
|
|
172
|
+
success: false,
|
|
173
|
+
amount: params.amount,
|
|
174
|
+
token: params.token || "USDC",
|
|
175
|
+
chain: params.chain || "base",
|
|
176
|
+
status: "failed",
|
|
177
|
+
error: error instanceof Error ? error.message : "Unknown error",
|
|
178
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
async createHold(params) {
|
|
183
|
+
try {
|
|
184
|
+
const result = await this.request("POST", "/api/v2/holds", {
|
|
185
|
+
wallet_id: this.walletId,
|
|
186
|
+
amount: params.amount,
|
|
187
|
+
token: "USDC",
|
|
188
|
+
merchant_id: params.merchant,
|
|
189
|
+
purpose: params.description,
|
|
190
|
+
expiration_hours: params.expiresInHours || 24
|
|
191
|
+
});
|
|
192
|
+
if (!result.success || !result.hold) {
|
|
193
|
+
return {
|
|
194
|
+
success: false,
|
|
195
|
+
amount: params.amount,
|
|
196
|
+
merchant: params.merchant,
|
|
197
|
+
status: "failed",
|
|
198
|
+
error: result.error || "Failed to create hold"
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
return {
|
|
202
|
+
success: true,
|
|
203
|
+
holdId: result.hold.hold_id,
|
|
204
|
+
amount: params.amount,
|
|
205
|
+
merchant: params.merchant,
|
|
206
|
+
expiresAt: result.hold.expires_at || void 0,
|
|
207
|
+
status: result.hold.status
|
|
208
|
+
};
|
|
209
|
+
} catch (error) {
|
|
210
|
+
return {
|
|
211
|
+
success: false,
|
|
212
|
+
amount: params.amount,
|
|
213
|
+
merchant: params.merchant,
|
|
214
|
+
status: "failed",
|
|
215
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
async captureHold(params) {
|
|
220
|
+
try {
|
|
221
|
+
const result = await this.request(
|
|
222
|
+
"POST",
|
|
223
|
+
`/api/v2/holds/${params.holdId}/capture`,
|
|
224
|
+
params.amount != null ? { amount: params.amount } : void 0
|
|
225
|
+
);
|
|
226
|
+
if (!result.success || !result.hold) {
|
|
227
|
+
return {
|
|
228
|
+
success: false,
|
|
229
|
+
holdId: params.holdId,
|
|
230
|
+
amount: params.amount || 0,
|
|
231
|
+
merchant: "",
|
|
232
|
+
status: "failed",
|
|
233
|
+
error: result.error || "Failed to capture hold"
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
return {
|
|
237
|
+
success: true,
|
|
238
|
+
holdId: result.hold.hold_id,
|
|
239
|
+
amount: params.amount || parseFloat(result.hold.amount),
|
|
240
|
+
merchant: result.hold.merchant_id || "",
|
|
241
|
+
status: result.hold.status
|
|
242
|
+
};
|
|
243
|
+
} catch (error) {
|
|
244
|
+
return {
|
|
245
|
+
success: false,
|
|
246
|
+
holdId: params.holdId,
|
|
247
|
+
amount: params.amount || 0,
|
|
248
|
+
merchant: "",
|
|
249
|
+
status: "failed",
|
|
250
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
async voidHold(holdId) {
|
|
255
|
+
try {
|
|
256
|
+
const result = await this.request("POST", `/api/v2/holds/${holdId}/void`, {});
|
|
257
|
+
if (!result.success || !result.hold) {
|
|
258
|
+
return {
|
|
259
|
+
success: false,
|
|
260
|
+
holdId,
|
|
261
|
+
amount: 0,
|
|
262
|
+
merchant: "",
|
|
263
|
+
status: "failed",
|
|
264
|
+
error: result.error || "Failed to void hold"
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
return {
|
|
268
|
+
success: true,
|
|
269
|
+
holdId: result.hold.hold_id,
|
|
270
|
+
amount: parseFloat(result.hold.amount),
|
|
271
|
+
merchant: result.hold.merchant_id || "",
|
|
272
|
+
status: result.hold.status
|
|
273
|
+
};
|
|
274
|
+
} catch (error) {
|
|
275
|
+
return {
|
|
276
|
+
success: false,
|
|
277
|
+
holdId,
|
|
278
|
+
amount: 0,
|
|
279
|
+
merchant: "",
|
|
280
|
+
status: "failed",
|
|
281
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
async checkPolicy(params) {
|
|
286
|
+
const preCheck = this.preCheckPolicy(params.amount, params.merchant, params.category);
|
|
287
|
+
if (!preCheck.allowed) {
|
|
288
|
+
return {
|
|
289
|
+
allowed: false,
|
|
290
|
+
reason: preCheck.reason
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
try {
|
|
294
|
+
const agentId = await this.getEffectiveAgentId();
|
|
295
|
+
const result = await this.request("POST", "/api/v2/policies/check", {
|
|
296
|
+
agent_id: agentId,
|
|
297
|
+
amount: params.amount,
|
|
298
|
+
merchant_id: params.merchant,
|
|
299
|
+
merchant_category: params.category
|
|
300
|
+
});
|
|
301
|
+
return {
|
|
302
|
+
allowed: result.allowed,
|
|
303
|
+
reason: result.reason
|
|
304
|
+
};
|
|
305
|
+
} catch (error) {
|
|
306
|
+
return {
|
|
307
|
+
allowed: false,
|
|
308
|
+
reason: error instanceof Error ? error.message : "Policy check failed"
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
async getBalance(params) {
|
|
313
|
+
try {
|
|
314
|
+
const result = await this.request(
|
|
315
|
+
"GET",
|
|
316
|
+
`/api/v2/wallets/${this.walletId}/balance?token=${params.token || "USDC"}${params.chain ? `&chain=${params.chain}` : ""}`
|
|
317
|
+
);
|
|
318
|
+
return {
|
|
319
|
+
available: parseFloat(result.balance),
|
|
320
|
+
pending: 0,
|
|
321
|
+
held: 0,
|
|
322
|
+
token: result.token,
|
|
323
|
+
chain: result.chain
|
|
324
|
+
};
|
|
325
|
+
} catch (error) {
|
|
326
|
+
throw new Error(error instanceof Error ? error.message : "Failed to get balance");
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
async getSpendingSummary() {
|
|
330
|
+
try {
|
|
331
|
+
const response = await this.request(
|
|
332
|
+
"GET",
|
|
333
|
+
`/api/v2/ledger/entries?wallet_id=${this.walletId}&limit=500&offset=0`
|
|
334
|
+
);
|
|
335
|
+
const now = /* @__PURE__ */ new Date();
|
|
336
|
+
const startOfToday = new Date(now);
|
|
337
|
+
startOfToday.setHours(0, 0, 0, 0);
|
|
338
|
+
const startOfWeek = new Date(startOfToday);
|
|
339
|
+
startOfWeek.setDate(startOfWeek.getDate() - startOfWeek.getDay());
|
|
340
|
+
const startOfMonth = new Date(now.getFullYear(), now.getMonth(), 1);
|
|
341
|
+
let today = 0;
|
|
342
|
+
let thisWeek = 0;
|
|
343
|
+
let thisMonth = 0;
|
|
344
|
+
for (const entry of response.entries || []) {
|
|
345
|
+
if (entry.from_wallet && entry.from_wallet !== this.walletId) continue;
|
|
346
|
+
const createdAt = new Date(entry.created_at);
|
|
347
|
+
const amount = Number.parseFloat(entry.amount);
|
|
348
|
+
if (Number.isNaN(amount)) continue;
|
|
349
|
+
if (createdAt >= startOfMonth) thisMonth += amount;
|
|
350
|
+
if (createdAt >= startOfWeek) thisWeek += amount;
|
|
351
|
+
if (createdAt >= startOfToday) today += amount;
|
|
352
|
+
}
|
|
353
|
+
return { today, thisWeek, thisMonth, byCategory: {}, byMerchant: {} };
|
|
354
|
+
} catch (error) {
|
|
355
|
+
throw new Error(error instanceof Error ? error.message : "Failed to get spending summary");
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
};
|
|
359
|
+
function createSardisTools(config) {
|
|
360
|
+
const client = new SardisToolClient(config);
|
|
361
|
+
return {
|
|
362
|
+
/**
|
|
363
|
+
* Execute a payment from the wallet.
|
|
364
|
+
*/
|
|
365
|
+
sardis_pay: tool({
|
|
366
|
+
description: `Execute a payment from the Sardis wallet. Use this to send money to merchants or addresses.
|
|
367
|
+
Always check the policy first for large amounts. The payment is executed on-chain and returns a transaction hash.
|
|
368
|
+
Supported chains: base, polygon, ethereum, arbitrum, optimism.
|
|
369
|
+
Default token is USDC.`,
|
|
370
|
+
inputSchema: PaymentParamsSchema,
|
|
371
|
+
execute: async (params) => client.executePayment(params)
|
|
372
|
+
}),
|
|
373
|
+
/**
|
|
374
|
+
* Create a hold (pre-authorization) for a future payment.
|
|
375
|
+
*/
|
|
376
|
+
sardis_create_hold: tool({
|
|
377
|
+
description: `Create a hold (pre-authorization) on funds for a future payment.
|
|
378
|
+
Use this when the final amount is not yet known, like hotel reservations or variable-price services.
|
|
379
|
+
The hold reserves funds without transferring them. Capture the hold later to complete the payment.`,
|
|
380
|
+
inputSchema: HoldParamsSchema,
|
|
381
|
+
execute: async (params) => client.createHold(params)
|
|
382
|
+
}),
|
|
383
|
+
/**
|
|
384
|
+
* Capture a previously created hold.
|
|
385
|
+
*/
|
|
386
|
+
sardis_capture_hold: tool({
|
|
387
|
+
description: `Capture a previously created hold to complete the payment.
|
|
388
|
+
You can capture the full amount or a partial amount (for tips, adjustments, etc.).
|
|
389
|
+
If no amount is specified, the full hold amount is captured.`,
|
|
390
|
+
inputSchema: CaptureParamsSchema,
|
|
391
|
+
execute: async (params) => client.captureHold(params)
|
|
392
|
+
}),
|
|
393
|
+
/**
|
|
394
|
+
* Void/cancel a hold.
|
|
395
|
+
*/
|
|
396
|
+
sardis_void_hold: tool({
|
|
397
|
+
description: `Void (cancel) a hold to release the reserved funds back to the wallet.
|
|
398
|
+
Use this when a transaction is cancelled or no longer needed.`,
|
|
399
|
+
inputSchema: z.object({
|
|
400
|
+
holdId: z.string().describe("ID of the hold to void")
|
|
401
|
+
}),
|
|
402
|
+
execute: async ({ holdId }) => client.voidHold(holdId)
|
|
403
|
+
}),
|
|
404
|
+
/**
|
|
405
|
+
* Check if a payment is allowed by policy.
|
|
406
|
+
*/
|
|
407
|
+
sardis_check_policy: tool({
|
|
408
|
+
description: `Check if a payment would be allowed by the wallet's policy before attempting it.
|
|
409
|
+
Use this to verify spending limits, merchant restrictions, and category rules.
|
|
410
|
+
Always use this before large payments to avoid failed transactions.`,
|
|
411
|
+
inputSchema: PolicyCheckParamsSchema,
|
|
412
|
+
execute: async (params) => client.checkPolicy(params)
|
|
413
|
+
}),
|
|
414
|
+
/**
|
|
415
|
+
* Get wallet balance.
|
|
416
|
+
*/
|
|
417
|
+
sardis_get_balance: tool({
|
|
418
|
+
description: `Get the current balance of the wallet.
|
|
419
|
+
Returns available balance, pending transactions, and held amounts.
|
|
420
|
+
Default token is USDC. Can check specific chains if needed.`,
|
|
421
|
+
inputSchema: BalanceParamsSchema,
|
|
422
|
+
execute: async (params) => client.getBalance(params)
|
|
423
|
+
}),
|
|
424
|
+
/**
|
|
425
|
+
* Get spending summary.
|
|
426
|
+
*/
|
|
427
|
+
sardis_get_spending: tool({
|
|
428
|
+
description: `Get a summary of spending from the wallet.
|
|
429
|
+
Shows spending by day, week, month, and breakdowns by category and merchant.
|
|
430
|
+
Useful for budget tracking and reporting.`,
|
|
431
|
+
inputSchema: z.object({}),
|
|
432
|
+
execute: async () => client.getSpendingSummary()
|
|
433
|
+
})
|
|
434
|
+
};
|
|
435
|
+
}
|
|
436
|
+
function createMinimalSardisTools(config) {
|
|
437
|
+
const allTools = createSardisTools(config);
|
|
438
|
+
return {
|
|
439
|
+
sardis_pay: allTools.sardis_pay,
|
|
440
|
+
sardis_get_balance: allTools.sardis_get_balance
|
|
441
|
+
};
|
|
442
|
+
}
|
|
443
|
+
function createReadOnlySardisTools(config) {
|
|
444
|
+
const allTools = createSardisTools(config);
|
|
445
|
+
return {
|
|
446
|
+
sardis_check_policy: allTools.sardis_check_policy,
|
|
447
|
+
sardis_get_balance: allTools.sardis_get_balance,
|
|
448
|
+
sardis_get_spending: allTools.sardis_get_spending
|
|
449
|
+
};
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
export { BalanceParamsSchema, CaptureParamsSchema, HoldParamsSchema, PaymentParamsSchema, PolicyCheckParamsSchema, createMinimalSardisTools, createReadOnlySardisTools, createSardisTools };
|
|
453
|
+
//# sourceMappingURL=chunk-BVUWWUQU.js.map
|
|
454
|
+
//# sourceMappingURL=chunk-BVUWWUQU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/tools.ts"],"names":["z"],"mappings":"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","file":"chunk-BVUWWUQU.js","sourcesContent":["/**\n * Type definitions for Sardis AI SDK integration.\n */\n\nimport { z } from 'zod'\n\n/**\n * Configuration for Sardis AI SDK tools.\n */\nexport interface SardisToolsConfig {\n /** Sardis API key */\n apiKey: string\n /** Default wallet ID for payments */\n walletId: string\n /** Default agent ID */\n agentId?: string\n /** Base URL for Sardis API (default: https://api.sardis.network) */\n baseUrl?: string\n /** Enable simulation mode (no real transactions) */\n simulationMode?: boolean\n /** Maximum single payment amount (policy limit) */\n maxPaymentAmount?: number\n /** Blocked merchant categories */\n blockedCategories?: string[]\n /** Allowed merchants only (whitelist mode) */\n allowedMerchants?: string[]\n}\n\n/**\n * Payment execution parameters.\n */\nexport const PaymentParamsSchema = z.object({\n /** Recipient address or merchant identifier */\n to: z.string().describe('Recipient wallet address or merchant ID'),\n /** Amount in USD */\n amount: z.number().positive().describe('Payment amount in USD'),\n /** Token to use (default: USDC) */\n token: z.string().optional().default('USDC').describe('Token to use for payment'),\n /** Chain to execute on */\n chain: z.enum(['base', 'polygon', 'ethereum', 'arbitrum', 'optimism']).optional().default('base').describe('Blockchain network'),\n /** Payment description/memo */\n memo: z.string().optional().describe('Description or memo for the payment'),\n /** Merchant name for policy checks */\n merchant: z.string().optional().describe('Merchant name for policy validation'),\n /** Merchant category code */\n category: z.string().optional().describe('Merchant category code (e.g., \"software\", \"travel\")'),\n /** Idempotency key to prevent duplicates */\n idempotencyKey: z.string().optional().describe('Unique key to prevent duplicate payments'),\n})\n\nexport type PaymentParams = z.infer<typeof PaymentParamsSchema>\n\n/**\n * Hold creation parameters.\n */\nexport const HoldParamsSchema = z.object({\n /** Amount to hold in USD */\n amount: z.number().positive().describe('Hold amount in USD'),\n /** Merchant name */\n merchant: z.string().describe('Merchant name for the hold'),\n /** Hold expiration in hours (default: 24) */\n expiresInHours: z.number().optional().default(24).describe('Hours until hold expires'),\n /** Description of the hold purpose */\n description: z.string().optional().describe('Description of what the hold is for'),\n})\n\nexport type HoldParams = z.infer<typeof HoldParamsSchema>\n\n/**\n * Hold capture parameters.\n */\nexport const CaptureParamsSchema = z.object({\n /** Hold ID to capture */\n holdId: z.string().describe('ID of the hold to capture'),\n /** Amount to capture (defaults to full hold amount) */\n amount: z.number().positive().optional().describe('Amount to capture (partial capture if less than hold)'),\n})\n\nexport type CaptureParams = z.infer<typeof CaptureParamsSchema>\n\n/**\n * Policy check parameters.\n */\nexport const PolicyCheckParamsSchema = z.object({\n /** Amount to check */\n amount: z.number().positive().describe('Amount to check against policy'),\n /** Merchant name */\n merchant: z.string().optional().describe('Merchant name for policy check'),\n /** Merchant category */\n category: z.string().optional().describe('Merchant category for policy check'),\n})\n\nexport type PolicyCheckParams = z.infer<typeof PolicyCheckParamsSchema>\n\n/**\n * Balance check parameters.\n */\nexport const BalanceParamsSchema = z.object({\n /** Token to check (default: USDC) */\n token: z.string().optional().default('USDC').describe('Token to check balance for'),\n /** Chain to check */\n chain: z.string().optional().describe('Specific chain to check balance on'),\n})\n\nexport type BalanceParams = z.infer<typeof BalanceParamsSchema>\n\n/**\n * Payment result.\n */\nexport interface PaymentResult {\n success: boolean\n transactionId?: string\n txHash?: string\n amount: number\n token: string\n chain: string\n status: 'completed' | 'pending' | 'failed'\n error?: string\n blockNumber?: number\n timestamp: string\n}\n\n/**\n * Hold result.\n */\nexport interface HoldResult {\n success: boolean\n holdId?: string\n amount: number\n merchant: string\n expiresAt?: string\n status: 'active' | 'captured' | 'voided' | 'expired' | 'failed'\n error?: string\n}\n\n/**\n * Policy check result.\n */\nexport interface PolicyCheckResult {\n allowed: boolean\n reason?: string\n remainingDailyLimit?: number\n remainingMonthlyLimit?: number\n requiresApproval?: boolean\n}\n\n/**\n * Balance result.\n */\nexport interface BalanceResult {\n available: number\n pending: number\n held: number\n token: string\n chain: string\n}\n","/**\n * Sardis payment tools for Vercel AI SDK.\n *\n * These tools enable AI agents to make payments with policy guardrails.\n *\n * @example\n * ```typescript\n * import { generateText } from 'ai'\n * import { openai } from '@ai-sdk/openai'\n * import { createSardisTools } from '@sardis/ai-sdk'\n *\n * const sardisTools = createSardisTools({\n * apiKey: process.env.SARDIS_API_KEY!,\n * walletId: 'wallet_abc123',\n * })\n *\n * const result = await generateText({\n * model: openai('gpt-4o'),\n * tools: sardisTools,\n * prompt: 'Pay $50 to merchant_xyz for API credits',\n * })\n * ```\n */\n\nimport { tool, type Tool } from 'ai'\nimport { z } from 'zod'\nimport type {\n SardisToolsConfig,\n PaymentResult,\n HoldResult,\n PolicyCheckResult,\n BalanceResult,\n} from './types'\nimport {\n PaymentParamsSchema,\n HoldParamsSchema,\n CaptureParamsSchema,\n PolicyCheckParamsSchema,\n BalanceParamsSchema,\n} from './types'\n\n/**\n * Internal Sardis API client for tool execution.\n */\nclass SardisToolClient {\n private apiKey: string\n private walletId: string\n private agentId?: string\n private baseUrl: string\n private simulationMode: boolean\n private maxPaymentAmount?: number\n private blockedCategories: string[]\n private allowedMerchants?: string[]\n private resolvedAgentId?: string\n private resolvingAgentId?: Promise<string>\n\n constructor(config: SardisToolsConfig) {\n this.apiKey = config.apiKey\n this.walletId = config.walletId\n this.agentId = config.agentId\n this.baseUrl = (config.baseUrl || 'https://api.sardis.network').replace(/\\/$/, '')\n this.simulationMode = config.simulationMode || false\n this.maxPaymentAmount = config.maxPaymentAmount\n this.blockedCategories = config.blockedCategories || []\n this.allowedMerchants = config.allowedMerchants\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: unknown\n ): Promise<T> {\n const response = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers: {\n 'X-API-Key': this.apiKey,\n 'Content-Type': 'application/json',\n ...(this.simulationMode && { 'X-Simulation-Mode': 'true' }),\n },\n body: body ? JSON.stringify(body) : undefined,\n })\n\n if (!response.ok) {\n const error = await response.json().catch(() => null)\n const message =\n (error &&\n typeof error === 'object' &&\n ('message' in error || 'detail' in error) &&\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ((error as any).message || (error as any).detail)) ||\n `API error: ${response.status}`\n throw new Error(message)\n }\n\n return (await response.json()) as T\n }\n\n private async getEffectiveAgentId(): Promise<string> {\n if (this.agentId) return this.agentId\n if (this.resolvedAgentId) return this.resolvedAgentId\n\n if (!this.resolvingAgentId) {\n this.resolvingAgentId = (async () => {\n const wallet = await this.request<{ agent_id: string }>(\n 'GET',\n `/api/v2/wallets/${this.walletId}`\n )\n if (!wallet.agent_id) {\n throw new Error('Wallet has no agent_id')\n }\n this.resolvedAgentId = wallet.agent_id\n return wallet.agent_id\n })()\n }\n return this.resolvingAgentId\n }\n\n /**\n * Local policy pre-check before API call.\n */\n private preCheckPolicy(\n amount: number,\n merchant?: string,\n category?: string\n ): { allowed: boolean; reason?: string } {\n // Check max payment amount\n if (this.maxPaymentAmount && amount > this.maxPaymentAmount) {\n return {\n allowed: false,\n reason: `Amount $${amount} exceeds maximum allowed payment of $${this.maxPaymentAmount}`,\n }\n }\n\n // Check blocked categories\n if (category && this.blockedCategories.includes(category.toLowerCase())) {\n return {\n allowed: false,\n reason: `Category \"${category}\" is blocked by policy`,\n }\n }\n\n // Check allowed merchants (whitelist mode)\n if (this.allowedMerchants && merchant) {\n if (!this.allowedMerchants.includes(merchant.toLowerCase())) {\n return {\n allowed: false,\n reason: `Merchant \"${merchant}\" is not in the allowed list`,\n }\n }\n }\n\n return { allowed: true }\n }\n\n async executePayment(params: z.infer<typeof PaymentParamsSchema>): Promise<PaymentResult> {\n // Local pre-check\n const preCheck = this.preCheckPolicy(params.amount, params.merchant, params.category)\n if (!preCheck.allowed) {\n return {\n success: false,\n amount: params.amount,\n token: params.token || 'USDC',\n chain: params.chain || 'base',\n status: 'failed',\n error: preCheck.reason,\n timestamp: new Date().toISOString(),\n }\n }\n\n try {\n const result = await this.request<{\n tx_hash: string\n status: string\n chain: string\n ledger_tx_id?: string\n audit_anchor?: string | null\n }>('POST', `/api/v2/wallets/${this.walletId}/transfer`, {\n destination: params.to,\n amount: params.amount,\n token: params.token || 'USDC',\n chain: params.chain || 'base',\n domain: params.merchant || 'unknown',\n memo: params.memo,\n })\n\n return {\n success: true,\n transactionId: result.ledger_tx_id,\n txHash: result.tx_hash,\n amount: params.amount,\n token: params.token || 'USDC',\n chain: params.chain || 'base',\n status: (result.status === 'submitted' ? 'pending' : (result.status as PaymentResult['status'])),\n timestamp: new Date().toISOString(),\n }\n } catch (error) {\n return {\n success: false,\n amount: params.amount,\n token: params.token || 'USDC',\n chain: params.chain || 'base',\n status: 'failed',\n error: error instanceof Error ? error.message : 'Unknown error',\n timestamp: new Date().toISOString(),\n }\n }\n }\n\n async createHold(params: z.infer<typeof HoldParamsSchema>): Promise<HoldResult> {\n try {\n const result = await this.request<{\n success: boolean\n hold?: {\n hold_id: string\n amount: string\n merchant_id?: string | null\n status: string\n expires_at?: string | null\n }\n error?: string | null\n }>('POST', '/api/v2/holds', {\n wallet_id: this.walletId,\n amount: params.amount,\n token: 'USDC',\n merchant_id: params.merchant,\n purpose: params.description,\n expiration_hours: params.expiresInHours || 24,\n })\n\n if (!result.success || !result.hold) {\n return {\n success: false,\n amount: params.amount,\n merchant: params.merchant,\n status: 'failed',\n error: result.error || 'Failed to create hold',\n }\n }\n\n return {\n success: true,\n holdId: result.hold.hold_id,\n amount: params.amount,\n merchant: params.merchant,\n expiresAt: result.hold.expires_at || undefined,\n status: result.hold.status as HoldResult['status'],\n }\n } catch (error) {\n return {\n success: false,\n amount: params.amount,\n merchant: params.merchant,\n status: 'failed',\n error: error instanceof Error ? error.message : 'Unknown error',\n }\n }\n }\n\n async captureHold(params: z.infer<typeof CaptureParamsSchema>): Promise<HoldResult> {\n try {\n const result = await this.request<{\n success: boolean\n hold?: {\n hold_id: string\n amount: string\n merchant_id?: string | null\n status: string\n }\n error?: string | null\n }>(\n 'POST',\n `/api/v2/holds/${params.holdId}/capture`,\n params.amount != null ? { amount: params.amount } : undefined\n )\n\n if (!result.success || !result.hold) {\n return {\n success: false,\n holdId: params.holdId,\n amount: params.amount || 0,\n merchant: '',\n status: 'failed',\n error: result.error || 'Failed to capture hold',\n }\n }\n\n return {\n success: true,\n holdId: result.hold.hold_id,\n amount: params.amount || parseFloat(result.hold.amount),\n merchant: result.hold.merchant_id || '',\n status: result.hold.status as HoldResult['status'],\n }\n } catch (error) {\n return {\n success: false,\n holdId: params.holdId,\n amount: params.amount || 0,\n merchant: '',\n status: 'failed',\n error: error instanceof Error ? error.message : 'Unknown error',\n }\n }\n }\n\n async voidHold(holdId: string): Promise<HoldResult> {\n try {\n const result = await this.request<{\n success: boolean\n hold?: {\n hold_id: string\n amount: string\n merchant_id?: string | null\n status: string\n }\n error?: string | null\n }>('POST', `/api/v2/holds/${holdId}/void`, {})\n\n if (!result.success || !result.hold) {\n return {\n success: false,\n holdId,\n amount: 0,\n merchant: '',\n status: 'failed',\n error: result.error || 'Failed to void hold',\n }\n }\n\n return {\n success: true,\n holdId: result.hold.hold_id,\n amount: parseFloat(result.hold.amount),\n merchant: result.hold.merchant_id || '',\n status: result.hold.status as HoldResult['status'],\n }\n } catch (error) {\n return {\n success: false,\n holdId: holdId,\n amount: 0,\n merchant: '',\n status: 'failed',\n error: error instanceof Error ? error.message : 'Unknown error',\n }\n }\n }\n\n async checkPolicy(params: z.infer<typeof PolicyCheckParamsSchema>): Promise<PolicyCheckResult> {\n // Local pre-check first\n const preCheck = this.preCheckPolicy(params.amount, params.merchant, params.category)\n if (!preCheck.allowed) {\n return {\n allowed: false,\n reason: preCheck.reason,\n }\n }\n\n try {\n const agentId = await this.getEffectiveAgentId()\n const result = await this.request<{\n allowed: boolean\n reason: string\n policy_id?: string | null\n }>('POST', '/api/v2/policies/check', {\n agent_id: agentId,\n amount: params.amount,\n merchant_id: params.merchant,\n merchant_category: params.category,\n })\n\n return {\n allowed: result.allowed,\n reason: result.reason,\n }\n } catch (error) {\n return {\n allowed: false,\n reason: error instanceof Error ? error.message : 'Policy check failed',\n }\n }\n }\n\n async getBalance(params: z.infer<typeof BalanceParamsSchema>): Promise<BalanceResult> {\n try {\n const result = await this.request<{\n balance: string\n token: string\n chain: string\n }>(\n 'GET',\n `/api/v2/wallets/${this.walletId}/balance?token=${params.token || 'USDC'}${params.chain ? `&chain=${params.chain}` : ''}`\n )\n\n return {\n available: parseFloat(result.balance),\n pending: 0,\n held: 0,\n token: result.token,\n chain: result.chain,\n }\n } catch (error) {\n throw new Error(error instanceof Error ? error.message : 'Failed to get balance')\n }\n }\n\n async getSpendingSummary(): Promise<{\n today: number\n thisWeek: number\n thisMonth: number\n byCategory: Record<string, number>\n byMerchant: Record<string, number>\n }> {\n try {\n const response = await this.request<{ entries: Array<{ from_wallet?: string; amount: string; created_at: string }> }>(\n 'GET',\n `/api/v2/ledger/entries?wallet_id=${this.walletId}&limit=500&offset=0`\n )\n\n const now = new Date()\n const startOfToday = new Date(now)\n startOfToday.setHours(0, 0, 0, 0)\n\n const startOfWeek = new Date(startOfToday)\n startOfWeek.setDate(startOfWeek.getDate() - startOfWeek.getDay())\n\n const startOfMonth = new Date(now.getFullYear(), now.getMonth(), 1)\n\n let today = 0\n let thisWeek = 0\n let thisMonth = 0\n\n for (const entry of response.entries || []) {\n if (entry.from_wallet && entry.from_wallet !== this.walletId) continue\n const createdAt = new Date(entry.created_at)\n const amount = Number.parseFloat(entry.amount)\n if (Number.isNaN(amount)) continue\n\n if (createdAt >= startOfMonth) thisMonth += amount\n if (createdAt >= startOfWeek) thisWeek += amount\n if (createdAt >= startOfToday) today += amount\n }\n\n return { today, thisWeek, thisMonth, byCategory: {}, byMerchant: {} }\n } catch (error) {\n throw new Error(error instanceof Error ? error.message : 'Failed to get spending summary')\n }\n }\n}\n\n/**\n * Create Sardis payment tools for Vercel AI SDK.\n *\n * Returns a set of tools that can be passed to `generateText` or `streamText`.\n *\n * @example\n * ```typescript\n * const tools = createSardisTools({\n * apiKey: process.env.SARDIS_API_KEY!,\n * walletId: 'wallet_abc123',\n * maxPaymentAmount: 100, // Optional: limit single payments\n * blockedCategories: ['gambling', 'adult'], // Optional: block categories\n * })\n *\n * const { text, toolResults } = await generateText({\n * model: openai('gpt-4o'),\n * tools,\n * prompt: 'Check my balance and pay $25 to OpenAI for API credits',\n * })\n * ```\n */\nexport function createSardisTools(config: SardisToolsConfig): Record<string, Tool> {\n const client = new SardisToolClient(config)\n\n return {\n /**\n * Execute a payment from the wallet.\n */\n sardis_pay: tool({\n description: `Execute a payment from the Sardis wallet. Use this to send money to merchants or addresses.\nAlways check the policy first for large amounts. The payment is executed on-chain and returns a transaction hash.\nSupported chains: base, polygon, ethereum, arbitrum, optimism.\nDefault token is USDC.`,\n inputSchema: PaymentParamsSchema,\n execute: async (params) => client.executePayment(params),\n }),\n\n /**\n * Create a hold (pre-authorization) for a future payment.\n */\n sardis_create_hold: tool({\n description: `Create a hold (pre-authorization) on funds for a future payment.\nUse this when the final amount is not yet known, like hotel reservations or variable-price services.\nThe hold reserves funds without transferring them. Capture the hold later to complete the payment.`,\n inputSchema: HoldParamsSchema,\n execute: async (params) => client.createHold(params),\n }),\n\n /**\n * Capture a previously created hold.\n */\n sardis_capture_hold: tool({\n description: `Capture a previously created hold to complete the payment.\nYou can capture the full amount or a partial amount (for tips, adjustments, etc.).\nIf no amount is specified, the full hold amount is captured.`,\n inputSchema: CaptureParamsSchema,\n execute: async (params) => client.captureHold(params),\n }),\n\n /**\n * Void/cancel a hold.\n */\n sardis_void_hold: tool({\n description: `Void (cancel) a hold to release the reserved funds back to the wallet.\nUse this when a transaction is cancelled or no longer needed.`,\n inputSchema: z.object({\n holdId: z.string().describe('ID of the hold to void'),\n }),\n execute: async ({ holdId }) => client.voidHold(holdId),\n }),\n\n /**\n * Check if a payment is allowed by policy.\n */\n sardis_check_policy: tool({\n description: `Check if a payment would be allowed by the wallet's policy before attempting it.\nUse this to verify spending limits, merchant restrictions, and category rules.\nAlways use this before large payments to avoid failed transactions.`,\n inputSchema: PolicyCheckParamsSchema,\n execute: async (params) => client.checkPolicy(params),\n }),\n\n /**\n * Get wallet balance.\n */\n sardis_get_balance: tool({\n description: `Get the current balance of the wallet.\nReturns available balance, pending transactions, and held amounts.\nDefault token is USDC. Can check specific chains if needed.`,\n inputSchema: BalanceParamsSchema,\n execute: async (params) => client.getBalance(params),\n }),\n\n /**\n * Get spending summary.\n */\n sardis_get_spending: tool({\n description: `Get a summary of spending from the wallet.\nShows spending by day, week, month, and breakdowns by category and merchant.\nUseful for budget tracking and reporting.`,\n inputSchema: z.object({}),\n execute: async () => client.getSpendingSummary(),\n }),\n }\n}\n\n/**\n * Create a minimal set of Sardis tools (pay + balance only).\n *\n * Use this for simpler use cases that don't need holds or detailed policy checks.\n */\nexport function createMinimalSardisTools(config: SardisToolsConfig): Record<string, Tool> {\n const allTools = createSardisTools(config)\n\n return {\n sardis_pay: allTools.sardis_pay!,\n sardis_get_balance: allTools.sardis_get_balance!,\n }\n}\n\n/**\n * Create Sardis tools with only read operations (no payments).\n *\n * Use this for analytics, reporting, or view-only access.\n */\nexport function createReadOnlySardisTools(config: SardisToolsConfig): Record<string, Tool> {\n const allTools = createSardisTools(config)\n\n return {\n sardis_check_policy: allTools.sardis_check_policy!,\n sardis_get_balance: allTools.sardis_get_balance!,\n sardis_get_spending: allTools.sardis_get_spending!,\n }\n}\n"]}
|