@sardis/sdk 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.
Files changed (146) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/LICENSE +21 -0
  3. package/README.md +439 -0
  4. package/dist/browser/index.js +7049 -0
  5. package/dist/browser/index.js.map +1 -0
  6. package/dist/browser/sardis.umd.js +7071 -0
  7. package/dist/browser/sardis.umd.js.map +1 -0
  8. package/dist/cjs/client.js +644 -0
  9. package/dist/cjs/client.js.map +1 -0
  10. package/dist/cjs/demo.js +699 -0
  11. package/dist/cjs/demo.js.map +1 -0
  12. package/dist/cjs/errors.js +630 -0
  13. package/dist/cjs/errors.js.map +1 -0
  14. package/dist/cjs/index.js +131 -0
  15. package/dist/cjs/index.js.map +1 -0
  16. package/dist/cjs/integrations/index.js +21 -0
  17. package/dist/cjs/integrations/index.js.map +1 -0
  18. package/dist/cjs/integrations/langchain.js +339 -0
  19. package/dist/cjs/integrations/langchain.js.map +1 -0
  20. package/dist/cjs/integrations/openai.js +505 -0
  21. package/dist/cjs/integrations/openai.js.map +1 -0
  22. package/dist/cjs/integrations/vercel-ai.js +198 -0
  23. package/dist/cjs/integrations/vercel-ai.js.map +1 -0
  24. package/dist/cjs/resources/a2a.js +158 -0
  25. package/dist/cjs/resources/a2a.js.map +1 -0
  26. package/dist/cjs/resources/agents.js +142 -0
  27. package/dist/cjs/resources/agents.js.map +1 -0
  28. package/dist/cjs/resources/base.js +124 -0
  29. package/dist/cjs/resources/base.js.map +1 -0
  30. package/dist/cjs/resources/cards.js +43 -0
  31. package/dist/cjs/resources/cards.js.map +1 -0
  32. package/dist/cjs/resources/holds.js +64 -0
  33. package/dist/cjs/resources/holds.js.map +1 -0
  34. package/dist/cjs/resources/index.js +31 -0
  35. package/dist/cjs/resources/index.js.map +1 -0
  36. package/dist/cjs/resources/ledger.js +43 -0
  37. package/dist/cjs/resources/ledger.js.map +1 -0
  38. package/dist/cjs/resources/marketplace.js +88 -0
  39. package/dist/cjs/resources/marketplace.js.map +1 -0
  40. package/dist/cjs/resources/payments.js +33 -0
  41. package/dist/cjs/resources/payments.js.map +1 -0
  42. package/dist/cjs/resources/policies.js +31 -0
  43. package/dist/cjs/resources/policies.js.map +1 -0
  44. package/dist/cjs/resources/transactions.js +37 -0
  45. package/dist/cjs/resources/transactions.js.map +1 -0
  46. package/dist/cjs/resources/ucp.js +133 -0
  47. package/dist/cjs/resources/ucp.js.map +1 -0
  48. package/dist/cjs/resources/wallets.js +109 -0
  49. package/dist/cjs/resources/wallets.js.map +1 -0
  50. package/dist/cjs/resources/webhooks.js +81 -0
  51. package/dist/cjs/resources/webhooks.js.map +1 -0
  52. package/dist/cjs/types.js +11 -0
  53. package/dist/cjs/types.js.map +1 -0
  54. package/dist/client.d.ts +419 -0
  55. package/dist/client.d.ts.map +1 -0
  56. package/dist/client.js +637 -0
  57. package/dist/client.js.map +1 -0
  58. package/dist/demo.d.ts +335 -0
  59. package/dist/demo.d.ts.map +1 -0
  60. package/dist/demo.js +694 -0
  61. package/dist/demo.js.map +1 -0
  62. package/dist/errors.d.ts +522 -0
  63. package/dist/errors.d.ts.map +1 -0
  64. package/dist/errors.js +612 -0
  65. package/dist/errors.js.map +1 -0
  66. package/dist/index.d.ts +83 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +85 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/integrations/index.d.ts +4 -0
  71. package/dist/integrations/index.d.ts.map +1 -0
  72. package/dist/integrations/index.js +5 -0
  73. package/dist/integrations/index.js.map +1 -0
  74. package/dist/integrations/langchain.d.ts +68 -0
  75. package/dist/integrations/langchain.d.ts.map +1 -0
  76. package/dist/integrations/langchain.js +335 -0
  77. package/dist/integrations/langchain.js.map +1 -0
  78. package/dist/integrations/openai.d.ts +97 -0
  79. package/dist/integrations/openai.d.ts.map +1 -0
  80. package/dist/integrations/openai.js +467 -0
  81. package/dist/integrations/openai.js.map +1 -0
  82. package/dist/integrations/vercel-ai.d.ts +180 -0
  83. package/dist/integrations/vercel-ai.d.ts.map +1 -0
  84. package/dist/integrations/vercel-ai.js +194 -0
  85. package/dist/integrations/vercel-ai.js.map +1 -0
  86. package/dist/resources/a2a.d.ts +254 -0
  87. package/dist/resources/a2a.d.ts.map +1 -0
  88. package/dist/resources/a2a.js +154 -0
  89. package/dist/resources/a2a.js.map +1 -0
  90. package/dist/resources/agents.d.ts +111 -0
  91. package/dist/resources/agents.d.ts.map +1 -0
  92. package/dist/resources/agents.js +138 -0
  93. package/dist/resources/agents.js.map +1 -0
  94. package/dist/resources/base.d.ts +115 -0
  95. package/dist/resources/base.d.ts.map +1 -0
  96. package/dist/resources/base.js +120 -0
  97. package/dist/resources/base.js.map +1 -0
  98. package/dist/resources/cards.d.ts +19 -0
  99. package/dist/resources/cards.d.ts.map +1 -0
  100. package/dist/resources/cards.js +39 -0
  101. package/dist/resources/cards.js.map +1 -0
  102. package/dist/resources/holds.d.ts +44 -0
  103. package/dist/resources/holds.d.ts.map +1 -0
  104. package/dist/resources/holds.js +60 -0
  105. package/dist/resources/holds.js.map +1 -0
  106. package/dist/resources/index.d.ts +16 -0
  107. package/dist/resources/index.d.ts.map +1 -0
  108. package/dist/resources/index.js +16 -0
  109. package/dist/resources/index.js.map +1 -0
  110. package/dist/resources/ledger.d.ts +38 -0
  111. package/dist/resources/ledger.d.ts.map +1 -0
  112. package/dist/resources/ledger.js +39 -0
  113. package/dist/resources/ledger.js.map +1 -0
  114. package/dist/resources/marketplace.d.ts +60 -0
  115. package/dist/resources/marketplace.d.ts.map +1 -0
  116. package/dist/resources/marketplace.js +84 -0
  117. package/dist/resources/marketplace.js.map +1 -0
  118. package/dist/resources/payments.d.ts +24 -0
  119. package/dist/resources/payments.d.ts.map +1 -0
  120. package/dist/resources/payments.js +29 -0
  121. package/dist/resources/payments.js.map +1 -0
  122. package/dist/resources/policies.d.ts +23 -0
  123. package/dist/resources/policies.d.ts.map +1 -0
  124. package/dist/resources/policies.js +27 -0
  125. package/dist/resources/policies.js.map +1 -0
  126. package/dist/resources/transactions.d.ts +32 -0
  127. package/dist/resources/transactions.d.ts.map +1 -0
  128. package/dist/resources/transactions.js +33 -0
  129. package/dist/resources/transactions.js.map +1 -0
  130. package/dist/resources/ucp.d.ts +218 -0
  131. package/dist/resources/ucp.d.ts.map +1 -0
  132. package/dist/resources/ucp.js +129 -0
  133. package/dist/resources/ucp.js.map +1 -0
  134. package/dist/resources/wallets.d.ts +71 -0
  135. package/dist/resources/wallets.d.ts.map +1 -0
  136. package/dist/resources/wallets.js +105 -0
  137. package/dist/resources/wallets.js.map +1 -0
  138. package/dist/resources/webhooks.d.ts +57 -0
  139. package/dist/resources/webhooks.d.ts.map +1 -0
  140. package/dist/resources/webhooks.js +77 -0
  141. package/dist/resources/webhooks.js.map +1 -0
  142. package/dist/types.d.ts +1045 -0
  143. package/dist/types.d.ts.map +1 -0
  144. package/dist/types.js +10 -0
  145. package/dist/types.js.map +1 -0
  146. package/package.json +114 -0
