@naturalpay/sdk 0.1.3 → 0.1.4
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/dist/index.cjs +538 -115
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +189 -3
- package/dist/index.d.ts +189 -3
- package/dist/index.js +531 -116
- package/dist/index.js.map +1 -1
- package/dist/mcp/cli.cjs +1 -1
- package/dist/mcp/cli.cjs.map +1 -1
- package/dist/mcp/cli.js +1 -1
- package/dist/mcp/cli.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/version.ts","../src/logging.ts","../src/tool-call-context.ts","../src/http.ts","../src/resources/base.ts","../src/resources/transactions.ts","../src/resources/payments.ts","../src/resources/wallet.ts","../src/resources/agents.ts","../src/resources/delegations.ts","../src/resources/customers.ts","../src/client.ts","../src/types/transactions.ts"],"names":["logger","AsyncLocalStorage","networkError","TransactionTypeFilter"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Natural Payments SDK error classes.\n */\n\n/**\n * Base error for all Natural SDK errors.\n */\nexport class NaturalError extends Error {\n readonly statusCode?: number;\n readonly code?: string;\n\n constructor(message: string, options?: { statusCode?: number; code?: string }) {\n super(message);\n this.name = 'NaturalError';\n this.statusCode = options?.statusCode;\n this.code = options?.code;\n\n // Maintains proper stack trace for where error was thrown (V8 engines)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\n/**\n * Invalid or missing API key.\n */\nexport class AuthenticationError extends NaturalError {\n constructor(message = 'Invalid or missing API key') {\n super(message, { statusCode: 401, code: 'authentication_error' });\n this.name = 'AuthenticationError';\n }\n}\n\n/**\n * Malformed request parameters.\n */\nexport class InvalidRequestError extends NaturalError {\n constructor(message: string, code = 'invalid_request') {\n super(message, { statusCode: 400, code });\n this.name = 'InvalidRequestError';\n }\n}\n\n/**\n * Payment-specific failure.\n */\nexport class PaymentError extends NaturalError {\n constructor(message: string, code = 'payment_error') {\n super(message, { statusCode: 400, code });\n this.name = 'PaymentError';\n }\n}\n\n/**\n * Not enough balance for payment.\n */\nexport class InsufficientFundsError extends PaymentError {\n constructor(message = 'Insufficient funds') {\n super(message, 'insufficient_funds');\n this.name = 'InsufficientFundsError';\n }\n}\n\n/**\n * Invalid recipient.\n */\nexport class RecipientNotFoundError extends PaymentError {\n constructor(message = 'Recipient not found') {\n super(message, 'recipient_not_found');\n this.name = 'RecipientNotFoundError';\n }\n}\n\n/**\n * Too many requests.\n */\nexport class RateLimitError extends NaturalError {\n readonly retryAfter?: number;\n\n constructor(message = 'Rate limit exceeded', retryAfter?: number) {\n super(message, { statusCode: 429, code: 'rate_limit_exceeded' });\n this.name = 'RateLimitError';\n this.retryAfter = retryAfter;\n }\n}\n\n/**\n * Internal server error.\n */\nexport class ServerError extends NaturalError {\n constructor(message = 'Internal server error') {\n super(message, { statusCode: 500, code: 'server_error' });\n this.name = 'ServerError';\n }\n}\n","/**\n * Single source of truth for the SDK version string.\n */\nexport const VERSION = '0.1.3';\n","/**\n * Structured logging for Natural Payments SDK.\n *\n * Supports two modes:\n * 1. Plain text logging (default, for local development)\n * 2. JSON logging with Datadog correlation (when NATURAL_LOG_FORMAT=json)\n *\n * Features:\n * - Source info: file, line, function on every log (for error grouping)\n * - Context binding for request_id, agent_id, instance_id\n * - Datadog trace correlation fields\n * - AsyncLocalStorage for proper async context isolation\n */\n\nimport { AsyncLocalStorage } from 'node:async_hooks';\n\nimport { VERSION } from './version.js';\n\n// Log levels (matching standard levels)\nexport type LogLevel = 'debug' | 'info' | 'warning' | 'error';\n\nconst LOG_LEVEL_VALUES: Record<LogLevel, number> = {\n debug: 10,\n info: 20,\n warning: 30,\n error: 40,\n};\n\n// AsyncLocalStorage for proper async context isolation\nconst asyncContext = new AsyncLocalStorage<Record<string, unknown>>();\n\n// Fallback global context for environments where AsyncLocalStorage isn't used\nlet globalContext: Record<string, unknown> = {};\n\n/**\n * Get the current logging context.\n * Uses AsyncLocalStorage if available, falls back to global context.\n */\nexport function getContext(): Record<string, unknown> {\n const asyncStore = asyncContext.getStore();\n if (asyncStore) {\n return { ...asyncStore };\n }\n return { ...globalContext };\n}\n\n/**\n * Sanitize a string for safe logging to prevent log injection.\n */\nfunction sanitizeString(value: string): string {\n let sanitized = '';\n for (const char of value) {\n if (char === '\\r' || char === '\\n') {\n sanitized += '\\\\n';\n } else if (char.charCodeAt(0) < 32 || char.charCodeAt(0) === 127) {\n // Control characters - escape them\n sanitized += `\\\\x${char.charCodeAt(0).toString(16).padStart(2, '0')}`;\n } else {\n sanitized += char;\n }\n }\n // Truncate overly long values to prevent log flooding\n const maxLength = 1000;\n if (sanitized.length > maxLength) {\n sanitized = sanitized.slice(0, maxLength) + '...[truncated]';\n }\n return sanitized;\n}\n\n/**\n * Sanitize a value for safe logging to prevent log injection.\n *\n * Recursively sanitizes strings in objects and arrays.\n * Removes/escapes control characters, newlines, and other potentially\n * dangerous sequences that could be used for log injection attacks.\n */\nfunction sanitizeLogValue(value: unknown, depth = 0): unknown {\n // Prevent infinite recursion on deeply nested objects\n const maxDepth = 10;\n if (depth > maxDepth) {\n return '[max depth exceeded]';\n }\n\n if (value === null || value === undefined) {\n return value;\n }\n\n if (typeof value === 'string') {\n return sanitizeString(value);\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => sanitizeLogValue(item, depth + 1));\n }\n\n if (typeof value === 'object') {\n const sanitized: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value)) {\n const sanitizedKey = sanitizeString(key);\n sanitized[sanitizedKey] = sanitizeLogValue(val, depth + 1);\n }\n return sanitized;\n }\n\n // For functions, symbols, etc. - return type description\n return `[${typeof value}]`;\n}\n\n/**\n * Bind additional context to current scope (e.g., request_id, agent_id).\n *\n * Values are sanitized to prevent log injection attacks.\n * Updates both AsyncLocalStorage (if active) and global context.\n *\n * @example\n * bindContext({ requestId: 'req_123', agentId: 'agt_456' });\n * logger.info('Processing payment'); // Will include requestId and agentId\n */\nexport function bindContext(context: Record<string, unknown>): void {\n const sanitized: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(context)) {\n sanitized[key] = sanitizeLogValue(value);\n }\n\n // Update AsyncLocalStorage if active\n const asyncStore = asyncContext.getStore();\n if (asyncStore) {\n Object.assign(asyncStore, sanitized);\n }\n\n // Always update global context as fallback\n globalContext = { ...globalContext, ...sanitized };\n}\n\n/**\n * Clear all bound context.\n */\nexport function clearContext(): void {\n const asyncStore = asyncContext.getStore();\n if (asyncStore) {\n for (const key of Object.keys(asyncStore)) {\n delete asyncStore[key];\n }\n }\n globalContext = {};\n}\n\n/**\n * Run a function with isolated logging context.\n *\n * Context bound within the callback is isolated from other async operations.\n * This is the recommended way to set context for request handling.\n *\n * @example\n * await runWithContext({ requestId: 'req_123' }, async () => {\n * logger.info('Processing request'); // Includes requestId\n * await doAsyncWork();\n * logger.info('Request complete'); // Still includes requestId\n * });\n */\nexport function runWithContext<T>(\n context: Record<string, unknown>,\n fn: () => T | Promise<T>\n): T | Promise<T> {\n const sanitized: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(context)) {\n sanitized[key] = sanitizeLogValue(value);\n }\n return asyncContext.run(sanitized, fn);\n}\n\n// Logging configuration\ninterface LoggingConfig {\n level: LogLevel;\n jsonFormat: boolean;\n serviceName: string;\n environment: string;\n}\n\nconst loggingConfig: LoggingConfig = {\n level: (process.env['NATURAL_LOG_LEVEL']?.toLowerCase() as LogLevel) || 'info',\n jsonFormat: process.env['NATURAL_LOG_FORMAT']?.toLowerCase() === 'json',\n serviceName: 'naturalpay-sdk',\n environment: process.env['NATURAL_ENV'] || process.env['DD_ENV'] || 'development',\n};\n\n/**\n * Configure logging for the Natural SDK.\n *\n * @param options - Logging configuration options\n * @param options.level - Log level (debug, info, warning, error)\n * @param options.jsonFormat - Use JSON format (default: auto-detect from NATURAL_LOG_FORMAT env var)\n * @param options.serviceName - Service name for structured logs\n *\n * Environment variables:\n * - NATURAL_LOG_LEVEL: Override log level (DEBUG, INFO, WARNING, ERROR)\n * - NATURAL_LOG_FORMAT: Set to \"json\" for JSON output, \"text\" for plain text\n */\nexport function configureLogging(options?: {\n level?: LogLevel;\n jsonFormat?: boolean;\n serviceName?: string;\n}): void {\n if (options?.level) {\n loggingConfig.level = options.level;\n }\n if (options?.jsonFormat !== undefined) {\n loggingConfig.jsonFormat = options.jsonFormat;\n }\n if (options?.serviceName) {\n loggingConfig.serviceName = options.serviceName;\n }\n}\n\n/**\n * Get source location information from stack trace.\n */\nfunction getSourceInfo(): { file: string; line: number; function: string } {\n const stack = new Error().stack;\n if (!stack) {\n return { file: 'unknown', line: 0, function: 'unknown' };\n }\n\n // Parse stack trace - skip the first 3 lines (Error, getSourceInfo, formatLogRecord/log)\n const lines = stack.split('\\n');\n const callerLine = lines[4] || lines[3] || '';\n\n // Match patterns like \"at functionName (/path/to/file.ts:123:45)\" or \"at /path/to/file.ts:123:45\"\n const match = callerLine.match(/at\\s+(?:(.+?)\\s+\\()?(.*?):(\\d+):\\d+\\)?/);\n if (match) {\n return {\n function: match[1] || 'anonymous',\n file: match[2] || 'unknown',\n line: parseInt(match[3] || '0', 10),\n };\n }\n\n return { file: 'unknown', line: 0, function: 'unknown' };\n}\n\ninterface LogRecord {\n timestamp: string;\n level: string;\n logger: string;\n message: string;\n source: { file: string; line: number; function: string };\n service: string;\n environment: string;\n version: string;\n [key: string]: unknown;\n}\n\n/**\n * Format a log record as JSON.\n */\nfunction formatJsonLog(\n level: LogLevel,\n loggerName: string,\n message: string,\n extra?: Record<string, unknown>\n): string {\n const record: LogRecord = {\n timestamp: new Date().toISOString(),\n level: level.toUpperCase(),\n logger: loggerName,\n message,\n source: getSourceInfo(),\n service: loggingConfig.serviceName,\n environment: loggingConfig.environment,\n version: VERSION,\n ...getContext(),\n ...extra,\n };\n\n // Add Datadog trace correlation if available\n const ddTraceId = process.env['DD_TRACE_ID'];\n const ddSpanId = process.env['DD_SPAN_ID'];\n if (ddTraceId) {\n record['dd.trace_id'] = ddTraceId;\n record['dd.span_id'] = ddSpanId;\n record['dd.service'] = loggingConfig.serviceName;\n record['dd.version'] = VERSION;\n record['dd.env'] = loggingConfig.environment;\n }\n\n return JSON.stringify(record);\n}\n\n/**\n * Format a log record as plain text.\n */\nfunction formatTextLog(\n level: LogLevel,\n loggerName: string,\n message: string,\n extra?: Record<string, unknown>\n): string {\n const contextEntries = Object.entries({ ...getContext(), ...extra });\n const contextStr =\n contextEntries.length > 0 ? ` [${contextEntries.map(([k, v]) => `${k}=${v}`).join(', ')}]` : '';\n\n return `${level.toUpperCase().padEnd(8)} ${loggerName}: ${message}${contextStr}`;\n}\n\n/**\n * Logger instance for a specific module/context.\n */\nexport class Logger {\n constructor(private readonly name: string) {}\n\n private log(level: LogLevel, message: string, extra?: Record<string, unknown>): void {\n if (LOG_LEVEL_VALUES[level] < LOG_LEVEL_VALUES[loggingConfig.level]) {\n return;\n }\n\n const formatted = loggingConfig.jsonFormat\n ? formatJsonLog(level, this.name, message, extra)\n : formatTextLog(level, this.name, message, extra);\n\n // Use stderr for logs (best practice for CLI tools)\n if (level === 'error') {\n console.error(formatted);\n } else if (level === 'warning') {\n console.warn(formatted);\n } else {\n console.error(formatted); // All logs to stderr\n }\n }\n\n debug(message: string, extra?: Record<string, unknown>): void {\n this.log('debug', message, extra);\n }\n\n info(message: string, extra?: Record<string, unknown>): void {\n this.log('info', message, extra);\n }\n\n warning(message: string, extra?: Record<string, unknown>): void {\n this.log('warning', message, extra);\n }\n\n warn(message: string, extra?: Record<string, unknown>): void {\n this.warning(message, extra);\n }\n\n error(message: string, extra?: Record<string, unknown>): void {\n this.log('error', message, extra);\n }\n}\n\n/**\n * Get a logger for the given module name.\n *\n * @param name - Module name (e.g., 'naturalpay.http')\n * @returns Logger instance\n *\n * @example\n * const logger = getLogger('naturalpay.payments');\n * logger.info('Payment initiated', { amount: 10000 });\n */\nexport function getLogger(name: string): Logger {\n if (!name.startsWith('naturalpay')) {\n name = `naturalpay.${name}`;\n }\n return new Logger(name);\n}\n\n// Helper functions for common logging patterns\n\n/**\n * Log an error with full context and exception info.\n */\nexport function logError(\n logger: Logger,\n message: string,\n options?: {\n error?: Error;\n statusCode?: number;\n code?: string;\n [key: string]: unknown;\n }\n): void {\n const extra: Record<string, unknown> = { ...options };\n\n if (options?.error) {\n extra['errorType'] = options.error.name;\n extra['errorMessage'] = options.error.message;\n if (options.error.stack) {\n extra['errorStack'] = options.error.stack.split('\\n').slice(0, 5).join('\\n');\n }\n delete extra['error'];\n }\n\n logger.error(message, extra);\n}\n\n/**\n * Log an API call with standard fields.\n */\nexport function logApiCall(\n logger: Logger,\n method: string,\n path: string,\n options?: {\n statusCode?: number;\n durationMs?: number;\n error?: Error;\n [key: string]: unknown;\n }\n): void {\n const extra: Record<string, unknown> = {\n method,\n path,\n ...options,\n };\n\n if (options?.statusCode) {\n extra['statusCode'] = options.statusCode;\n }\n if (options?.durationMs !== undefined) {\n extra['durationMs'] = Math.round(options.durationMs * 100) / 100;\n }\n\n if (options?.error) {\n logError(logger, `API call failed: ${method} ${path}`, extra);\n } else if (options?.statusCode && options.statusCode >= 400) {\n logger.warning(`API call error: ${method} ${path} -> ${options.statusCode}`, extra);\n } else {\n logger.info(`API call: ${method} ${path} -> ${options?.statusCode}`, extra);\n }\n}\n\n/**\n * Log an MCP tool invocation.\n */\nexport function logToolCall(\n logger: Logger,\n toolName: string,\n options?: {\n success?: boolean;\n durationMs?: number;\n error?: Error;\n [key: string]: unknown;\n }\n): void {\n const extra: Record<string, unknown> = {\n toolName,\n ...options,\n };\n\n if (options?.durationMs !== undefined) {\n extra['durationMs'] = Math.round(options.durationMs * 100) / 100;\n }\n\n if (options?.error) {\n logError(logger, `Tool call failed: ${toolName}`, extra);\n } else if (options?.success === false) {\n logger.warning(`Tool call returned error: ${toolName}`, extra);\n } else {\n logger.info(`Tool call: ${toolName}`, extra);\n }\n}\n","/**\n * Tool call context for MCP server → HTTP layer communication.\n *\n * The MCP server sets tool call data (name + arguments) before invoking SDK\n * methods. The HTTP layer reads it and sends the X-Tool-Call header to the BFF\n * for audit/observability. Direct SDK users never interact with this module.\n */\n\nimport { AsyncLocalStorage } from 'node:async_hooks';\n\ninterface ToolCallData {\n tool: string;\n arguments: Record<string, unknown>;\n timestamp: string;\n}\n\nconst toolCallStorage = new AsyncLocalStorage<ToolCallData>();\n\n/**\n * Get the base64-encoded X-Tool-Call header value, or undefined if not in MCP context.\n */\nexport function getToolCallHeader(): string | undefined {\n const data = toolCallStorage.getStore();\n if (!data) return undefined;\n return btoa(JSON.stringify(data));\n}\n\n/**\n * Run a function within a tool call context. The HTTP layer will automatically\n * pick up the tool call data and send it as the X-Tool-Call header.\n */\nexport function runWithToolCall<T>(name: string, args: Record<string, unknown>, fn: () => T): T {\n return toolCallStorage.run(\n {\n tool: name,\n arguments: args,\n timestamp: new Date().toISOString(),\n },\n fn\n );\n}\n","/**\n * HTTP client for Natural Server API with JWT caching.\n */\n\nimport {\n AuthenticationError,\n InvalidRequestError,\n NaturalError,\n RateLimitError,\n ServerError,\n} from './errors.js';\nimport { getLogger, logApiCall, logError } from './logging.js';\nimport { getToolCallHeader } from './tool-call-context.js';\nimport { VERSION } from './version.js';\n\nconst logger = getLogger('http');\n\nconst DEFAULT_BASE_URL = 'https://api.natural.co';\nconst DEFAULT_TIMEOUT = 30000;\n\nconst API_KEY_PREFIX_REGEX = /^sk_ntl_(dev|sandbox|prod)_/;\n\n/**\n * Parse an API key and return its environment label.\n *\n * Accepts keys matching `sk_ntl_(dev|sandbox|prod)_*`. Throws\n * `InvalidRequestError` for anything else. The return type is a narrowed\n * literal union so callers can discriminate on the env without a second\n * parse.\n */\nexport function parseApiKeyEnv(key: string): 'dev' | 'sandbox' | 'prod' {\n const match = API_KEY_PREFIX_REGEX.exec(key);\n if (match) {\n return match[1] as 'dev' | 'sandbox' | 'prod';\n }\n const preview = key.length > 16 ? `${key.slice(0, 16)}...` : key;\n throw new InvalidRequestError(\n `Invalid API key prefix. Expected a key starting with 'sk_ntl_dev_', ` +\n `'sk_ntl_sandbox_', or 'sk_ntl_prod_'. Got: '${preview}'`\n );\n}\n\n/**\n * Validate that a base URL uses HTTPS, with a localhost auto-allow and an\n * `NATURAL_ALLOW_HTTP=1` escape hatch for non-localhost plaintext hosts.\n *\n * Throws `InvalidRequestError` if the URL is not HTTPS and neither escape\n * hatch applies. Runs at client construction, not per-request.\n */\nexport function validateBaseUrl(baseUrl: string): void {\n let url: URL;\n try {\n url = new URL(baseUrl);\n } catch {\n throw new InvalidRequestError(`Invalid baseUrl: '${baseUrl}'. Must be a valid absolute URL.`);\n }\n if (url.protocol === 'https:') {\n return;\n }\n // url.hostname for IPv6 may return either \"::1\" or \"[::1]\" depending on\n // the runtime; accept both forms.\n const host = url.hostname;\n if (host === 'localhost' || host === '127.0.0.1' || host === '::1' || host === '[::1]') {\n return;\n }\n const allowHttp = process.env['NATURAL_ALLOW_HTTP'];\n if (allowHttp && allowHttp !== '0' && allowHttp.toLowerCase() !== 'false') {\n return;\n }\n throw new InvalidRequestError(\n `baseUrl must use HTTPS (got '${baseUrl}'). To allow plaintext HTTP for development, set NATURAL_ALLOW_HTTP=1 or use a localhost host.`\n );\n}\n\nexport interface HTTPClientOptions {\n apiKey?: string;\n baseUrl?: string;\n timeout?: number;\n}\n\ninterface JWTCacheEntry {\n token: string;\n expiresAt: number;\n}\n\ninterface RequestOptions {\n body?: Record<string, unknown>;\n params?: Record<string, unknown>;\n headers?: Record<string, string>;\n}\n\n/**\n * Hash a string using a simple hash function (for cache keys).\n */\nfunction hashString(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return Math.abs(hash).toString(16).slice(0, 16);\n}\n\nexport class HTTPClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n private readonly jwtCache: Map<string, JWTCacheEntry> = new Map();\n\n constructor(options: HTTPClientOptions = {}) {\n this.apiKey = options.apiKey ?? process.env['NATURAL_API_KEY'] ?? '';\n this.baseUrl = (\n options.baseUrl ??\n process.env['NATURAL_SERVER_URL'] ??\n DEFAULT_BASE_URL\n ).replace(/\\/$/, '');\n validateBaseUrl(this.baseUrl);\n // Prefix validation runs only when an apiKey was actually resolved.\n // Empty means the caller relies on NATURAL_API_KEY being populated\n // later in the process lifetime; the first API call then raises\n // AuthenticationError through the existing unauthenticated-request path.\n if (this.apiKey) {\n parseApiKeyEnv(this.apiKey);\n }\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n }\n\n /**\n * Get a cached JWT or exchange API key for a new one.\n */\n private async getJwt(): Promise<string> {\n if (!this.apiKey) {\n throw new AuthenticationError();\n }\n\n // Check cache\n const cacheKey = hashString(this.apiKey);\n const cached = this.jwtCache.get(cacheKey);\n if (cached && Date.now() < cached.expiresAt) {\n return cached.token;\n }\n\n // Exchange API key for JWT\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n logger.debug('Exchanging API key for JWT', { path: '/auth/api/token' });\n\n try {\n const response = await fetch(`${this.baseUrl}/auth/api/token`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const authError = new AuthenticationError(\n `Authentication failed (status=${response.status})`\n );\n logError(logger, 'JWT exchange failed', {\n error: authError,\n statusCode: response.status,\n path: '/auth/api/token',\n });\n throw authError;\n }\n\n const data = (await response.json()) as {\n accessToken: string;\n expiresIn?: number;\n };\n\n const expiresIn = data.expiresIn ?? 900; // Default 15 minutes\n const expiresAt = Date.now() + (expiresIn - 30) * 1000; // 30 second buffer\n\n this.jwtCache.set(cacheKey, { token: data.accessToken, expiresAt });\n\n return data.accessToken;\n } catch (error) {\n clearTimeout(timeoutId);\n if (error instanceof AuthenticationError) {\n throw error;\n }\n if (error instanceof Error && error.name === 'AbortError') {\n const networkError = new NaturalError('Request timed out during authentication');\n logError(logger, 'JWT exchange network error', {\n error: networkError,\n path: '/auth/api/token',\n });\n throw networkError;\n }\n const networkError = new NaturalError(\n `Network error during authentication: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n logError(logger, 'JWT exchange network error', {\n error: networkError,\n path: '/auth/api/token',\n });\n throw networkError;\n }\n }\n\n /**\n * Build URL with query parameters.\n */\n private buildUrl(path: string, params?: Record<string, unknown>): string {\n const url = new URL(path, this.baseUrl);\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n return url.toString();\n }\n\n /**\n * Handle API response and throw appropriate errors.\n */\n private async handleResponse<T>(\n response: Response,\n method: string,\n path: string,\n durationMs: number\n ): Promise<T> {\n if (response.status === 401) {\n const authError = new AuthenticationError();\n logApiCall(logger, method, path, {\n statusCode: response.status,\n durationMs,\n error: authError,\n });\n throw authError;\n }\n\n if (response.status === 429) {\n const retryAfter = response.headers.get('Retry-After');\n const rateError = new RateLimitError(\n 'Rate limit exceeded',\n retryAfter ? parseInt(retryAfter, 10) : undefined\n );\n logger.warning(`Rate limited: ${method} ${path}`, {\n method,\n path,\n statusCode: response.status,\n retryAfter,\n durationMs: Math.round(durationMs * 100) / 100,\n });\n throw rateError;\n }\n\n if (response.status >= 500) {\n const serverError = new ServerError(`Server error: ${response.status}`);\n logApiCall(logger, method, path, {\n statusCode: response.status,\n durationMs,\n error: serverError,\n });\n throw serverError;\n }\n\n let data: unknown;\n try {\n const text = await response.text();\n data = text ? JSON.parse(text) : {};\n } catch {\n if (response.status >= 400) {\n const parseError = new NaturalError(`Request failed: ${response.status}`, {\n statusCode: response.status,\n });\n logApiCall(logger, method, path, {\n statusCode: response.status,\n durationMs,\n error: parseError,\n });\n throw parseError;\n }\n // Success but no JSON body\n logApiCall(logger, method, path, { statusCode: response.status, durationMs });\n return {} as T;\n }\n\n if (response.status >= 400) {\n // Try JSON:API errors[] envelope first (canonical server format),\n // then fall back to flat fields for defense in depth.\n const errBody = data as Record<string, unknown>;\n const errors = Array.isArray(errBody.errors) ? errBody.errors : [];\n const firstError = (errors[0] ?? {}) as Record<string, unknown>;\n\n const errorMessage =\n (firstError.detail as string) ??\n (errBody.detail as string) ??\n (errBody.message as string) ??\n (errBody.error as string) ??\n 'Request failed';\n const errorCode = (firstError.code as string) ?? (errBody.code as string) ?? 'unknown_error';\n const requestError = new InvalidRequestError(\n `${errorMessage} (status=${response.status})`,\n errorCode\n );\n logApiCall(logger, method, path, {\n statusCode: response.status,\n durationMs,\n error: requestError,\n });\n throw requestError;\n }\n\n // Success\n logApiCall(logger, method, path, { statusCode: response.status, durationMs });\n return data as T;\n }\n\n /**\n * Make an authenticated request.\n */\n async request<T>(method: string, path: string, options?: RequestOptions): Promise<T> {\n const jwt = await this.getJwt();\n\n const url = this.buildUrl(path, options?.params);\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n logger.debug(`API request: ${method} ${path}`, {\n method,\n path,\n hasBody: !!options?.body,\n });\n\n const startTime = Date.now();\n try {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${jwt}`,\n 'Content-Type': 'application/json',\n 'User-Agent': `naturalpay-ts/${VERSION}`,\n };\n const toolCallHeader = getToolCallHeader();\n if (toolCallHeader) {\n headers['X-Tool-Call'] = toolCallHeader;\n }\n if (options?.headers) {\n Object.assign(headers, options.headers);\n }\n\n const response = await fetch(url, {\n method,\n headers,\n body: options?.body ? JSON.stringify(options.body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n const durationMs = Date.now() - startTime;\n return this.handleResponse<T>(response, method, path, durationMs);\n } catch (error) {\n clearTimeout(timeoutId);\n const durationMs = Date.now() - startTime;\n\n if (\n error instanceof NaturalError ||\n error instanceof AuthenticationError ||\n error instanceof InvalidRequestError ||\n error instanceof RateLimitError ||\n error instanceof ServerError\n ) {\n throw error;\n }\n if (error instanceof Error && error.name === 'AbortError') {\n const networkError = new NaturalError('Request timed out');\n logApiCall(logger, method, path, { durationMs, error: networkError });\n throw networkError;\n }\n const networkError = new NaturalError(\n `Network error: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n logApiCall(logger, method, path, { durationMs, error: networkError });\n throw networkError;\n }\n }\n\n async get<T>(path: string, options?: Omit<RequestOptions, 'body'>): Promise<T> {\n return this.request<T>('GET', path, options);\n }\n\n async post<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('POST', path, options);\n }\n\n async put<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('PUT', path, options);\n }\n\n async delete<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('DELETE', path, options);\n }\n}\n","/**\n * Base resource class.\n */\n\nimport type { HTTPClient } from '../http.js';\n\nexport abstract class BaseResource {\n protected readonly http: HTTPClient;\n\n constructor(http: HTTPClient) {\n this.http = http;\n }\n}\n","/**\n * Transactions resource.\n */\n\nimport { InvalidRequestError, NaturalError } from '../errors.js';\nimport { BaseResource } from './base.js';\nimport type {\n Transaction,\n TransactionGetParams,\n TransactionListParams,\n TransactionListResponse,\n} from '../types/transactions.js';\nimport type { JsonApiListResponse, JsonApiResource, JsonApiSingleResponse } from './jsonapi.js';\n\n/**\n * Unwrap a single JSON:API transaction resource into a flat Transaction object.\n */\nexport function unwrapTransactionResource(resource: JsonApiResource): Transaction {\n if (resource.type !== 'transaction' || !resource.attributes) {\n throw new NaturalError(\n `Unexpected resource format: expected type \"transaction\", got \"${resource.type}\"`\n );\n }\n\n const { id, attributes, relationships } = resource;\n\n return {\n transactionId: id,\n amount: Number(attributes.amount),\n currency: String(attributes.currency),\n status: String(attributes.status),\n description: attributes.description != null ? String(attributes.description) : undefined,\n memo: attributes.memo != null ? String(attributes.memo) : undefined,\n createdAt: String(attributes.createdAt),\n updatedAt: attributes.updatedAt != null ? String(attributes.updatedAt) : undefined,\n isDelegated: Boolean(attributes.isDelegated),\n customerName: attributes.customerName != null ? String(attributes.customerName) : undefined,\n customerAgentId:\n attributes.customerAgentId != null ? String(attributes.customerAgentId) : undefined,\n senderName: attributes.senderName != null ? String(attributes.senderName) : undefined,\n recipientName: attributes.recipientName != null ? String(attributes.recipientName) : undefined,\n transactionType: String(attributes.transactionType),\n category: String(attributes.category),\n direction: String(attributes.direction),\n sourcePartyId: relationships?.sourceParty?.data?.id,\n destinationPartyId: relationships?.destinationParty?.data?.id,\n sourceWalletId: relationships?.sourceWallet?.data?.id,\n destinationWalletId: relationships?.destinationWallet?.data?.id,\n instanceId: attributes.instanceId != null ? String(attributes.instanceId) : undefined,\n claimLink: attributes.claimLink != null ? String(attributes.claimLink) : undefined,\n };\n}\n\nexport class TransactionsResource extends BaseResource {\n /**\n * Get a transaction by ID.\n *\n * @param transactionId - Transaction ID (txn_xxx)\n * @param params - Optional parameters for observability\n * @returns Transaction details\n */\n async get(transactionId: string, params?: TransactionGetParams): Promise<Transaction> {\n const headers: Record<string, string> = {};\n\n if (params?.instanceId) {\n headers['X-Instance-ID'] = params.instanceId;\n }\n\n const queryParams: Record<string, string> = {};\n if (params?.customerPartyId) {\n queryParams['partyId'] = params.customerPartyId;\n }\n\n const response = await this.http.get<JsonApiSingleResponse>(`/transactions/${transactionId}`, {\n params: Object.keys(queryParams).length > 0 ? queryParams : undefined,\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n });\n\n if (!response?.data) {\n throw new NaturalError('Unexpected response format: missing \"data\" in transaction response');\n }\n\n return unwrapTransactionResource(response.data);\n }\n\n /**\n * List recent transactions.\n *\n * @param params - List parameters including agent context\n * @returns TransactionListResponse with transactions and pagination info\n */\n async list(params?: TransactionListParams): Promise<TransactionListResponse> {\n const headers: Record<string, string> = {};\n\n if (params?.agentId) {\n if (!params?.instanceId) {\n throw new InvalidRequestError('instanceId is required when agentId is provided');\n }\n headers['X-Agent-ID'] = params.agentId;\n }\n if (params?.instanceId) {\n headers['X-Instance-ID'] = params.instanceId;\n }\n\n const queryParams: Record<string, unknown> = {\n limit: params?.limit ?? 50,\n cursor: params?.cursor,\n type: params?.type,\n };\n\n const response = await this.http.get<JsonApiListResponse>('/transactions', {\n params: queryParams,\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n });\n\n if (!response?.data || !Array.isArray(response.data)) {\n throw new NaturalError(\n 'Unexpected response format: missing \"data\" array in transaction list response'\n );\n }\n\n const transactions = response.data.map(unwrapTransactionResource);\n const pagination = response.meta?.pagination ?? {};\n\n return {\n transactions,\n hasMore: pagination.hasMore ?? false,\n nextCursor: pagination.nextCursor ?? null,\n };\n }\n}\n","/**\n * Payments resource.\n */\n\nimport { InvalidRequestError, NaturalError } from '../errors.js';\nimport { BaseResource } from './base.js';\nimport { unwrapTransactionResource } from './transactions.js';\nimport type { PaymentCreateParams } from '../types/payments.js';\nimport type { Transaction } from '../types/transactions.js';\nimport type { JsonApiSingleResponse, JsonApiRequestBody } from './jsonapi.js';\n\nconst PHONE_DIGITS_RE = /^\\d{10,}$/;\nconst PHONE_PLUS_RE = /^\\+\\d{7,}$/;\n\n/**\n * Validate recipient format matches backend expectations.\n * Accepted: party ID (pty_*), email (@), phone (+ prefix with digits, or 10+ digits).\n *\n * Caller must trim the value before passing it here.\n */\nfunction validateRecipient(recipient: string): void {\n if (!recipient) {\n throw new InvalidRequestError('recipient cannot be empty');\n }\n if (recipient.startsWith('pty_')) return;\n if (recipient.includes('@')) return;\n if (PHONE_PLUS_RE.test(recipient)) return;\n if (PHONE_DIGITS_RE.test(recipient)) return;\n throw new InvalidRequestError(\n 'Invalid recipient format. Expected: party ID (pty_*), email (contains @), or phone (+ prefix or 10+ digits)'\n );\n}\n\n/**\n * Unwrap a JSON:API single-resource response into a flat Transaction object.\n *\n * Delegates to the shared `unwrapTransactionResource` for core field extraction,\n * then applies payment-specific overrides: relationship key mapping\n * (customerParty/counterparty), defaults, and memo mirroring.\n */\nfunction unwrapPaymentResponse(response: JsonApiSingleResponse): Transaction {\n if (!response?.data) {\n throw new NaturalError('Unexpected response format: missing \"data\" field in payment response');\n }\n\n const base = unwrapTransactionResource(response.data);\n const { relationships, attributes } = response.data;\n\n return {\n ...base,\n // Payment responses may omit these fields; provide sensible defaults.\n transactionType: String(attributes.transactionType ?? 'payment'),\n category: String(attributes.category ?? 'sent'),\n direction: String(attributes.direction ?? 'OUTBOUND'),\n // Mirror description into memo for payment convenience.\n memo: base.description,\n // Payments use customerParty/counterparty relationship keys,\n // falling back to the generic sourceParty/destinationParty.\n sourcePartyId: relationships?.customerParty?.data?.id ?? base.sourcePartyId,\n destinationPartyId: relationships?.counterparty?.data?.id ?? base.destinationPartyId,\n };\n}\n\nexport class PaymentsResource extends BaseResource {\n /**\n * Create a payment.\n *\n * @param params - Payment creation parameters\n * @returns Transaction object with transaction_id (txn_*), status, etc.\n */\n async create(params: PaymentCreateParams): Promise<Transaction> {\n const recipient = params.recipient.trim();\n validateRecipient(recipient);\n\n if (!Number.isInteger(params.amount) || params.amount <= 0) {\n throw new InvalidRequestError('amount must be a positive integer (minor units in cents)');\n }\n\n // Build JSON:API envelope\n const attributes: Record<string, unknown> = {\n amount: params.amount,\n currency: params.currency ?? 'USD',\n counterparty: recipient,\n customerPartyId: params.customerPartyId,\n };\n\n attributes['description'] = params.memo;\n\n const body: JsonApiRequestBody = { data: { attributes } };\n\n const headers: Record<string, string> = {\n 'Idempotency-Key': params.idempotencyKey,\n };\n if (params.agentId) {\n if (!params.instanceId) {\n throw new InvalidRequestError('instanceId is required when agentId is provided');\n }\n headers['X-Agent-ID'] = params.agentId;\n }\n if (params.instanceId) {\n headers['X-Instance-ID'] = params.instanceId;\n }\n\n const response = await this.http.post<JsonApiSingleResponse>('/payments', {\n body,\n headers,\n });\n\n return unwrapPaymentResponse(response);\n }\n}\n","/**\n * Wallet resource.\n */\n\nimport { InvalidRequestError, NaturalError } from '../errors.js';\nimport { BaseResource } from './base.js';\nimport type {\n AccountBalance,\n AmountInfo,\n BalanceBreakdown,\n BalanceOptions,\n WithdrawParams,\n WithdrawResponse,\n} from '../types/wallet.js';\nimport type { JsonApiSingleResponse, JsonApiRequestBody } from './jsonapi.js';\n\n/**\n * Extract an AmountInfo from a raw attribute value.\n */\nfunction toAmountInfo(raw: unknown): AmountInfo {\n const obj = raw as Record<string, unknown> | undefined;\n return {\n amountMinor: Number(obj?.amountMinor ?? 0),\n };\n}\n\n/**\n * Unwrap a JSON:API single-resource response into a flat AccountBalance.\n * Validates the envelope structure and extracts fields explicitly.\n */\nfunction unwrapBalance(response: JsonApiSingleResponse): AccountBalance {\n if (!response?.data) {\n throw new NaturalError(\n 'Unexpected response format: missing \"data\" field in wallet balance response'\n );\n }\n\n const { data } = response;\n if (data.type !== 'walletBalance' || !data.attributes) {\n throw new NaturalError(\n `Unexpected resource format: expected type \"walletBalance\", got \"${data.type}\"`\n );\n }\n\n const { id, attributes } = data;\n const rawBreakdown = attributes.breakdown as Record<string, unknown> | undefined;\n\n const breakdown: BalanceBreakdown = {\n operatingFunded: toAmountInfo(rawBreakdown?.operatingFunded),\n operatingAdvanced: toAmountInfo(rawBreakdown?.operatingAdvanced),\n escrowFundedSettled: toAmountInfo(rawBreakdown?.escrowFundedSettled),\n escrowAdvanced: toAmountInfo(rawBreakdown?.escrowAdvanced),\n holdsOutbound: toAmountInfo(rawBreakdown?.holdsOutbound),\n };\n\n return {\n walletId: id,\n breakdown,\n available: toAmountInfo(attributes.available),\n pendingClaimAmountMinor:\n attributes.pendingClaimAmountMinor != null\n ? Number(attributes.pendingClaimAmountMinor)\n : undefined,\n pendingClaimCount:\n attributes.pendingClaimCount != null ? Number(attributes.pendingClaimCount) : undefined,\n };\n}\n\n/**\n * Unwrap a JSON:API single-resource response into a flat WithdrawResponse.\n * Server returns resource type \"withdrawal\" with id = transfer_id.\n */\nfunction unwrapWithdrawal(response: JsonApiSingleResponse): WithdrawResponse {\n if (!response?.data) {\n throw new NaturalError(\n 'Unexpected response format: missing \"data\" field in withdrawal response'\n );\n }\n\n const { data } = response;\n if (data.type !== 'withdrawal' || !data.attributes) {\n throw new NaturalError(\n `Unexpected resource format: expected type \"withdrawal\", got \"${data.type}\"`\n );\n }\n\n const { id, attributes } = data;\n\n return {\n transferId: id ?? undefined,\n instructionId: attributes.instructionId != null ? String(attributes.instructionId) : undefined,\n status: String(attributes.status),\n amount: attributes.amount != null ? Number(attributes.amount) : 0,\n currency: String(attributes.currency),\n estimatedSettlement:\n attributes.estimatedSettlement != null ? String(attributes.estimatedSettlement) : undefined,\n kycRequired: Boolean(attributes.kycRequired),\n kycStatus: attributes.kycStatus != null ? String(attributes.kycStatus) : undefined,\n kycSessionUrl: attributes.kycSessionUrl != null ? String(attributes.kycSessionUrl) : undefined,\n mfaRequired: Boolean(attributes.mfaRequired),\n mfaChallengeId:\n attributes.mfaChallengeId != null ? String(attributes.mfaChallengeId) : undefined,\n mfaExpiresAt: attributes.mfaExpiresAt != null ? String(attributes.mfaExpiresAt) : undefined,\n error: attributes.error != null ? String(attributes.error) : undefined,\n errorDetails: attributes.errorDetails != null ? String(attributes.errorDetails) : undefined,\n };\n}\n\nexport class WalletResource extends BaseResource {\n /**\n * Get current wallet balance.\n *\n * @returns AccountBalance with available, current, pending amounts\n */\n async balance(options?: BalanceOptions): Promise<AccountBalance> {\n const headers: Record<string, string> = {};\n if (options?.instanceId) {\n headers['X-Instance-ID'] = options.instanceId;\n }\n\n const params: Record<string, string> = {};\n if (options?.customerPartyId) {\n params['partyId'] = options.customerPartyId;\n }\n\n const response = await this.http.get<JsonApiSingleResponse>('/wallet/balance', {\n params: Object.keys(params).length > 0 ? params : undefined,\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n });\n return unwrapBalance(response);\n }\n\n /**\n * Initiate a withdrawal to a linked bank account.\n *\n * @param params - Withdrawal parameters\n * @returns WithdrawResponse with transfer status (may require KYC/MFA)\n */\n async withdraw(params: WithdrawParams): Promise<WithdrawResponse> {\n if (!Number.isInteger(params.amount) || params.amount <= 0) {\n throw new InvalidRequestError('amount must be a positive integer (minor units in cents)');\n }\n\n const attributes: Record<string, unknown> = {\n amount: params.amount,\n currency: params.currency ?? 'USD',\n externalFundingSourceId: params.externalFundingSourceId,\n };\n if (params.description) attributes['description'] = params.description;\n\n const body: JsonApiRequestBody = { data: { attributes } };\n\n const response = await this.http.post<JsonApiSingleResponse>('/wallet/withdraw', {\n body,\n headers: { 'Idempotency-Key': params.idempotencyKey },\n });\n\n return unwrapWithdrawal(response);\n }\n}\n","/**\n * Agents resource.\n */\n\nimport { NaturalError } from '../errors.js';\nimport { BaseResource } from './base.js';\nimport type {\n Agent,\n AgentStatus,\n AgentCreateParams,\n AgentCreateResponse,\n AgentUpdateParams,\n AgentUpdateResponse,\n AgentListParams,\n AgentListResponse,\n AgentGetOptions,\n AgentDeleteOptions,\n} from '../types/agents.js';\nimport type {\n JsonApiSingleResponse,\n JsonApiListResponse,\n JsonApiRequestBody,\n JsonApiResource,\n} from './jsonapi.js';\n\n/**\n * Unwrap a single JSON:API agent resource into a flat Agent object.\n * Validates the envelope structure and extracts fields explicitly.\n */\nfunction unwrapAgentResource(resource: JsonApiResource): Agent {\n if (resource.type !== 'agent' || !resource.attributes) {\n throw new NaturalError(\n `Unexpected resource format: expected type \"agent\", got \"${resource.type}\"`\n );\n }\n\n const { id, attributes, relationships } = resource;\n\n return {\n id,\n name: String(attributes.name),\n description: attributes.description != null ? String(attributes.description) : undefined,\n status: String(attributes.status) as AgentStatus,\n partyId: relationships?.party?.data?.id ?? '',\n createdAt: attributes.createdAt != null ? String(attributes.createdAt) : undefined,\n createdBy: attributes.createdBy != null ? String(attributes.createdBy) : undefined,\n updatedAt: attributes.updatedAt != null ? String(attributes.updatedAt) : undefined,\n updatedBy: attributes.updatedBy != null ? String(attributes.updatedBy) : undefined,\n };\n}\n\n/**\n * Unwrap a JSON:API single-resource response into a flat Agent.\n */\nfunction unwrapAgent(response: JsonApiSingleResponse): Agent {\n if (!response?.data) {\n throw new NaturalError('Unexpected response format: missing \"data\" field in agent response');\n }\n return unwrapAgentResource(response.data);\n}\n\n/**\n * Unwrap a JSON:API list response into an AgentListResponse.\n */\nfunction unwrapAgentList(response: JsonApiListResponse): AgentListResponse {\n if (!response?.data || !Array.isArray(response.data)) {\n throw new NaturalError(\n 'Unexpected response format: missing \"data\" array in agent list response'\n );\n }\n\n const agents = response.data.map(unwrapAgentResource);\n const pagination = response.meta?.pagination ?? {};\n\n return {\n agents,\n hasMore: pagination.hasMore ?? false,\n nextCursor: pagination.nextCursor ?? null,\n };\n}\n\nexport class AgentsResource extends BaseResource {\n /**\n * List agents for the partner.\n *\n * @param params - Filter and pagination parameters\n * @returns AgentListResponse with list of agents\n */\n async list(params?: AgentListParams): Promise<AgentListResponse> {\n const headers: Record<string, string> = {};\n if (params?.instanceId) {\n headers['X-Instance-ID'] = params.instanceId;\n }\n\n const queryParams: Record<string, unknown> = {\n status: params?.status,\n limit: params?.limit ?? 50,\n cursor: params?.cursor,\n };\n\n const response = await this.http.get<JsonApiListResponse>('/agents', {\n params: queryParams,\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n });\n return unwrapAgentList(response);\n }\n\n /**\n * Get agent by ID.\n *\n * @param agentId - The agent ID to retrieve (agt_xxx)\n * @returns Agent details\n */\n async get(agentId: string, options?: AgentGetOptions): Promise<Agent> {\n const headers: Record<string, string> = {};\n if (options?.instanceId) {\n headers['X-Instance-ID'] = options.instanceId;\n }\n\n const response = await this.http.get<JsonApiSingleResponse>(`/agents/${agentId}`, {\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n });\n return unwrapAgent(response);\n }\n\n /**\n * Create a new agent.\n *\n * @param params - Agent creation parameters\n * @returns AgentCreateResponse with created agent details\n */\n async create(params: AgentCreateParams): Promise<AgentCreateResponse> {\n const attributes: Record<string, unknown> = {\n name: params.name,\n };\n\n if (params.description) {\n attributes['description'] = params.description;\n }\n\n if (params.limits) {\n attributes['limits'] = params.limits;\n }\n\n const body: JsonApiRequestBody = { data: { attributes } };\n\n const headers: Record<string, string> = {};\n if (params.idempotencyKey) {\n headers['Idempotency-Key'] = params.idempotencyKey;\n }\n if (params.instanceId) {\n headers['X-Instance-ID'] = params.instanceId;\n }\n\n const response = await this.http.post<JsonApiSingleResponse>('/agents', {\n body,\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n });\n\n return unwrapAgent(response);\n }\n\n /**\n * Update an existing agent.\n *\n * @param agentId - The agent ID to update (agt_xxx)\n * @param params - Update parameters\n * @returns AgentUpdateResponse with updated agent details\n */\n async update(agentId: string, params: AgentUpdateParams): Promise<AgentUpdateResponse> {\n const attributes: Record<string, unknown> = {};\n\n if (params.name !== undefined) attributes['name'] = params.name;\n if (params.description !== undefined) attributes['description'] = params.description;\n if (params.status !== undefined) attributes['status'] = params.status;\n\n const body: JsonApiRequestBody = { data: { attributes } };\n\n const headers: Record<string, string> = {};\n if (params.idempotencyKey) {\n headers['Idempotency-Key'] = params.idempotencyKey;\n }\n if (params.instanceId) {\n headers['X-Instance-ID'] = params.instanceId;\n }\n\n const response = await this.http.put<JsonApiSingleResponse>(`/agents/${agentId}`, {\n body,\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n });\n\n return unwrapAgent(response);\n }\n\n /**\n * Delete an agent.\n *\n * @param agentId - The agent ID to delete (agt_xxx)\n * @param options - Optional observability parameters\n */\n async delete(agentId: string, options?: AgentDeleteOptions): Promise<void> {\n const headers: Record<string, string> = {};\n if (options?.instanceId) {\n headers['X-Instance-ID'] = options.instanceId;\n }\n\n await this.http.delete(`/agents/${agentId}`, {\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n });\n }\n}\n","/**\n * Agent delegations resource.\n */\n\nimport { NaturalError } from '../errors.js';\nimport { BaseResource } from './base.js';\nimport type {\n AgentDelegation,\n AgentDelegationListParams,\n AgentDelegationListResponse,\n} from '../types/delegations.js';\nimport type { JsonApiSingleResponse, JsonApiListResponse, JsonApiResource } from './jsonapi.js';\n\n/**\n * Unwrap a single JSON:API agent delegation resource into a flat AgentDelegation object.\n */\nfunction unwrapAgentDelegationResource(resource: JsonApiResource): AgentDelegation {\n if (resource.type !== 'agentDelegation' || !resource.attributes) {\n throw new NaturalError(\n `Unexpected resource format: expected type \"agentDelegation\", got \"${resource.type}\"`\n );\n }\n\n const { id, attributes, relationships } = resource;\n\n return {\n id,\n agentName: attributes.agentName != null ? String(attributes.agentName) : undefined,\n agentId: relationships?.agent?.data?.id ?? '',\n delegationId: relationships?.delegation?.data?.id ?? '',\n delegatorPartyId: relationships?.delegatorParty?.data?.id,\n delegateePartyId: relationships?.delegateeParty?.data?.id,\n delegatorPartyName:\n attributes.delegatorPartyName != null ? String(attributes.delegatorPartyName) : undefined,\n delegateePartyName:\n attributes.delegateePartyName != null ? String(attributes.delegateePartyName) : undefined,\n permissions: Array.isArray(attributes.permissions) ? (attributes.permissions as string[]) : [],\n limits: attributes.limits != null ? (attributes.limits as Record<string, number>) : undefined,\n expiresAt: attributes.expiresAt != null ? String(attributes.expiresAt) : undefined,\n createdAt: String(attributes.createdAt),\n createdBy: attributes.createdBy != null ? String(attributes.createdBy) : undefined,\n updatedAt: String(attributes.updatedAt),\n };\n}\n\n/**\n * Unwrap a JSON:API single-resource response into a flat AgentDelegation.\n */\nfunction unwrapAgentDelegation(response: JsonApiSingleResponse): AgentDelegation {\n if (!response?.data) {\n throw new NaturalError(\n 'Unexpected response format: missing \"data\" field in agent delegation response'\n );\n }\n return unwrapAgentDelegationResource(response.data);\n}\n\n/**\n * Unwrap a JSON:API list response into an AgentDelegationListResponse.\n */\nfunction unwrapAgentDelegationList(response: JsonApiListResponse): AgentDelegationListResponse {\n if (!response?.data || !Array.isArray(response.data)) {\n throw new NaturalError(\n 'Unexpected response format: missing \"data\" array in agent delegation list response'\n );\n }\n\n const agentDelegations = response.data.map(unwrapAgentDelegationResource);\n const pagination = response.meta?.pagination ?? {};\n\n return {\n agentDelegations,\n hasMore: pagination.hasMore ?? false,\n nextCursor: pagination.nextCursor ?? null,\n };\n}\n\nexport class DelegationsResource extends BaseResource {\n /**\n * List agent delegations with optional filters.\n *\n * @param params - Filter parameters\n * @returns AgentDelegationListResponse with list of agent delegations\n */\n async list(params?: AgentDelegationListParams): Promise<AgentDelegationListResponse> {\n const headers: Record<string, string> = {};\n if (params?.instanceId) {\n headers['X-Instance-ID'] = params.instanceId;\n }\n\n const queryParams: Record<string, unknown> = {\n delegationId: params?.delegationId,\n agentId: params?.agentId,\n delegatorPartyId: params?.delegatorPartyId,\n delegateePartyId: params?.delegateePartyId,\n includeRevoked: params?.includeRevoked,\n limit: params?.limit ?? 50,\n cursor: params?.cursor,\n };\n\n const response = await this.http.get<JsonApiListResponse>('/agent-delegations', {\n params: queryParams,\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n });\n return unwrapAgentDelegationList(response);\n }\n\n /**\n * Get agent delegation by ID.\n *\n * @param agentDelegationId - The agent delegation handle (adl_xxx)\n * @returns AgentDelegation details\n */\n async get(agentDelegationId: string): Promise<AgentDelegation> {\n const response = await this.http.get<JsonApiSingleResponse>(\n `/agent-delegations/${agentDelegationId}`\n );\n return unwrapAgentDelegation(response);\n }\n}\n","/**\n * Customers resource.\n */\n\nimport { NaturalError } from '../errors.js';\nimport { BaseResource } from './base.js';\nimport type { JsonApiListResponse, JsonApiResource } from './jsonapi.js';\nimport type { Customer, CustomerListParams, CustomerListResponse } from '../types/customers.js';\n\n/**\n * Unwrap a single JSON:API customer resource into a flat Customer.\n */\nconst VALID_CUSTOMER_TYPES = new Set(['party', 'delegationInvitation'] as const);\nconst VALID_WALLET_ACCESS = new Set(['granted', 'denied', 'noWallet'] as const);\n\ntype CustomerType = 'party' | 'delegationInvitation';\ntype WalletAccess = 'granted' | 'denied' | 'noWallet';\n\nfunction isCustomerType(value: string): value is CustomerType {\n return VALID_CUSTOMER_TYPES.has(value as CustomerType);\n}\n\nfunction isWalletAccess(value: unknown): value is WalletAccess {\n return typeof value === 'string' && VALID_WALLET_ACCESS.has(value as WalletAccess);\n}\n\nfunction unwrapCustomerResource(resource: JsonApiResource): Customer {\n if (!isCustomerType(resource.type) || !resource.attributes) {\n throw new NaturalError(\n `Unexpected resource format: expected type \"party\" or \"delegationInvitation\", got \"${resource.type}\"`\n );\n }\n\n const { id, attributes } = resource;\n\n const party =\n typeof attributes.party === 'object' && attributes.party != null\n ? {\n id: String((attributes.party as Record<string, unknown>).id),\n name: String((attributes.party as Record<string, unknown>).name),\n email:\n typeof (attributes.party as Record<string, unknown>).email === 'string'\n ? String((attributes.party as Record<string, unknown>).email)\n : undefined,\n }\n : undefined;\n\n return {\n id,\n type: resource.type,\n party,\n email: typeof attributes.email === 'string' ? attributes.email : undefined,\n status: typeof attributes.status === 'string' ? attributes.status : '',\n permissions: Array.isArray(attributes.permissions) ? attributes.permissions : [],\n createdAt: typeof attributes.createdAt === 'string' ? attributes.createdAt : '',\n walletAvailableMinor:\n typeof attributes.walletAvailableMinor === 'number'\n ? attributes.walletAvailableMinor\n : undefined,\n walletAvailableDollars:\n typeof attributes.walletAvailableDollars === 'string'\n ? attributes.walletAvailableDollars\n : undefined,\n walletAccess: isWalletAccess(attributes.walletAccess) ? attributes.walletAccess : 'denied',\n };\n}\n\n/**\n * Unwrap a JSON:API list response into a CustomerListResponse.\n */\nfunction unwrapCustomerList(response: JsonApiListResponse): CustomerListResponse {\n if (!response?.data || !Array.isArray(response.data)) {\n throw new NaturalError(\n 'Unexpected response format: missing \"data\" array in customer list response'\n );\n }\n\n const pagination = response.meta?.pagination ?? {};\n\n return {\n items: response.data.map(unwrapCustomerResource),\n hasMore: pagination.hasMore ?? false,\n nextCursor: pagination.nextCursor ?? null,\n };\n}\n\nexport class CustomersResource extends BaseResource {\n /**\n * List customers who have delegated access to the partner.\n *\n * @param params - Pagination parameters\n * @returns CustomerListResponse with items, hasMore, nextCursor\n */\n async list(params?: CustomerListParams): Promise<CustomerListResponse> {\n const headers: Record<string, string> = {};\n if (params?.instanceId) {\n headers['X-Instance-ID'] = params.instanceId;\n }\n\n const queryParams: Record<string, unknown> = {\n limit: params?.limit,\n cursor: params?.cursor,\n };\n\n const response = await this.http.get<JsonApiListResponse>('/customers', {\n params: queryParams,\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n });\n return unwrapCustomerList(response);\n }\n}\n","/**\n * Natural Payments SDK client.\n */\n\nimport { HTTPClient, type HTTPClientOptions } from './http.js';\nimport { PaymentsResource } from './resources/payments.js';\nimport { WalletResource } from './resources/wallet.js';\nimport { TransactionsResource } from './resources/transactions.js';\nimport { AgentsResource } from './resources/agents.js';\nimport { DelegationsResource } from './resources/delegations.js';\nimport { CustomersResource } from './resources/customers.js';\n\nexport interface NaturalClientOptions extends HTTPClientOptions {}\n\n/**\n * Natural Payments SDK client.\n *\n * @example\n * ```typescript\n * import { NaturalClient } from '@naturalpay/sdk';\n *\n * const client = new NaturalClient({ apiKey: process.env['NATURAL_API_KEY'] });\n *\n * // Create a payment\n * const payment = await client.payments.create({\n * agentId: 'agt_xxx',\n * amount: 5000,\n * customerPartyId: 'pty_xxx',\n * recipient: 'alice@example.com',\n * memo: 'For consulting',\n * idempotencyKey: 'unique-key-for-this-payment',\n * });\n *\n * // Check balance\n * const balance = await client.wallet.balance();\n * ```\n */\nexport class NaturalClient {\n private readonly http: HTTPClient;\n\n /** Payments API resource. */\n readonly payments: PaymentsResource;\n\n /** Wallet API resource for balance and withdrawals. */\n readonly wallet: WalletResource;\n\n /** Transactions API resource. */\n readonly transactions: TransactionsResource;\n\n /** Agents API resource for managing agents. */\n readonly agents: AgentsResource;\n\n /** Agent delegations API resource. */\n readonly delegations: DelegationsResource;\n\n /** Customers API resource for listing parties who delegated access. */\n readonly customers: CustomersResource;\n\n /**\n * Initialize the Natural client.\n *\n * @param options - Client configuration options\n * @param options.apiKey - API key (defaults to NATURAL_API_KEY env var)\n * @param options.baseUrl - API base URL (defaults to https://api.natural.co)\n * @param options.timeout - Request timeout in milliseconds (default: 30000)\n */\n constructor(options: NaturalClientOptions = {}) {\n this.http = new HTTPClient(options);\n\n this.payments = new PaymentsResource(this.http);\n this.wallet = new WalletResource(this.http);\n this.transactions = new TransactionsResource(this.http);\n this.agents = new AgentsResource(this.http);\n this.delegations = new DelegationsResource(this.http);\n this.customers = new CustomersResource(this.http);\n }\n}\n","/**\n * Transaction types.\n */\n\n/**\n * Filter for transaction types in list operations.\n */\nexport enum TransactionTypeFilter {\n PAYMENT = 'payment',\n TRANSFER = 'transfer',\n ALL = 'all',\n}\n\nexport interface Transaction {\n transactionId: string;\n amount: number;\n currency: string;\n status: string;\n description?: string;\n memo?: string;\n createdAt: string;\n updatedAt?: string;\n isDelegated: boolean;\n customerName?: string;\n customerAgentId?: string;\n senderName?: string;\n recipientName?: string;\n transactionType: string;\n category: string;\n direction: string;\n sourcePartyId?: string;\n destinationPartyId?: string;\n sourceWalletId?: string;\n destinationWalletId?: string;\n /** Internal instance ID (ins_xxx) assigned by server. */\n instanceId?: string;\n /** Claim link URL for unclaimed payments. */\n claimLink?: string;\n}\n\nexport interface TransactionGetParams {\n /** Customer party ID (pty_xxx) for delegated transaction lookup. */\n customerPartyId?: string;\n /** Developer's session/conversation ID for observability grouping. */\n instanceId?: string;\n}\n\nexport interface TransactionListParams {\n limit?: number;\n cursor?: string;\n agentId?: string;\n /** Filter by transaction type (payment, transfer, or all) */\n type?: TransactionTypeFilter;\n /** Developer's session/conversation ID for observability grouping. */\n instanceId?: string;\n}\n\nexport interface TransactionListResponse {\n transactions: Transaction[];\n hasMore: boolean;\n nextCursor?: string | null;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/version.ts","../src/logging.ts","../src/model-context.ts","../src/tool-call-context.ts","../src/http.ts","../src/resources/base.ts","../src/resources/transactions.ts","../src/resources/payments.ts","../src/resources/wallet.ts","../src/resources/agents.ts","../src/resources/delegations.ts","../src/resources/customers.ts","../src/client.ts","../src/webhooks.ts","../src/types/transactions.ts"],"names":["logger","AsyncLocalStorage","TransactionTypeFilter"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Natural Payments SDK error classes.\n */\n\n/**\n * Base error for all Natural SDK errors.\n */\nexport class NaturalError extends Error {\n readonly statusCode?: number;\n readonly code?: string;\n\n constructor(message: string, options?: { statusCode?: number; code?: string }) {\n super(message);\n this.name = 'NaturalError';\n this.statusCode = options?.statusCode;\n this.code = options?.code;\n\n // Maintains proper stack trace for where error was thrown (V8 engines)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\n/**\n * Invalid or missing API key.\n */\nexport class AuthenticationError extends NaturalError {\n constructor(message = 'Invalid or missing API key') {\n super(message, { statusCode: 401, code: 'authentication_error' });\n this.name = 'AuthenticationError';\n }\n}\n\n/**\n * Malformed request parameters.\n */\nexport class InvalidRequestError extends NaturalError {\n constructor(message: string, code = 'invalid_request') {\n super(message, { statusCode: 400, code });\n this.name = 'InvalidRequestError';\n }\n}\n\n/**\n * Payment-specific failure.\n */\nexport class PaymentError extends NaturalError {\n constructor(message: string, code = 'payment_error') {\n super(message, { statusCode: 400, code });\n this.name = 'PaymentError';\n }\n}\n\n/**\n * Not enough balance for payment.\n */\nexport class InsufficientFundsError extends PaymentError {\n constructor(message = 'Insufficient funds') {\n super(message, 'insufficient_funds');\n this.name = 'InsufficientFundsError';\n }\n}\n\n/**\n * Invalid recipient.\n */\nexport class RecipientNotFoundError extends PaymentError {\n constructor(message = 'Recipient not found') {\n super(message, 'recipient_not_found');\n this.name = 'RecipientNotFoundError';\n }\n}\n\n/**\n * Too many requests.\n */\nexport class RateLimitError extends NaturalError {\n readonly retryAfter?: number;\n\n constructor(message = 'Rate limit exceeded', retryAfter?: number) {\n super(message, { statusCode: 429, code: 'rate_limit_exceeded' });\n this.name = 'RateLimitError';\n this.retryAfter = retryAfter;\n }\n}\n\n/**\n * Internal server error.\n */\nexport class ServerError extends NaturalError {\n constructor(message = 'Internal server error') {\n super(message, { statusCode: 500, code: 'server_error' });\n this.name = 'ServerError';\n }\n}\n\n/**\n * Webhook signature verification failed.\n */\nexport class WebhookVerificationError extends NaturalError {\n constructor(message: string) {\n super(message, { code: 'webhook_verification_failed' });\n this.name = 'WebhookVerificationError';\n }\n}\n","/**\n * Single source of truth for the SDK version string.\n */\nexport const VERSION = '0.1.4';\n","/**\n * Structured logging for Natural Payments SDK.\n *\n * Supports two modes:\n * 1. Plain text logging (default, for local development)\n * 2. JSON logging with Datadog correlation (when NATURAL_LOG_FORMAT=json)\n *\n * Features:\n * - Source info: file, line, function on every log (for error grouping)\n * - Context binding for request_id, agent_id, instance_id\n * - Datadog trace correlation fields\n * - AsyncLocalStorage for proper async context isolation\n */\n\nimport { AsyncLocalStorage } from 'node:async_hooks';\n\nimport { VERSION } from './version.js';\n\n// Log levels (matching standard levels)\nexport type LogLevel = 'debug' | 'info' | 'warning' | 'error';\n\nconst LOG_LEVEL_VALUES: Record<LogLevel, number> = {\n debug: 10,\n info: 20,\n warning: 30,\n error: 40,\n};\n\n// AsyncLocalStorage for proper async context isolation\nconst asyncContext = new AsyncLocalStorage<Record<string, unknown>>();\n\n// Fallback global context for environments where AsyncLocalStorage isn't used\nlet globalContext: Record<string, unknown> = {};\n\n/**\n * Get the current logging context.\n * Uses AsyncLocalStorage if available, falls back to global context.\n */\nexport function getContext(): Record<string, unknown> {\n const asyncStore = asyncContext.getStore();\n if (asyncStore) {\n return { ...asyncStore };\n }\n return { ...globalContext };\n}\n\n/**\n * Sanitize a string for safe logging to prevent log injection.\n */\nfunction sanitizeString(value: string): string {\n let sanitized = '';\n for (const char of value) {\n if (char === '\\r' || char === '\\n') {\n sanitized += '\\\\n';\n } else if (char.charCodeAt(0) < 32 || char.charCodeAt(0) === 127) {\n // Control characters - escape them\n sanitized += `\\\\x${char.charCodeAt(0).toString(16).padStart(2, '0')}`;\n } else {\n sanitized += char;\n }\n }\n // Truncate overly long values to prevent log flooding\n const maxLength = 1000;\n if (sanitized.length > maxLength) {\n sanitized = sanitized.slice(0, maxLength) + '...[truncated]';\n }\n return sanitized;\n}\n\n/**\n * Sanitize a value for safe logging to prevent log injection.\n *\n * Recursively sanitizes strings in objects and arrays.\n * Removes/escapes control characters, newlines, and other potentially\n * dangerous sequences that could be used for log injection attacks.\n */\nfunction sanitizeLogValue(value: unknown, depth = 0): unknown {\n // Prevent infinite recursion on deeply nested objects\n const maxDepth = 10;\n if (depth > maxDepth) {\n return '[max depth exceeded]';\n }\n\n if (value === null || value === undefined) {\n return value;\n }\n\n if (typeof value === 'string') {\n return sanitizeString(value);\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => sanitizeLogValue(item, depth + 1));\n }\n\n if (typeof value === 'object') {\n const sanitized: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value)) {\n const sanitizedKey = sanitizeString(key);\n sanitized[sanitizedKey] = sanitizeLogValue(val, depth + 1);\n }\n return sanitized;\n }\n\n // For functions, symbols, etc. - return type description\n return `[${typeof value}]`;\n}\n\n/**\n * Bind additional context to current scope (e.g., request_id, agent_id).\n *\n * Values are sanitized to prevent log injection attacks.\n * Updates both AsyncLocalStorage (if active) and global context.\n *\n * @example\n * bindContext({ requestId: 'req_123', agentId: 'agt_456' });\n * logger.info('Processing payment'); // Will include requestId and agentId\n */\nexport function bindContext(context: Record<string, unknown>): void {\n const sanitized: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(context)) {\n sanitized[key] = sanitizeLogValue(value);\n }\n\n // Update AsyncLocalStorage if active\n const asyncStore = asyncContext.getStore();\n if (asyncStore) {\n Object.assign(asyncStore, sanitized);\n }\n\n // Always update global context as fallback\n globalContext = { ...globalContext, ...sanitized };\n}\n\n/**\n * Clear all bound context.\n */\nexport function clearContext(): void {\n const asyncStore = asyncContext.getStore();\n if (asyncStore) {\n for (const key of Object.keys(asyncStore)) {\n delete asyncStore[key];\n }\n }\n globalContext = {};\n}\n\n/**\n * Run a function with isolated logging context.\n *\n * Context bound within the callback is isolated from other async operations.\n * This is the recommended way to set context for request handling.\n *\n * @example\n * await runWithContext({ requestId: 'req_123' }, async () => {\n * logger.info('Processing request'); // Includes requestId\n * await doAsyncWork();\n * logger.info('Request complete'); // Still includes requestId\n * });\n */\nexport function runWithContext<T>(\n context: Record<string, unknown>,\n fn: () => T | Promise<T>\n): T | Promise<T> {\n const sanitized: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(context)) {\n sanitized[key] = sanitizeLogValue(value);\n }\n return asyncContext.run(sanitized, fn);\n}\n\n// Logging configuration\ninterface LoggingConfig {\n level: LogLevel;\n jsonFormat: boolean;\n serviceName: string;\n environment: string;\n}\n\nconst loggingConfig: LoggingConfig = {\n level: (process.env['NATURAL_LOG_LEVEL']?.toLowerCase() as LogLevel) || 'info',\n jsonFormat: process.env['NATURAL_LOG_FORMAT']?.toLowerCase() === 'json',\n serviceName: 'naturalpay-sdk',\n environment: process.env['NATURAL_ENV'] || process.env['DD_ENV'] || 'development',\n};\n\n/**\n * Configure logging for the Natural SDK.\n *\n * @param options - Logging configuration options\n * @param options.level - Log level (debug, info, warning, error)\n * @param options.jsonFormat - Use JSON format (default: auto-detect from NATURAL_LOG_FORMAT env var)\n * @param options.serviceName - Service name for structured logs\n *\n * Environment variables:\n * - NATURAL_LOG_LEVEL: Override log level (DEBUG, INFO, WARNING, ERROR)\n * - NATURAL_LOG_FORMAT: Set to \"json\" for JSON output, \"text\" for plain text\n */\nexport function configureLogging(options?: {\n level?: LogLevel;\n jsonFormat?: boolean;\n serviceName?: string;\n}): void {\n if (options?.level) {\n loggingConfig.level = options.level;\n }\n if (options?.jsonFormat !== undefined) {\n loggingConfig.jsonFormat = options.jsonFormat;\n }\n if (options?.serviceName) {\n loggingConfig.serviceName = options.serviceName;\n }\n}\n\n/**\n * Get source location information from stack trace.\n */\nfunction getSourceInfo(): { file: string; line: number; function: string } {\n const stack = new Error().stack;\n if (!stack) {\n return { file: 'unknown', line: 0, function: 'unknown' };\n }\n\n // Parse stack trace - skip the first 3 lines (Error, getSourceInfo, formatLogRecord/log)\n const lines = stack.split('\\n');\n const callerLine = lines[4] || lines[3] || '';\n\n // Match patterns like \"at functionName (/path/to/file.ts:123:45)\" or \"at /path/to/file.ts:123:45\"\n const match = callerLine.match(/at\\s+(?:(.+?)\\s+\\()?(.*?):(\\d+):\\d+\\)?/);\n if (match) {\n return {\n function: match[1] || 'anonymous',\n file: match[2] || 'unknown',\n line: parseInt(match[3] || '0', 10),\n };\n }\n\n return { file: 'unknown', line: 0, function: 'unknown' };\n}\n\ninterface LogRecord {\n timestamp: string;\n level: string;\n logger: string;\n message: string;\n source: { file: string; line: number; function: string };\n service: string;\n environment: string;\n version: string;\n [key: string]: unknown;\n}\n\n/**\n * Format a log record as JSON.\n */\nfunction formatJsonLog(\n level: LogLevel,\n loggerName: string,\n message: string,\n extra?: Record<string, unknown>\n): string {\n const record: LogRecord = {\n timestamp: new Date().toISOString(),\n level: level.toUpperCase(),\n logger: loggerName,\n message,\n source: getSourceInfo(),\n service: loggingConfig.serviceName,\n environment: loggingConfig.environment,\n version: VERSION,\n ...getContext(),\n ...extra,\n };\n\n // Add Datadog trace correlation if available\n const ddTraceId = process.env['DD_TRACE_ID'];\n const ddSpanId = process.env['DD_SPAN_ID'];\n if (ddTraceId) {\n record['dd.trace_id'] = ddTraceId;\n record['dd.span_id'] = ddSpanId;\n record['dd.service'] = loggingConfig.serviceName;\n record['dd.version'] = VERSION;\n record['dd.env'] = loggingConfig.environment;\n }\n\n return JSON.stringify(record);\n}\n\n/**\n * Format a log record as plain text.\n */\nfunction formatTextLog(\n level: LogLevel,\n loggerName: string,\n message: string,\n extra?: Record<string, unknown>\n): string {\n const contextEntries = Object.entries({ ...getContext(), ...extra });\n const contextStr =\n contextEntries.length > 0 ? ` [${contextEntries.map(([k, v]) => `${k}=${v}`).join(', ')}]` : '';\n\n return `${level.toUpperCase().padEnd(8)} ${loggerName}: ${message}${contextStr}`;\n}\n\n/**\n * Logger instance for a specific module/context.\n */\nexport class Logger {\n constructor(private readonly name: string) {}\n\n private log(level: LogLevel, message: string, extra?: Record<string, unknown>): void {\n if (LOG_LEVEL_VALUES[level] < LOG_LEVEL_VALUES[loggingConfig.level]) {\n return;\n }\n\n const formatted = loggingConfig.jsonFormat\n ? formatJsonLog(level, this.name, message, extra)\n : formatTextLog(level, this.name, message, extra);\n\n // Use stderr for logs (best practice for CLI tools)\n if (level === 'error') {\n console.error(formatted);\n } else if (level === 'warning') {\n console.warn(formatted);\n } else {\n console.error(formatted); // All logs to stderr\n }\n }\n\n debug(message: string, extra?: Record<string, unknown>): void {\n this.log('debug', message, extra);\n }\n\n info(message: string, extra?: Record<string, unknown>): void {\n this.log('info', message, extra);\n }\n\n warning(message: string, extra?: Record<string, unknown>): void {\n this.log('warning', message, extra);\n }\n\n warn(message: string, extra?: Record<string, unknown>): void {\n this.warning(message, extra);\n }\n\n error(message: string, extra?: Record<string, unknown>): void {\n this.log('error', message, extra);\n }\n}\n\n/**\n * Get a logger for the given module name.\n *\n * @param name - Module name (e.g., 'naturalpay.http')\n * @returns Logger instance\n *\n * @example\n * const logger = getLogger('naturalpay.payments');\n * logger.info('Payment initiated', { amount: 10000 });\n */\nexport function getLogger(name: string): Logger {\n if (!name.startsWith('naturalpay')) {\n name = `naturalpay.${name}`;\n }\n return new Logger(name);\n}\n\n// Helper functions for common logging patterns\n\n/**\n * Log an error with full context and exception info.\n */\nexport function logError(\n logger: Logger,\n message: string,\n options?: {\n error?: Error;\n statusCode?: number;\n code?: string;\n [key: string]: unknown;\n }\n): void {\n const extra: Record<string, unknown> = { ...options };\n\n if (options?.error) {\n extra['errorType'] = options.error.name;\n extra['errorMessage'] = options.error.message;\n if (options.error.stack) {\n extra['errorStack'] = options.error.stack.split('\\n').slice(0, 5).join('\\n');\n }\n delete extra['error'];\n }\n\n logger.error(message, extra);\n}\n\n/**\n * Log an API call with standard fields.\n */\nexport function logApiCall(\n logger: Logger,\n method: string,\n path: string,\n options?: {\n statusCode?: number;\n durationMs?: number;\n error?: Error;\n [key: string]: unknown;\n }\n): void {\n const extra: Record<string, unknown> = {\n method,\n path,\n ...options,\n };\n\n if (options?.statusCode) {\n extra['statusCode'] = options.statusCode;\n }\n if (options?.durationMs !== undefined) {\n extra['durationMs'] = Math.round(options.durationMs * 100) / 100;\n }\n\n if (options?.error) {\n logError(logger, `API call failed: ${method} ${path}`, extra);\n } else if (options?.statusCode && options.statusCode >= 400) {\n logger.warning(`API call error: ${method} ${path} -> ${options.statusCode}`, extra);\n } else {\n logger.info(`API call: ${method} ${path} -> ${options?.statusCode}`, extra);\n }\n}\n\n/**\n * Log an MCP tool invocation.\n */\nexport function logToolCall(\n logger: Logger,\n toolName: string,\n options?: {\n success?: boolean;\n durationMs?: number;\n error?: Error;\n [key: string]: unknown;\n }\n): void {\n const extra: Record<string, unknown> = {\n toolName,\n ...options,\n };\n\n if (options?.durationMs !== undefined) {\n extra['durationMs'] = Math.round(options.durationMs * 100) / 100;\n }\n\n if (options?.error) {\n logError(logger, `Tool call failed: ${toolName}`, extra);\n } else if (options?.success === false) {\n logger.warning(`Tool call returned error: ${toolName}`, extra);\n } else {\n logger.info(`Tool call: ${toolName}`, extra);\n }\n}\n","/**\n * Agent config and model usage for LLM observability.\n *\n * Tracks static agent configuration (system prompt, tools) and per-request\n * model usage so the observability service can attribute API calls to\n * specific LLM sessions.\n */\n\nimport { createHash } from 'crypto';\n\n/**\n * Static agent configuration — set once per client, sent to observability.\n *\n * Describes the agent's identity (system prompt and available tools).\n * Model/provider are per-request and belong in ModelUsage.\n */\nexport interface AgentConfig {\n systemPrompt: string;\n toolsAvailable: string[];\n}\n\nexport interface ModelUsage {\n model?: string;\n provider?: string;\n inputTokens?: number;\n outputTokens?: number;\n toolsCalled?: string[];\n}\n\nexport interface AgentConfigDict {\n system_prompt: string;\n tools_available: string[];\n}\n\nexport interface ModelUsageDict {\n model?: string;\n provider?: string;\n input_tokens?: number;\n output_tokens?: number;\n tools_called?: string[];\n}\n\n/**\n * SHA-256 hash for change detection.\n *\n * Covers only {system_prompt, tools_available} — model/provider\n * are dynamic per-request and excluded from the config hash.\n */\nexport function configHash(cfg: AgentConfig): string {\n const content = JSON.stringify({\n system_prompt: cfg.systemPrompt,\n tools_available: [...cfg.toolsAvailable].sort(),\n });\n return createHash('sha256').update(content).digest('hex');\n}\n\nexport function agentConfigToDict(cfg: AgentConfig): AgentConfigDict {\n return {\n system_prompt: cfg.systemPrompt,\n tools_available: [...cfg.toolsAvailable].sort(),\n };\n}\n\nexport function modelUsageToDict(usage: ModelUsage): ModelUsageDict {\n const dict: ModelUsageDict = {};\n if (usage.model) {\n dict.model = usage.model;\n }\n if (usage.provider) {\n dict.provider = usage.provider;\n }\n if (usage.inputTokens != null) {\n dict.input_tokens = usage.inputTokens;\n }\n if (usage.outputTokens != null) {\n dict.output_tokens = usage.outputTokens;\n }\n if (usage.toolsCalled != null && usage.toolsCalled.length > 0) {\n dict.tools_called = usage.toolsCalled;\n }\n return dict;\n}\n","/**\n * Tool call context for MCP server -> HTTP layer communication.\n *\n * The MCP server sets tool call data (id + name + arguments) before invoking\n * SDK methods. The HTTP layer reads it and sends the X-Tool-Call header to the\n * BFF for audit/observability. Direct SDK users never interact with this module.\n */\n\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { randomUUID } from 'node:crypto';\nimport { getLogger } from './logging.js';\nimport type { ToolCallId } from './ids.js';\n\nconst logger = getLogger('tool-call-context');\n\ninterface ToolCallData {\n tool_call_id: ToolCallId;\n tool_name: string;\n tool_call_arguments: string;\n}\n\nconst toolCallStorage = new AsyncLocalStorage<ToolCallData>();\n\n/**\n * Generate a unique tool call ID with the `tc_` prefix.\n */\nexport function generateToolCallId(): ToolCallId {\n return `tc_${randomUUID()}` as ToolCallId;\n}\n\n/**\n * Get the base64-encoded X-Tool-Call header value, or undefined if not in\n * a tool call context.\n *\n * If the full header (with arguments) exceeds 16 KB, the arguments are\n * omitted and a warning is logged.\n */\nexport function getToolCallHeader(): string | undefined {\n const data = toolCallStorage.getStore();\n if (!data) return undefined;\n\n const full = Buffer.from(JSON.stringify(data)).toString('base64');\n if (full.length <= 16 * 1024) return full;\n\n // Arguments too large — send id + name only.\n logger.warning('Tool call header exceeds 16KB, omitting arguments', {\n toolCallId: data.tool_call_id,\n toolName: data.tool_name,\n fullSizeBytes: full.length,\n });\n const slim: Omit<ToolCallData, 'tool_call_arguments'> = {\n tool_call_id: data.tool_call_id,\n tool_name: data.tool_name,\n };\n return Buffer.from(JSON.stringify(slim)).toString('base64');\n}\n\n/**\n * Run a function within a tool call context. The HTTP layer will automatically\n * pick up the tool call data and send it as the X-Tool-Call header.\n *\n * @param toolCallId - Unique ID for this invocation (tc_<uuid>).\n * @param name - Tool name (e.g. \"create_payment\").\n * @param args - Raw tool arguments.\n * @param fn - The function to execute within the context.\n */\nexport function runWithToolCall<T>(\n toolCallId: ToolCallId,\n name: string,\n args: Record<string, unknown>,\n fn: () => T\n): T {\n return toolCallStorage.run(\n {\n tool_call_id: toolCallId,\n tool_name: name,\n tool_call_arguments: JSON.stringify(args),\n },\n fn\n );\n}\n","/**\n * HTTP client for Natural Server API with JWT caching.\n */\n\nimport {\n AuthenticationError,\n InvalidRequestError,\n NaturalError,\n RateLimitError,\n ServerError,\n} from './errors.js';\nimport { getLogger, logApiCall, logError } from './logging.js';\nimport {\n type AgentConfig,\n type ModelUsage,\n configHash,\n agentConfigToDict,\n modelUsageToDict,\n} from './model-context.js';\nimport { getToolCallHeader } from './tool-call-context.js';\nimport { VERSION } from './version.js';\n\nconst logger = getLogger('http');\n\nconst DEFAULT_BASE_URL = 'https://api.natural.co';\nconst DEFAULT_TIMEOUT = 30000;\n\nconst API_KEY_PREFIX_REGEX = /^sk_ntl_(dev|sandbox|prod)_/;\n\n/**\n * Parse an API key and return its environment label.\n *\n * Accepts keys matching `sk_ntl_(dev|sandbox|prod)_*`. Throws\n * `InvalidRequestError` for anything else. The return type is a narrowed\n * literal union so callers can discriminate on the env without a second\n * parse.\n */\nexport function parseApiKeyEnv(key: string): 'dev' | 'sandbox' | 'prod' {\n const match = API_KEY_PREFIX_REGEX.exec(key);\n if (match) {\n return match[1] as 'dev' | 'sandbox' | 'prod';\n }\n const preview = key.length > 16 ? `${key.slice(0, 16)}...` : key;\n throw new InvalidRequestError(\n `Invalid API key prefix. Expected a key starting with 'sk_ntl_dev_', ` +\n `'sk_ntl_sandbox_', or 'sk_ntl_prod_'. Got: '${preview}'`\n );\n}\n\n/**\n * Validate that a base URL uses HTTPS, with a localhost auto-allow and an\n * `NATURAL_ALLOW_HTTP=1` escape hatch for non-localhost plaintext hosts.\n *\n * Throws `InvalidRequestError` if the URL is not HTTPS and neither escape\n * hatch applies. Runs at client construction, not per-request.\n */\nexport function validateBaseUrl(baseUrl: string): void {\n let url: URL;\n try {\n url = new URL(baseUrl);\n } catch {\n throw new InvalidRequestError(`Invalid baseUrl: '${baseUrl}'. Must be a valid absolute URL.`);\n }\n if (url.protocol === 'https:') {\n return;\n }\n // url.hostname for IPv6 may return either \"::1\" or \"[::1]\" depending on\n // the runtime; accept both forms.\n const host = url.hostname;\n if (host === 'localhost' || host === '127.0.0.1' || host === '::1' || host === '[::1]') {\n return;\n }\n const allowHttp = process.env['NATURAL_ALLOW_HTTP'];\n if (allowHttp && allowHttp !== '0' && allowHttp.toLowerCase() !== 'false') {\n return;\n }\n throw new InvalidRequestError(\n `baseUrl must use HTTPS (got '${baseUrl}'). To allow plaintext HTTP for development, set NATURAL_ALLOW_HTTP=1 or use a localhost host.`\n );\n}\n\nexport interface HTTPClientOptions {\n apiKey?: string;\n baseUrl?: string;\n timeout?: number;\n agentConfig?: AgentConfig;\n /** Default model/provider sent with every request as X-Model-Usage. */\n defaultModelUsage?: Pick<ModelUsage, 'model' | 'provider'>;\n maxRetries?: number;\n}\n\ninterface JWTCacheEntry {\n token: string;\n expiresAt: number;\n}\n\ninterface RequestOptions {\n body?: Record<string, unknown>;\n params?: Record<string, unknown>;\n headers?: Record<string, string>;\n modelUsage?: ModelUsage;\n}\n\n/**\n * Hash a string using a simple hash function (for cache keys).\n */\nfunction hashString(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return Math.abs(hash).toString(16).slice(0, 16);\n}\n\nconst SAFE_METHODS = new Set(['GET', 'HEAD']);\n\n/**\n * Check if a request header key matches 'idempotency-key' (case-insensitive).\n */\nfunction hasIdempotencyKey(headers: Record<string, string>): boolean {\n return Object.entries(headers).some(\n ([k, v]) => k.toLowerCase() === 'idempotency-key' && v !== ''\n );\n}\n\n/**\n * Determine whether a failed request should be retried.\n */\nexport function shouldRetry(\n method: string,\n headers: Record<string, string>,\n error: unknown,\n attempt: number,\n maxRetries: number\n): boolean {\n if (attempt >= maxRetries) return false;\n\n // Never retry auth or client errors (except rate limit)\n if (error instanceof AuthenticationError) return false;\n if (error instanceof InvalidRequestError) return false;\n\n // Never retry 4xx responses (e.g. non-JSON parse failures that produce NaturalError)\n // but DO retry 429 (RateLimitError)\n if (\n !(error instanceof RateLimitError) &&\n error instanceof NaturalError &&\n error.statusCode &&\n error.statusCode >= 400 &&\n error.statusCode < 500\n ) {\n return false;\n }\n\n // Only retry ServerError, RateLimitError, or network NaturalError\n const isRetryable =\n error instanceof ServerError ||\n error instanceof RateLimitError ||\n (error instanceof NaturalError && !(error instanceof AuthenticationError));\n if (!isRetryable) return false;\n\n // Safe methods always retryable; unsafe only with idempotency key\n if (SAFE_METHODS.has(method.toUpperCase())) return true;\n return hasIdempotencyKey(headers);\n}\n\n/**\n * Calculate delay before next retry attempt.\n */\nconst MAX_RETRY_AFTER_MS = 60000; // Cap Retry-After at 60 seconds\n\nexport function calculateRetryDelay(attempt: number, retryAfterSeconds?: number): number {\n if (retryAfterSeconds != null && Number.isFinite(retryAfterSeconds) && retryAfterSeconds > 0) {\n return Math.min(retryAfterSeconds * 1000, MAX_RETRY_AFTER_MS);\n }\n const jitter = 1 + Math.random() * 0.25;\n return Math.min(500 * Math.pow(2, attempt) * jitter, 5000);\n}\n\nexport class HTTPClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n private readonly maxRetries: number;\n private readonly jwtCache: Map<string, JWTCacheEntry> = new Map();\n private readonly agentConfig?: AgentConfig;\n private readonly _defaultModelUsage?: Pick<ModelUsage, 'model' | 'provider'>;\n private _configResolved: boolean = false;\n private _configAttempted: boolean = false;\n private _registerConfigPromise: Promise<void> | null = null;\n private _nextRetryAt: number = 0;\n private _retryBackoffMs: number = 1000;\n private static readonly MAX_RETRY_BACKOFF_MS = 5 * 60 * 1000;\n\n constructor(options: HTTPClientOptions = {}) {\n this.apiKey = options.apiKey ?? process.env['NATURAL_API_KEY'] ?? '';\n this.baseUrl = (\n options.baseUrl ??\n process.env['NATURAL_SERVER_URL'] ??\n DEFAULT_BASE_URL\n ).replace(/\\/$/, '');\n validateBaseUrl(this.baseUrl);\n if (this.apiKey) {\n parseApiKeyEnv(this.apiKey);\n }\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n this.agentConfig = options.agentConfig\n ? {\n systemPrompt: options.agentConfig.systemPrompt,\n toolsAvailable: [...options.agentConfig.toolsAvailable],\n }\n : undefined;\n\n if (options.defaultModelUsage) {\n this._defaultModelUsage = {\n model: options.defaultModelUsage.model,\n provider: options.defaultModelUsage.provider,\n };\n }\n\n const maxRetries = options.maxRetries ?? 2;\n if (!Number.isInteger(maxRetries) || maxRetries < 0) {\n throw new InvalidRequestError('maxRetries must be a non-negative integer');\n }\n this.maxRetries = maxRetries;\n }\n\n /**\n * Get a cached JWT or exchange API key for a new one.\n * Retries on transient failures (5xx, network) but not on 401.\n */\n private async getJwt(): Promise<string> {\n if (!this.apiKey) {\n throw new AuthenticationError();\n }\n\n // Check cache\n const cacheKey = hashString(this.apiKey);\n const cached = this.jwtCache.get(cacheKey);\n if (cached && Date.now() < cached.expiresAt) {\n return cached.token;\n }\n\n logger.debug('Exchanging API key for JWT', { path: '/auth/api/token' });\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(`${this.baseUrl}/auth/api/token`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n // 429 on auth endpoint is transient — retry with Retry-After\n if (response.status === 429) {\n const retryAfter = response.headers.get('Retry-After');\n const rateError = new RateLimitError(\n 'JWT exchange rate limited',\n retryAfter ? parseInt(retryAfter, 10) : undefined\n );\n throw rateError;\n }\n\n if (response.status >= 400 && response.status < 500) {\n const authError = new AuthenticationError(\n `Authentication failed (status=${response.status})`\n );\n logError(logger, 'JWT exchange failed', {\n error: authError,\n statusCode: response.status,\n path: '/auth/api/token',\n });\n throw authError;\n }\n\n if (response.status >= 500) {\n const serverError = new ServerError(`JWT exchange failed (status=${response.status})`);\n logError(logger, 'JWT exchange server error', {\n error: serverError,\n statusCode: response.status,\n path: '/auth/api/token',\n });\n throw serverError;\n }\n\n const data = (await response.json()) as {\n accessToken: string;\n expiresIn?: number;\n };\n\n const expiresIn = data.expiresIn ?? 900;\n const expiresAt = Date.now() + (expiresIn - 30) * 1000;\n\n this.jwtCache.set(cacheKey, { token: data.accessToken, expiresAt });\n\n return data.accessToken;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof AuthenticationError) {\n throw error;\n }\n\n // Normalize to SDK error\n let sdkError: NaturalError;\n if (error instanceof NaturalError) {\n sdkError = error;\n } else if (error instanceof Error && error.name === 'AbortError') {\n sdkError = new NaturalError('Request timed out during authentication');\n } else {\n sdkError = new NaturalError(\n `Network error during authentication: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n\n if (attempt < this.maxRetries) {\n const retryAfter = sdkError instanceof RateLimitError ? sdkError.retryAfter : undefined;\n const delay = calculateRetryDelay(attempt, retryAfter);\n const reason =\n sdkError instanceof RateLimitError\n ? '429 rate limited'\n : sdkError instanceof ServerError\n ? `status ${sdkError.statusCode}`\n : 'network error';\n logger.warning(`Retrying JWT exchange (attempt ${attempt + 1}/${this.maxRetries})`, {\n path: '/auth/api/token',\n attempt: attempt + 1,\n maxRetries: this.maxRetries,\n delayMs: Math.round(delay),\n reason,\n });\n await new Promise((resolve) => setTimeout(resolve, delay));\n continue;\n }\n\n logError(logger, 'JWT exchange failed after retries', {\n error: sdkError,\n path: '/auth/api/token',\n });\n throw sdkError;\n }\n }\n\n throw new NaturalError('Unexpected retry exhaustion during JWT exchange');\n }\n\n /**\n * Build URL with query parameters.\n */\n private buildUrl(path: string, params?: Record<string, unknown>): string {\n const url = new URL(path, this.baseUrl);\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n return url.toString();\n }\n\n /**\n * Handle API response and throw appropriate errors.\n */\n private async handleResponse<T>(\n response: Response,\n method: string,\n path: string,\n durationMs: number\n ): Promise<T> {\n if (response.status === 401) {\n const authError = new AuthenticationError();\n logApiCall(logger, method, path, {\n statusCode: response.status,\n durationMs,\n error: authError,\n });\n throw authError;\n }\n\n if (response.status === 429) {\n const retryAfter = response.headers.get('Retry-After');\n const rateError = new RateLimitError(\n 'Rate limit exceeded',\n retryAfter ? parseInt(retryAfter, 10) : undefined\n );\n logger.warning(`Rate limited: ${method} ${path}`, {\n method,\n path,\n statusCode: response.status,\n retryAfter,\n durationMs: Math.round(durationMs * 100) / 100,\n });\n throw rateError;\n }\n\n if (response.status >= 500) {\n const serverError = new ServerError(`Server error: ${response.status}`);\n logApiCall(logger, method, path, {\n statusCode: response.status,\n durationMs,\n error: serverError,\n });\n throw serverError;\n }\n\n let data: unknown;\n try {\n const text = await response.text();\n data = text ? JSON.parse(text) : {};\n } catch {\n if (response.status >= 400) {\n const parseError = new NaturalError(\n `Request failed: ${response.status} (non-JSON response)`,\n { statusCode: response.status, code: 'parse_error' }\n );\n logApiCall(logger, method, path, {\n statusCode: response.status,\n durationMs,\n error: parseError,\n });\n throw parseError;\n }\n // Success but no JSON body\n logApiCall(logger, method, path, { statusCode: response.status, durationMs });\n return {} as T;\n }\n\n if (response.status >= 400) {\n // Try JSON:API errors[] envelope first (canonical server format),\n // then fall back to flat fields for defense in depth.\n const errBody = data as Record<string, unknown>;\n const errors = Array.isArray(errBody.errors) ? errBody.errors : [];\n const firstError = (errors[0] ?? {}) as Record<string, unknown>;\n\n const errorMessage =\n (firstError.detail as string) ??\n (errBody.detail as string) ??\n (errBody.message as string) ??\n (errBody.error as string) ??\n 'Request failed';\n const errorCode = (firstError.code as string) ?? (errBody.code as string) ?? 'unknown_error';\n const requestError = new InvalidRequestError(\n `${errorMessage} (status=${response.status})`,\n errorCode\n );\n logApiCall(logger, method, path, {\n statusCode: response.status,\n durationMs,\n error: requestError,\n });\n throw requestError;\n }\n\n // Success\n logApiCall(logger, method, path, { statusCode: response.status, durationMs });\n return data as T;\n }\n\n /**\n * Register agent config with the observability service.\n *\n * Called lazily before the first request. Errors are caught and logged,\n * never thrown.\n */\n private async registerConfig(): Promise<void> {\n if (!this.agentConfig) return;\n\n try {\n const jwt = await this.getJwt();\n const hash = configHash(this.agentConfig);\n const body = {\n config_hash: hash,\n ...agentConfigToDict(this.agentConfig),\n };\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(`${this.baseUrl}/agents/config`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${jwt}`,\n 'Content-Type': 'application/json',\n 'User-Agent': `naturalpay-ts/${VERSION}`,\n },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n\n if (response.ok) {\n this._configResolved = true;\n } else if (response.status === 429 || response.status === 408 || response.status >= 500) {\n // Transient — will retry after backoff\n this._nextRetryAt = Date.now() + this._retryBackoffMs;\n this._retryBackoffMs = Math.min(\n this._retryBackoffMs * 2,\n HTTPClient.MAX_RETRY_BACKOFF_MS\n );\n logger.warning('Agent config registration failed (transient)', {\n statusCode: response.status,\n });\n } else {\n // Permanent 4xx — stop retrying\n this._configResolved = true;\n logger.warning('Agent config registration failed (permanent)', {\n statusCode: response.status,\n });\n }\n } finally {\n clearTimeout(timeoutId);\n }\n } catch (error) {\n this._nextRetryAt = Date.now() + this._retryBackoffMs;\n this._retryBackoffMs = Math.min(this._retryBackoffMs * 2, HTTPClient.MAX_RETRY_BACKOFF_MS);\n logger.warning('Failed to register agent config', {\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n } finally {\n this._configAttempted = true;\n }\n }\n\n /**\n * Add agent config hash and model usage headers if configured.\n */\n private injectModelContextHeaders(\n headers: Record<string, string>,\n modelUsage?: ModelUsage\n ): void {\n if (this.agentConfig) {\n headers['X-Model-Config-Hash'] = configHash(this.agentConfig);\n }\n\n // Merge constructor-level model/provider defaults with per-request modelUsage.\n // Per-request values override the defaults.\n const effectiveUsage: ModelUsage | undefined = (() => {\n if (!modelUsage && !this._defaultModelUsage) return undefined;\n return {\n model: modelUsage?.model ?? this._defaultModelUsage?.model,\n provider: modelUsage?.provider ?? this._defaultModelUsage?.provider,\n inputTokens: modelUsage?.inputTokens,\n outputTokens: modelUsage?.outputTokens,\n toolsCalled: modelUsage?.toolsCalled,\n };\n })();\n\n if (effectiveUsage) {\n const usageDict = modelUsageToDict(effectiveUsage);\n if (Object.keys(usageDict).length > 0) {\n headers['X-Model-Usage'] = Buffer.from(JSON.stringify(usageDict)).toString('base64');\n }\n }\n }\n\n /**\n * Make an authenticated request with automatic retries.\n */\n async request<T>(method: string, path: string, options?: RequestOptions): Promise<T> {\n if (this.agentConfig && !this._configResolved) {\n if (!this._registerConfigPromise) {\n if (!this._configAttempted || Date.now() >= this._nextRetryAt) {\n this._registerConfigPromise = this.registerConfig()\n .catch(() => {})\n .finally(() => {\n this._registerConfigPromise = null;\n });\n }\n }\n if (!this._configAttempted) {\n // First attempt: await so (1) the JWT is cached for the request\n // below (avoids a double exchange) and (2) the config hash is\n // registered before the first hashed request is sent.\n await this._registerConfigPromise;\n }\n // After the first attempt, retries are fire-and-forget so transient\n // observability failures never block business requests.\n }\n\n const jwt = await this.getJwt();\n\n const url = this.buildUrl(path, options?.params);\n\n const mergedHeaders: Record<string, string> = {\n Authorization: `Bearer ${jwt}`,\n 'Content-Type': 'application/json',\n 'User-Agent': `naturalpay-ts/${VERSION}`,\n };\n const toolCallHeader = getToolCallHeader();\n if (toolCallHeader) {\n mergedHeaders['X-Tool-Call'] = toolCallHeader;\n }\n this.injectModelContextHeaders(mergedHeaders, options?.modelUsage);\n if (options?.headers) {\n Object.assign(mergedHeaders, options.headers);\n }\n\n const bodyStr = options?.body ? JSON.stringify(options.body) : undefined;\n\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n const startTime = Date.now();\n\n if (attempt === 0) {\n logger.debug(`API request: ${method} ${path}`, {\n method,\n path,\n hasBody: !!options?.body,\n });\n }\n\n try {\n const response = await fetch(url, {\n method,\n headers: mergedHeaders,\n body: bodyStr,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n const durationMs = Date.now() - startTime;\n return await this.handleResponse<T>(response, method, path, durationMs);\n } catch (error) {\n clearTimeout(timeoutId);\n const durationMs = Date.now() - startTime;\n\n // Normalize raw errors into SDK error types\n let sdkError: NaturalError;\n if (error instanceof NaturalError) {\n sdkError = error;\n } else if (error instanceof Error && error.name === 'AbortError') {\n sdkError = new NaturalError('Request timed out');\n logApiCall(logger, method, path, { durationMs, error: sdkError });\n } else {\n sdkError = new NaturalError(\n `Network error: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n logApiCall(logger, method, path, { durationMs, error: sdkError });\n }\n\n // Check if we should retry\n if (shouldRetry(method, mergedHeaders, sdkError, attempt, this.maxRetries)) {\n const retryAfter = sdkError instanceof RateLimitError ? sdkError.retryAfter : undefined;\n const delay = calculateRetryDelay(attempt, retryAfter);\n logger.warning(`Retrying ${method} ${path} (attempt ${attempt + 1}/${this.maxRetries})`, {\n method,\n path,\n attempt: attempt + 1,\n maxRetries: this.maxRetries,\n delayMs: Math.round(delay),\n reason:\n sdkError instanceof ServerError\n ? `status ${sdkError.statusCode}`\n : sdkError instanceof RateLimitError\n ? '429 rate limited'\n : 'network error',\n });\n await new Promise((resolve) => setTimeout(resolve, delay));\n continue;\n }\n\n throw sdkError;\n }\n }\n\n // Unreachable — loop always throws or returns\n throw new NaturalError('Unexpected retry exhaustion');\n }\n\n async get<T>(path: string, options?: Omit<RequestOptions, 'body'>): Promise<T> {\n return this.request<T>('GET', path, options);\n }\n\n async post<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('POST', path, options);\n }\n\n async put<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('PUT', path, options);\n }\n\n async delete<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('DELETE', path, options);\n }\n}\n","/**\n * Base resource class.\n */\n\nimport type { HTTPClient } from '../http.js';\n\nexport abstract class BaseResource {\n protected readonly http: HTTPClient;\n\n constructor(http: HTTPClient) {\n this.http = http;\n }\n}\n\n/** Strip control characters (CR, LF, NUL, etc.) from a header value to prevent header injection. */\nexport function sanitizeHeaderValue(value: string): string {\n // eslint-disable-next-line no-control-regex\n return value.replace(/[\\x00-\\x1f\\x7f]/g, '');\n}\n","/**\n * Transactions resource.\n */\n\nimport { InvalidRequestError, NaturalError } from '../errors.js';\nimport { BaseResource, sanitizeHeaderValue } from './base.js';\nimport type {\n Transaction,\n TransactionGetParams,\n TransactionListParams,\n TransactionListResponse,\n} from '../types/transactions.js';\nimport type { JsonApiListResponse, JsonApiResource, JsonApiSingleResponse } from './jsonapi.js';\n\n/**\n * Unwrap a single JSON:API transaction resource into a flat Transaction object.\n */\nexport function unwrapTransactionResource(resource: JsonApiResource): Transaction {\n if (resource.type !== 'transaction' || !resource.attributes) {\n throw new NaturalError(\n `Unexpected resource format: expected type \"transaction\", got \"${resource.type}\"`\n );\n }\n\n const { id, attributes, relationships } = resource;\n\n return {\n transactionId: id,\n amount: Number(attributes.amount),\n currency: String(attributes.currency),\n status: String(attributes.status),\n description: attributes.description != null ? String(attributes.description) : undefined,\n memo: attributes.memo != null ? String(attributes.memo) : undefined,\n createdAt: String(attributes.createdAt),\n updatedAt: attributes.updatedAt != null ? String(attributes.updatedAt) : undefined,\n isDelegated: Boolean(attributes.isDelegated),\n customerName: attributes.customerName != null ? String(attributes.customerName) : undefined,\n customerAgentId:\n attributes.customerAgentId != null ? String(attributes.customerAgentId) : undefined,\n senderName: attributes.senderName != null ? String(attributes.senderName) : undefined,\n recipientName: attributes.recipientName != null ? String(attributes.recipientName) : undefined,\n transactionType: String(attributes.transactionType),\n category: String(attributes.category),\n direction: String(attributes.direction),\n sourcePartyId: relationships?.sourceParty?.data?.id,\n destinationPartyId: relationships?.destinationParty?.data?.id,\n sourceWalletId: relationships?.sourceWallet?.data?.id,\n destinationWalletId: relationships?.destinationWallet?.data?.id,\n instanceId: attributes.instanceId != null ? String(attributes.instanceId) : undefined,\n claimLink: attributes.claimLink != null ? String(attributes.claimLink) : undefined,\n };\n}\n\nexport class TransactionsResource extends BaseResource {\n /**\n * Get a transaction by ID.\n *\n * @param transactionId - Transaction ID (txn_xxx)\n * @param params - Optional parameters for observability\n * @returns Transaction details\n */\n async get(transactionId: string, params?: TransactionGetParams): Promise<Transaction> {\n const headers: Record<string, string> = {};\n\n if (params?.agentId) {\n headers['X-Agent-ID'] = params.agentId;\n }\n if (params?.instanceId) {\n headers['X-Instance-ID'] = params.instanceId;\n }\n if (params?.traceId) {\n headers['X-Trace-ID'] = sanitizeHeaderValue(params.traceId);\n }\n\n const queryParams: Record<string, string> = {};\n if (params?.customerPartyId) {\n queryParams['partyId'] = params.customerPartyId;\n }\n\n const response = await this.http.get<JsonApiSingleResponse>(`/transactions/${transactionId}`, {\n params: Object.keys(queryParams).length > 0 ? queryParams : undefined,\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n });\n\n if (!response?.data) {\n throw new NaturalError('Unexpected response format: missing \"data\" in transaction response');\n }\n\n return unwrapTransactionResource(response.data);\n }\n\n /**\n * List recent transactions.\n *\n * @param params - List parameters including agent context\n * @returns TransactionListResponse with transactions and pagination info\n */\n async list(params?: TransactionListParams): Promise<TransactionListResponse> {\n const headers: Record<string, string> = {};\n\n if (params?.agentId) {\n if (!params?.instanceId) {\n throw new InvalidRequestError('instanceId is required when agentId is provided');\n }\n headers['X-Agent-ID'] = params.agentId;\n }\n if (params?.instanceId) {\n headers['X-Instance-ID'] = params.instanceId;\n }\n if (params?.traceId) {\n headers['X-Trace-ID'] = sanitizeHeaderValue(params.traceId);\n }\n\n const queryParams: Record<string, unknown> = {\n limit: params?.limit ?? 50,\n cursor: params?.cursor,\n type: params?.type,\n };\n\n const response = await this.http.get<JsonApiListResponse>('/transactions', {\n params: queryParams,\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n });\n\n if (!response?.data || !Array.isArray(response.data)) {\n throw new NaturalError(\n 'Unexpected response format: missing \"data\" array in transaction list response'\n );\n }\n\n const transactions = response.data.map(unwrapTransactionResource);\n const pagination = response.meta?.pagination ?? {};\n\n return {\n transactions,\n hasMore: pagination.hasMore ?? false,\n nextCursor: pagination.nextCursor ?? null,\n };\n }\n}\n","/**\n * Payments resource.\n */\n\nimport { InvalidRequestError, NaturalError } from '../errors.js';\nimport { BaseResource, sanitizeHeaderValue } from './base.js';\nimport { unwrapTransactionResource } from './transactions.js';\nimport type { PaymentCreateParams } from '../types/payments.js';\nimport type { Transaction } from '../types/transactions.js';\nimport type { JsonApiSingleResponse, JsonApiRequestBody } from './jsonapi.js';\n\nconst PHONE_DIGITS_RE = /^\\d{10,}$/;\nconst PHONE_PLUS_RE = /^\\+\\d{7,}$/;\n\n/**\n * Validate recipient format matches backend expectations.\n * Accepted: party ID (pty_*), email (@), phone (+ prefix with digits, or 10+ digits).\n *\n * Caller must trim the value before passing it here.\n */\nfunction validateRecipient(recipient: string): void {\n if (!recipient) {\n throw new InvalidRequestError('recipient cannot be empty');\n }\n if (recipient.startsWith('pty_')) return;\n if (recipient.includes('@')) return;\n if (PHONE_PLUS_RE.test(recipient)) return;\n if (PHONE_DIGITS_RE.test(recipient)) return;\n throw new InvalidRequestError(\n 'Invalid recipient format. Expected: party ID (pty_*), email (contains @), or phone (+ prefix or 10+ digits)'\n );\n}\n\n/**\n * Unwrap a JSON:API single-resource response into a flat Transaction object.\n *\n * Delegates to the shared `unwrapTransactionResource` for core field extraction,\n * then applies payment-specific overrides: relationship key mapping\n * (customerParty/counterparty), defaults, and memo mirroring.\n */\nfunction unwrapPaymentResponse(response: JsonApiSingleResponse): Transaction {\n if (!response?.data) {\n throw new NaturalError('Unexpected response format: missing \"data\" field in payment response');\n }\n\n const base = unwrapTransactionResource(response.data);\n const { relationships, attributes } = response.data;\n\n return {\n ...base,\n // Payment responses may omit these fields; provide sensible defaults.\n transactionType: String(attributes.transactionType ?? 'payment'),\n category: String(attributes.category ?? 'sent'),\n direction: String(attributes.direction ?? 'OUTBOUND'),\n // Mirror description into memo for payment convenience.\n memo: base.description,\n // Payments use customerParty/counterparty relationship keys,\n // falling back to the generic sourceParty/destinationParty.\n sourcePartyId: relationships?.customerParty?.data?.id ?? base.sourcePartyId,\n destinationPartyId: relationships?.counterparty?.data?.id ?? base.destinationPartyId,\n };\n}\n\nexport class PaymentsResource extends BaseResource {\n /**\n * Create a payment.\n *\n * @param params - Payment creation parameters\n * @returns Transaction object with transaction_id (txn_*), status, etc.\n */\n async create(params: PaymentCreateParams): Promise<Transaction> {\n const recipient = params.recipient.trim();\n validateRecipient(recipient);\n\n if (!Number.isInteger(params.amount) || params.amount <= 0) {\n throw new InvalidRequestError('amount must be a positive integer (minor units in cents)');\n }\n\n // Build JSON:API envelope\n const attributes: Record<string, unknown> = {\n amount: params.amount,\n currency: params.currency ?? 'USD',\n counterparty: recipient,\n customerPartyId: params.customerPartyId,\n };\n\n attributes['description'] = params.memo;\n\n const body: JsonApiRequestBody = { data: { attributes } };\n\n const headers: Record<string, string> = {\n 'Idempotency-Key': params.idempotencyKey,\n };\n if (params.agentId) {\n if (!params.instanceId) {\n throw new InvalidRequestError('instanceId is required when agentId is provided');\n }\n headers['X-Agent-ID'] = params.agentId;\n }\n if (params.instanceId) {\n headers['X-Instance-ID'] = params.instanceId;\n }\n if (params.traceId) {\n headers['X-Trace-ID'] = sanitizeHeaderValue(params.traceId);\n }\n\n const response = await this.http.post<JsonApiSingleResponse>('/payments', {\n body,\n headers,\n });\n\n return unwrapPaymentResponse(response);\n }\n}\n","/**\n * Wallet resource.\n */\n\nimport { InvalidRequestError, NaturalError } from '../errors.js';\nimport { BaseResource, sanitizeHeaderValue } from './base.js';\nimport type {\n AccountBalance,\n AmountInfo,\n BalanceBreakdown,\n BalanceOptions,\n WithdrawParams,\n WithdrawResponse,\n} from '../types/wallet.js';\nimport type { JsonApiSingleResponse, JsonApiRequestBody } from './jsonapi.js';\n\n/**\n * Extract an AmountInfo from a raw attribute value.\n */\nfunction toAmountInfo(raw: unknown): AmountInfo {\n const obj = raw as Record<string, unknown> | undefined;\n return {\n amountMinor: Number(obj?.amountMinor ?? 0),\n };\n}\n\n/**\n * Unwrap a JSON:API single-resource response into a flat AccountBalance.\n * Validates the envelope structure and extracts fields explicitly.\n */\nfunction unwrapBalance(response: JsonApiSingleResponse): AccountBalance {\n if (!response?.data) {\n throw new NaturalError(\n 'Unexpected response format: missing \"data\" field in wallet balance response'\n );\n }\n\n const { data } = response;\n if (data.type !== 'walletBalance' || !data.attributes) {\n throw new NaturalError(\n `Unexpected resource format: expected type \"walletBalance\", got \"${data.type}\"`\n );\n }\n\n const { id, attributes } = data;\n const rawBreakdown = attributes.breakdown as Record<string, unknown> | undefined;\n\n const breakdown: BalanceBreakdown = {\n operatingFunded: toAmountInfo(rawBreakdown?.operatingFunded),\n operatingAdvanced: toAmountInfo(rawBreakdown?.operatingAdvanced),\n escrowFundedSettled: toAmountInfo(rawBreakdown?.escrowFundedSettled),\n escrowAdvanced: toAmountInfo(rawBreakdown?.escrowAdvanced),\n holdsOutbound: toAmountInfo(rawBreakdown?.holdsOutbound),\n };\n\n return {\n walletId: id,\n breakdown,\n available: toAmountInfo(attributes.available),\n pendingClaimAmountMinor:\n attributes.pendingClaimAmountMinor != null\n ? Number(attributes.pendingClaimAmountMinor)\n : undefined,\n pendingClaimCount:\n attributes.pendingClaimCount != null ? Number(attributes.pendingClaimCount) : undefined,\n };\n}\n\n/**\n * Unwrap a JSON:API single-resource response into a flat WithdrawResponse.\n * Server returns resource type \"withdrawal\" with id = transfer_id.\n */\nfunction unwrapWithdrawal(response: JsonApiSingleResponse): WithdrawResponse {\n if (!response?.data) {\n throw new NaturalError(\n 'Unexpected response format: missing \"data\" field in withdrawal response'\n );\n }\n\n const { data } = response;\n if (data.type !== 'withdrawal' || !data.attributes) {\n throw new NaturalError(\n `Unexpected resource format: expected type \"withdrawal\", got \"${data.type}\"`\n );\n }\n\n const { id, attributes } = data;\n\n return {\n transferId: id ?? undefined,\n instructionId: attributes.instructionId != null ? String(attributes.instructionId) : undefined,\n status: String(attributes.status),\n amount: attributes.amount != null ? Number(attributes.amount) : 0,\n currency: String(attributes.currency),\n estimatedSettlement:\n attributes.estimatedSettlement != null ? String(attributes.estimatedSettlement) : undefined,\n kycRequired: Boolean(attributes.kycRequired),\n kycStatus: attributes.kycStatus != null ? String(attributes.kycStatus) : undefined,\n kycSessionUrl: attributes.kycSessionUrl != null ? String(attributes.kycSessionUrl) : undefined,\n mfaRequired: Boolean(attributes.mfaRequired),\n mfaChallengeId:\n attributes.mfaChallengeId != null ? String(attributes.mfaChallengeId) : undefined,\n mfaExpiresAt: attributes.mfaExpiresAt != null ? String(attributes.mfaExpiresAt) : undefined,\n error: attributes.error != null ? String(attributes.error) : undefined,\n errorDetails: attributes.errorDetails != null ? String(attributes.errorDetails) : undefined,\n };\n}\n\nexport class WalletResource extends BaseResource {\n /**\n * Get current wallet balance.\n *\n * @returns AccountBalance with available, current, pending amounts\n */\n async balance(options?: BalanceOptions): Promise<AccountBalance> {\n const headers: Record<string, string> = {};\n if (options?.agentId) {\n headers['X-Agent-ID'] = options.agentId;\n }\n if (options?.instanceId) {\n headers['X-Instance-ID'] = options.instanceId;\n }\n if (options?.traceId) {\n headers['X-Trace-ID'] = sanitizeHeaderValue(options.traceId);\n }\n\n const params: Record<string, string> = {};\n if (options?.customerPartyId) {\n params['partyId'] = options.customerPartyId;\n }\n\n const response = await this.http.get<JsonApiSingleResponse>('/wallet/balance', {\n params: Object.keys(params).length > 0 ? params : undefined,\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n });\n return unwrapBalance(response);\n }\n\n /**\n * Initiate a withdrawal to a linked bank account.\n *\n * @param params - Withdrawal parameters\n * @returns WithdrawResponse with transfer status (may require KYC/MFA)\n */\n async withdraw(params: WithdrawParams): Promise<WithdrawResponse> {\n if (!Number.isInteger(params.amount) || params.amount <= 0) {\n throw new InvalidRequestError('amount must be a positive integer (minor units in cents)');\n }\n\n const attributes: Record<string, unknown> = {\n amount: params.amount,\n currency: params.currency ?? 'USD',\n externalFundingSourceId: params.externalFundingSourceId,\n };\n if (params.description) attributes['description'] = params.description;\n\n const body: JsonApiRequestBody = { data: { attributes } };\n\n const headers: Record<string, string> = {\n 'Idempotency-Key': params.idempotencyKey,\n };\n if (params.agentId) {\n headers['X-Agent-ID'] = params.agentId;\n }\n if (params.instanceId) {\n headers['X-Instance-ID'] = params.instanceId;\n }\n if (params.traceId) {\n headers['X-Trace-ID'] = sanitizeHeaderValue(params.traceId);\n }\n\n const response = await this.http.post<JsonApiSingleResponse>('/wallet/withdraw', {\n body,\n headers,\n });\n\n return unwrapWithdrawal(response);\n }\n}\n","/**\n * Agents resource.\n */\n\nimport { NaturalError } from '../errors.js';\nimport { BaseResource, sanitizeHeaderValue } from './base.js';\nimport type {\n Agent,\n AgentStatus,\n AgentCreateParams,\n AgentCreateResponse,\n AgentUpdateParams,\n AgentUpdateResponse,\n AgentListParams,\n AgentListResponse,\n AgentGetOptions,\n AgentDeleteOptions,\n} from '../types/agents.js';\nimport type {\n JsonApiSingleResponse,\n JsonApiListResponse,\n JsonApiRequestBody,\n JsonApiResource,\n} from './jsonapi.js';\n\n/**\n * Unwrap a single JSON:API agent resource into a flat Agent object.\n * Validates the envelope structure and extracts fields explicitly.\n */\nfunction unwrapAgentResource(resource: JsonApiResource): Agent {\n if (resource.type !== 'agent' || !resource.attributes) {\n throw new NaturalError(\n `Unexpected resource format: expected type \"agent\", got \"${resource.type}\"`\n );\n }\n\n const { id, attributes, relationships } = resource;\n\n return {\n id,\n name: String(attributes.name),\n description: attributes.description != null ? String(attributes.description) : undefined,\n status: String(attributes.status) as AgentStatus,\n partyId: relationships?.party?.data?.id ?? '',\n createdAt: attributes.createdAt != null ? String(attributes.createdAt) : undefined,\n createdBy: attributes.createdBy != null ? String(attributes.createdBy) : undefined,\n updatedAt: attributes.updatedAt != null ? String(attributes.updatedAt) : undefined,\n updatedBy: attributes.updatedBy != null ? String(attributes.updatedBy) : undefined,\n };\n}\n\n/**\n * Unwrap a JSON:API single-resource response into a flat Agent.\n */\nfunction unwrapAgent(response: JsonApiSingleResponse): Agent {\n if (!response?.data) {\n throw new NaturalError('Unexpected response format: missing \"data\" field in agent response');\n }\n return unwrapAgentResource(response.data);\n}\n\n/**\n * Unwrap a JSON:API list response into an AgentListResponse.\n */\nfunction unwrapAgentList(response: JsonApiListResponse): AgentListResponse {\n if (!response?.data || !Array.isArray(response.data)) {\n throw new NaturalError(\n 'Unexpected response format: missing \"data\" array in agent list response'\n );\n }\n\n const agents = response.data.map(unwrapAgentResource);\n const pagination = response.meta?.pagination ?? {};\n\n return {\n agents,\n hasMore: pagination.hasMore ?? false,\n nextCursor: pagination.nextCursor ?? null,\n };\n}\n\nexport class AgentsResource extends BaseResource {\n /**\n * List agents for the partner.\n *\n * @param params - Filter and pagination parameters\n * @returns AgentListResponse with list of agents\n */\n async list(params?: AgentListParams): Promise<AgentListResponse> {\n const headers: Record<string, string> = {};\n if (params?.agentId) {\n headers['X-Agent-ID'] = params.agentId;\n }\n if (params?.instanceId) {\n headers['X-Instance-ID'] = params.instanceId;\n }\n if (params?.traceId) {\n headers['X-Trace-ID'] = sanitizeHeaderValue(params.traceId);\n }\n\n const queryParams: Record<string, unknown> = {\n status: params?.status,\n limit: params?.limit ?? 50,\n cursor: params?.cursor,\n };\n\n const response = await this.http.get<JsonApiListResponse>('/agents', {\n params: queryParams,\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n });\n return unwrapAgentList(response);\n }\n\n /**\n * Get agent by ID.\n *\n * @param agentId - The agent ID to retrieve (agt_xxx)\n * @returns Agent details\n */\n async get(agentId: string, options?: AgentGetOptions): Promise<Agent> {\n const headers: Record<string, string> = {};\n if (options?.agentId) {\n headers['X-Agent-ID'] = options.agentId;\n }\n if (options?.instanceId) {\n headers['X-Instance-ID'] = options.instanceId;\n }\n if (options?.traceId) {\n headers['X-Trace-ID'] = sanitizeHeaderValue(options.traceId);\n }\n\n const response = await this.http.get<JsonApiSingleResponse>(`/agents/${agentId}`, {\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n });\n return unwrapAgent(response);\n }\n\n /**\n * Create a new agent.\n *\n * @param params - Agent creation parameters\n * @returns AgentCreateResponse with created agent details\n */\n async create(params: AgentCreateParams): Promise<AgentCreateResponse> {\n const attributes: Record<string, unknown> = {\n name: params.name,\n };\n\n if (params.description) {\n attributes['description'] = params.description;\n }\n\n if (params.limits) {\n attributes['limits'] = params.limits;\n }\n\n const body: JsonApiRequestBody = { data: { attributes } };\n\n const headers: Record<string, string> = {};\n if (params.idempotencyKey) {\n headers['Idempotency-Key'] = params.idempotencyKey;\n }\n if (params.agentId) {\n headers['X-Agent-ID'] = params.agentId;\n }\n if (params.instanceId) {\n headers['X-Instance-ID'] = params.instanceId;\n }\n if (params.traceId) {\n headers['X-Trace-ID'] = sanitizeHeaderValue(params.traceId);\n }\n\n const response = await this.http.post<JsonApiSingleResponse>('/agents', {\n body,\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n });\n\n return unwrapAgent(response);\n }\n\n /**\n * Update an existing agent.\n *\n * @param agentId - The agent ID to update (agt_xxx)\n * @param params - Update parameters\n * @returns AgentUpdateResponse with updated agent details\n */\n async update(agentId: string, params: AgentUpdateParams): Promise<AgentUpdateResponse> {\n const attributes: Record<string, unknown> = {};\n\n if (params.name !== undefined) attributes['name'] = params.name;\n if (params.description !== undefined) attributes['description'] = params.description;\n if (params.status !== undefined) attributes['status'] = params.status;\n\n const body: JsonApiRequestBody = { data: { attributes } };\n\n const headers: Record<string, string> = {};\n if (params.idempotencyKey) {\n headers['Idempotency-Key'] = params.idempotencyKey;\n }\n if (params.agentId) {\n headers['X-Agent-ID'] = params.agentId;\n }\n if (params.instanceId) {\n headers['X-Instance-ID'] = params.instanceId;\n }\n if (params.traceId) {\n headers['X-Trace-ID'] = sanitizeHeaderValue(params.traceId);\n }\n\n const response = await this.http.put<JsonApiSingleResponse>(`/agents/${agentId}`, {\n body,\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n });\n\n return unwrapAgent(response);\n }\n\n /**\n * Delete an agent.\n *\n * @param agentId - The agent ID to delete (agt_xxx)\n * @param options - Optional observability parameters\n */\n async delete(agentId: string, options?: AgentDeleteOptions): Promise<void> {\n const headers: Record<string, string> = {};\n if (options?.agentId) {\n headers['X-Agent-ID'] = options.agentId;\n }\n if (options?.instanceId) {\n headers['X-Instance-ID'] = options.instanceId;\n }\n if (options?.traceId) {\n headers['X-Trace-ID'] = sanitizeHeaderValue(options.traceId);\n }\n\n await this.http.delete(`/agents/${agentId}`, {\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n });\n }\n}\n","/**\n * Agent delegations resource.\n */\n\nimport { NaturalError } from '../errors.js';\nimport { BaseResource, sanitizeHeaderValue } from './base.js';\nimport type {\n AgentDelegation,\n AgentDelegationListParams,\n AgentDelegationListResponse,\n} from '../types/delegations.js';\nimport type { JsonApiSingleResponse, JsonApiListResponse, JsonApiResource } from './jsonapi.js';\n\n/**\n * Unwrap a single JSON:API agent delegation resource into a flat AgentDelegation object.\n */\nfunction unwrapAgentDelegationResource(resource: JsonApiResource): AgentDelegation {\n if (resource.type !== 'agentDelegation' || !resource.attributes) {\n throw new NaturalError(\n `Unexpected resource format: expected type \"agentDelegation\", got \"${resource.type}\"`\n );\n }\n\n const { id, attributes, relationships } = resource;\n\n return {\n id,\n agentName: attributes.agentName != null ? String(attributes.agentName) : undefined,\n agentId: relationships?.agent?.data?.id ?? '',\n delegationId: relationships?.delegation?.data?.id ?? '',\n delegatorPartyId: relationships?.delegatorParty?.data?.id,\n delegateePartyId: relationships?.delegateeParty?.data?.id,\n delegatorPartyName:\n attributes.delegatorPartyName != null ? String(attributes.delegatorPartyName) : undefined,\n delegateePartyName:\n attributes.delegateePartyName != null ? String(attributes.delegateePartyName) : undefined,\n permissions: Array.isArray(attributes.permissions) ? (attributes.permissions as string[]) : [],\n limits: attributes.limits != null ? (attributes.limits as Record<string, number>) : undefined,\n expiresAt: attributes.expiresAt != null ? String(attributes.expiresAt) : undefined,\n createdAt: String(attributes.createdAt),\n createdBy: attributes.createdBy != null ? String(attributes.createdBy) : undefined,\n updatedAt: String(attributes.updatedAt),\n };\n}\n\n/**\n * Unwrap a JSON:API single-resource response into a flat AgentDelegation.\n */\nfunction unwrapAgentDelegation(response: JsonApiSingleResponse): AgentDelegation {\n if (!response?.data) {\n throw new NaturalError(\n 'Unexpected response format: missing \"data\" field in agent delegation response'\n );\n }\n return unwrapAgentDelegationResource(response.data);\n}\n\n/**\n * Unwrap a JSON:API list response into an AgentDelegationListResponse.\n */\nfunction unwrapAgentDelegationList(response: JsonApiListResponse): AgentDelegationListResponse {\n if (!response?.data || !Array.isArray(response.data)) {\n throw new NaturalError(\n 'Unexpected response format: missing \"data\" array in agent delegation list response'\n );\n }\n\n const agentDelegations = response.data.map(unwrapAgentDelegationResource);\n const pagination = response.meta?.pagination ?? {};\n\n return {\n agentDelegations,\n hasMore: pagination.hasMore ?? false,\n nextCursor: pagination.nextCursor ?? null,\n };\n}\n\nexport class DelegationsResource extends BaseResource {\n /**\n * List agent delegations with optional filters.\n *\n * @param params - Filter parameters\n * @returns AgentDelegationListResponse with list of agent delegations\n */\n async list(params?: AgentDelegationListParams): Promise<AgentDelegationListResponse> {\n const headers: Record<string, string> = {};\n if (params?.instanceId) {\n headers['X-Instance-ID'] = params.instanceId;\n }\n if (params?.traceId) {\n headers['X-Trace-ID'] = sanitizeHeaderValue(params.traceId);\n }\n\n const queryParams: Record<string, unknown> = {\n delegationId: params?.delegationId,\n agentId: params?.agentId,\n delegatorPartyId: params?.delegatorPartyId,\n delegateePartyId: params?.delegateePartyId,\n includeRevoked: params?.includeRevoked,\n limit: params?.limit ?? 50,\n cursor: params?.cursor,\n };\n\n const response = await this.http.get<JsonApiListResponse>('/agent-delegations', {\n params: queryParams,\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n });\n return unwrapAgentDelegationList(response);\n }\n\n /**\n * Get agent delegation by ID.\n *\n * @param agentDelegationId - The agent delegation handle (adl_xxx)\n * @returns AgentDelegation details\n */\n async get(agentDelegationId: string): Promise<AgentDelegation> {\n const response = await this.http.get<JsonApiSingleResponse>(\n `/agent-delegations/${agentDelegationId}`\n );\n return unwrapAgentDelegation(response);\n }\n}\n","/**\n * Customers resource.\n */\n\nimport { NaturalError } from '../errors.js';\nimport { BaseResource, sanitizeHeaderValue } from './base.js';\nimport type { JsonApiListResponse, JsonApiResource } from './jsonapi.js';\nimport type { Customer, CustomerListParams, CustomerListResponse } from '../types/customers.js';\n\n/**\n * Unwrap a single JSON:API customer resource into a flat Customer.\n */\nconst VALID_CUSTOMER_TYPES = new Set(['party', 'delegationInvitation'] as const);\nconst VALID_WALLET_ACCESS = new Set(['granted', 'denied', 'noWallet'] as const);\n\ntype CustomerType = 'party' | 'delegationInvitation';\ntype WalletAccess = 'granted' | 'denied' | 'noWallet';\n\nfunction isCustomerType(value: string): value is CustomerType {\n return VALID_CUSTOMER_TYPES.has(value as CustomerType);\n}\n\nfunction isWalletAccess(value: unknown): value is WalletAccess {\n return typeof value === 'string' && VALID_WALLET_ACCESS.has(value as WalletAccess);\n}\n\nfunction unwrapCustomerResource(resource: JsonApiResource): Customer {\n if (!isCustomerType(resource.type) || !resource.attributes) {\n throw new NaturalError(\n `Unexpected resource format: expected type \"party\" or \"delegationInvitation\", got \"${resource.type}\"`\n );\n }\n\n const { id, attributes } = resource;\n\n const party =\n typeof attributes.party === 'object' && attributes.party != null\n ? {\n id: String((attributes.party as Record<string, unknown>).id),\n name: String((attributes.party as Record<string, unknown>).name),\n email:\n typeof (attributes.party as Record<string, unknown>).email === 'string'\n ? String((attributes.party as Record<string, unknown>).email)\n : undefined,\n }\n : undefined;\n\n return {\n id,\n type: resource.type,\n party,\n email: typeof attributes.email === 'string' ? attributes.email : undefined,\n status: typeof attributes.status === 'string' ? attributes.status : '',\n permissions: Array.isArray(attributes.permissions) ? attributes.permissions : [],\n createdAt: typeof attributes.createdAt === 'string' ? attributes.createdAt : '',\n walletAvailableMinor:\n typeof attributes.walletAvailableMinor === 'number'\n ? attributes.walletAvailableMinor\n : undefined,\n walletAvailableDollars:\n typeof attributes.walletAvailableDollars === 'string'\n ? attributes.walletAvailableDollars\n : undefined,\n walletAccess: isWalletAccess(attributes.walletAccess) ? attributes.walletAccess : 'denied',\n };\n}\n\n/**\n * Unwrap a JSON:API list response into a CustomerListResponse.\n */\nfunction unwrapCustomerList(response: JsonApiListResponse): CustomerListResponse {\n if (!response?.data || !Array.isArray(response.data)) {\n throw new NaturalError(\n 'Unexpected response format: missing \"data\" array in customer list response'\n );\n }\n\n const pagination = response.meta?.pagination ?? {};\n\n return {\n items: response.data.map(unwrapCustomerResource),\n hasMore: pagination.hasMore ?? false,\n nextCursor: pagination.nextCursor ?? null,\n };\n}\n\nexport class CustomersResource extends BaseResource {\n /**\n * List customers who have delegated access to the partner.\n *\n * @param params - Pagination parameters\n * @returns CustomerListResponse with items, hasMore, nextCursor\n */\n async list(params?: CustomerListParams): Promise<CustomerListResponse> {\n const headers: Record<string, string> = {};\n if (params?.agentId) {\n headers['X-Agent-ID'] = params.agentId;\n }\n if (params?.instanceId) {\n headers['X-Instance-ID'] = params.instanceId;\n }\n if (params?.traceId) {\n headers['X-Trace-ID'] = sanitizeHeaderValue(params.traceId);\n }\n\n const queryParams: Record<string, unknown> = {\n limit: params?.limit,\n cursor: params?.cursor,\n };\n\n const response = await this.http.get<JsonApiListResponse>('/customers', {\n params: queryParams,\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n });\n return unwrapCustomerList(response);\n }\n}\n","/**\n * Natural Payments SDK client.\n */\n\nimport { HTTPClient, type HTTPClientOptions } from './http.js';\nimport { PaymentsResource } from './resources/payments.js';\nimport { WalletResource } from './resources/wallet.js';\nimport { TransactionsResource } from './resources/transactions.js';\nimport { AgentsResource } from './resources/agents.js';\nimport { DelegationsResource } from './resources/delegations.js';\nimport { CustomersResource } from './resources/customers.js';\n\nexport interface NaturalClientOptions extends HTTPClientOptions {}\n\n/**\n * Natural Payments SDK client.\n *\n * @example\n * ```typescript\n * import { NaturalClient } from '@naturalpay/sdk';\n *\n * const client = new NaturalClient({ apiKey: process.env['NATURAL_API_KEY'] });\n *\n * // Create a payment\n * const payment = await client.payments.create({\n * agentId: 'agt_xxx',\n * amount: 5000,\n * customerPartyId: 'pty_xxx',\n * recipient: 'alice@example.com',\n * memo: 'For consulting',\n * idempotencyKey: 'unique-key-for-this-payment',\n * });\n *\n * // Check balance\n * const balance = await client.wallet.balance();\n * ```\n */\nexport class NaturalClient {\n private readonly http: HTTPClient;\n\n /** Payments API resource. */\n readonly payments: PaymentsResource;\n\n /** Wallet API resource for balance and withdrawals. */\n readonly wallet: WalletResource;\n\n /** Transactions API resource. */\n readonly transactions: TransactionsResource;\n\n /** Agents API resource for managing agents. */\n readonly agents: AgentsResource;\n\n /** Agent delegations API resource. */\n readonly delegations: DelegationsResource;\n\n /** Customers API resource for listing parties who delegated access. */\n readonly customers: CustomersResource;\n\n /**\n * Initialize the Natural client.\n *\n * @param options - Client configuration options\n * @param options.apiKey - API key (defaults to NATURAL_API_KEY env var)\n * @param options.baseUrl - API base URL (defaults to https://api.natural.co)\n * @param options.timeout - Request timeout in milliseconds (default: 30000)\n */\n constructor(options: NaturalClientOptions = {}) {\n this.http = new HTTPClient(options);\n\n this.payments = new PaymentsResource(this.http);\n this.wallet = new WalletResource(this.http);\n this.transactions = new TransactionsResource(this.http);\n this.agents = new AgentsResource(this.http);\n this.delegations = new DelegationsResource(this.http);\n this.customers = new CustomersResource(this.http);\n }\n}\n","/**\n * Webhook signature verification using Standard Webhooks HMAC-SHA256.\n */\n\nimport { createHmac, timingSafeEqual } from 'node:crypto';\n\nimport { WebhookVerificationError } from './errors.js';\n\nconst WHSEC_PREFIX = 'whsec_';\nconst DEFAULT_TOLERANCE_SECONDS = 300; // 5 minutes\n\n/**\n * Extract a header value by name, case-insensitively.\n * Supports both plain objects and Headers instances.\n */\nfunction getHeader(headers: Record<string, string> | Headers, name: string): string | undefined {\n if (typeof (headers as Headers).get === 'function') {\n return (headers as Headers).get(name) ?? undefined;\n }\n const lower = name.toLowerCase();\n for (const key of Object.keys(headers as Record<string, string>)) {\n if (key.toLowerCase() === lower) {\n return (headers as Record<string, string>)[key];\n }\n }\n return undefined;\n}\n\nexport interface VerifyWebhookOptions {\n toleranceInSeconds?: number;\n}\n\n/**\n * Verify a webhook signature using Standard Webhooks HMAC-SHA256.\n *\n * The body must be the raw request body — not a parsed and re-serialized\n * JSON object, as whitespace or key ordering differences would produce a\n * different signature.\n *\n * @param body - Raw request body (string, Buffer, or Uint8Array)\n * @param headers - Request headers containing webhook-id, webhook-timestamp, webhook-signature\n * @param secret - Signing secret (with or without whsec_ prefix)\n * @param options - Optional configuration (toleranceInSeconds)\n * @returns Parsed JSON payload\n * @throws WebhookVerificationError on any verification failure\n */\nexport function verifyWebhookSignature(\n body: string | Buffer | Uint8Array,\n headers: Record<string, string> | Headers,\n secret: string,\n options?: VerifyWebhookOptions\n): unknown {\n const tolerance = options?.toleranceInSeconds ?? DEFAULT_TOLERANCE_SECONDS;\n\n if (!Number.isInteger(tolerance) || tolerance <= 0) {\n throw new WebhookVerificationError('toleranceInSeconds must be a positive integer');\n }\n\n // Extract required headers\n const webhookId = getHeader(headers, 'webhook-id');\n if (!webhookId) {\n throw new WebhookVerificationError('webhook-id header is missing');\n }\n\n const timestampStr = getHeader(headers, 'webhook-timestamp');\n if (!timestampStr) {\n throw new WebhookVerificationError('webhook-timestamp header is missing');\n }\n\n const signatureHeader = getHeader(headers, 'webhook-signature');\n if (!signatureHeader) {\n throw new WebhookVerificationError('webhook-signature header is missing');\n }\n\n // Validate timestamp — strict integer check (reject \"123abc\", \"12.3\", etc.)\n if (!/^\\d+$/.test(timestampStr)) {\n throw new WebhookVerificationError(\n `Invalid webhook-timestamp: '${timestampStr}' is not a valid integer`\n );\n }\n const timestamp = parseInt(timestampStr, 10);\n\n const now = Math.floor(Date.now() / 1000);\n if (Math.abs(now - timestamp) > tolerance) {\n throw new WebhookVerificationError(\n timestamp > now\n ? 'Webhook timestamp is too far in the future'\n : 'Webhook timestamp is too old'\n );\n }\n\n // Decode signing secret — strict base64 validation\n let keyBytes: Buffer;\n const base64Part = secret.startsWith(WHSEC_PREFIX) ? secret.slice(WHSEC_PREFIX.length) : secret;\n if (!/^[A-Za-z0-9+/]*={0,2}$/.test(base64Part) || base64Part.length === 0) {\n throw new WebhookVerificationError('Invalid signing secret: could not base64-decode');\n }\n try {\n keyBytes = Buffer.from(base64Part, 'base64');\n if (keyBytes.length === 0) {\n throw new Error('empty key');\n }\n } catch {\n throw new WebhookVerificationError('Invalid signing secret: could not base64-decode');\n }\n\n // Compute expected signature\n const bodyStr = typeof body === 'string' ? body : Buffer.from(body).toString('utf-8');\n const signedContent = `${webhookId}.${timestampStr}.${bodyStr}`;\n const expectedSig = createHmac('sha256', keyBytes).update(signedContent).digest('base64');\n\n // Check each v1 signature in the header (space-separated)\n const candidates = signatureHeader.split(' ');\n for (const candidate of candidates) {\n if (!candidate.startsWith('v1,')) continue;\n const candidateSig = candidate.slice(3); // strip \"v1,\"\n\n // Length guard: timingSafeEqual throws if lengths differ\n const expectedBuf = Buffer.from(expectedSig, 'utf-8');\n const candidateBuf = Buffer.from(candidateSig, 'utf-8');\n if (expectedBuf.length !== candidateBuf.length) continue;\n\n if (timingSafeEqual(expectedBuf, candidateBuf)) {\n // Signature valid — parse and return the body\n try {\n return JSON.parse(bodyStr);\n } catch {\n throw new WebhookVerificationError('Webhook signature is valid but body is not valid JSON');\n }\n }\n }\n\n throw new WebhookVerificationError(\n 'Webhook signature does not match — ensure you are using the raw request body'\n );\n}\n","/**\n * Transaction types.\n */\n\n/**\n * Filter for transaction types in list operations.\n */\nexport enum TransactionTypeFilter {\n PAYMENT = 'payment',\n TRANSFER = 'transfer',\n ALL = 'all',\n}\n\nexport interface Transaction {\n transactionId: string;\n amount: number;\n currency: string;\n status: string;\n description?: string;\n memo?: string;\n createdAt: string;\n updatedAt?: string;\n isDelegated: boolean;\n customerName?: string;\n customerAgentId?: string;\n senderName?: string;\n recipientName?: string;\n transactionType: string;\n category: string;\n direction: string;\n sourcePartyId?: string;\n destinationPartyId?: string;\n sourceWalletId?: string;\n destinationWalletId?: string;\n /** Internal instance ID (ins_xxx) assigned by server. */\n instanceId?: string;\n /** Claim link URL for unclaimed payments. */\n claimLink?: string;\n}\n\nexport interface TransactionGetParams {\n /** Customer party ID (pty_xxx) for delegated transaction lookup. */\n customerPartyId?: string;\n /** Agent ID (agt_xxx) for observability attribution. */\n agentId?: string;\n /** Developer's session/conversation ID for observability grouping. */\n instanceId?: string;\n /** Trace ID for distributed tracing correlation. */\n traceId?: string;\n}\n\nexport interface TransactionListParams {\n limit?: number;\n cursor?: string;\n agentId?: string;\n /** Filter by transaction type (payment, transfer, or all) */\n type?: TransactionTypeFilter;\n /** Developer's session/conversation ID for observability grouping. */\n instanceId?: string;\n /** Trace ID for distributed tracing correlation. */\n traceId?: string;\n}\n\nexport interface TransactionListResponse {\n transactions: Transaction[];\n hasMore: boolean;\n nextCursor?: string | null;\n}\n"]}
|