@sardis/ai-sdk 0.1.3 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,13 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.1.5] - 2026-02-14
9
+
10
+ ### Fixed
11
+
12
+ - Publish metadata now uses a registry-compatible dependency range for `@sardis/sdk` (removes workspace protocol leakage in published package).
13
+ - Release docs/claims parity cleanup to keep MCP tool count aligned with unique registered tools.
14
+
8
15
  ## [0.1.0] - 2026-01-27
9
16
 
10
17
  ### Added
package/README.md CHANGED
@@ -250,7 +250,7 @@ if (!result.success) {
250
250
  - [Documentation](https://sardis.sh/docs)
251
251
  - [API Reference](https://sardis.sh/docs/api)
252
252
  - [GitHub](https://github.com/sardis-project/sardis)
253
- - [Discord](https://discord.gg/sardis)
253
+ - [Discord](https://discord.gg/XMA9JwDJ)
254
254
 
255
255
  ## License
256
256
 
@@ -1,4 +1,4 @@
1
- import { createSardisTools, createReadOnlySardisTools, createMinimalSardisTools } from './chunk-OSEUF66C.js';
1
+ import { createSardisTools, createReadOnlySardisTools, createMinimalSardisTools } from './chunk-CVJNY6YV.js';
2
2
 
3
3
  // src/provider.ts
4
4
  var SardisProvider = class {
@@ -212,5 +212,5 @@ function createSardisProvider(config) {
212
212
  }
213
213
 
214
214
  export { SardisProvider, createSardisProvider };
215
- //# sourceMappingURL=chunk-GJYLTYI6.js.map
216
- //# sourceMappingURL=chunk-GJYLTYI6.js.map
215
+ //# sourceMappingURL=chunk-6ANIHSMF.js.map
216
+ //# sourceMappingURL=chunk-6ANIHSMF.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/provider.ts"],"names":[],"mappings":"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","file":"chunk-GJYLTYI6.js","sourcesContent":["/**\n * Sardis Provider for Vercel AI SDK.\n *\n * Provides a higher-level abstraction for integrating Sardis payments\n * with AI agents, including automatic policy enforcement and transaction logging.\n *\n * @example\n * ```typescript\n * import { SardisProvider } from '@sardis/ai-sdk/provider'\n *\n * const sardis = new SardisProvider({\n * apiKey: process.env.SARDIS_API_KEY!,\n * walletId: 'wallet_abc123',\n * agentId: 'agent_xyz789',\n * })\n *\n * // Use with Vercel AI SDK\n * const { text } = await generateText({\n * model: openai('gpt-4o'),\n * tools: sardis.tools,\n * system: sardis.systemPrompt,\n * prompt: 'Purchase $50 worth of API credits',\n * })\n *\n * // Or execute directly\n * const result = await sardis.pay({\n * to: 'merchant_openai',\n * amount: 50,\n * memo: 'API credits',\n * })\n * ```\n */\n\nimport { createSardisTools, createMinimalSardisTools, createReadOnlySardisTools } from './tools'\nimport type { SardisToolsConfig, PaymentResult, HoldResult, PolicyCheckResult, BalanceResult } from './types'\nimport type { Tool, ToolExecutionOptions } from 'ai'\n\n/**\n * Extended configuration for SardisProvider.\n */\nexport interface SardisProviderConfig extends SardisToolsConfig {\n /** Log all transactions to console */\n enableLogging?: boolean\n /** Callback for transaction events */\n onTransaction?: (event: TransactionEvent) => void | Promise<void>\n /** Custom system prompt additions */\n customInstructions?: string\n /** Tool set to use: 'full', 'minimal', 'readonly' */\n toolSet?: 'full' | 'minimal' | 'readonly'\n}\n\n/**\n * Transaction event for logging/callbacks.\n */\nexport interface TransactionEvent {\n type: 'payment' | 'hold_create' | 'hold_capture' | 'hold_void' | 'policy_check' | 'balance_check'\n timestamp: string\n params: Record<string, unknown>\n result: PaymentResult | HoldResult | PolicyCheckResult | BalanceResult\n success: boolean\n error?: string\n}\n\n/**\n * Sardis Provider for streamlined AI agent integration.\n *\n * Provides:\n * - Pre-configured tools for Vercel AI SDK\n * - System prompt with payment guidelines\n * - Direct payment methods for programmatic access\n * - Transaction logging and callbacks\n */\nexport class SardisProvider {\n private config: SardisProviderConfig\n private _tools: Record<string, Tool>\n\n constructor(config: SardisProviderConfig) {\n this.config = config\n\n // Create appropriate tool set\n switch (config.toolSet) {\n case 'minimal':\n this._tools = createMinimalSardisTools(config)\n break\n case 'readonly':\n this._tools = createReadOnlySardisTools(config)\n break\n default:\n this._tools = createSardisTools(config)\n }\n\n // Wrap tools with logging if enabled\n if (config.enableLogging || config.onTransaction) {\n this._tools = this.wrapToolsWithLogging(this._tools)\n }\n }\n\n /**\n * Get the tools for Vercel AI SDK.\n */\n get tools(): Record<string, Tool> {\n return this._tools\n }\n\n /**\n * Get the recommended system prompt for payment agents.\n */\n get systemPrompt(): string {\n const basePrompt = `You are an AI assistant with access to a Sardis payment wallet.\n\n## Payment Guidelines\n\n1. **Always check policy before large payments** (>$50)\n - Use sardis_check_policy to verify the payment would be allowed\n - Report any policy violations to the user\n\n2. **Use holds for uncertain amounts**\n - Create a hold when the final amount isn't known\n - Capture the hold once the final amount is confirmed\n - Void holds that are no longer needed\n\n3. **Provide transaction details**\n - Always include the transaction ID and status in your response\n - If a payment fails, explain why and suggest alternatives\n\n4. **Respect spending limits**\n - Check remaining limits with sardis_get_spending\n - Don't attempt payments that would exceed limits\n\n5. **Security practices**\n - Never expose wallet IDs or API keys\n - Verify merchant names before large payments\n - Double-check amounts with the user for payments >$100\n\n## Available Actions\n\n- **sardis_pay**: Execute a payment\n- **sardis_create_hold**: Reserve funds for later\n- **sardis_capture_hold**: Complete a held payment\n- **sardis_void_hold**: Cancel a hold\n- **sardis_check_policy**: Check if payment is allowed\n- **sardis_get_balance**: Check wallet balance\n- **sardis_get_spending**: View spending summary`\n\n if (this.config.customInstructions) {\n return `${basePrompt}\\n\\n## Additional Instructions\\n\\n${this.config.customInstructions}`\n }\n\n return basePrompt\n }\n\n /**\n * Execute a payment directly (without AI).\n */\n async pay(params: {\n to: string\n amount: number\n token?: string\n chain?: 'base' | 'polygon' | 'ethereum' | 'arbitrum' | 'optimism'\n memo?: string\n merchant?: string\n category?: string\n }): Promise<PaymentResult> {\n const tool = this._tools.sardis_pay\n if (!tool || typeof tool.execute !== 'function') {\n throw new Error('Payment tool not available')\n }\n return tool.execute(params, { toolCallId: 'direct', messages: [] }) as Promise<PaymentResult>\n }\n\n /**\n * Create a hold directly (without AI).\n */\n async createHold(params: {\n amount: number\n merchant: string\n expiresInHours?: number\n description?: string\n }): Promise<HoldResult> {\n const tool = this._tools.sardis_create_hold\n if (!tool || typeof tool.execute !== 'function') {\n throw new Error('Hold tool not available')\n }\n return tool.execute(params, { toolCallId: 'direct', messages: [] }) as Promise<HoldResult>\n }\n\n /**\n * Capture a hold directly (without AI).\n */\n async captureHold(holdId: string, amount?: number): Promise<HoldResult> {\n const tool = this._tools.sardis_capture_hold\n if (!tool || typeof tool.execute !== 'function') {\n throw new Error('Capture tool not available')\n }\n return tool.execute({ holdId, amount }, { toolCallId: 'direct', messages: [] }) as Promise<HoldResult>\n }\n\n /**\n * Void a hold directly (without AI).\n */\n async voidHold(holdId: string): Promise<HoldResult> {\n const tool = this._tools.sardis_void_hold\n if (!tool || typeof tool.execute !== 'function') {\n throw new Error('Void tool not available')\n }\n return tool.execute({ holdId }, { toolCallId: 'direct', messages: [] }) as Promise<HoldResult>\n }\n\n /**\n * Check policy directly (without AI).\n */\n async checkPolicy(params: {\n amount: number\n merchant?: string\n category?: string\n }): Promise<PolicyCheckResult> {\n const tool = this._tools.sardis_check_policy\n if (!tool || typeof tool.execute !== 'function') {\n throw new Error('Policy check tool not available')\n }\n return tool.execute(params, { toolCallId: 'direct', messages: [] }) as Promise<PolicyCheckResult>\n }\n\n /**\n * Get balance directly (without AI).\n */\n async getBalance(token?: string, chain?: string): Promise<BalanceResult> {\n const tool = this._tools.sardis_get_balance\n if (!tool || typeof tool.execute !== 'function') {\n throw new Error('Balance tool not available')\n }\n return tool.execute({ token, chain }, { toolCallId: 'direct', messages: [] }) as Promise<BalanceResult>\n }\n\n /**\n * Wrap tools with logging functionality.\n */\n private wrapToolsWithLogging(tools: Record<string, Tool>): Record<string, Tool> {\n const wrapped: Record<string, Tool> = {}\n\n for (const [name, tool] of Object.entries(tools)) {\n if (tool && typeof tool.execute === 'function') {\n const originalExecute = tool.execute.bind(tool)\n\n wrapped[name] = {\n ...tool,\n execute: async (params: unknown, options: ToolExecutionOptions) => {\n const startTime = Date.now()\n let result: unknown\n let success = true\n let error: string | undefined\n\n try {\n result = await originalExecute(params, options)\n\n // Check if result indicates failure\n if (result && typeof result === 'object' && 'success' in result) {\n success = (result as { success: boolean }).success\n if (!success && 'error' in result) {\n error = (result as { error?: string }).error\n }\n }\n } catch (e) {\n success = false\n error = e instanceof Error ? e.message : 'Unknown error'\n throw e\n } finally {\n const event: TransactionEvent = {\n type: this.getEventType(name),\n timestamp: new Date().toISOString(),\n params: params as Record<string, unknown>,\n result: result as TransactionEvent['result'],\n success,\n error,\n }\n\n // Log to console if enabled\n if (this.config.enableLogging) {\n const duration = Date.now() - startTime\n console.log(`[Sardis] ${name} ${success ? '✓' : '✗'} (${duration}ms)`, event)\n }\n\n // Call transaction callback if provided\n if (this.config.onTransaction) {\n try {\n await this.config.onTransaction(event)\n } catch (callbackError) {\n console.error('[Sardis] Transaction callback error:', callbackError)\n }\n }\n }\n\n return result\n },\n } as Tool\n } else {\n wrapped[name] = tool\n }\n }\n\n return wrapped\n }\n\n /**\n * Map tool name to event type.\n */\n private getEventType(toolName: string): TransactionEvent['type'] {\n const mapping: Record<string, TransactionEvent['type']> = {\n sardis_pay: 'payment',\n sardis_create_hold: 'hold_create',\n sardis_capture_hold: 'hold_capture',\n sardis_void_hold: 'hold_void',\n sardis_check_policy: 'policy_check',\n sardis_get_balance: 'balance_check',\n sardis_get_spending: 'balance_check',\n }\n return mapping[toolName] || 'payment'\n }\n}\n\n/**\n * Create a SardisProvider instance.\n *\n * Convenience function for creating a provider.\n */\nexport function createSardisProvider(config: SardisProviderConfig): SardisProvider {\n return new SardisProvider(config)\n}\n"]}
1
+ {"version":3,"sources":["../src/provider.ts"],"names":[],"mappings":"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","file":"chunk-6ANIHSMF.js","sourcesContent":["/**\n * Sardis Provider for Vercel AI SDK.\n *\n * Provides a higher-level abstraction for integrating Sardis payments\n * with AI agents, including automatic policy enforcement and transaction logging.\n *\n * @example\n * ```typescript\n * import { SardisProvider } from '@sardis/ai-sdk/provider'\n *\n * const sardis = new SardisProvider({\n * apiKey: process.env.SARDIS_API_KEY!,\n * walletId: 'wallet_abc123',\n * agentId: 'agent_xyz789',\n * })\n *\n * // Use with Vercel AI SDK\n * const { text } = await generateText({\n * model: openai('gpt-4o'),\n * tools: sardis.tools,\n * system: sardis.systemPrompt,\n * prompt: 'Purchase $50 worth of API credits',\n * })\n *\n * // Or execute directly\n * const result = await sardis.pay({\n * to: 'merchant_openai',\n * amount: 50,\n * memo: 'API credits',\n * })\n * ```\n */\n\nimport { createSardisTools, createMinimalSardisTools, createReadOnlySardisTools } from './tools'\nimport type { SardisToolsConfig, PaymentResult, HoldResult, PolicyCheckResult, BalanceResult } from './types'\nimport type { Tool, ToolExecutionOptions } from 'ai'\n\n/**\n * Extended configuration for SardisProvider.\n */\nexport interface SardisProviderConfig extends SardisToolsConfig {\n /** Log all transactions to console */\n enableLogging?: boolean\n /** Callback for transaction events */\n onTransaction?: (event: TransactionEvent) => void | Promise<void>\n /** Custom system prompt additions */\n customInstructions?: string\n /** Tool set to use: 'full', 'minimal', 'readonly' */\n toolSet?: 'full' | 'minimal' | 'readonly'\n}\n\n/**\n * Transaction event for logging/callbacks.\n */\nexport interface TransactionEvent {\n type: 'payment' | 'hold_create' | 'hold_capture' | 'hold_void' | 'policy_check' | 'balance_check'\n timestamp: string\n params: Record<string, unknown>\n result: PaymentResult | HoldResult | PolicyCheckResult | BalanceResult\n success: boolean\n error?: string\n}\n\n/**\n * Sardis Provider for streamlined AI agent integration.\n *\n * Provides:\n * - Pre-configured tools for Vercel AI SDK\n * - System prompt with payment guidelines\n * - Direct payment methods for programmatic access\n * - Transaction logging and callbacks\n */\nexport class SardisProvider {\n private config: SardisProviderConfig\n private _tools: Record<string, Tool>\n\n constructor(config: SardisProviderConfig) {\n this.config = config\n\n // Create appropriate tool set\n switch (config.toolSet) {\n case 'minimal':\n this._tools = createMinimalSardisTools(config)\n break\n case 'readonly':\n this._tools = createReadOnlySardisTools(config)\n break\n default:\n this._tools = createSardisTools(config)\n }\n\n // Wrap tools with logging if enabled\n if (config.enableLogging || config.onTransaction) {\n this._tools = this.wrapToolsWithLogging(this._tools)\n }\n }\n\n /**\n * Get the tools for Vercel AI SDK.\n */\n get tools(): Record<string, Tool> {\n return this._tools\n }\n\n /**\n * Get the recommended system prompt for payment agents.\n */\n get systemPrompt(): string {\n const basePrompt = `You are an AI assistant with access to a Sardis payment wallet.\n\n## Payment Guidelines\n\n1. **Always check policy before large payments** (>$50)\n - Use sardis_check_policy to verify the payment would be allowed\n - Report any policy violations to the user\n\n2. **Use holds for uncertain amounts**\n - Create a hold when the final amount isn't known\n - Capture the hold once the final amount is confirmed\n - Void holds that are no longer needed\n\n3. **Provide transaction details**\n - Always include the transaction ID and status in your response\n - If a payment fails, explain why and suggest alternatives\n\n4. **Respect spending limits**\n - Check remaining limits with sardis_get_spending\n - Don't attempt payments that would exceed limits\n\n5. **Security practices**\n - Never expose wallet IDs or API keys\n - Verify merchant names before large payments\n - Double-check amounts with the user for payments >$100\n\n## Available Actions\n\n- **sardis_pay**: Execute a payment\n- **sardis_create_hold**: Reserve funds for later\n- **sardis_capture_hold**: Complete a held payment\n- **sardis_void_hold**: Cancel a hold\n- **sardis_check_policy**: Check if payment is allowed\n- **sardis_get_balance**: Check wallet balance\n- **sardis_get_spending**: View spending summary`\n\n if (this.config.customInstructions) {\n return `${basePrompt}\\n\\n## Additional Instructions\\n\\n${this.config.customInstructions}`\n }\n\n return basePrompt\n }\n\n /**\n * Execute a payment directly (without AI).\n */\n async pay(params: {\n to: string\n amount: number\n token?: string\n chain?: 'base' | 'polygon' | 'ethereum' | 'arbitrum' | 'optimism'\n memo?: string\n merchant?: string\n category?: string\n }): Promise<PaymentResult> {\n const tool = this._tools.sardis_pay\n if (!tool || typeof tool.execute !== 'function') {\n throw new Error('Payment tool not available')\n }\n return tool.execute(params, { toolCallId: 'direct', messages: [] }) as Promise<PaymentResult>\n }\n\n /**\n * Create a hold directly (without AI).\n */\n async createHold(params: {\n amount: number\n merchant: string\n expiresInHours?: number\n description?: string\n }): Promise<HoldResult> {\n const tool = this._tools.sardis_create_hold\n if (!tool || typeof tool.execute !== 'function') {\n throw new Error('Hold tool not available')\n }\n return tool.execute(params, { toolCallId: 'direct', messages: [] }) as Promise<HoldResult>\n }\n\n /**\n * Capture a hold directly (without AI).\n */\n async captureHold(holdId: string, amount?: number): Promise<HoldResult> {\n const tool = this._tools.sardis_capture_hold\n if (!tool || typeof tool.execute !== 'function') {\n throw new Error('Capture tool not available')\n }\n return tool.execute({ holdId, amount }, { toolCallId: 'direct', messages: [] }) as Promise<HoldResult>\n }\n\n /**\n * Void a hold directly (without AI).\n */\n async voidHold(holdId: string): Promise<HoldResult> {\n const tool = this._tools.sardis_void_hold\n if (!tool || typeof tool.execute !== 'function') {\n throw new Error('Void tool not available')\n }\n return tool.execute({ holdId }, { toolCallId: 'direct', messages: [] }) as Promise<HoldResult>\n }\n\n /**\n * Check policy directly (without AI).\n */\n async checkPolicy(params: {\n amount: number\n merchant?: string\n category?: string\n }): Promise<PolicyCheckResult> {\n const tool = this._tools.sardis_check_policy\n if (!tool || typeof tool.execute !== 'function') {\n throw new Error('Policy check tool not available')\n }\n return tool.execute(params, { toolCallId: 'direct', messages: [] }) as Promise<PolicyCheckResult>\n }\n\n /**\n * Get balance directly (without AI).\n */\n async getBalance(token?: string, chain?: string): Promise<BalanceResult> {\n const tool = this._tools.sardis_get_balance\n if (!tool || typeof tool.execute !== 'function') {\n throw new Error('Balance tool not available')\n }\n return tool.execute({ token, chain }, { toolCallId: 'direct', messages: [] }) as Promise<BalanceResult>\n }\n\n /**\n * Wrap tools with logging functionality.\n */\n private wrapToolsWithLogging(tools: Record<string, Tool>): Record<string, Tool> {\n const wrapped: Record<string, Tool> = {}\n\n for (const [name, tool] of Object.entries(tools)) {\n if (tool && typeof tool.execute === 'function') {\n const originalExecute = tool.execute.bind(tool)\n\n wrapped[name] = {\n ...tool,\n execute: async (params: unknown, options: ToolExecutionOptions) => {\n const startTime = Date.now()\n let result: unknown\n let success = true\n let error: string | undefined\n\n try {\n result = await originalExecute(params, options)\n\n // Check if result indicates failure\n if (result && typeof result === 'object' && 'success' in result) {\n success = (result as { success: boolean }).success\n if (!success && 'error' in result) {\n error = (result as { error?: string }).error\n }\n }\n } catch (e) {\n success = false\n error = e instanceof Error ? e.message : 'Unknown error'\n throw e\n } finally {\n const event: TransactionEvent = {\n type: this.getEventType(name),\n timestamp: new Date().toISOString(),\n params: params as Record<string, unknown>,\n result: result as TransactionEvent['result'],\n success,\n error,\n }\n\n // Log to console if enabled\n if (this.config.enableLogging) {\n const duration = Date.now() - startTime\n console.log(`[Sardis] ${name} ${success ? '✓' : '✗'} (${duration}ms)`, event)\n }\n\n // Call transaction callback if provided\n if (this.config.onTransaction) {\n try {\n await this.config.onTransaction(event)\n } catch (callbackError) {\n console.error('[Sardis] Transaction callback error:', callbackError)\n }\n }\n }\n\n return result\n },\n } as Tool\n } else {\n wrapped[name] = tool\n }\n }\n\n return wrapped\n }\n\n /**\n * Map tool name to event type.\n */\n private getEventType(toolName: string): TransactionEvent['type'] {\n const mapping: Record<string, TransactionEvent['type']> = {\n sardis_pay: 'payment',\n sardis_create_hold: 'hold_create',\n sardis_capture_hold: 'hold_capture',\n sardis_void_hold: 'hold_void',\n sardis_check_policy: 'policy_check',\n sardis_get_balance: 'balance_check',\n sardis_get_spending: 'balance_check',\n }\n return mapping[toolName] || 'payment'\n }\n}\n\n/**\n * Create a SardisProvider instance.\n *\n * Convenience function for creating a provider.\n */\nexport function createSardisProvider(config: SardisProviderConfig): SardisProvider {\n return new SardisProvider(config)\n}\n"]}
@@ -85,8 +85,8 @@ var SardisToolClient = class {
85
85
  });
86
86
  if (!response.ok) {
87
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}`;
88
+ const parsedError = error && typeof error === "object" ? error : null;
89
+ const message = parsedError?.message || parsedError?.detail || `API error: ${response.status}`;
90
90
  throw new Error(message);
91
91
  }
92
92
  return await response.json();
@@ -450,5 +450,5 @@ function createReadOnlySardisTools(config) {
450
450
  }
451
451
 
452
452
  export { BalanceParamsSchema, CaptureParamsSchema, HoldParamsSchema, PaymentParamsSchema, PolicyCheckParamsSchema, createMinimalSardisTools, createReadOnlySardisTools, createSardisTools };
453
- //# sourceMappingURL=chunk-OSEUF66C.js.map
454
- //# sourceMappingURL=chunk-OSEUF66C.js.map
453
+ //# sourceMappingURL=chunk-CVJNY6YV.js.map
454
+ //# sourceMappingURL=chunk-CVJNY6YV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types.ts","../src/tools.ts"],"names":["z"],"mappings":"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","file":"chunk-CVJNY6YV.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.sh) */\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\ntype ErrorPayload = {\n message?: string\n detail?: string\n}\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.sh').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 parsedError = error && typeof error === 'object' ? (error as ErrorPayload) : null\n const message =\n (parsedError?.message || parsedError?.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"]}
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- export { SardisProvider, createSardisProvider } from './chunk-GJYLTYI6.js';
2
- export { BalanceParamsSchema, CaptureParamsSchema, HoldParamsSchema, PaymentParamsSchema, PolicyCheckParamsSchema, createMinimalSardisTools, createReadOnlySardisTools, createSardisTools } from './chunk-OSEUF66C.js';
1
+ export { SardisProvider, createSardisProvider } from './chunk-6ANIHSMF.js';
2
+ export { BalanceParamsSchema, CaptureParamsSchema, HoldParamsSchema, PaymentParamsSchema, PolicyCheckParamsSchema, createMinimalSardisTools, createReadOnlySardisTools, createSardisTools } from './chunk-CVJNY6YV.js';
3
3
  //# sourceMappingURL=index.js.map
4
4
  //# sourceMappingURL=index.js.map
package/dist/provider.js CHANGED
@@ -1,4 +1,4 @@
1
- export { SardisProvider, createSardisProvider } from './chunk-GJYLTYI6.js';
2
- import './chunk-OSEUF66C.js';
1
+ export { SardisProvider, createSardisProvider } from './chunk-6ANIHSMF.js';
2
+ import './chunk-CVJNY6YV.js';
3
3
  //# sourceMappingURL=provider.js.map
4
4
  //# sourceMappingURL=provider.js.map
package/dist/tools.js CHANGED
@@ -1,3 +1,3 @@
1
- export { createMinimalSardisTools, createReadOnlySardisTools, createSardisTools } from './chunk-OSEUF66C.js';
1
+ export { createMinimalSardisTools, createReadOnlySardisTools, createSardisTools } from './chunk-CVJNY6YV.js';
2
2
  //# sourceMappingURL=tools.js.map
3
3
  //# sourceMappingURL=tools.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sardis/ai-sdk",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "Sardis payment tools for Vercel AI SDK - Enable AI agents to make payments with policy guardrails",
5
5
  "keywords": [
6
6
  "ai",
@@ -68,7 +68,7 @@
68
68
  "prepublishOnly": "npm run build && npm run test"
69
69
  },
70
70
  "dependencies": {
71
- "@sardis/sdk": "workspace:^0.2.0",
71
+ "@sardis/sdk": "^0.3.4",
72
72
  "zod": "^3.22.0"
73
73
  },
74
74
  "peerDependencies": {
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/types.ts","../src/tools.ts"],"names":["z"],"mappings":"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","file":"chunk-OSEUF66C.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.sh) */\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.sh').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"]}