@@ -0,0 +1,505 @@
1
+ "use strict";
2
+ /**
3
+ * OpenAI Function Calling Integration for Sardis SDK
4
+ *
5
+ * Provides OpenAI-compatible function schemas and execution handlers
6
+ * for AI agents to execute payments through Sardis MPC wallets.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * import OpenAI from 'openai';
11
+ * import { SardisClient } from '@sardis/sdk';
12
+ * import { createSardisOpenAITools, handleSardisFunctionCall } from '@sardis/sdk/integrations/openai';
13
+ *
14
+ * const sardis = new SardisClient({ apiKey: 'your-api-key' });
15
+ * const openai = new OpenAI();
16
+ *
17
+ * const tools = createSardisOpenAITools();
18
+ *
19
+ * const response = await openai.chat.completions.create({
20
+ * model: 'gpt-4',
21
+ * messages: [{ role: 'user', content: 'Pay $50 to OpenAI' }],
22
+ * tools
23
+ * });
24
+ *
25
+ * // Handle tool calls
26
+ * for (const toolCall of response.choices[0].message.tool_calls || []) {
27
+ * const result = await handleSardisFunctionCall(sardis, toolCall, { walletId: 'wallet_123' });
28
+ * console.log(result);
29
+ * }
30
+ * ```
31
+ */
32
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
33
+ if (k2 === undefined) k2 = k;
34
+ var desc = Object.getOwnPropertyDescriptor(m, k);
35
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
36
+ desc = { enumerable: true, get: function() { return m[k]; } };
37
+ }
38
+ Object.defineProperty(o, k2, desc);
39
+ }) : (function(o, m, k, k2) {
40
+ if (k2 === undefined) k2 = k;
41
+ o[k2] = m[k];
42
+ }));
43
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
44
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
45
+ }) : function(o, v) {
46
+ o["default"] = v;
47
+ });
48
+ var __importStar = (this && this.__importStar) || (function () {
49
+ var ownKeys = function(o) {
50
+ ownKeys = Object.getOwnPropertyNames || function (o) {
51
+ var ar = [];
52
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
53
+ return ar;
54
+ };
55
+ return ownKeys(o);
56
+ };
57
+ return function (mod) {
58
+ if (mod && mod.__esModule) return mod;
59
+ var result = {};
60
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
61
+ __setModuleDefault(result, mod);
62
+ return result;
63
+ };
64
+ })();
65
+ Object.defineProperty(exports, "__esModule", { value: true });
66
+ exports.createSardisOpenAITools = createSardisOpenAITools;
67
+ exports.handleSardisFunctionCall = handleSardisFunctionCall;
68
+ exports.createToolResponse = createToolResponse;
69
+ /**
70
+ * Generate a unique mandate ID
71
+ *
72
+ * SECURITY: Uses crypto.randomUUID() for cryptographically secure IDs.
73
+ * Math.random() is not suitable for security-relevant identifiers.
74
+ */
75
+ function generateMandateId() {
76
+ const id = (typeof crypto !== 'undefined' && crypto.randomUUID)
77
+ ? crypto.randomUUID().replace(/-/g, '').substring(0, 16)
78
+ : Array.from((typeof crypto !== 'undefined' && crypto.getRandomValues)
79
+ ? crypto.getRandomValues(new Uint8Array(8))
80
+ : (() => { throw new Error('No cryptographic RNG available for mandate IDs'); })()).map((b) => b.toString(16).padStart(2, '0')).join('');
81
+ return `mnd_${id}`;
82
+ }
83
+ /**
84
+ * Create a SHA-256 hash for audit purposes
85
+ *
86
+ * SECURITY: The fallback uses Node.js crypto module instead of a
87
+ * predictable timestamp string. Audit hashes must provide collision
88
+ * resistance for financial integrity.
89
+ */
90
+ async function createAuditHash(data) {
91
+ if (typeof crypto !== 'undefined' && crypto.subtle) {
92
+ const encoder = new TextEncoder();
93
+ const dataBuffer = encoder.encode(data);
94
+ const hashBuffer = await crypto.subtle.digest('SHA-256', dataBuffer);
95
+ const hashArray = Array.from(new Uint8Array(hashBuffer));
96
+ return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
97
+ }
98
+ // Fallback: use Node.js crypto (always available in Node environments)
99
+ try {
100
+ const { createHash } = await Promise.resolve().then(() => __importStar(require('node:crypto')));
101
+ return createHash('sha256').update(data).digest('hex');
102
+ }
103
+ catch {
104
+ // SECURITY: Refuse to produce a fake hash — fail-closed.
105
+ throw new Error('No cryptographic hash function available. '
106
+ + 'Audit integrity cannot be guaranteed without SHA-256.');
107
+ }
108
+ }
109
+ /**
110
+ * Create OpenAI-compatible tool definitions for Sardis functions.
111
+ * Use these with the OpenAI Chat Completions API.
112
+ */
113
+ function createSardisOpenAITools() {
114
+ return [
115
+ {
116
+ type: 'function',
117
+ function: {
118
+ name: 'sardis_pay',
119
+ description: 'Execute a secure payment using Sardis MPC wallet. Validates against spending policies before execution. Returns transaction details on success or error message if blocked by policy.',
120
+ parameters: {
121
+ type: 'object',
122
+ properties: {
123
+ amount: {
124
+ type: 'number',
125
+ description: 'The amount to pay in USD (or token units)'
126
+ },
127
+ vendor: {
128
+ type: 'string',
129
+ description: 'The name of the merchant or service provider (e.g., "OpenAI", "GitHub", "Vercel")'
130
+ },
131
+ vendor_address: {
132
+ type: 'string',
133
+ description: 'The wallet address of the vendor (0x...). Optional - will be resolved if not provided.'
134
+ },
135
+ purpose: {
136
+ type: 'string',
137
+ description: 'The reason for the payment, used for policy validation and audit trail'
138
+ },
139
+ token: {
140
+ type: 'string',
141
+ description: 'The stablecoin to use for payment. Defaults to USDC.',
142
+ enum: ['USDC', 'USDT', 'PYUSD', 'EURC']
143
+ }
144
+ },
145
+ required: ['amount', 'vendor']
146
+ }
147
+ }
148
+ },
149
+ {
150
+ type: 'function',
151
+ function: {
152
+ name: 'sardis_check_balance',
153
+ description: 'Check the current balance of the Sardis wallet. Use this before making payments to ensure sufficient funds are available.',
154
+ parameters: {
155
+ type: 'object',
156
+ properties: {
157
+ token: {
158
+ type: 'string',
159
+ description: 'The token to check balance for. Defaults to USDC.',
160
+ enum: ['USDC', 'USDT', 'PYUSD', 'EURC']
161
+ },
162
+ chain: {
163
+ type: 'string',
164
+ description: 'The blockchain to check balance on (e.g., "base", "polygon", "ethereum")'
165
+ }
166
+ }
167
+ }
168
+ }
169
+ },
170
+ {
171
+ type: 'function',
172
+ function: {
173
+ name: 'sardis_get_wallet',
174
+ description: 'Get information about the Sardis wallet including spending limits, policy settings, and configured addresses.',
175
+ parameters: {
176
+ type: 'object',
177
+ properties: {}
178
+ }
179
+ }
180
+ },
181
+ {
182
+ type: 'function',
183
+ function: {
184
+ name: 'sardis_check_policy',
185
+ description: 'Check if a payment would be allowed by the spending policy without executing it. Use this to validate payments before execution.',
186
+ parameters: {
187
+ type: 'object',
188
+ properties: {
189
+ amount: {
190
+ type: 'number',
191
+ description: 'The amount to pay in USD'
192
+ },
193
+ vendor: {
194
+ type: 'string',
195
+ description: 'The name of the merchant or service provider'
196
+ },
197
+ purpose: {
198
+ type: 'string',
199
+ description: 'The reason for the payment'
200
+ }
201
+ },
202
+ required: ['amount', 'vendor']
203
+ }
204
+ }
205
+ }
206
+ ];
207
+ }
208
+ /**
209
+ * Handle an OpenAI function call and execute the corresponding Sardis operation.
210
+ *
211
+ * @param client - Initialized SardisClient instance
212
+ * @param toolCall - The tool call from OpenAI response
213
+ * @param options - Configuration options including walletId
214
+ * @returns JSON string with the result
215
+ */
216
+ async function handleSardisFunctionCall(client, toolCall, options = {}) {
217
+ const { function: func } = toolCall;
218
+ // SECURITY: LLMs can produce malformed JSON. Without try/catch, a parse
219
+ // failure during a payment flow crashes the process and may leave the
220
+ // system in an inconsistent state (e.g., hold created but never captured).
221
+ let args;
222
+ try {
223
+ args = JSON.parse(func.arguments);
224
+ }
225
+ catch (parseError) {
226
+ return JSON.stringify({
227
+ success: false,
228
+ error: 'INVALID_FUNCTION_ARGUMENTS',
229
+ message: `Failed to parse function arguments: ${parseError instanceof Error ? parseError.message : 'malformed JSON'}`,
230
+ raw_arguments: func.arguments.substring(0, 200),
231
+ });
232
+ }
233
+ const defaultWalletId = options.walletId || process.env.SARDIS_WALLET_ID || '';
234
+ const defaultAgentId = options.agentId || process.env.SARDIS_AGENT_ID || '';
235
+ const defaultChain = options.chain || 'base_sepolia';
236
+ const defaultToken = options.token || 'USDC';
237
+ switch (func.name) {
238
+ case 'sardis_pay':
239
+ return handlePayment(client, args, {
240
+ walletId: defaultWalletId,
241
+ agentId: defaultAgentId,
242
+ chain: defaultChain,
243
+ token: defaultToken
244
+ });
245
+ case 'sardis_check_balance':
246
+ return handleCheckBalance(client, args, {
247
+ walletId: defaultWalletId,
248
+ chain: defaultChain,
249
+ token: defaultToken
250
+ });
251
+ case 'sardis_get_wallet':
252
+ return handleGetWallet(client, defaultWalletId);
253
+ case 'sardis_check_policy':
254
+ return handleCheckPolicy(client, args, defaultWalletId);
255
+ default:
256
+ return JSON.stringify({
257
+ success: false,
258
+ error: `Unknown function: ${func.name}`
259
+ });
260
+ }
261
+ }
262
+ async function handlePayment(client, args, options) {
263
+ const { walletId, agentId, chain, token: defaultToken } = options;
264
+ if (!walletId) {
265
+ return JSON.stringify({
266
+ success: false,
267
+ error: 'No wallet ID configured. Set walletId in options or SARDIS_WALLET_ID env var.'
268
+ });
269
+ }
270
+ // SECURITY: Validate LLM-provided arguments before passing to API.
271
+ // LLMs can produce out-of-range values, injection payloads, or garbage strings.
272
+ const amount = args.amount;
273
+ const vendor = args.vendor;
274
+ const vendorAddress = args.vendor_address;
275
+ const purpose = args.purpose;
276
+ const token = args.token || defaultToken;
277
+ // Amount validation: must be positive, finite, and within sane bounds
278
+ if (typeof amount !== 'number' || !Number.isFinite(amount) || amount <= 0) {
279
+ return JSON.stringify({
280
+ success: false,
281
+ error: 'INVALID_AMOUNT',
282
+ message: 'Amount must be a positive finite number',
283
+ });
284
+ }
285
+ if (amount > 1_000_000) {
286
+ return JSON.stringify({
287
+ success: false,
288
+ error: 'AMOUNT_EXCEEDS_MAXIMUM',
289
+ message: 'Amount exceeds maximum allowed ($1,000,000). Use the dashboard for larger transfers.',
290
+ });
291
+ }
292
+ // Vendor name validation: length limit and safe characters
293
+ if (typeof vendor !== 'string' || vendor.length === 0 || vendor.length > 200) {
294
+ return JSON.stringify({
295
+ success: false,
296
+ error: 'INVALID_VENDOR',
297
+ message: 'Vendor name must be 1-200 characters',
298
+ });
299
+ }
300
+ // Purpose validation: length limit
301
+ if (purpose !== undefined && (typeof purpose !== 'string' || purpose.length > 500)) {
302
+ return JSON.stringify({
303
+ success: false,
304
+ error: 'INVALID_PURPOSE',
305
+ message: 'Purpose must be a string of 500 characters or fewer',
306
+ });
307
+ }
308
+ // Vendor address validation: must be a valid hex address if provided
309
+ if (vendorAddress !== undefined) {
310
+ if (typeof vendorAddress !== 'string' || !/^0x[0-9a-fA-F]{40}$/.test(vendorAddress)) {
311
+ return JSON.stringify({
312
+ success: false,
313
+ error: 'INVALID_VENDOR_ADDRESS',
314
+ message: 'Vendor address must be a valid Ethereum address (0x followed by 40 hex characters)',
315
+ });
316
+ }
317
+ }
318
+ // Token validation
319
+ const validTokens = new Set(['USDC', 'USDT', 'PYUSD', 'EURC']);
320
+ if (!validTokens.has(token)) {
321
+ return JSON.stringify({
322
+ success: false,
323
+ error: 'INVALID_TOKEN',
324
+ message: `Token must be one of: ${[...validTokens].join(', ')}`,
325
+ });
326
+ }
327
+ try {
328
+ const mandateId = generateMandateId();
329
+ const timestamp = new Date().toISOString();
330
+ const amountMinor = Math.round(amount * 1_000_000).toString();
331
+ const auditData = JSON.stringify({
332
+ mandate_id: mandateId,
333
+ subject: walletId,
334
+ destination: vendorAddress || `pending:${vendor}`,
335
+ amount_minor: amountMinor,
336
+ token,
337
+ purpose: purpose || `Payment to ${vendor}`,
338
+ timestamp
339
+ });
340
+ const auditHash = await createAuditHash(auditData);
341
+ const mandate = {
342
+ mandate_id: mandateId,
343
+ subject: walletId,
344
+ destination: vendorAddress || `pending:${vendor}`,
345
+ amount_minor: amountMinor,
346
+ token,
347
+ chain,
348
+ purpose: purpose || `Payment to ${vendor}`,
349
+ vendor_name: vendor,
350
+ agent_id: agentId,
351
+ timestamp,
352
+ audit_hash: auditHash,
353
+ metadata: {
354
+ vendor,
355
+ category: 'saas',
356
+ initiated_by: 'ai_agent',
357
+ tool: 'openai_function_calling'
358
+ }
359
+ };
360
+ const result = await client.payments.executeMandate(mandate);
361
+ return JSON.stringify({
362
+ success: true,
363
+ status: result.status,
364
+ payment_id: result.payment_id,
365
+ transaction_hash: result.tx_hash,
366
+ chain: result.chain,
367
+ ledger_tx_id: result.ledger_tx_id,
368
+ audit_anchor: result.audit_anchor,
369
+ message: `Payment of $${amount} ${token} to ${vendor} ${result.status === 'completed' ? 'completed' : 'initiated'}.`
370
+ });
371
+ }
372
+ catch (error) {
373
+ const errorMessage = error instanceof Error ? error.message : 'Payment failed';
374
+ if (errorMessage.includes('policy') || errorMessage.includes('blocked') || errorMessage.includes('limit')) {
375
+ return JSON.stringify({
376
+ success: false,
377
+ blocked: true,
378
+ error: errorMessage,
379
+ message: `Payment to ${vendor} blocked by policy: ${errorMessage}`
380
+ });
381
+ }
382
+ return JSON.stringify({
383
+ success: false,
384
+ error: errorMessage
385
+ });
386
+ }
387
+ }
388
+ async function handleCheckBalance(client, args, options) {
389
+ const { walletId } = options;
390
+ if (!walletId) {
391
+ return JSON.stringify({
392
+ success: false,
393
+ error: 'No wallet ID configured'
394
+ });
395
+ }
396
+ const token = args.token || options.token;
397
+ const chain = args.chain || options.chain;
398
+ try {
399
+ const balance = await client.wallets.getBalance(walletId, chain, token);
400
+ return JSON.stringify({
401
+ success: true,
402
+ wallet_id: balance.wallet_id,
403
+ balance: balance.balance,
404
+ token: balance.token,
405
+ chain: balance.chain,
406
+ address: balance.address
407
+ });
408
+ }
409
+ catch (error) {
410
+ return JSON.stringify({
411
+ success: false,
412
+ error: error instanceof Error ? error.message : 'Failed to get balance'
413
+ });
414
+ }
415
+ }
416
+ async function handleGetWallet(client, walletId) {
417
+ if (!walletId) {
418
+ return JSON.stringify({
419
+ success: false,
420
+ error: 'No wallet ID configured'
421
+ });
422
+ }
423
+ try {
424
+ const wallet = await client.wallets.get(walletId);
425
+ return JSON.stringify({
426
+ success: true,
427
+ wallet: {
428
+ id: wallet.id,
429
+ agent_id: wallet.agent_id,
430
+ currency: wallet.currency,
431
+ limit_per_tx: wallet.limit_per_tx,
432
+ limit_total: wallet.limit_total,
433
+ is_active: wallet.is_active,
434
+ addresses: wallet.addresses
435
+ }
436
+ });
437
+ }
438
+ catch (error) {
439
+ return JSON.stringify({
440
+ success: false,
441
+ error: error instanceof Error ? error.message : 'Failed to get wallet'
442
+ });
443
+ }
444
+ }
445
+ async function handleCheckPolicy(client, args, walletId) {
446
+ if (!walletId) {
447
+ return JSON.stringify({
448
+ success: false,
449
+ error: 'No wallet ID configured'
450
+ });
451
+ }
452
+ const amount = args.amount;
453
+ const vendor = args.vendor;
454
+ try {
455
+ const wallet = await client.wallets.get(walletId);
456
+ const limitPerTx = parseFloat(wallet.limit_per_tx);
457
+ const checks = [];
458
+ if (amount <= limitPerTx) {
459
+ checks.push({ name: 'per_transaction_limit', passed: true });
460
+ }
461
+ else {
462
+ checks.push({
463
+ name: 'per_transaction_limit',
464
+ passed: false,
465
+ reason: `Amount $${amount} exceeds per-transaction limit of $${limitPerTx}`
466
+ });
467
+ }
468
+ if (wallet.is_active) {
469
+ checks.push({ name: 'wallet_active', passed: true });
470
+ }
471
+ else {
472
+ checks.push({
473
+ name: 'wallet_active',
474
+ passed: false,
475
+ reason: 'Wallet is not active'
476
+ });
477
+ }
478
+ const allPassed = checks.every(c => c.passed);
479
+ return JSON.stringify({
480
+ success: true,
481
+ allowed: allPassed,
482
+ checks,
483
+ summary: allPassed
484
+ ? `Payment of $${amount} to ${vendor} would be allowed`
485
+ : `Payment of $${amount} to ${vendor} would be blocked: ${checks.filter(c => !c.passed).map(c => c.reason).join('; ')}`
486
+ });
487
+ }
488
+ catch (error) {
489
+ return JSON.stringify({
490
+ success: false,
491
+ error: error instanceof Error ? error.message : 'Failed to check policy'
492
+ });
493
+ }
494
+ }
495
+ /**
496
+ * Helper to create tool response message for OpenAI conversation
497
+ */
498
+ function createToolResponse(toolCallId, content) {
499
+ return {
500
+ role: 'tool',
501
+ tool_call_id: toolCallId,
502
+ content
503
+ };
504
+ }
505
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/integrations/openai.ts"],"names":[],"mappings":"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"}