lane-sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1061 -0
- package/dist/cli/index.js +7413 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/index.cjs +3249 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1985 -0
- package/dist/index.d.ts +1985 -0
- package/dist/index.js +3200 -0
- package/dist/index.js.map +1 -0
- package/dist/server/index.js +2610 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server-http.cjs +2378 -0
- package/dist/server-http.cjs.map +1 -0
- package/dist/server-http.js +2376 -0
- package/dist/server-http.js.map +1 -0
- package/dist/server-stdio.cjs +2356 -0
- package/dist/server-stdio.cjs.map +1 -0
- package/dist/server-stdio.js +2354 -0
- package/dist/server-stdio.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/crypto/signature.ts","../src/errors.ts","../src/client.ts","../src/auth/token-store.ts","../src/config.ts","../src/resources/base.ts","../src/resources/auth.ts","../src/resources/wallets.ts","../src/resources/pay.ts","../src/resources/products.ts","../src/resources/checkout.ts","../src/resources/sell.ts","../src/resources/admin.ts","../src/resources/webhooks.ts","../src/resources/vic.ts","../src/resources/metering.ts","../src/resources/payouts.ts","../src/resources/teams.ts","../src/resources/agents.ts","../src/resources/audit.ts","../src/resources/identity.ts","../src/resources/subscriptions.ts","../src/resources/merchants.ts","../src/lane.ts","../src/mcp/tool.ts","../src/mcp/tools/whoami.ts","../src/mcp/tools/list-cards.ts","../src/mcp/tools/check-balance.ts","../src/mcp/tools/pay.ts","../src/mcp/tools/list-transactions.ts","../src/mcp/tools/search-products.ts","../src/mcp/tools/checkout.ts","../src/mcp/tools/set-budget.ts","../src/mcp/tools/request-refund.ts","../src/mcp/tools/subscribe.ts","../src/mcp/tools/list-subscriptions.ts","../src/mcp/tools/search-software.ts","../src/mcp/tools/cancel-subscription.ts","../src/mcp/tools/discover-merchants.ts","../src/mcp/server.ts","../src/vgs/token.ts","../src/vgs/proxy.ts","../src/vgs/card-types.ts","../src/vgs/collect.ts","../src/psp/registry.ts","../src/psp/adapters/stripe.ts","../src/psp/adapters/worldpay.ts","../src/psp/adapters/cybersource.ts","../src/routing/engine.ts","../src/index.ts"],"names":["createHash","createHmac","timingSafeEqual","EventEmitter","randomUUID","join","homedir","readFile","writeFile","mkdir","stat","chmod","z","inputSchema","McpServer"],"mappings":"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","file":"index.cjs","sourcesContent":["// ---------------------------------------------------------------------------\n// Lane SDK — HMAC-SHA256 Request Signing\n// ---------------------------------------------------------------------------\n// Signs every SDK request to prevent tampering and replay attacks.\n// Mirrors server/middleware/signature.js from the Lane backend.\n//\n// Signature = HMAC-SHA256(key, \"{method}\\n{path}\\n{timestamp}\\n{bodyHash}\")\n// ---------------------------------------------------------------------------\n\nimport { createHmac, createHash, timingSafeEqual } from 'node:crypto';\n\n/** Maximum age of a signed request before it's considered stale (5 minutes). */\nconst TIMESTAMP_TOLERANCE_SECONDS = 300;\n\nexport interface SignatureComponents {\n method: string;\n path: string;\n timestamp: number;\n body?: string;\n}\n\nexport class HMACSignature {\n private readonly secret: string;\n\n constructor(secret: string) {\n this.secret = secret;\n }\n\n /**\n * Sign request components and return the hex-encoded HMAC-SHA256 signature.\n */\n sign(components: SignatureComponents): string {\n const bodyHash = components.body\n ? createHash('sha256').update(components.body).digest('hex')\n : createHash('sha256').update('').digest('hex');\n\n const payload = [\n components.method.toUpperCase(),\n components.path,\n components.timestamp.toString(),\n bodyHash,\n ].join('\\n');\n\n return createHmac('sha256', this.secret).update(payload).digest('hex');\n }\n\n /**\n * Verify a signature against request components.\n * Uses constant-time comparison to prevent timing attacks.\n */\n verify(\n signature: string,\n components: SignatureComponents,\n toleranceSeconds: number = TIMESTAMP_TOLERANCE_SECONDS,\n ): boolean {\n // Reject stale timestamps to prevent replay attacks\n const now = Math.floor(Date.now() / 1000);\n if (Math.abs(now - components.timestamp) > toleranceSeconds) {\n return false;\n }\n\n const expected = this.sign(components);\n return constantTimeEqual(expected, signature);\n }\n\n /**\n * Generate the signature headers for an outgoing request.\n */\n headers(components: SignatureComponents): Record<string, string> {\n const signature = this.sign(components);\n return {\n 'X-Lane-Timestamp': components.timestamp.toString(),\n 'X-Lane-Signature': `sha256=${signature}`,\n };\n }\n}\n\n/**\n * Verify a webhook payload signature.\n *\n * @param payload - Raw webhook body string\n * @param signature - Value of X-Lane-Signature header\n * @param secret - Webhook signing secret\n * @param timestamp - Value of X-Lane-Timestamp header\n */\nexport function verifyWebhookSignature(\n payload: string,\n signature: string,\n secret: string,\n timestamp: number,\n): boolean {\n const hmac = new HMACSignature(secret);\n const sig = signature.startsWith('sha256=')\n ? signature.slice(7)\n : signature;\n\n return hmac.verify(sig, {\n method: 'POST',\n path: '/webhook',\n timestamp,\n body: payload,\n });\n}\n\n/**\n * Constant-time string comparison to prevent timing attacks.\n */\nfunction constantTimeEqual(a: string, b: string): boolean {\n if (a.length !== b.length) {\n return false;\n }\n\n const bufA = Buffer.from(a, 'utf8');\n const bufB = Buffer.from(b, 'utf8');\n return timingSafeEqual(bufA, bufB);\n}\n","// ---------------------------------------------------------------------------\n// Lane SDK — Error Hierarchy\n// ---------------------------------------------------------------------------\n// Every error is structured for agent consumption. Agents need codes,\n// categories, and suggested actions — not string messages.\n// ---------------------------------------------------------------------------\n\nexport interface LaneErrorOptions {\n code: string;\n statusCode: number;\n requestId?: string;\n retryable?: boolean;\n suggestedAction?: string;\n}\n\n/**\n * Base error class for all Lane SDK errors.\n *\n * Carries structured metadata so agents can make programmatic decisions\n * without parsing human-readable messages.\n */\nexport class LaneError extends Error {\n /** Machine-readable error code (e.g. 'budget_exceeded'). */\n readonly code: string;\n\n /** HTTP status code from the API (or synthetic for client-side errors). */\n readonly statusCode: number;\n\n /** Request ID for support and audit trail correlation. */\n readonly requestId: string;\n\n /** Whether the caller should retry this request. */\n readonly retryable: boolean;\n\n /** Human-readable suggestion for what the agent should do next. */\n readonly suggestedAction?: string;\n\n /** Executable suggestion for agents (e.g. \"lane.wallet.deposit(2000)\"). */\n fix?: string;\n\n /** Current state context for agent decision-making. */\n currentState?: Record<string, unknown>;\n\n constructor(message: string, options: LaneErrorOptions) {\n super(message);\n this.name = 'LaneError';\n this.code = options.code;\n this.statusCode = options.statusCode;\n this.requestId = options.requestId ?? 'unknown';\n this.retryable = options.retryable ?? false;\n this.suggestedAction = options.suggestedAction;\n\n // Maintain proper prototype chain for instanceof checks\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n /** Serialize to a plain object for structured logging / JSON responses. */\n toJSON(): Record<string, unknown> {\n const json: Record<string, unknown> = {\n name: this.name,\n message: this.message,\n code: this.code,\n statusCode: this.statusCode,\n requestId: this.requestId,\n retryable: this.retryable,\n suggestedAction: this.suggestedAction,\n };\n if (this.fix !== undefined) {\n json.fix = this.fix;\n }\n if (this.currentState !== undefined) {\n json.currentState = this.currentState;\n }\n return json;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Authentication Errors (401, 403)\n// ---------------------------------------------------------------------------\n\nexport class LaneAuthError extends LaneError {\n constructor(\n message: string,\n options: Omit<LaneErrorOptions, 'statusCode'> & { statusCode?: number },\n ) {\n super(message, { statusCode: 401, ...options });\n this.name = 'LaneAuthError';\n }\n\n static invalidApiKey(requestId?: string): LaneAuthError {\n return new LaneAuthError('Invalid API key. Check your key and try again.', {\n code: 'invalid_api_key',\n statusCode: 401,\n requestId,\n suggestedAction:\n 'Verify the API key is correct. Run `lane whoami` to check authentication.',\n });\n }\n\n static expiredToken(requestId?: string): LaneAuthError {\n return new LaneAuthError('Authentication token has expired.', {\n code: 'expired_token',\n statusCode: 401,\n requestId,\n suggestedAction: 'Run `lane login` to re-authenticate.',\n });\n }\n\n static insufficientScope(\n requiredScope: string,\n requestId?: string,\n ): LaneAuthError {\n return new LaneAuthError(\n `API key lacks required permission: ${requiredScope}`,\n {\n code: 'insufficient_scope',\n statusCode: 403,\n requestId,\n suggestedAction:\n 'Generate a new API key with the required permissions in the dashboard.',\n },\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// Payment Errors (402, 502)\n// ---------------------------------------------------------------------------\n\nexport class LanePaymentError extends LaneError {\n constructor(message: string, options: LaneErrorOptions) {\n super(message, options);\n this.name = 'LanePaymentError';\n }\n\n static declined(requestId?: string): LanePaymentError {\n return new LanePaymentError('Payment was declined by the card issuer.', {\n code: 'payment_declined',\n statusCode: 402,\n requestId,\n suggestedAction:\n 'The card was declined. Ask the developer to check their card or add a new one.',\n });\n }\n\n static insufficientFunds(currentBalance?: number, required?: number, requestId?: string): LanePaymentError {\n const error = new LanePaymentError('Insufficient wallet balance', {\n code: 'insufficient_funds',\n statusCode: 402,\n requestId,\n suggestedAction:\n 'Check wallet balance and deposit more funds',\n });\n if (currentBalance !== undefined && required !== undefined) {\n error.fix = `lane.wallet.deposit(${required - currentBalance})`;\n error.currentState = { balance: currentBalance, required };\n }\n return error;\n }\n\n static merchantUnavailable(\n merchant: string,\n requestId?: string,\n ): LanePaymentError {\n return new LanePaymentError(\n `Merchant \"${merchant}\" is temporarily unavailable.`,\n {\n code: 'merchant_unavailable',\n statusCode: 502,\n requestId,\n retryable: true,\n suggestedAction:\n 'The merchant endpoint is down. Try again in a few minutes or choose an alternative.',\n },\n );\n }\n\n static serviceError(requestId?: string): LanePaymentError {\n return new LanePaymentError(\n 'Payment service encountered an internal error.',\n {\n code: 'payment_service_error',\n statusCode: 502,\n requestId,\n retryable: true,\n suggestedAction:\n 'Payment service temporarily unavailable. Try again in a few minutes.',\n },\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// Budget Errors (402)\n// ---------------------------------------------------------------------------\n\nexport class LaneBudgetError extends LaneError {\n /** The budget limit that was exceeded. */\n readonly limit: number;\n\n /** The amount that was requested. */\n readonly requested: number;\n\n constructor(\n message: string,\n options: LaneErrorOptions & { limit: number; requested: number },\n ) {\n super(message, options);\n this.name = 'LaneBudgetError';\n this.limit = options.limit;\n this.requested = options.requested;\n }\n\n static dailyExceeded(\n limit: number,\n requested: number,\n requestId?: string,\n ): LaneBudgetError {\n return new LaneBudgetError(\n `Daily spending limit of $${(limit / 100).toFixed(2)} exceeded. Requested: $${(requested / 100).toFixed(2)}.`,\n {\n code: 'daily_limit_exceeded',\n statusCode: 402,\n requestId,\n limit,\n requested,\n suggestedAction:\n 'Ask the developer to increase the daily limit or approve this transaction.',\n },\n );\n }\n\n static taskExceeded(\n limit: number,\n requested: number,\n requestId?: string,\n ): LaneBudgetError {\n return new LaneBudgetError(\n `Per-task spending limit of $${(limit / 100).toFixed(2)} exceeded. Requested: $${(requested / 100).toFixed(2)}.`,\n {\n code: 'task_limit_exceeded',\n statusCode: 402,\n requestId,\n limit,\n requested,\n suggestedAction:\n 'Ask the developer to increase the per-task limit or approve this transaction.',\n },\n );\n }\n\n static monthlyExceeded(\n limit: number,\n requested: number,\n requestId?: string,\n ): LaneBudgetError {\n return new LaneBudgetError(\n `Monthly spending limit of $${(limit / 100).toFixed(2)} exceeded. Requested: $${(requested / 100).toFixed(2)}.`,\n {\n code: 'monthly_limit_exceeded',\n statusCode: 402,\n requestId,\n limit,\n requested,\n suggestedAction:\n 'Ask the developer to increase the monthly limit.',\n },\n );\n }\n\n static merchantNotAllowed(\n merchant: string,\n requestId?: string,\n ): LaneBudgetError {\n return new LaneBudgetError(\n `Merchant \"${merchant}\" is not on the spending allowlist.`,\n {\n code: 'merchant_not_allowed',\n statusCode: 402,\n requestId,\n limit: 0,\n requested: 0,\n suggestedAction:\n 'This merchant is not on your allowlist. Ask the developer to add it via the dashboard.',\n },\n );\n }\n\n override toJSON(): Record<string, unknown> {\n return {\n ...super.toJSON(),\n limit: this.limit,\n requested: this.requested,\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Not Found Errors (404)\n// ---------------------------------------------------------------------------\n\nexport class LaneNotFoundError extends LaneError {\n constructor(resource: string, id: string, requestId?: string) {\n super(`${resource} \"${id}\" not found.`, {\n code: `${resource.toLowerCase()}_not_found`,\n statusCode: 404,\n requestId,\n suggestedAction: `The ${resource.toLowerCase()} does not exist or you don't have access to it.`,\n });\n this.name = 'LaneNotFoundError';\n }\n}\n\n// ---------------------------------------------------------------------------\n// Rate Limit Errors (429)\n// ---------------------------------------------------------------------------\n\nexport class LaneRateLimitError extends LaneError {\n /** Seconds until the rate limit resets. */\n readonly retryAfter: number;\n\n constructor(retryAfter: number, requestId?: string) {\n super(`Rate limit exceeded. Retry after ${retryAfter} seconds.`, {\n code: 'rate_limit_exceeded',\n statusCode: 429,\n requestId,\n retryable: true,\n suggestedAction: `Wait ${retryAfter} seconds before retrying.`,\n });\n this.name = 'LaneRateLimitError';\n this.retryAfter = retryAfter;\n }\n\n override toJSON(): Record<string, unknown> {\n return {\n ...super.toJSON(),\n retryAfter: this.retryAfter,\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Validation Errors (400)\n// ---------------------------------------------------------------------------\n\nexport interface FieldError {\n field: string;\n message: string;\n}\n\nexport class LaneValidationError extends LaneError {\n readonly fields: FieldError[];\n\n constructor(fields: FieldError[], requestId?: string) {\n const fieldMessages = fields\n .map((f) => `${f.field}: ${f.message}`)\n .join('; ');\n super(`Validation error: ${fieldMessages}`, {\n code: 'validation_error',\n statusCode: 400,\n requestId,\n suggestedAction: 'Check the request parameters and try again.',\n });\n this.name = 'LaneValidationError';\n this.fields = fields;\n }\n\n override toJSON(): Record<string, unknown> {\n return {\n ...super.toJSON(),\n fields: this.fields,\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory: Build typed error from API response\n// ---------------------------------------------------------------------------\n\nexport interface APIErrorBody {\n error: {\n code: string;\n message: string;\n statusCode: number;\n retryable?: boolean;\n suggestedAction?: string;\n retryAfter?: number;\n limit?: number;\n requested?: number;\n fields?: FieldError[];\n };\n requestId: string;\n}\n\n/** Parse an API error response into the appropriate typed LaneError subclass. */\nexport function createErrorFromResponse(body: APIErrorBody): LaneError {\n const { error, requestId } = body;\n\n // Authentication\n if (error.statusCode === 401 || error.statusCode === 403) {\n return new LaneAuthError(error.message, {\n code: error.code,\n statusCode: error.statusCode,\n requestId,\n suggestedAction: error.suggestedAction,\n });\n }\n\n // Rate limiting\n if (error.statusCode === 429) {\n return new LaneRateLimitError(error.retryAfter ?? 60, requestId);\n }\n\n // Validation\n if (error.statusCode === 400 && error.fields) {\n return new LaneValidationError(error.fields, requestId);\n }\n\n // Budget\n if (error.code.includes('limit_exceeded') || error.code === 'merchant_not_allowed') {\n return new LaneBudgetError(error.message, {\n code: error.code,\n statusCode: error.statusCode,\n requestId,\n limit: error.limit ?? 0,\n requested: error.requested ?? 0,\n suggestedAction: error.suggestedAction,\n });\n }\n\n // Payment\n if (\n error.code.startsWith('payment_') ||\n error.code === 'insufficient_funds' ||\n error.code === 'merchant_unavailable'\n ) {\n return new LanePaymentError(error.message, {\n code: error.code,\n statusCode: error.statusCode,\n requestId,\n retryable: error.retryable,\n suggestedAction: error.suggestedAction,\n });\n }\n\n // Not found\n if (error.statusCode === 404) {\n return new LaneNotFoundError('Resource', error.code.replace('_not_found', ''), requestId);\n }\n\n // Fallback\n return new LaneError(error.message, {\n code: error.code,\n statusCode: error.statusCode,\n requestId,\n retryable: error.retryable,\n suggestedAction: error.suggestedAction,\n });\n}\n","// ---------------------------------------------------------------------------\n// Lane SDK — HTTP Client\n// ---------------------------------------------------------------------------\n// Central HTTP client with:\n// - Bearer token authentication\n// - HMAC-SHA256 request signing\n// - Idempotency key support\n// - Automatic retries with exponential backoff\n// - Circuit breaker for downstream resilience\n// - Request ID propagation for audit trails\n// - Structured error parsing\n// ---------------------------------------------------------------------------\n\nimport { EventEmitter } from 'node:events';\nimport { randomUUID } from 'node:crypto';\nimport type { ResolvedConfig, RequestOptions, APIResponse } from './types.js';\nimport { HMACSignature } from './crypto/signature.js';\nimport {\n LaneError,\n LaneRateLimitError,\n createErrorFromResponse,\n type APIErrorBody,\n} from './errors.js';\n\n// ---------------------------------------------------------------------------\n// Circuit Breaker\n// ---------------------------------------------------------------------------\n\ntype CircuitState = 'closed' | 'open' | 'half_open';\n\nclass CircuitBreaker {\n private state: CircuitState = 'closed';\n private failureCount = 0;\n private lastFailureTime = 0;\n\n constructor(\n private readonly failureThreshold: number = 3,\n private readonly resetTimeoutMs: number = 30_000,\n ) {}\n\n get isOpen(): boolean {\n if (this.state === 'open') {\n // Check if reset timeout has elapsed -> move to half-open\n if (Date.now() - this.lastFailureTime >= this.resetTimeoutMs) {\n this.state = 'half_open';\n return false;\n }\n return true;\n }\n return false;\n }\n\n recordSuccess(): void {\n this.failureCount = 0;\n this.state = 'closed';\n }\n\n recordFailure(): void {\n this.failureCount++;\n this.lastFailureTime = Date.now();\n if (this.failureCount >= this.failureThreshold) {\n this.state = 'open';\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// LaneClient\n// ---------------------------------------------------------------------------\n\nexport interface LaneClientEvents {\n request: [{ method: string; path: string; requestId: string }];\n response: [{ statusCode: number; requestId: string; durationMs: number }];\n error: [{ error: LaneError; requestId: string }];\n retry: [{ attempt: number; maxRetries: number; requestId: string }];\n}\n\n/**\n * Low-level HTTP client for the Lane API.\n *\n * Handles authentication, signing, retries, circuit breaking, and error\n * parsing. All Resource classes delegate HTTP calls through this client.\n */\nexport class LaneClient extends EventEmitter<LaneClientEvents> {\n private readonly config: ResolvedConfig;\n private readonly signer: HMACSignature;\n private readonly circuitBreaker: CircuitBreaker;\n\n constructor(config: ResolvedConfig) {\n super();\n this.config = config;\n this.signer = new HMACSignature(config.apiKey);\n this.circuitBreaker = new CircuitBreaker(\n config.circuitBreaker?.failureThreshold,\n config.circuitBreaker?.resetTimeoutMs,\n );\n }\n\n /** Whether this client is operating in test mode. */\n get testMode(): boolean {\n return this.config.testMode;\n }\n\n /** The resolved base URL. */\n get baseUrl(): string {\n return this.config.baseUrl;\n }\n\n // -------------------------------------------------------------------------\n // Public convenience methods\n // -------------------------------------------------------------------------\n\n async get<T>(path: string, query?: RequestOptions['query']): Promise<APIResponse<T>> {\n return this.request<T>({ method: 'GET', path, query });\n }\n\n async post<T>(\n path: string,\n body?: Record<string, unknown>,\n idempotencyKey?: string,\n ): Promise<APIResponse<T>> {\n return this.request<T>({ method: 'POST', path, body, idempotencyKey });\n }\n\n async put<T>(\n path: string,\n body?: Record<string, unknown>,\n ): Promise<APIResponse<T>> {\n return this.request<T>({ method: 'PUT', path, body });\n }\n\n async delete<T>(path: string): Promise<APIResponse<T>> {\n return this.request<T>({ method: 'DELETE', path });\n }\n\n // -------------------------------------------------------------------------\n // Core request method with retries\n // -------------------------------------------------------------------------\n\n async request<T>(options: RequestOptions): Promise<APIResponse<T>> {\n const requestId = `req_${randomUUID().replace(/-/g, '').slice(0, 24)}`;\n let lastError: Error | undefined;\n\n const maxAttempts = this.isRetryable(options.method)\n ? this.config.maxRetries + 1\n : 1;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n if (attempt > 1) {\n this.emit('retry', {\n attempt,\n maxRetries: this.config.maxRetries,\n requestId,\n });\n await this.backoff(attempt);\n }\n\n try {\n return await this.executeRequest<T>(options, requestId);\n } catch (err) {\n lastError = err instanceof Error ? err : new Error(String(err));\n\n // Don't retry non-retryable errors\n if (err instanceof LaneError && !err.retryable) {\n throw err;\n }\n\n // Respect rate limit retry-after\n if (err instanceof LaneRateLimitError) {\n if (attempt < maxAttempts) {\n await sleep(err.retryAfter * 1000);\n continue;\n }\n throw err;\n }\n }\n }\n\n throw lastError ?? new Error('Request failed with no error details');\n }\n\n // -------------------------------------------------------------------------\n // Private\n // -------------------------------------------------------------------------\n\n private async executeRequest<T>(\n options: RequestOptions,\n requestId: string,\n ): Promise<APIResponse<T>> {\n // Circuit breaker check\n if (this.circuitBreaker.isOpen) {\n throw new LaneError('Service temporarily unavailable (circuit breaker open).', {\n code: 'circuit_breaker_open',\n statusCode: 503,\n requestId,\n retryable: true,\n suggestedAction: 'Payment service temporarily unavailable. Try again in 30 seconds.',\n });\n }\n\n const url = this.buildUrl(options.path, options.query);\n const bodyStr = options.body ? JSON.stringify(options.body) : undefined;\n const timestamp = Math.floor(Date.now() / 1000);\n\n // Sign the request\n const signatureHeaders = this.signer.headers({\n method: options.method,\n path: options.path,\n timestamp,\n body: bodyStr,\n });\n\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${this.config.apiKey}`,\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'X-Lane-Request-Id': requestId,\n 'User-Agent': 'lane-sdk/0.1.0',\n ...signatureHeaders,\n };\n\n if (options.idempotencyKey) {\n headers['X-Idempotency-Key'] = options.idempotencyKey;\n }\n\n this.emit('request', { method: options.method, path: options.path, requestId });\n const startTime = Date.now();\n\n const controller = new AbortController();\n const timeoutId = setTimeout(\n () => controller.abort(),\n options.timeout ?? this.config.timeout,\n );\n\n try {\n const response = await fetch(url, {\n method: options.method,\n headers,\n body: bodyStr,\n signal: controller.signal,\n });\n\n const durationMs = Date.now() - startTime;\n this.emit('response', {\n statusCode: response.status,\n requestId,\n durationMs,\n });\n\n if (!response.ok) {\n const errorBody = await this.parseErrorBody(response, requestId);\n const error = createErrorFromResponse(errorBody);\n\n this.emit('error', { error, requestId });\n\n // Record failure for circuit breaker (only server errors)\n if (response.status >= 500) {\n this.circuitBreaker.recordFailure();\n }\n\n throw error;\n }\n\n this.circuitBreaker.recordSuccess();\n\n const data = (await response.json()) as T;\n\n return {\n data,\n requestId,\n testMode: this.config.testMode,\n rateLimitRemaining: parseIntHeader(response, 'X-RateLimit-Remaining'),\n rateLimitLimit: parseIntHeader(response, 'X-RateLimit-Limit'),\n rateLimitReset: parseIntHeader(response, 'X-RateLimit-Reset'),\n };\n } catch (err) {\n if (err instanceof LaneError) throw err;\n\n // AbortController timeout\n if (err instanceof DOMException && err.name === 'AbortError') {\n this.circuitBreaker.recordFailure();\n throw new LaneError('Request timed out.', {\n code: 'request_timeout',\n statusCode: 408,\n requestId,\n retryable: true,\n suggestedAction: 'The request took too long. Try again.',\n });\n }\n\n // Network / DNS errors\n this.circuitBreaker.recordFailure();\n throw new LaneError(\n `Network error: ${err instanceof Error ? err.message : String(err)}`,\n {\n code: 'network_error',\n statusCode: 0,\n requestId,\n retryable: true,\n suggestedAction: 'Check your network connection and try again.',\n },\n );\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n private buildUrl(\n path: string,\n query?: Record<string, string | number | boolean | undefined>,\n ): string {\n const url = new URL(path, this.config.baseUrl);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n return url.toString();\n }\n\n private async parseErrorBody(\n response: Response,\n requestId: string,\n ): Promise<APIErrorBody> {\n try {\n const body = (await response.json()) as Partial<APIErrorBody>;\n if (body.error && body.requestId) {\n return body as APIErrorBody;\n }\n // API returned JSON but not our error format\n return {\n error: {\n code: 'unknown_error',\n message: JSON.stringify(body),\n statusCode: response.status,\n },\n requestId,\n };\n } catch {\n // Non-JSON response\n return {\n error: {\n code: 'unknown_error',\n message: `HTTP ${response.status}: ${response.statusText}`,\n statusCode: response.status,\n },\n requestId,\n };\n }\n }\n\n private isRetryable(method: string): boolean {\n // Only retry idempotent methods or methods with idempotency keys\n return ['GET', 'PUT', 'DELETE'].includes(method) || method === 'POST';\n }\n\n private async backoff(attempt: number): Promise<void> {\n // Exponential backoff: 1s, 3s (with jitter)\n const baseDelay = Math.min(1000 * Math.pow(2, attempt - 2), 5000);\n const jitter = Math.random() * 500;\n await sleep(baseDelay + jitter);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Utility\n// ---------------------------------------------------------------------------\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction parseIntHeader(response: Response, name: string): number | undefined {\n const value = response.headers.get(name);\n if (value === null) return undefined;\n const parsed = parseInt(value, 10);\n return isNaN(parsed) ? undefined : parsed;\n}\n","// ---------------------------------------------------------------------------\n// Lane SDK — Token Store\n// ---------------------------------------------------------------------------\n// Reads/writes credentials to ~/.lane/credentials.json.\n// File permissions enforced at 0600 (owner read/write only) for SOC 2.\n// ---------------------------------------------------------------------------\n\nimport { readFile, writeFile, mkdir, stat, chmod } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport type { Credentials, TokenStore } from '../types.js';\n\nconst LANE_DIR = '.lane';\nconst CREDENTIALS_FILE = 'credentials.json';\nconst SECURE_FILE_MODE = 0o600;\nconst SECURE_DIR_MODE = 0o700;\n\n/**\n * File-system backed token store.\n *\n * Stores credentials at ~/.lane/credentials.json with strict permissions.\n * Implements the TokenStore interface so it can be swapped for Redis,\n * Keychain, etc.\n */\nexport class FileTokenStore implements TokenStore {\n private readonly dirPath: string;\n private readonly filePath: string;\n\n constructor(basePath?: string) {\n this.dirPath = basePath ?? join(homedir(), LANE_DIR);\n this.filePath = join(this.dirPath, CREDENTIALS_FILE);\n }\n\n /**\n * Read credentials from disk. Returns null if file doesn't exist.\n * Warns to stderr if file permissions are too permissive.\n */\n async read(): Promise<Credentials | null> {\n try {\n await this.validatePermissions();\n const raw = await readFile(this.filePath, 'utf-8');\n const parsed: unknown = JSON.parse(raw);\n return this.validateCredentials(parsed);\n } catch (err) {\n if (isNodeError(err) && err.code === 'ENOENT') {\n return null;\n }\n throw err;\n }\n }\n\n /**\n * Write credentials to disk with secure permissions.\n */\n async write(credentials: Credentials): Promise<void> {\n await this.ensureDirectory();\n\n const data = JSON.stringify(credentials, null, 2) + '\\n';\n await writeFile(this.filePath, data, { mode: SECURE_FILE_MODE });\n }\n\n /**\n * Remove the credentials file.\n */\n async clear(): Promise<void> {\n try {\n const { unlink } = await import('node:fs/promises');\n await unlink(this.filePath);\n } catch (err) {\n if (isNodeError(err) && err.code === 'ENOENT') {\n return; // Already gone\n }\n throw err;\n }\n }\n\n /** Return the path to the credentials file (for CLI display). */\n get path(): string {\n return this.filePath;\n }\n\n // -------------------------------------------------------------------------\n // Private\n // -------------------------------------------------------------------------\n\n private async ensureDirectory(): Promise<void> {\n await mkdir(this.dirPath, { recursive: true, mode: SECURE_DIR_MODE });\n }\n\n /**\n * Check file permissions and warn if too open.\n * SOC 2 control: credentials should only be readable by owner.\n */\n private async validatePermissions(): Promise<void> {\n try {\n const stats = await stat(this.filePath);\n const mode = stats.mode & 0o777;\n if (mode !== SECURE_FILE_MODE) {\n process.stderr.write(\n `[lane] Warning: ${this.filePath} has permissions ${mode.toString(8)}. ` +\n `Expected ${SECURE_FILE_MODE.toString(8)}. Fixing...\\n`,\n );\n await chmod(this.filePath, SECURE_FILE_MODE);\n }\n } catch {\n // File might not exist yet — that's fine\n }\n }\n\n private validateCredentials(parsed: unknown): Credentials | null {\n if (\n typeof parsed !== 'object' ||\n parsed === null ||\n !('apiKey' in parsed) ||\n typeof (parsed as Record<string, unknown>)['apiKey'] !== 'string'\n ) {\n return null;\n }\n return parsed as Credentials;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nfunction isNodeError(err: unknown): err is NodeJS.ErrnoException {\n return err instanceof Error && 'code' in err;\n}\n","// ---------------------------------------------------------------------------\n// Lane SDK — Config Resolution\n// ---------------------------------------------------------------------------\n// Resolution order (first match wins):\n// 1. Constructor argument: new Lane({ apiKey: 'lane_sk_...' })\n// 2. Environment variable: LANE_API_KEY\n// 3. Credentials file: ~/.lane/credentials.json\n// ---------------------------------------------------------------------------\n\nimport type { LaneConfig, ResolvedConfig, TokenStore } from './types.js';\nimport { FileTokenStore } from './auth/token-store.js';\n\nconst DEFAULT_BASE_URL = 'https://api.getonlane.com';\nconst DEFAULT_TIMEOUT = 30_000;\nconst DEFAULT_MAX_RETRIES = 2;\n\n/**\n * Resolve SDK configuration from multiple sources.\n *\n * Immutable after construction — no config drift during a session.\n */\nexport async function resolveConfig(\n options: LaneConfig = {},\n tokenStore?: TokenStore,\n): Promise<ResolvedConfig> {\n // 1. Constructor argument\n let apiKey = options.apiKey;\n\n // 2. Environment variable\n if (!apiKey) {\n apiKey = process.env['LANE_API_KEY'];\n }\n\n // 3. Credentials file\n if (!apiKey) {\n const store = tokenStore ?? new FileTokenStore();\n const creds = await store.read();\n if (creds) {\n apiKey = creds.apiKey;\n }\n }\n\n if (!apiKey) {\n throw new Error(\n 'No API key found. Provide one via:\\n' +\n ' 1. new Lane({ apiKey: \"lane_sk_...\" })\\n' +\n ' 2. LANE_API_KEY environment variable\\n' +\n ' 3. Run `lane login` to authenticate',\n );\n }\n\n const testMode =\n options.testMode ??\n (process.env['LANE_TEST_MODE'] === 'true' ||\n apiKey.startsWith('lane_sk_test_'));\n\n const baseUrl =\n options.baseUrl ??\n process.env['LANE_BASE_URL'] ??\n DEFAULT_BASE_URL;\n\n const timeout =\n options.timeout ??\n (process.env['LANE_TIMEOUT']\n ? parseInt(process.env['LANE_TIMEOUT'], 10)\n : DEFAULT_TIMEOUT);\n\n const maxRetries =\n options.maxRetries ??\n (process.env['LANE_MAX_RETRIES']\n ? parseInt(process.env['LANE_MAX_RETRIES'], 10)\n : DEFAULT_MAX_RETRIES);\n\n return Object.freeze({\n apiKey,\n baseUrl,\n testMode,\n timeout,\n maxRetries,\n circuitBreaker: options.circuitBreaker ? Object.freeze({\n failureThreshold: options.circuitBreaker.failureThreshold ?? 3,\n resetTimeoutMs: options.circuitBreaker.resetTimeoutMs ?? 30_000,\n }) : undefined,\n });\n}\n","// ---------------------------------------------------------------------------\n// Lane SDK — Abstract Resource Base Class\n// ---------------------------------------------------------------------------\n// Every API resource (Wallets, Pay, Products, etc.) extends this class.\n// Provides typed access to the underlying LaneClient and common patterns.\n// ---------------------------------------------------------------------------\n\nimport type { LaneClient } from '../client.js';\nimport type { APIResponse, PaginatedResponse } from '../types.js';\n\n/**\n * Abstract base class for all Lane API resources.\n *\n * Subclasses focus on domain logic; the base class handles HTTP delegation,\n * pagination helpers, and idempotency key forwarding.\n */\nexport abstract class Resource {\n protected readonly client: LaneClient;\n\n constructor(client: LaneClient) {\n this.client = client;\n }\n\n /** The API path prefix for this resource (e.g. '/api/sdk/wallets'). */\n protected abstract get basePath(): string;\n\n // -----------------------------------------------------------------------\n // Convenience wrappers that prepend basePath\n // -----------------------------------------------------------------------\n\n protected async _get<T>(\n subpath: string = '',\n query?: Record<string, string | number | boolean | undefined>,\n ): Promise<APIResponse<T>> {\n return this.client.get<T>(`${this.basePath}${subpath}`, query);\n }\n\n protected async _post<T>(\n subpath: string = '',\n body?: Record<string, unknown>,\n idempotencyKey?: string,\n ): Promise<APIResponse<T>> {\n return this.client.post<T>(`${this.basePath}${subpath}`, body, idempotencyKey);\n }\n\n protected async _put<T>(\n subpath: string = '',\n body?: Record<string, unknown>,\n ): Promise<APIResponse<T>> {\n return this.client.put<T>(`${this.basePath}${subpath}`, body);\n }\n\n protected async _delete<T>(subpath: string = ''): Promise<APIResponse<T>> {\n return this.client.delete<T>(`${this.basePath}${subpath}`);\n }\n\n /**\n * Helper for paginated list endpoints.\n */\n protected async _list<T>(\n subpath: string = '',\n params?: { limit?: number; offset?: number } & Record<string, unknown>,\n ): Promise<PaginatedResponse<T>> {\n const query: Record<string, string | number | boolean | undefined> = {};\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n query[key] = typeof value === 'object' ? JSON.stringify(value) : (value as string | number | boolean);\n }\n }\n }\n const response = await this.client.get<PaginatedResponse<T>>(\n `${this.basePath}${subpath}`,\n query,\n );\n return response.data;\n }\n}\n","// ---------------------------------------------------------------------------\n// Lane SDK — Auth Resource\n// ---------------------------------------------------------------------------\n\nimport { Resource } from './base.js';\nimport type { DeveloperProfile, RotateKeyResult } from '../types.js';\n\nexport class Auth extends Resource {\n protected get basePath(): string {\n return '/api/sdk/auth';\n }\n\n /** Get the authenticated developer's profile. */\n async whoami(): Promise<DeveloperProfile> {\n const res = await this._get<DeveloperProfile>('/whoami');\n return res.data;\n }\n\n /**\n * Start a login session. Returns a URL the developer opens in their browser.\n */\n async login(): Promise<{ sessionId: string; authUrl: string; port: number }> {\n const res = await this._post<{ sessionId: string; authUrl: string; port: number }>('/login');\n return res.data;\n }\n\n /**\n * Exchange a one-time code (from browser callback) for an API key.\n */\n async exchangeCode(code: string, sessionId: string): Promise<{ apiKey: string; developerId: string }> {\n const res = await this._post<{ apiKey: string; developerId: string }>('/token', {\n code,\n sessionId,\n });\n return res.data;\n }\n\n /**\n * Rotate the API key. Old key remains valid for 15 minutes.\n */\n async rotateKey(): Promise<RotateKeyResult> {\n const res = await this._post<RotateKeyResult>('/rotate');\n return res.data;\n }\n}\n","// ---------------------------------------------------------------------------\n// Lane SDK — Wallets Resource\n// ---------------------------------------------------------------------------\n\nimport { Resource } from './base.js';\nimport type {\n Wallet,\n Card,\n CreateWalletParams,\n PaginatedResponse,\n DepositParams,\n DepositResult,\n AutoReloadConfig,\n CardAttributes,\n WalletBalance,\n CheckoutProfile,\n SetCheckoutProfileParams,\n MerchantAccount,\n SaveMerchantAccountParams,\n} from '../types.js';\n\nexport class Wallets extends Resource {\n protected get basePath(): string {\n return '/api/sdk/wallets';\n }\n\n /** Create a new wallet, optionally scoped to an end user. */\n async create(params: CreateWalletParams = {}): Promise<Wallet> {\n const res = await this._post<Wallet>('', {\n userId: params.userId,\n }, params.idempotencyKey);\n return res.data;\n }\n\n /** Get a wallet by ID. */\n async get(walletId: string): Promise<Wallet> {\n const res = await this._get<Wallet>(`/${walletId}`);\n return res.data;\n }\n\n /** List all wallets for the authenticated developer. */\n async list(params?: { limit?: number; offset?: number }): Promise<PaginatedResponse<Wallet>> {\n return this._list<Wallet>('', params);\n }\n\n /** List cards in a wallet. Returns last4/brand only — never full PAN. */\n async listCards(walletId: string): Promise<Card[]> {\n const res = await this._get<Card[]>(`/${walletId}/cards`);\n return res.data;\n }\n\n /**\n * Get a secure link for the end user to add a card via VGS Collect.\n * PAN goes directly to VGS vault — Lane never sees it.\n */\n async getAddCardLink(walletId: string): Promise<{ url: string; expiresAt: string }> {\n const res = await this._get<{ url: string; expiresAt: string }>(`/${walletId}/add-card-link`);\n return res.data;\n }\n\n /** Revoke a wallet. All linked tokens are immediately invalidated. */\n async revoke(walletId: string): Promise<void> {\n await this._delete(`/${walletId}`);\n }\n\n /** Remove a specific card from a wallet. */\n async removeCard(walletId: string, cardId: string): Promise<void> {\n await this._delete(`/${walletId}/cards/${cardId}`);\n }\n\n /** Deposit funds into a wallet. */\n async deposit(walletId: string, params: DepositParams): Promise<DepositResult> {\n const res = await this._post<DepositResult>(\n `/${walletId}/deposit`,\n { amount: params.amount } as Record<string, unknown>,\n params.idempotencyKey,\n );\n return res.data;\n }\n\n /** Get wallet balance and metadata. */\n async balance(walletId?: string): Promise<WalletBalance> {\n const res = await this._get<WalletBalance>(`/${walletId ?? 'default'}/balance`);\n return res.data;\n }\n\n /** Configure auto-reload for a wallet. */\n async setAutoReload(walletId: string, config: AutoReloadConfig): Promise<AutoReloadConfig> {\n const res = await this._put<AutoReloadConfig>(\n `/${walletId}/auto-reload`,\n config as unknown as Record<string, unknown>,\n );\n return res.data;\n }\n\n /** Get card attributes for a wallet. */\n async getAttributes(walletId: string): Promise<CardAttributes> {\n const res = await this._get<CardAttributes>(`/${walletId}/card-attributes`);\n return res.data;\n }\n\n /** Set the checkout profile for a wallet (billing, shipping, email). */\n async setProfile(walletId: string, profile: SetCheckoutProfileParams): Promise<CheckoutProfile> {\n const res = await this._post<CheckoutProfile>(`/${walletId}/profile`, profile as unknown as Record<string, unknown>);\n return res.data;\n }\n\n /** Get the checkout profile. Addresses and email are visible; no sensitive data. */\n async getProfile(walletId: string): Promise<CheckoutProfile> {\n const res = await this._get<CheckoutProfile>(`/${walletId}/profile`);\n return res.data;\n }\n\n /** Update the checkout profile (partial). */\n async updateProfile(walletId: string, updates: Partial<SetCheckoutProfileParams>): Promise<CheckoutProfile> {\n const res = await this._put<CheckoutProfile>(`/${walletId}/profile`, updates as Record<string, unknown>);\n return res.data;\n }\n\n /** Save a merchant account (for sites without guest checkout). */\n async saveMerchantAccount(walletId: string, params: SaveMerchantAccountParams): Promise<MerchantAccount> {\n const res = await this._post<MerchantAccount>(`/${walletId}/merchant-accounts`, params as unknown as Record<string, unknown>);\n return res.data;\n }\n\n /** List saved merchant accounts (domain + email only). */\n async listMerchantAccounts(walletId: string): Promise<MerchantAccount[]> {\n const res = await this._get<MerchantAccount[]>(`/${walletId}/merchant-accounts`);\n return res.data;\n }\n\n /** Remove a saved merchant account. */\n async removeMerchantAccount(walletId: string, accountId: string): Promise<void> {\n await this._delete(`/${walletId}/merchant-accounts/${accountId}`);\n }\n}\n","// ---------------------------------------------------------------------------\n// Lane SDK — Pay Resource (Agentic Tokens + Payment Execution)\n// ---------------------------------------------------------------------------\n\nimport { createHash } from 'node:crypto';\nimport { Resource } from './base.js';\nimport type {\n AgenticToken,\n CreateTokenParams,\n ExecutePaymentParams,\n Transaction,\n RefundParams,\n Refund,\n PaginatedResponse,\n} from '../types.js';\n\nexport class Pay extends Resource {\n protected get basePath(): string {\n return '/api/sdk/pay';\n }\n\n /**\n * Create a scoped agentic token — amount-limited, merchant-locked,\n * time-bounded. The token can be used to execute a single payment.\n */\n async createToken(params: CreateTokenParams): Promise<AgenticToken> {\n const res = await this._post<AgenticToken>('/tokens', {\n walletId: params.walletId,\n amount: params.amount,\n currency: params.currency ?? 'USD',\n merchant: params.merchant ?? '*',\n expiresIn: params.expiresIn ?? '1h',\n permissions: params.permissions ?? [],\n }, params.idempotencyKey);\n return res.data;\n }\n\n /**\n * Execute a payment. Routed via the best available path:\n * 1. Billing API (for services like OpenAI, Replicate, Vercel)\n * 2. ACP-enabled merchant checkout\n * 3. VIC agentic token (when available)\n *\n * Idempotency key is strongly recommended to prevent double charges.\n */\n async execute(params: ExecutePaymentParams): Promise<Transaction> {\n // Auto-generate idempotency key if not provided (amount + recipient + 5-min window)\n const idempotencyKey = params.idempotencyKey ?? this.generateIdempotencyKey(params);\n\n const res = await this._post<Transaction>('/execute', {\n tokenId: params.tokenId,\n recipient: params.recipient,\n amount: params.amount,\n currency: params.currency ?? 'USD',\n description: params.description,\n }, idempotencyKey);\n return res.data;\n }\n\n private generateIdempotencyKey(params: ExecutePaymentParams): string {\n const window = Math.floor(Date.now() / (5 * 60 * 1000)); // 5-minute window\n const input = `${params.amount}:${params.recipient}:${params.currency ?? 'USD'}:${window}`;\n return `auto_${createHash('sha256').update(input).digest('hex').slice(0, 24)}`;\n }\n\n /** Get a transaction by ID. */\n async getTransaction(transactionId: string): Promise<Transaction> {\n const res = await this._get<Transaction>(`/transactions/${transactionId}`);\n return res.data;\n }\n\n /** List transactions with optional filters. */\n async listTransactions(params?: {\n limit?: number;\n offset?: number;\n cardId?: string;\n status?: Transaction['status'];\n }): Promise<PaginatedResponse<Transaction>> {\n return this._list<Transaction>('/transactions', params);\n }\n\n /**\n * Initiate a refund. Full or partial.\n *\n * Refund routing mirrors payment routing:\n * - Billing API merchants: calls their refund API\n * - ACP merchants: initiates refund through PSP\n * - VIC transactions: standard Visa dispute flow\n */\n async refund(params: RefundParams): Promise<Refund> {\n const res = await this._post<Refund>('/refunds', {\n transactionId: params.transactionId,\n amount: params.amount,\n reason: params.reason,\n }, params.idempotencyKey);\n return res.data;\n }\n\n /** Get a refund by ID. */\n async getRefund(refundId: string): Promise<Refund> {\n const res = await this._get<Refund>(`/refunds/${refundId}`);\n return res.data;\n }\n}\n","// ---------------------------------------------------------------------------\n// Lane SDK — Products Resource (Discovery)\n// ---------------------------------------------------------------------------\n\nimport { Resource } from './base.js';\nimport type {\n Product,\n ProductSearchParams,\n SoftwareProductSearchParams,\n Merchant,\n PaginatedResponse,\n} from '../types.js';\n\nexport class Products extends Resource {\n protected get basePath(): string {\n return '/api/sdk/products';\n }\n\n /** Search the Lane product catalog. */\n async search(params: ProductSearchParams | SoftwareProductSearchParams): Promise<PaginatedResponse<Product>> {\n return this._list<Product>('/search', { ...params });\n }\n\n /** Get a product by ID. */\n async get(productId: string): Promise<Product> {\n const res = await this._get<Product>(`/${productId}`);\n return res.data;\n }\n\n /** List available merchants. */\n async listMerchants(params?: {\n limit?: number;\n offset?: number;\n query?: string;\n }): Promise<PaginatedResponse<Merchant>> {\n return this._list<Merchant>('/merchants', params);\n }\n\n /** Get a merchant by ID or slug. */\n async getMerchant(merchantIdOrSlug: string): Promise<Merchant> {\n const res = await this.client.get<Merchant>(`/api/sdk/merchants/${merchantIdOrSlug}`);\n return res.data;\n }\n}\n","// ---------------------------------------------------------------------------\n// Lane SDK — Checkout Resource\n// ---------------------------------------------------------------------------\n\nimport { Resource } from './base.js';\nimport type {\n CheckoutSession,\n CreateCheckoutParams,\n SoftwareCheckoutParams,\n Order,\n SoftwareOrder,\n} from '../types.js';\n\nexport class Checkout extends Resource {\n protected get basePath(): string {\n return '/api/sdk/checkout';\n }\n\n /** Create a new checkout session for a product. */\n async create(params: CreateCheckoutParams | SoftwareCheckoutParams): Promise<CheckoutSession> {\n const body: Record<string, unknown> = {\n productId: params.productId,\n walletId: params.walletId,\n quantity: params.quantity ?? 1,\n };\n if ('plan' in params && params.plan !== undefined) {\n body.plan = params.plan;\n }\n if ('parameters' in params && params.parameters !== undefined) {\n body.parameters = params.parameters;\n }\n const res = await this._post<CheckoutSession>('', body, params.idempotencyKey);\n return res.data;\n }\n\n /** Complete a checkout session — processes payment and returns the order. */\n async complete(sessionId: string): Promise<Order | SoftwareOrder> {\n const res = await this._post<Order | SoftwareOrder>(`/${sessionId}/complete`);\n return res.data;\n }\n\n /** Get the status of a checkout session. */\n async get(sessionId: string): Promise<CheckoutSession> {\n const res = await this._get<CheckoutSession>(`/${sessionId}`);\n return res.data;\n }\n\n /** Cancel a pending checkout session. */\n async cancel(sessionId: string): Promise<CheckoutSession> {\n const res = await this._post<CheckoutSession>(`/${sessionId}/cancel`);\n return res.data;\n }\n}\n","// ---------------------------------------------------------------------------\n// Lane SDK — Sell Resource (Make-a-SaaS)\n// ---------------------------------------------------------------------------\n\nimport { Resource } from './base.js';\nimport type {\n Product,\n CreateProductParams,\n ProductAnalytics,\n AnalyticsParams,\n PaginatedResponse,\n SCPManifest,\n} from '../types.js';\n\nexport class Sell extends Resource {\n protected get basePath(): string {\n return '/api/sdk/sell';\n }\n\n /**\n * List a product for sale on the Lane marketplace.\n *\n * Lane will:\n * 1. List the product in the Product API (discoverable by any agent)\n * 2. Create a proxy endpoint (handles auth + metering)\n * 3. Generate API keys for buyers automatically\n * 4. Meter usage and bill buyer wallets\n * 5. Pay out to seller (minus Lane fee)\n */\n async create(params: CreateProductParams): Promise<Product> {\n const res = await this._post<Product>('/products', {\n name: params.name,\n type: params.type,\n endpoint: params.endpoint,\n mcpEndpoint: params.mcpEndpoint,\n pricing: params.pricing,\n description: params.description,\n auth: params.auth,\n }, params.idempotencyKey);\n return res.data;\n }\n\n /** Update an existing product listing. */\n async update(productId: string, params: Partial<CreateProductParams>): Promise<Product> {\n const res = await this._put<Product>(`/products/${productId}`, params as Record<string, unknown>);\n return res.data;\n }\n\n /** Deactivate a product listing (soft delete). */\n async deactivate(productId: string): Promise<void> {\n await this._delete(`/products/${productId}`);\n }\n\n /** Get a product you've listed. */\n async get(productId: string): Promise<Product> {\n const res = await this._get<Product>(`/products/${productId}`);\n return res.data;\n }\n\n /** List all products you've listed for sale. */\n async list(params?: { limit?: number; offset?: number }): Promise<PaginatedResponse<Product>> {\n return this._list<Product>('/products', params);\n }\n\n /** Get analytics for a product you've listed. */\n async analytics(params: AnalyticsParams): Promise<ProductAnalytics> {\n const res = await this._get<ProductAnalytics>(\n `/products/${params.productId}/analytics`,\n { period: params.period },\n );\n return res.data;\n }\n\n /** List a software product using an SCP manifest. */\n async createSoftwareProduct(manifest: SCPManifest): Promise<Product> {\n const res = await this._post<Product>('/software', manifest as unknown as Record<string, unknown>);\n return res.data;\n }\n}\n","// ---------------------------------------------------------------------------\n// Lane SDK — Admin Resource (Enterprise / Team Management)\n// ---------------------------------------------------------------------------\n\nimport { Resource } from './base.js';\nimport type {\n BudgetConfig,\n SpendingSummary,\n TeamMember,\n PaginatedResponse,\n} from '../types.js';\n\nexport class Admin extends Resource {\n protected get basePath(): string {\n return '/api/sdk/admin';\n }\n\n // -------------------------------------------------------------------------\n // Spending\n // -------------------------------------------------------------------------\n\n /** Get spending summary with optional grouping by team/developer/agent. */\n async spending(params: {\n period: string;\n groupBy?: 'team' | 'developer' | 'agent';\n }): Promise<SpendingSummary> {\n const res = await this._get<SpendingSummary>('/spending', params);\n return res.data;\n }\n\n // -------------------------------------------------------------------------\n // Budgets\n // -------------------------------------------------------------------------\n\n /** Get current budget configuration. */\n async getBudget(scope?: { teamId?: string; developerId?: string }): Promise<BudgetConfig> {\n const res = await this._get<BudgetConfig>('/budgets', scope);\n return res.data;\n }\n\n /** Update budget limits. */\n async setBudget(\n config: BudgetConfig & { teamId?: string; developerId?: string },\n ): Promise<BudgetConfig> {\n const res = await this._put<BudgetConfig>('/budgets', config as Record<string, unknown>);\n return res.data;\n }\n\n // -------------------------------------------------------------------------\n // Team Members\n // -------------------------------------------------------------------------\n\n /** List team members. */\n async listMembers(params?: {\n limit?: number;\n offset?: number;\n teamId?: string;\n }): Promise<PaginatedResponse<TeamMember>> {\n return this._list<TeamMember>('/members', params);\n }\n\n /** Invite a team member. */\n async inviteMember(params: {\n email: string;\n role: TeamMember['role'];\n teamId?: string;\n }): Promise<TeamMember> {\n const res = await this._post<TeamMember>('/members', params);\n return res.data;\n }\n\n /** Update a team member's role. */\n async updateMember(memberId: string, params: { role: TeamMember['role'] }): Promise<TeamMember> {\n const res = await this._put<TeamMember>(`/members/${memberId}`, params);\n return res.data;\n }\n\n /** Remove a team member. */\n async removeMember(memberId: string): Promise<void> {\n await this._delete(`/members/${memberId}`);\n }\n\n // -------------------------------------------------------------------------\n // Account Management (GDPR)\n // -------------------------------------------------------------------------\n\n /**\n * Export all developer data as JSON (GDPR data portability).\n */\n async exportData(): Promise<Record<string, unknown>> {\n const res = await this._get<Record<string, unknown>>('/export');\n return res.data;\n }\n\n /**\n * Delete the developer account and purge all PII (GDPR right to erasure).\n * Transaction records are anonymized (amount + merchant retained for regulatory).\n */\n async deleteAccount(): Promise<{ status: string; deletionCompletesAt: string }> {\n const res = await this._delete<{ status: string; deletionCompletesAt: string }>('/account');\n return res.data;\n }\n}\n","// ---------------------------------------------------------------------------\n// Lane SDK — Webhooks Resource\n// ---------------------------------------------------------------------------\n\nimport { Resource } from './base.js';\nimport { verifyWebhookSignature } from '../crypto/signature.js';\nimport type { WebhookConfig, WebhookPayload, PaginatedResponse } from '../types.js';\n\nexport class Webhooks extends Resource {\n protected get basePath(): string {\n return '/api/sdk/webhooks';\n }\n\n /** Register a new webhook endpoint. */\n async create(params: Omit<WebhookConfig, 'id'>): Promise<WebhookConfig> {\n const res = await this._post<WebhookConfig>('', params as Record<string, unknown>);\n return res.data;\n }\n\n /** List registered webhooks. */\n async list(): Promise<PaginatedResponse<WebhookConfig>> {\n return this._list<WebhookConfig>();\n }\n\n /** Get a webhook by ID. */\n async get(webhookId: string): Promise<WebhookConfig> {\n const res = await this._get<WebhookConfig>(`/${webhookId}`);\n return res.data;\n }\n\n /** Update a webhook configuration. */\n async update(webhookId: string, params: Partial<WebhookConfig>): Promise<WebhookConfig> {\n const res = await this._put<WebhookConfig>(`/${webhookId}`, params as Record<string, unknown>);\n return res.data;\n }\n\n /** Delete a webhook endpoint. */\n async delete(webhookId: string): Promise<void> {\n await this._delete(`/${webhookId}`);\n }\n\n /**\n * Verify a webhook payload's signature.\n *\n * Use this in your webhook handler to confirm the payload was sent by Lane.\n *\n * @param payload - Raw request body string\n * @param signature - Value of X-Lane-Signature header\n * @param secret - Your webhook signing secret\n * @param timestamp - Value of X-Lane-Timestamp header (unix seconds)\n */\n verify(\n payload: string,\n signature: string,\n secret: string,\n timestamp: number,\n ): boolean {\n return verifyWebhookSignature(payload, signature, secret, timestamp);\n }\n\n /**\n * Parse and verify a webhook payload in one step.\n * Throws if signature is invalid.\n */\n constructEvent(\n payload: string,\n signature: string,\n secret: string,\n timestamp: number,\n ): WebhookPayload {\n if (!this.verify(payload, signature, secret, timestamp)) {\n throw new Error('Invalid webhook signature');\n }\n return JSON.parse(payload) as WebhookPayload;\n }\n}\n","// ---------------------------------------------------------------------------\n// Lane SDK — VIC Resource (Visa Intelligent Commerce Agentic Tokens)\n// ---------------------------------------------------------------------------\n// Phase 2: THE MOAT — issue Visa-authenticated credentials that work at\n// any Visa-accepting merchant. Upgrades from \"call billing API\" to\n// \"issue a Visa credential.\"\n// ---------------------------------------------------------------------------\n\nimport { Resource } from './base.js';\nimport type {\n VICToken,\n VICIssuanceParams,\n NetworkTokenPayload,\n PaginatedResponse,\n} from '../types.js';\n\nexport class VIC extends Resource {\n protected get basePath(): string {\n return '/api/sdk/vic';\n }\n\n /**\n * Issue a VIC agentic token. This provisions a Visa network token (DPAN)\n * scoped to the agent's constraints: amount limits, merchant restrictions,\n * and time bounds.\n *\n * The token works at any Visa-accepting merchant — not just Lane catalog.\n */\n async issue(params: VICIssuanceParams): Promise<VICToken> {\n const res = await this._post<VICToken>('/tokens', {\n walletId: params.walletId,\n cardId: params.cardId,\n maxTransactionAmount: params.maxTransactionAmount,\n allowedMCCs: params.allowedMCCs,\n expiresIn: params.expiresIn ?? '24h',\n }, params.idempotencyKey);\n return res.data;\n }\n\n /**\n * Get a transaction-specific cryptogram for a VIC token.\n * Called just before payment execution — the cryptogram is single-use.\n */\n async getCryptogram(tokenId: string, params: {\n amount: number;\n currency: string;\n merchantId: string;\n }): Promise<NetworkTokenPayload> {\n const res = await this._post<NetworkTokenPayload>(\n `/tokens/${tokenId}/cryptogram`,\n params as Record<string, unknown>,\n );\n return res.data;\n }\n\n /** Get a VIC token by ID. */\n async get(tokenId: string): Promise<VICToken> {\n const res = await this._get<VICToken>(`/tokens/${tokenId}`);\n return res.data;\n }\n\n /** List VIC tokens for a wallet. */\n async list(params?: {\n walletId?: string;\n status?: VICToken['status'];\n limit?: number;\n offset?: number;\n }): Promise<PaginatedResponse<VICToken>> {\n return this._list<VICToken>('/tokens', params);\n }\n\n /** Revoke a VIC token immediately. */\n async revoke(tokenId: string): Promise<VICToken> {\n const res = await this._post<VICToken>(`/tokens/${tokenId}/revoke`);\n return res.data;\n }\n\n /** Suspend a VIC token (can be reactivated). */\n async suspend(tokenId: string): Promise<VICToken> {\n const res = await this._post<VICToken>(`/tokens/${tokenId}/suspend`);\n return res.data;\n }\n\n /** Reactivate a suspended VIC token. */\n async reactivate(tokenId: string): Promise<VICToken> {\n const res = await this._post<VICToken>(`/tokens/${tokenId}/reactivate`);\n return res.data;\n }\n}\n","// ---------------------------------------------------------------------------\n// Lane SDK — Metering Resource (Make-a-SaaS Usage Tracking)\n// ---------------------------------------------------------------------------\n// Phase 4: Sellers track API usage, and Lane handles billing.\n// ---------------------------------------------------------------------------\n\nimport { Resource } from './base.js';\nimport type {\n UsageRecord,\n UsageReport,\n MeteringConfig,\n PaginatedResponse,\n} from '../types.js';\n\nexport class Metering extends Resource {\n protected get basePath(): string {\n return '/api/sdk/metering';\n }\n\n /**\n * Record a usage event (API call, token consumption, etc.).\n * Called by the seller's service when a buyer uses it.\n */\n async record(params: {\n productId: string;\n buyerId: string;\n quantity: number;\n unit?: string;\n idempotencyKey?: string;\n }): Promise<UsageRecord> {\n const res = await this._post<UsageRecord>('/usage', {\n productId: params.productId,\n buyerId: params.buyerId,\n quantity: params.quantity,\n unit: params.unit ?? 'calls',\n }, params.idempotencyKey);\n return res.data;\n }\n\n /**\n * Record a batch of usage events efficiently.\n */\n async recordBatch(records: {\n productId: string;\n buyerId: string;\n quantity: number;\n unit?: string;\n timestamp?: string;\n }[]): Promise<{ recorded: number; failed: number }> {\n const res = await this._post<{ recorded: number; failed: number }>('/usage/batch', {\n records,\n });\n return res.data;\n }\n\n /** Query usage for a product. */\n async query(params: {\n productId: string;\n buyerId?: string;\n startDate?: string;\n endDate?: string;\n limit?: number;\n offset?: number;\n }): Promise<PaginatedResponse<UsageRecord>> {\n return this._list<UsageRecord>('/usage', params);\n }\n\n /** Get an aggregated usage report. */\n async report(params: {\n productId: string;\n period: string;\n }): Promise<UsageReport> {\n const res = await this._get<UsageReport>('/reports', params);\n return res.data;\n }\n\n /** Get or update metering config for a product. */\n async getConfig(productId: string): Promise<MeteringConfig> {\n const res = await this._get<MeteringConfig>(`/config/${productId}`);\n return res.data;\n }\n\n async setConfig(productId: string, config: MeteringConfig): Promise<MeteringConfig> {\n const res = await this._put<MeteringConfig>(`/config/${productId}`, config as unknown as Record<string, unknown>);\n return res.data;\n }\n}\n","// ---------------------------------------------------------------------------\n// Lane SDK — Payouts Resource (Seller Disbursements)\n// ---------------------------------------------------------------------------\n// Phase 4: Sellers receive payouts from Lane for their product sales.\n// ---------------------------------------------------------------------------\n\nimport { Resource } from './base.js';\nimport type { Payout, PayoutConfig, PaginatedResponse } from '../types.js';\n\nexport class Payouts extends Resource {\n protected get basePath(): string {\n return '/api/sdk/payouts';\n }\n\n /** Get payout configuration. */\n async getConfig(): Promise<PayoutConfig> {\n const res = await this._get<PayoutConfig>('/config');\n return res.data;\n }\n\n /** Set up or update payout configuration. */\n async setConfig(config: {\n destination: PayoutConfig['destination'];\n destinationId: string;\n schedule?: PayoutConfig['schedule'];\n currency?: string;\n minimumPayout?: number;\n }): Promise<PayoutConfig> {\n const res = await this._put<PayoutConfig>('/config', config as Record<string, unknown>);\n return res.data;\n }\n\n /** List payouts. */\n async list(params?: {\n status?: Payout['status'];\n limit?: number;\n offset?: number;\n }): Promise<PaginatedResponse<Payout>> {\n return this._list<Payout>('', params);\n }\n\n /** Get a specific payout. */\n async get(payoutId: string): Promise<Payout> {\n const res = await this._get<Payout>(`/${payoutId}`);\n return res.data;\n }\n}\n","// ---------------------------------------------------------------------------\n// Lane SDK — Teams Resource (Corporate Agent Spend)\n// ---------------------------------------------------------------------------\n// Phase 5: Hierarchical team management with budget cascading.\n// ---------------------------------------------------------------------------\n\nimport { Resource } from './base.js';\nimport type {\n Team,\n CreateTeamParams,\n TeamMember,\n BudgetConfig,\n HierarchicalBudget,\n PaginatedResponse,\n} from '../types.js';\n\nexport class Teams extends Resource {\n protected get basePath(): string {\n return '/api/sdk/teams';\n }\n\n /** Create a new team. */\n async create(params: CreateTeamParams): Promise<Team> {\n const res = await this._post<Team>('', params as unknown as Record<string, unknown>);\n return res.data;\n }\n\n /** List teams. */\n async list(params?: { limit?: number; offset?: number }): Promise<PaginatedResponse<Team>> {\n return this._list<Team>('', params);\n }\n\n /** Get a team by ID. */\n async get(teamId: string): Promise<Team> {\n const res = await this._get<Team>(`/${teamId}`);\n return res.data;\n }\n\n /** Update a team. */\n async update(teamId: string, params: { name?: string; budget?: BudgetConfig }): Promise<Team> {\n const res = await this._put<Team>(`/${teamId}`, params as Record<string, unknown>);\n return res.data;\n }\n\n /** Delete a team. */\n async delete(teamId: string): Promise<void> {\n await this._delete(`/${teamId}`);\n }\n\n /** Add a member to a team. */\n async addMember(teamId: string, params: { email: string; role: TeamMember['role'] }): Promise<TeamMember> {\n const res = await this._post<TeamMember>(`/${teamId}/members`, params);\n return res.data;\n }\n\n /** List team members. */\n async listMembers(teamId: string, params?: { limit?: number; offset?: number }): Promise<PaginatedResponse<TeamMember>> {\n return this._list<TeamMember>(`/${teamId}/members`, params);\n }\n\n /** Remove a member from a team. */\n async removeMember(teamId: string, memberId: string): Promise<void> {\n await this._delete(`/${teamId}/members/${memberId}`);\n }\n\n /** Get the hierarchical budget for a team (org > team > developer > agent). */\n async getHierarchicalBudget(teamId: string): Promise<HierarchicalBudget> {\n const res = await this._get<HierarchicalBudget>(`/${teamId}/budget/hierarchy`);\n return res.data;\n }\n\n /** Set the team-level budget. */\n async setBudget(teamId: string, budget: BudgetConfig): Promise<BudgetConfig> {\n const res = await this._put<BudgetConfig>(`/${teamId}/budget`, budget as unknown as Record<string, unknown>);\n return res.data;\n }\n}\n","// ---------------------------------------------------------------------------\n// Lane SDK — Agents Resource (Fleet Management)\n// ---------------------------------------------------------------------------\n// Phase 5: Register, manage, and constrain agents in a fleet.\n// Each agent gets a policy governing its capabilities and spending.\n// ---------------------------------------------------------------------------\n\nimport { Resource } from './base.js';\nimport type {\n AgentRecord,\n RegisterAgentParams,\n AgentPolicy,\n PaginatedResponse,\n} from '../types.js';\n\nexport class Agents extends Resource {\n protected get basePath(): string {\n return '/api/sdk/agents';\n }\n\n /** Register a new agent in the fleet. */\n async register(params: RegisterAgentParams): Promise<AgentRecord> {\n const res = await this._post<AgentRecord>('', params as unknown as Record<string, unknown>);\n return res.data;\n }\n\n /** Get an agent by ID. */\n async get(agentId: string): Promise<AgentRecord> {\n const res = await this._get<AgentRecord>(`/${agentId}`);\n return res.data;\n }\n\n /** List agents in the fleet. */\n async list(params?: {\n status?: AgentRecord['status'];\n limit?: number;\n offset?: number;\n }): Promise<PaginatedResponse<AgentRecord>> {\n return this._list<AgentRecord>('', params);\n }\n\n /** Update an agent's policy. */\n async setPolicy(agentId: string, policy: AgentPolicy): Promise<AgentRecord> {\n const res = await this._put<AgentRecord>(`/${agentId}/policy`, policy as unknown as Record<string, unknown>);\n return res.data;\n }\n\n /** Suspend an agent (temporary, can be reactivated). */\n async suspend(agentId: string): Promise<AgentRecord> {\n const res = await this._post<AgentRecord>(`/${agentId}/suspend`);\n return res.data;\n }\n\n /** Reactivate a suspended agent. */\n async reactivate(agentId: string): Promise<AgentRecord> {\n const res = await this._post<AgentRecord>(`/${agentId}/reactivate`);\n return res.data;\n }\n\n /** Permanently revoke an agent. */\n async revoke(agentId: string): Promise<AgentRecord> {\n const res = await this._post<AgentRecord>(`/${agentId}/revoke`);\n return res.data;\n }\n\n /** Assign a wallet to an agent (per-agent wallet). */\n async assignWallet(agentId: string, walletId: string): Promise<AgentRecord> {\n const res = await this._put<AgentRecord>(`/${agentId}/wallet`, { walletId });\n return res.data;\n }\n}\n","// ---------------------------------------------------------------------------\n// Lane SDK — Audit Resource (SOC 2 Audit Trail)\n// ---------------------------------------------------------------------------\n// Phase 5: Immutable audit trail for all SDK actions.\n// Every API call, payment, and admin action is logged.\n// ---------------------------------------------------------------------------\n\nimport { Resource } from './base.js';\nimport type { AuditEntry, AuditQueryParams, PaginatedResponse } from '../types.js';\n\nexport class Audit extends Resource {\n protected get basePath(): string {\n return '/api/sdk/audit';\n }\n\n /** Query audit log entries. */\n async query(params?: AuditQueryParams): Promise<PaginatedResponse<AuditEntry>> {\n return this._list<AuditEntry>('/logs', params ? { ...params } : undefined);\n }\n\n /** Get a specific audit entry by ID. */\n async get(entryId: string): Promise<AuditEntry> {\n const res = await this._get<AuditEntry>(`/logs/${entryId}`);\n return res.data;\n }\n\n /**\n * Export audit logs for a date range (SOC 2 compliance).\n * Returns a download URL for the audit log archive.\n */\n async export(params: {\n startDate: string;\n endDate: string;\n format?: 'json' | 'csv';\n }): Promise<{ downloadUrl: string; expiresAt: string }> {\n const res = await this._post<{ downloadUrl: string; expiresAt: string }>('/export', params);\n return res.data;\n }\n\n /** Get audit summary/statistics for a period. */\n async summary(params: {\n period: string;\n groupBy?: 'action' | 'actor' | 'resource';\n }): Promise<{\n totalEntries: number;\n byAction: Record<string, number>;\n byActorType: Record<string, number>;\n topActors: { id: string; count: number }[];\n }> {\n const res = await this._get<{\n totalEntries: number;\n byAction: Record<string, number>;\n byActorType: Record<string, number>;\n topActors: { id: string; count: number }[];\n }>('/summary', params);\n return res.data;\n }\n}\n","// ---------------------------------------------------------------------------\n// Lane SDK — Identity Resource (Agent Identity)\n// ---------------------------------------------------------------------------\n// Phase 6: Lane-issued agent identity. KYC chain:\n// Human -> Lane -> Agent -> Transaction\n// ---------------------------------------------------------------------------\n\nimport { Resource } from './base.js';\nimport type {\n AgentIdentity,\n RegisterIdentityParams,\n VerifyIdentityParams,\n IdentityAttestation,\n PaginatedResponse,\n} from '../types.js';\n\nexport class Identity extends Resource {\n protected get basePath(): string {\n return '/api/sdk/identity';\n }\n\n /**\n * Register an agent for identity verification.\n * This starts the KYC chain: Human (developer) vouches for Agent.\n */\n async register(params: RegisterIdentityParams): Promise<AgentIdentity> {\n const res = await this._post<AgentIdentity>('', params as unknown as Record<string, unknown>);\n return res.data;\n }\n\n /**\n * Complete identity verification using a developer-provided code.\n * This establishes the Human -> Lane -> Agent chain.\n */\n async verify(params: VerifyIdentityParams): Promise<AgentIdentity> {\n const res = await this._post<AgentIdentity>(\n `/${params.identityId}/verify`,\n { verificationCode: params.verificationCode },\n );\n return res.data;\n }\n\n /** Get an agent identity by ID. */\n async get(identityId: string): Promise<AgentIdentity> {\n const res = await this._get<AgentIdentity>(`/${identityId}`);\n return res.data;\n }\n\n /** List agent identities. */\n async list(params?: {\n agentId?: string;\n status?: AgentIdentity['status'];\n limit?: number;\n offset?: number;\n }): Promise<PaginatedResponse<AgentIdentity>> {\n return this._list<AgentIdentity>('', params);\n }\n\n /**\n * Get the current attestation for a verified identity.\n * The attestation is a cryptographic proof that Lane has verified the\n * Human -> Agent chain.\n */\n async getAttestation(identityId: string): Promise<IdentityAttestation> {\n const res = await this._get<IdentityAttestation>(`/${identityId}/attestation`);\n return res.data;\n }\n\n /**\n * Refresh the attestation (generates a new signed document).\n * Useful when the previous attestation is nearing expiry.\n */\n async refreshAttestation(identityId: string): Promise<IdentityAttestation> {\n const res = await this._post<IdentityAttestation>(`/${identityId}/attestation/refresh`);\n return res.data;\n }\n\n /** Suspend an agent identity. */\n async suspend(identityId: string): Promise<AgentIdentity> {\n const res = await this._post<AgentIdentity>(`/${identityId}/suspend`);\n return res.data;\n }\n\n /** Revoke an agent identity permanently. */\n async revoke(identityId: string): Promise<AgentIdentity> {\n const res = await this._post<AgentIdentity>(`/${identityId}/revoke`);\n return res.data;\n }\n}\n","// ---------------------------------------------------------------------------\n// Lane SDK — Subscriptions Resource\n// ---------------------------------------------------------------------------\n\nimport { Resource } from './base.js';\nimport type {\n Subscription,\n CreateSubscriptionParams,\n UpdateSubscriptionParams,\n PaginatedResponse,\n} from '../types.js';\n\nexport class Subscriptions extends Resource {\n protected get basePath(): string {\n return '/api/sdk/subscriptions';\n }\n\n /** Create a new subscription. */\n async create(params: CreateSubscriptionParams): Promise<Subscription> {\n const res = await this._post<Subscription>('', params as unknown as Record<string, unknown>);\n return res.data;\n }\n\n /** List subscriptions, optionally filtered by status. */\n async list(params?: { status?: string; limit?: number; offset?: number }): Promise<PaginatedResponse<Subscription>> {\n return this._list<Subscription>('', params);\n }\n\n /** Get a subscription by ID. */\n async get(subscriptionId: string): Promise<Subscription> {\n const res = await this._get<Subscription>(`/${subscriptionId}`);\n return res.data;\n }\n\n /** Cancel a subscription. */\n async cancel(subscriptionId: string): Promise<Subscription> {\n const res = await this._post<Subscription>(`/${subscriptionId}/cancel`, {});\n return res.data;\n }\n\n /** Upgrade a subscription to a higher plan. */\n async upgrade(subscriptionId: string, params: UpdateSubscriptionParams): Promise<Subscription> {\n const res = await this._post<Subscription>(`/${subscriptionId}/upgrade`, params as unknown as Record<string, unknown>);\n return res.data;\n }\n\n /** Downgrade a subscription to a lower plan. */\n async downgrade(subscriptionId: string, params: UpdateSubscriptionParams): Promise<Subscription> {\n const res = await this._post<Subscription>(`/${subscriptionId}/downgrade`, params as unknown as Record<string, unknown>);\n return res.data;\n }\n\n /** Pause a subscription. */\n async pause(subscriptionId: string): Promise<Subscription> {\n const res = await this._post<Subscription>(`/${subscriptionId}/pause`, {});\n return res.data;\n }\n\n /** Resume a paused subscription. */\n async resume(subscriptionId: string): Promise<Subscription> {\n const res = await this._post<Subscription>(`/${subscriptionId}/resume`, {});\n return res.data;\n }\n}\n","// ---------------------------------------------------------------------------\n// Lane SDK — Merchants Resource (Directory)\n// ---------------------------------------------------------------------------\n\nimport { Resource } from './base.js';\nimport type {\n PaginatedResponse,\n DirectoryMerchant,\n MerchantSearchParams,\n ProtocolDiscoveryResult,\n MerchantVerticalSummary,\n} from '../types.js';\n\nexport class Merchants extends Resource {\n protected get basePath(): string {\n return '/api/sdk/merchants';\n }\n\n /** List/search the merchant directory. */\n async list(params?: MerchantSearchParams): Promise<PaginatedResponse<DirectoryMerchant>> {\n return this._list<DirectoryMerchant>('', params as Record<string, unknown>);\n }\n\n /** Get a merchant by ID, slug, or domain. */\n async get(idOrSlug: string): Promise<DirectoryMerchant> {\n const res = await this._get<DirectoryMerchant>(`/${idOrSlug}`);\n return res.data;\n }\n\n /** List merchants that support a specific protocol. */\n async listByProtocol(\n protocol: string,\n params?: Omit<MerchantSearchParams, 'protocol'>,\n ): Promise<PaginatedResponse<DirectoryMerchant>> {\n return this._list<DirectoryMerchant>('', { ...params, protocol } as Record<string, unknown>);\n }\n\n /** List merchants in a specific vertical. */\n async listByVertical(\n vertical: string,\n params?: Omit<MerchantSearchParams, 'vertical'>,\n ): Promise<PaginatedResponse<DirectoryMerchant>> {\n return this._list<DirectoryMerchant>('', { ...params, vertical } as Record<string, unknown>);\n }\n\n /** List only Lane-onboarded merchants. */\n async listOnboarded(\n params?: Omit<MerchantSearchParams, 'tier'>,\n ): Promise<PaginatedResponse<DirectoryMerchant>> {\n return this._list<DirectoryMerchant>('', { ...params, tier: 'lane_onboarded' } as Record<string, unknown>);\n }\n\n /** List all verticals with subcategories and counts. */\n async verticals(): Promise<MerchantVerticalSummary[]> {\n const res = await this._get<MerchantVerticalSummary[]>('/verticals');\n return res.data;\n }\n\n /** Discover a protocol-compatible merchant by domain. */\n async discover(domain: string): Promise<ProtocolDiscoveryResult> {\n const res = await this._post<ProtocolDiscoveryResult>('/discover', { domain });\n return res.data;\n }\n}\n","// ---------------------------------------------------------------------------\n// Lane SDK — Main Class\n// ---------------------------------------------------------------------------\n// This is the primary entry point for the SDK. It composes all resources\n// and provides a clean, Stripe-like interface:\n//\n// const lane = new Lane({ apiKey: 'lane_sk_...' })\n// const wallet = await lane.wallets.create({ userId: 'u1' })\n// const txn = await lane.pay.execute({ ... })\n// ---------------------------------------------------------------------------\n\nimport { LaneClient } from './client.js';\nimport { resolveConfig } from './config.js';\nimport { Auth } from './resources/auth.js';\nimport { Wallets } from './resources/wallets.js';\nimport { Pay } from './resources/pay.js';\nimport { Products } from './resources/products.js';\nimport { Checkout } from './resources/checkout.js';\nimport { Sell } from './resources/sell.js';\nimport { Admin } from './resources/admin.js';\nimport { Webhooks } from './resources/webhooks.js';\nimport { VIC } from './resources/vic.js';\nimport { Metering } from './resources/metering.js';\nimport { Payouts } from './resources/payouts.js';\nimport { Teams } from './resources/teams.js';\nimport { Agents } from './resources/agents.js';\nimport { Audit } from './resources/audit.js';\nimport { Identity } from './resources/identity.js';\nimport { Subscriptions } from './resources/subscriptions.js';\nimport { Merchants } from './resources/merchants.js';\nimport type { LaneConfig, ResolvedConfig, TokenStore } from './types.js';\n\n/**\n * Lane SDK client.\n *\n * Provides access to all Lane API resources through a composable,\n * object-oriented interface. Resources are lazily initialized on first access.\n *\n * @example\n * ```typescript\n * import Lane from 'lane'\n *\n * const lane = await Lane.create({ apiKey: process.env.LANE_KEY })\n *\n * const wallet = await lane.wallets.create({ userId: 'user_123' })\n * const products = await lane.products.search({ query: 'API credits' })\n * const txn = await lane.pay.execute({ recipient: 'replicate.com', amount: 20 })\n * ```\n */\nexport class Lane {\n private readonly client: LaneClient;\n private readonly _config: ResolvedConfig;\n\n // Lazily initialized resources\n private _auth?: Auth;\n private _wallets?: Wallets;\n private _pay?: Pay;\n private _products?: Products;\n private _checkout?: Checkout;\n private _sell?: Sell;\n private _admin?: Admin;\n private _webhooks?: Webhooks;\n private _vic?: VIC;\n private _metering?: Metering;\n private _payouts?: Payouts;\n private _teams?: Teams;\n private _agents?: Agents;\n private _audit?: Audit;\n private _identity?: Identity;\n private _subscriptions?: Subscriptions;\n private _merchants?: Merchants;\n\n /**\n * Private constructor — use `Lane.create()` for async config resolution,\n * or `new Lane(resolvedConfig)` if you've already resolved config.\n */\n private constructor(config: ResolvedConfig) {\n this._config = config;\n this.client = new LaneClient(config);\n }\n\n /**\n * Create a new Lane SDK instance with async config resolution.\n *\n * Resolves API key from: constructor > env var > credentials file.\n */\n static async create(options: LaneConfig = {}): Promise<Lane> {\n const config = await resolveConfig(options, options.tokenStore);\n return new Lane(config);\n }\n\n /**\n * Create a Lane SDK instance synchronously (requires explicit apiKey).\n *\n * Use this when you already have the API key and don't need file-based\n * credential resolution.\n */\n static fromApiKey(apiKey: string, options: Omit<LaneConfig, 'apiKey'> = {}): Lane {\n const testMode = options.testMode ?? apiKey.startsWith('lane_sk_test_');\n const config: ResolvedConfig = Object.freeze({\n apiKey,\n baseUrl: options.baseUrl ?? process.env['LANE_BASE_URL'] ?? 'https://api.getonlane.com',\n testMode,\n timeout: options.timeout ?? 30_000,\n maxRetries: options.maxRetries ?? 2,\n circuitBreaker: options.circuitBreaker ? Object.freeze({\n failureThreshold: options.circuitBreaker.failureThreshold ?? 3,\n resetTimeoutMs: options.circuitBreaker.resetTimeoutMs ?? 30_000,\n }) : undefined,\n });\n return new Lane(config);\n }\n\n // -------------------------------------------------------------------------\n // Resource Accessors (lazy initialization)\n // -------------------------------------------------------------------------\n\n /** Authentication — login, whoami, key rotation. */\n get auth(): Auth {\n return (this._auth ??= new Auth(this.client));\n }\n\n /** Wallets — create, list cards, add card, revoke. */\n get wallets(): Wallets {\n return (this._wallets ??= new Wallets(this.client));\n }\n\n /** Pay — agentic tokens, payment execution, refunds. */\n get pay(): Pay {\n return (this._pay ??= new Pay(this.client));\n }\n\n /** Products — search catalog, list merchants. */\n get products(): Products {\n return (this._products ??= new Products(this.client));\n }\n\n /** Checkout — create and complete checkout sessions. */\n get checkout(): Checkout {\n return (this._checkout ??= new Checkout(this.client));\n }\n\n /** Sell — list products for sale, analytics (Make-a-SaaS). */\n get sell(): Sell {\n return (this._sell ??= new Sell(this.client));\n }\n\n /** Admin — spending, budgets, team management, GDPR. */\n get admin(): Admin {\n return (this._admin ??= new Admin(this.client));\n }\n\n /** Webhooks — register, verify, manage webhook endpoints. */\n get webhooks(): Webhooks {\n return (this._webhooks ??= new Webhooks(this.client));\n }\n\n /** VIC — Visa Intelligent Commerce agentic tokens (Phase 2). */\n get vic(): VIC {\n return (this._vic ??= new VIC(this.client));\n }\n\n /** Metering — usage tracking for Make-a-SaaS sellers (Phase 4). */\n get metering(): Metering {\n return (this._metering ??= new Metering(this.client));\n }\n\n /** Payouts — seller disbursements (Phase 4). */\n get payouts(): Payouts {\n return (this._payouts ??= new Payouts(this.client));\n }\n\n /** Teams — team management with hierarchical budgets (Phase 5). */\n get teams(): Teams {\n return (this._teams ??= new Teams(this.client));\n }\n\n /** Agents — fleet management with per-agent policies (Phase 5). */\n get agents(): Agents {\n return (this._agents ??= new Agents(this.client));\n }\n\n /** Audit — immutable audit trail for SOC 2 compliance (Phase 5). */\n get audit(): Audit {\n return (this._audit ??= new Audit(this.client));\n }\n\n /** Identity — agent identity and KYC chain (Phase 6). */\n get identity(): Identity {\n return (this._identity ??= new Identity(this.client));\n }\n\n /** Subscriptions — manage software subscriptions (SCP). */\n get subscriptions(): Subscriptions {\n return (this._subscriptions ??= new Subscriptions(this.client));\n }\n\n /** Merchants — discover and search the merchant directory. */\n get merchants(): Merchants {\n return (this._merchants ??= new Merchants(this.client));\n }\n\n // -------------------------------------------------------------------------\n // Observability\n // -------------------------------------------------------------------------\n\n /** Subscribe to SDK events (request, response, error, retry). */\n on(\n event: 'request' | 'response' | 'error' | 'retry',\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n listener: (...args: any[]) => void,\n ): this {\n this.client.on(event, listener);\n return this;\n }\n\n // -------------------------------------------------------------------------\n // Metadata\n // -------------------------------------------------------------------------\n\n /** Whether this instance is operating in test mode. */\n get testMode(): boolean {\n return this._config.testMode;\n }\n\n /** The resolved base URL. */\n get baseUrl(): string {\n return this._config.baseUrl;\n }\n}\n","// ---------------------------------------------------------------------------\n// Lane MCP — Abstract Tool Base Class\n// ---------------------------------------------------------------------------\n// Every MCP tool extends this class. It provides:\n// - Typed input/output schemas via Zod\n// - Access to the Lane SDK instance\n// - Consistent error handling for agent consumption\n// ---------------------------------------------------------------------------\n\nimport type { z } from 'zod';\nimport type { Lane } from '../lane.js';\nimport { LaneError } from '../errors.js';\n\nexport interface ToolDefinition {\n name: string;\n description: string;\n inputSchema: z.ZodType;\n}\n\nexport interface ToolResult {\n content: Array<{ type: 'text'; text: string }>;\n isError?: boolean;\n}\n\n/**\n * Abstract base class for all Lane MCP tools.\n *\n * Subclasses implement `definition()` for schema and `execute()` for logic.\n * The base class handles error formatting so agents always get structured errors.\n */\nexport abstract class LaneTool<TInput = unknown> {\n protected readonly lane: Lane;\n\n constructor(lane: Lane) {\n this.lane = lane;\n }\n\n /** Tool name, description, and input schema. */\n abstract get definition(): ToolDefinition;\n\n /** Execute the tool with validated input. */\n protected abstract run(input: TInput): Promise<unknown>;\n\n /**\n * Public entry point — validates input, runs tool, formats output.\n * Catches LaneErrors and formats them as structured agent-readable responses.\n */\n async execute(input: unknown): Promise<ToolResult> {\n try {\n const parsed = this.definition.inputSchema.parse(input);\n const result = await this.run(parsed as TInput);\n return {\n content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],\n };\n } catch (err) {\n if (err instanceof LaneError) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(\n {\n error: err.code,\n message: err.message,\n suggestedAction: err.suggestedAction,\n retryable: err.retryable,\n },\n null,\n 2,\n ),\n },\n ],\n isError: true,\n };\n }\n\n const message = err instanceof Error ? err.message : String(err);\n return {\n content: [{ type: 'text', text: JSON.stringify({ error: 'tool_error', message }, null, 2) }],\n isError: true,\n };\n }\n }\n}\n","import { z } from 'zod';\nimport { LaneTool, type ToolDefinition } from '../tool.js';\n\nexport class WhoamiTool extends LaneTool<Record<string, never>> {\n get definition(): ToolDefinition {\n return {\n name: 'whoami',\n description: 'Get the authenticated developer profile. Returns email, plan, and member since date.',\n inputSchema: z.object({}),\n };\n }\n\n protected async run(): Promise<unknown> {\n return this.lane.auth.whoami();\n }\n}\n","import { z } from 'zod';\nimport { LaneTool, type ToolDefinition } from '../tool.js';\n\nconst inputSchema = z.object({\n walletId: z.string().optional().describe('Wallet ID. Uses default wallet if not provided.'),\n});\n\ntype Input = z.infer<typeof inputSchema>;\n\nexport class ListCardsTool extends LaneTool<Input> {\n get definition(): ToolDefinition {\n return {\n name: 'list_cards',\n description:\n 'List available payment cards. Returns last4 and brand only — never full card numbers. ' +\n 'Use this to check what payment methods are available before making a purchase.',\n inputSchema,\n };\n }\n\n protected async run(input: Input): Promise<unknown> {\n let walletId = input.walletId;\n if (!walletId) {\n const wallets = await this.lane.wallets.list({ limit: 1 });\n if (wallets.data.length === 0) {\n return { cards: [], message: 'No wallets found. Ask the developer to run `lane add-card`.' };\n }\n walletId = wallets.data[0]!.id;\n }\n const cards = await this.lane.wallets.listCards(walletId);\n return { cards };\n }\n}\n","import { z } from 'zod';\nimport { LaneTool, type ToolDefinition } from '../tool.js';\n\nconst inputSchema = z.object({\n cardId: z.string().optional().describe('Specific card ID to check balance for.'),\n});\n\ntype Input = z.infer<typeof inputSchema>;\n\nexport class CheckBalanceTool extends LaneTool<Input> {\n get definition(): ToolDefinition {\n return {\n name: 'check_balance',\n description:\n 'Check remaining spending budget and limits. Returns daily limit, weekly limit, ' +\n 'monthly limit, per-task limit, and how much has been spent today. ' +\n 'Always check balance before making a payment to avoid exceeding limits.',\n inputSchema,\n };\n }\n\n protected async run(_input: Input): Promise<unknown> {\n const [budget, spending] = await Promise.all([\n this.lane.admin.getBudget(),\n this.lane.admin.spending({ period: '1d' }),\n ]);\n\n return {\n spentToday: spending.total,\n currency: spending.currency,\n limits: {\n daily: budget.dailyLimit ?? null,\n weekly: budget.weeklyLimit ?? null,\n monthly: budget.monthlyLimit ?? null,\n perTask: budget.perTaskLimit ?? null,\n confirmationThreshold: budget.confirmationThreshold ?? null,\n },\n remaining: budget.dailyLimit\n ? { daily: budget.dailyLimit - spending.total }\n : null,\n };\n }\n}\n","import { z } from 'zod';\nimport { LaneTool, type ToolDefinition } from '../tool.js';\n\nconst inputSchema = z.object({\n amount: z.number().positive().describe('Payment amount in dollars (e.g. 20.00).'),\n currency: z.string().default('USD').describe('Currency code (default: USD).'),\n recipient: z.string().describe('Merchant or service to pay (e.g. \"replicate.com\").'),\n description: z.string().optional().describe('What this payment is for.'),\n idempotencyKey: z\n .string()\n .optional()\n .describe('Unique key to prevent duplicate charges on retry.'),\n});\n\ntype Input = z.infer<typeof inputSchema>;\n\nexport class PayTool extends LaneTool<Input> {\n get definition(): ToolDefinition {\n return {\n name: 'pay',\n description:\n 'Execute a payment to a merchant or service. The payment is routed through the best ' +\n 'available path (billing API, ACP, or VIC token). Amount is in dollars. ' +\n 'Always check_balance first to ensure the payment is within limits. ' +\n 'Provide an idempotencyKey to prevent double charges if you need to retry.',\n inputSchema,\n };\n }\n\n protected async run(input: Input): Promise<unknown> {\n const txn = await this.lane.pay.execute({\n recipient: input.recipient,\n amount: Math.round(input.amount * 100), // Convert dollars to cents\n currency: input.currency,\n description: input.description,\n idempotencyKey: input.idempotencyKey,\n });\n\n return {\n transactionId: txn.id,\n amount: txn.amount / 100, // Back to dollars for display\n currency: txn.currency,\n recipient: txn.recipient,\n status: txn.status,\n receiptUrl: txn.receiptUrl,\n testMode: txn.testMode,\n };\n }\n}\n","import { z } from 'zod';\nimport { LaneTool, type ToolDefinition } from '../tool.js';\n\nconst inputSchema = z.object({\n limit: z.number().int().min(1).max(100).default(10).describe('Number of transactions to return.'),\n offset: z.number().int().min(0).default(0).describe('Offset for pagination.'),\n cardId: z.string().optional().describe('Filter by specific card ID.'),\n});\n\ntype Input = z.infer<typeof inputSchema>;\n\nexport class ListTransactionsTool extends LaneTool<Input> {\n get definition(): ToolDefinition {\n return {\n name: 'list_transactions',\n description:\n 'List recent payment transactions. Shows amount, recipient, timestamp, status, and description. ' +\n 'Use this to review spending history or verify a payment was successful.',\n inputSchema,\n };\n }\n\n protected async run(input: Input): Promise<unknown> {\n const result = await this.lane.pay.listTransactions({\n limit: input.limit,\n offset: input.offset,\n cardId: input.cardId,\n });\n\n return {\n transactions: result.data.map((txn) => ({\n id: txn.id,\n amount: txn.amount / 100,\n currency: txn.currency,\n recipient: txn.recipient,\n description: txn.description,\n status: txn.status,\n testMode: txn.testMode,\n createdAt: txn.createdAt,\n })),\n total: result.total,\n limit: result.limit,\n offset: result.offset,\n };\n }\n}\n","import { z } from 'zod';\nimport { LaneTool, type ToolDefinition } from '../tool.js';\n\nconst inputSchema = z.object({\n query: z.string().describe('Search query (e.g. \"image resize API\", \"API credits\").'),\n type: z\n .enum(['skill', 'api', 'saas', 'opensource'])\n .optional()\n .describe('Filter by product type.'),\n limit: z.number().int().min(1).max(50).default(10).describe('Number of results.'),\n});\n\ntype Input = z.infer<typeof inputSchema>;\n\nexport class SearchProductsTool extends LaneTool<Input> {\n get definition(): ToolDefinition {\n return {\n name: 'search_products',\n description:\n 'Search the Lane product catalog for APIs, skills, SaaS, and open source tools. ' +\n 'Returns product name, description, pricing, and seller info. ' +\n 'Use this to find services the agent can purchase.',\n inputSchema,\n };\n }\n\n protected async run(input: Input): Promise<unknown> {\n const result = await this.lane.products.search({\n query: input.query,\n type: input.type,\n limit: input.limit,\n });\n\n return {\n products: result.data.map((p) => ({\n id: p.id,\n name: p.name,\n description: p.description,\n type: p.type,\n pricing: p.pricing,\n rating: p.rating,\n })),\n total: result.total,\n };\n }\n}\n","import { z } from 'zod';\nimport { LaneTool, type ToolDefinition } from '../tool.js';\n\nconst inputSchema = z.object({\n productId: z.string().describe('Product ID from search_products results.'),\n walletId: z.string().optional().describe('Wallet ID. Uses default if not provided.'),\n quantity: z.number().int().min(1).default(1).describe('Quantity to purchase.'),\n});\n\ntype Input = z.infer<typeof inputSchema>;\n\nexport class CheckoutTool extends LaneTool<Input> {\n get definition(): ToolDefinition {\n return {\n name: 'checkout',\n description:\n 'Purchase a product from the Lane catalog. Creates a checkout session and completes ' +\n 'payment in one step. Returns the order details including any API keys or endpoints. ' +\n 'Use search_products first to find the product ID.',\n inputSchema,\n };\n }\n\n protected async run(input: Input): Promise<unknown> {\n let walletId = input.walletId;\n if (!walletId) {\n const wallets = await this.lane.wallets.list({ limit: 1 });\n if (wallets.data.length === 0) {\n return {\n error: 'no_wallet',\n message: 'No wallet found. Ask the developer to run `lane add-card` first.',\n };\n }\n walletId = wallets.data[0]!.id;\n }\n\n // Create and immediately complete checkout\n const session = await this.lane.checkout.create({\n productId: input.productId,\n walletId,\n quantity: input.quantity,\n });\n\n const order = await this.lane.checkout.complete(session.id);\n\n return {\n orderId: order.id,\n productId: order.productId,\n amount: order.amount / 100,\n currency: order.currency,\n status: order.status,\n apiKey: order.apiKey,\n endpoint: order.endpoint,\n };\n }\n}\n","import { z } from 'zod';\nimport { LaneTool, type ToolDefinition } from '../tool.js';\n\nconst inputSchema = z.object({\n daily: z.number().positive().optional().describe('Daily spending limit in dollars.'),\n weekly: z.number().positive().optional().describe('Weekly spending limit in dollars.'),\n monthly: z.number().positive().optional().describe('Monthly spending limit in dollars.'),\n perTask: z.number().positive().optional().describe('Per-task spending limit in dollars.'),\n});\n\ntype Input = z.infer<typeof inputSchema>;\n\nexport class SetBudgetTool extends LaneTool<Input> {\n get definition(): ToolDefinition {\n return {\n name: 'set_budget',\n description:\n 'Set spending limits for agent payments. Amounts are in dollars. ' +\n 'Only the authenticated developer can change these limits. ' +\n 'The agent cannot exceed these limits when using the pay tool.',\n inputSchema,\n };\n }\n\n protected async run(input: Input): Promise<unknown> {\n const config = await this.lane.admin.setBudget({\n dailyLimit: input.daily ? Math.round(input.daily * 100) : undefined,\n weeklyLimit: input.weekly ? Math.round(input.weekly * 100) : undefined,\n monthlyLimit: input.monthly ? Math.round(input.monthly * 100) : undefined,\n perTaskLimit: input.perTask ? Math.round(input.perTask * 100) : undefined,\n });\n\n return {\n limits: {\n daily: config.dailyLimit ? config.dailyLimit / 100 : null,\n weekly: config.weeklyLimit ? config.weeklyLimit / 100 : null,\n monthly: config.monthlyLimit ? config.monthlyLimit / 100 : null,\n perTask: config.perTaskLimit ? config.perTaskLimit / 100 : null,\n },\n };\n }\n}\n","import { z } from 'zod';\nimport { LaneTool, type ToolDefinition } from '../tool.js';\n\nconst inputSchema = z.object({\n transactionId: z.string().describe('Transaction ID to refund.'),\n amount: z.number().positive().optional().describe('Refund amount in dollars. If omitted, full refund.'),\n reason: z.string().optional().describe('Reason for the refund.'),\n});\n\ntype Input = z.infer<typeof inputSchema>;\n\nexport class RequestRefundTool extends LaneTool<Input> {\n get definition(): ToolDefinition {\n return {\n name: 'request_refund',\n description:\n 'Request a refund for a previous transaction. Partial or full refunds are supported. ' +\n 'The developer may need to approve refunds above a certain threshold. ' +\n 'Use list_transactions to find the transaction ID.',\n inputSchema,\n };\n }\n\n protected async run(input: Input): Promise<unknown> {\n const refund = await this.lane.pay.refund({\n transactionId: input.transactionId,\n amount: input.amount ? Math.round(input.amount * 100) : undefined,\n reason: input.reason,\n });\n\n return {\n refundId: refund.id,\n transactionId: refund.transactionId,\n amount: refund.amount / 100,\n status: refund.status,\n reason: refund.reason,\n };\n }\n}\n","import { z } from 'zod';\nimport { LaneTool, type ToolDefinition } from '../tool.js';\n\nconst inputSchema = z.object({\n productId: z.string().describe('Product ID to subscribe to.'),\n plan: z.string().describe('Plan ID (e.g. \"pro\", \"starter\").'),\n parameters: z\n .record(z.string(), z.string())\n .optional()\n .describe('SCP selection parameters (e.g. custom_domain, webhook_url).'),\n});\n\ntype Input = z.infer<typeof inputSchema>;\n\nexport class SubscribeTool extends LaneTool<Input> {\n get definition(): ToolDefinition {\n return {\n name: 'subscribe',\n description:\n 'Subscribe to a software product. Creates a subscription with recurring billing ' +\n 'from the wallet. Returns subscription details including access credentials. ' +\n 'Use search_products first to find the product and plan IDs.',\n inputSchema,\n };\n }\n\n protected async run(input: Input): Promise<unknown> {\n const subscription = await this.lane.subscriptions.create({\n productId: input.productId,\n plan: input.plan,\n parameters: input.parameters,\n paymentSource: 'wallet',\n });\n\n return {\n subscriptionId: subscription.id,\n productId: subscription.productId,\n plan: subscription.plan,\n status: subscription.status,\n accessToken: subscription.accessToken,\n currentPeriodStart: subscription.currentPeriodStart,\n currentPeriodEnd: subscription.currentPeriodEnd,\n };\n }\n}\n","import { z } from 'zod';\nimport { LaneTool, type ToolDefinition } from '../tool.js';\n\nconst inputSchema = z.object({\n status: z\n .enum(['active', 'paused', 'canceled', 'past_due', 'trialing'])\n .optional()\n .describe('Filter by subscription status.'),\n limit: z.number().int().min(1).max(50).default(20).describe('Number of results.'),\n});\n\ntype Input = z.infer<typeof inputSchema>;\n\nexport class ListSubscriptionsTool extends LaneTool<Input> {\n get definition(): ToolDefinition {\n return {\n name: 'list_subscriptions',\n description:\n 'List active subscriptions for the current wallet. Returns subscription details ' +\n 'including product ID, plan, status, and billing period. ' +\n 'Use this to check what software products the agent is currently subscribed to.',\n inputSchema,\n };\n }\n\n protected async run(input: Input): Promise<unknown> {\n const result = await this.lane.subscriptions.list({\n status: input.status,\n limit: input.limit,\n });\n\n return {\n subscriptions: result.data.map((s) => ({\n id: s.id,\n productId: s.productId,\n plan: s.plan,\n status: s.status,\n currentPeriodStart: s.currentPeriodStart,\n currentPeriodEnd: s.currentPeriodEnd,\n })),\n total: result.total,\n };\n }\n}\n","import { z } from 'zod';\nimport { LaneTool, type ToolDefinition } from '../tool.js';\n\nconst inputSchema = z.object({\n query: z.string().describe('Search query (e.g. \"monitoring API\", \"email service\").'),\n type: z\n .enum(['software', 'skill', 'oss'])\n .optional()\n .describe('Filter by software type. Defaults to all software types.'),\n pricingModel: z\n .enum(['fixed', 'subscription', 'consumption'])\n .optional()\n .describe('Filter by pricing model.'),\n limit: z.number().int().min(1).max(50).default(10).describe('Number of results.'),\n});\n\ntype Input = z.infer<typeof inputSchema>;\n\nexport class SearchSoftwareTool extends LaneTool<Input> {\n get definition(): ToolDefinition {\n return {\n name: 'search_software',\n description:\n 'Search for software products, SaaS tools, skills, and open source tools in the Lane catalog. ' +\n 'Returns product details including SCP manifests, pricing, and plans. ' +\n 'More targeted than search_products — focuses on software and subscribable products.',\n inputSchema,\n };\n }\n\n protected async run(input: Input): Promise<unknown> {\n // Map software-specific types to the product search type\n const typeMap: Record<string, 'skill' | 'api' | 'saas' | 'opensource'> = {\n software: 'saas',\n skill: 'skill',\n oss: 'opensource',\n };\n\n const result = await this.lane.products.search({\n query: input.query,\n type: input.type ? typeMap[input.type] : undefined,\n limit: input.limit,\n });\n\n return {\n products: result.data.map((p) => ({\n id: p.id,\n name: p.name,\n description: p.description,\n type: p.type,\n pricing: p.pricing,\n rating: p.rating,\n })),\n total: result.total,\n };\n }\n}\n","import { z } from 'zod';\nimport { LaneTool, type ToolDefinition } from '../tool.js';\n\nconst inputSchema = z.object({\n subscriptionId: z.string().describe('Subscription ID to cancel.'),\n});\n\ntype Input = z.infer<typeof inputSchema>;\n\nexport class CancelSubscriptionTool extends LaneTool<Input> {\n get definition(): ToolDefinition {\n return {\n name: 'cancel_subscription',\n description:\n 'Cancel an active subscription. The subscription will remain active until the end ' +\n 'of the current billing period. Use list_subscriptions first to find the subscription ID.',\n inputSchema,\n };\n }\n\n protected async run(input: Input): Promise<unknown> {\n const subscription = await this.lane.subscriptions.cancel(input.subscriptionId);\n\n return {\n subscriptionId: subscription.id,\n productId: subscription.productId,\n plan: subscription.plan,\n status: subscription.status,\n canceledAt: subscription.canceledAt,\n currentPeriodEnd: subscription.currentPeriodEnd,\n };\n }\n}\n","// ---------------------------------------------------------------------------\n// MCP Tool — Discover Merchants\n// ---------------------------------------------------------------------------\n\nimport { z } from 'zod';\nimport { LaneTool } from '../tool.js';\nimport type { ToolDefinition } from '../tool.js';\n\nconst inputSchema = z.object({\n query: z.string().optional().describe('Search query to find merchants by name or description.'),\n merchantType: z\n .enum(['ecommerce', 'software', 'api', 'saas', 'skill', 'service'])\n .optional()\n .describe('Filter by merchant type.'),\n vertical: z.string().optional().describe('Filter by vertical (e.g. \"fashion\", \"electronics\", \"developer_tools\").'),\n subcategory: z.string().optional().describe('Filter by subcategory (e.g. \"shoes\", \"laptops\", \"hosting\").'),\n tier: z\n .enum(['lane_onboarded', 'protocol'])\n .optional()\n .describe('Filter by tier: lane_onboarded (full checkout) or protocol (ACP/UCP).'),\n limit: z.number().int().min(1).max(50).optional().default(10).describe('Max results to return (default 10).'),\n});\n\ntype Input = z.infer<typeof inputSchema>;\n\nexport class DiscoverMerchantsTool extends LaneTool<Input> {\n get definition(): ToolDefinition {\n return {\n name: 'discover_merchants',\n description:\n 'Search the Lane merchant directory to find AI-shoppable merchants. ' +\n 'Filter by type (ecommerce, software, api, saas, skill, service), ' +\n 'vertical (fashion, electronics, developer_tools, etc.), ' +\n 'subcategory (shoes, laptops, hosting, etc.), or free-text query. ' +\n 'Returns merchant name, domain, capabilities, and supported protocols.',\n inputSchema,\n };\n }\n\n protected async run(input: Input): Promise<unknown> {\n const result = await this.lane.merchants.list({\n query: input.query,\n merchantType: input.merchantType,\n vertical: input.vertical,\n subcategory: input.subcategory,\n tier: input.tier,\n limit: input.limit,\n });\n\n return {\n merchants: result.data.map((m) => ({\n name: m.name,\n slug: m.slug,\n domain: m.domain,\n description: m.description,\n tier: m.tier,\n merchantType: m.merchantType,\n vertical: m.vertical,\n subcategories: m.subcategories,\n protocols: m.protocols,\n capabilities: m.capabilities,\n productCount: m.productCount,\n })),\n total: result.total,\n showing: result.data.length,\n };\n }\n}\n","// ---------------------------------------------------------------------------\n// Lane MCP Server\n// ---------------------------------------------------------------------------\n// Registers all Lane tools with the @modelcontextprotocol/sdk McpServer.\n// Provides a single entry point for stdio and HTTP transports.\n// ---------------------------------------------------------------------------\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { Lane } from '../lane.js';\nimport type { LaneTool } from './tool.js';\n\nimport { WhoamiTool } from './tools/whoami.js';\nimport { ListCardsTool } from './tools/list-cards.js';\nimport { CheckBalanceTool } from './tools/check-balance.js';\nimport { PayTool } from './tools/pay.js';\nimport { ListTransactionsTool } from './tools/list-transactions.js';\nimport { SearchProductsTool } from './tools/search-products.js';\nimport { CheckoutTool } from './tools/checkout.js';\nimport { SetBudgetTool } from './tools/set-budget.js';\nimport { RequestRefundTool } from './tools/request-refund.js';\nimport { SubscribeTool } from './tools/subscribe.js';\nimport { ListSubscriptionsTool } from './tools/list-subscriptions.js';\nimport { SearchSoftwareTool } from './tools/search-software.js';\nimport { CancelSubscriptionTool } from './tools/cancel-subscription.js';\nimport { DiscoverMerchantsTool } from './tools/discover-merchants.js';\n\nexport interface LaneMCPServerOptions {\n /** Override the server name shown to clients. */\n name?: string;\n /** Override the server version shown to clients. */\n version?: string;\n}\n\n/**\n * LaneMCPServer wraps @modelcontextprotocol/sdk McpServer and registers\n * all Lane agent tools. Connect it to any MCP transport (stdio, HTTP, etc.).\n */\nexport class LaneMCPServer {\n readonly mcp: McpServer;\n private readonly tools: LaneTool[];\n\n constructor(\n private readonly lane: Lane,\n options: LaneMCPServerOptions = {},\n ) {\n this.mcp = new McpServer(\n {\n name: options.name ?? 'lane',\n version: options.version ?? '0.1.0',\n },\n {\n capabilities: {\n tools: {},\n },\n },\n );\n\n this.tools = [\n new WhoamiTool(lane),\n new ListCardsTool(lane),\n new CheckBalanceTool(lane),\n new PayTool(lane),\n new ListTransactionsTool(lane),\n new SearchProductsTool(lane),\n new CheckoutTool(lane),\n new SetBudgetTool(lane),\n new RequestRefundTool(lane),\n new SubscribeTool(lane),\n new ListSubscriptionsTool(lane),\n new SearchSoftwareTool(lane),\n new CancelSubscriptionTool(lane),\n new DiscoverMerchantsTool(lane),\n ];\n\n this.registerTools();\n }\n\n private registerTools(): void {\n for (const tool of this.tools) {\n const def = tool.definition;\n\n // registerTool expects inputSchema as a zod schema (v3 or v4).\n // Cast to any to bypass generic constraints; the MCP SDK will\n // introspect the zod schema to generate JSON Schema for clients.\n (this.mcp as any).registerTool(\n def.name,\n { description: def.description, inputSchema: def.inputSchema },\n async (args: Record<string, unknown>) => {\n const result = await tool.execute(args);\n return { ...result } as Record<string, unknown>;\n },\n );\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// VGS — OAuth Token Management\n// ---------------------------------------------------------------------------\n// Manages VGS vault access tokens for outbound proxy requests.\n// Tokens are cached and refreshed automatically before expiry.\n// ---------------------------------------------------------------------------\n\nimport { LaneAuthError } from '../errors.js';\n\nexport interface VGSTokenConfig {\n /** VGS vault ID (e.g., tntxxxxxxxx). */\n vaultId: string;\n /** VGS service account client ID. */\n clientId: string;\n /** VGS service account client secret. */\n clientSecret: string;\n /** VGS environment: 'sandbox' | 'live'. */\n environment: 'sandbox' | 'live';\n}\n\ninterface CachedToken {\n accessToken: string;\n expiresAt: number;\n}\n\nconst TOKEN_REFRESH_MARGIN_MS = 60_000; // Refresh 1 minute before expiry\n\n/**\n * VGSTokenManager handles OAuth2 client_credentials flow for VGS vault access.\n * Tokens are cached and auto-refreshed before expiry.\n */\nexport class VGSTokenManager {\n private cached: CachedToken | null = null;\n\n constructor(private readonly config: VGSTokenConfig) {}\n\n /**\n * Get a valid access token, refreshing if expired or near-expiry.\n */\n async getAccessToken(): Promise<string> {\n if (this.cached && Date.now() < this.cached.expiresAt - TOKEN_REFRESH_MARGIN_MS) {\n return this.cached.accessToken;\n }\n return this.refresh();\n }\n\n /**\n * Force-refresh the token.\n */\n async refresh(): Promise<string> {\n const tokenUrl = this.getTokenUrl();\n const body = new URLSearchParams({\n grant_type: 'client_credentials',\n client_id: this.config.clientId,\n client_secret: this.config.clientSecret,\n });\n\n const response = await fetch(tokenUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: body.toString(),\n });\n\n if (!response.ok) {\n throw LaneAuthError.invalidApiKey(\n `VGS token exchange failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const data = (await response.json()) as {\n access_token: string;\n expires_in: number;\n token_type: string;\n };\n\n this.cached = {\n accessToken: data.access_token,\n expiresAt: Date.now() + data.expires_in * 1000,\n };\n\n return this.cached.accessToken;\n }\n\n /**\n * Invalidate the cached token.\n */\n invalidate(): void {\n this.cached = null;\n }\n\n private getTokenUrl(): string {\n const env = this.config.environment === 'live' ? 'live' : 'sandbox';\n return `https://auth.verygoodsecurity.com/vaults/${this.config.vaultId}/tokens?env=${env}`;\n }\n}\n","// ---------------------------------------------------------------------------\n// VGS — Outbound Proxy\n// ---------------------------------------------------------------------------\n// Routes sensitive card data through VGS outbound proxy so that PANs are\n// only revealed to PSP endpoints. Lane never sees or stores raw card numbers.\n//\n// PCI DSS Compliance:\n// - All card data stored as VGS aliases (format-preserving tokens)\n// - Outbound proxy reveals PANs only to whitelisted PSP endpoints\n// - Lane servers remain out of PCI scope\n// ---------------------------------------------------------------------------\n\nimport { VGSTokenManager, type VGSTokenConfig } from './token.js';\nimport { LanePaymentError } from '../errors.js';\n\nexport interface VGSProxyConfig extends VGSTokenConfig {\n /** Outbound route ID for PSP-bound requests. */\n routeId: string;\n}\n\nexport interface ProxyRequest {\n /** Target PSP endpoint URL. */\n url: string;\n /** HTTP method. */\n method: 'POST' | 'PUT' | 'PATCH';\n /** Request headers (Authorization, Content-Type, etc.). */\n headers: Record<string, string>;\n /** Request body containing VGS aliases that will be revealed by the proxy. */\n body: unknown;\n}\n\nexport interface ProxyResponse {\n status: number;\n headers: Record<string, string>;\n body: unknown;\n}\n\n/**\n * VGSOutboundProxy routes requests through VGS so that aliased card data\n * is revealed only to whitelisted PSP endpoints.\n */\nexport class VGSOutboundProxy {\n private readonly tokenManager: VGSTokenManager;\n\n constructor(private readonly config: VGSProxyConfig) {\n this.tokenManager = new VGSTokenManager(config);\n }\n\n /**\n * Send a request through the VGS outbound proxy.\n * VGS aliases in the body are de-tokenized and revealed to the target PSP.\n */\n async forward(request: ProxyRequest): Promise<ProxyResponse> {\n const accessToken = await this.tokenManager.getAccessToken();\n const proxyUrl = this.getProxyUrl();\n\n const response = await fetch(proxyUrl, {\n method: request.method,\n headers: {\n ...request.headers,\n 'Authorization': `Bearer ${accessToken}`,\n 'X-VGS-Route-Id': this.config.routeId,\n 'X-VGS-Upstream-Url': request.url,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(request.body),\n });\n\n const responseBody = await response.json().catch(() => null);\n\n if (!response.ok) {\n throw new LanePaymentError(\n `VGS proxy request failed: ${response.status}`,\n {\n code: 'vgs_proxy_error',\n statusCode: response.status,\n retryable: response.status >= 500,\n suggestedAction: 'Check VGS vault configuration and PSP endpoint whitelist.',\n },\n );\n }\n\n const responseHeaders: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n\n return {\n status: response.status,\n headers: responseHeaders,\n body: responseBody,\n };\n }\n\n /**\n * Invalidate the cached VGS access token.\n */\n invalidateToken(): void {\n this.tokenManager.invalidate();\n }\n\n private getProxyUrl(): string {\n const env = this.config.environment === 'live' ? 'live' : 'sandbox';\n return `https://${this.config.vaultId}.${env}.verygoodproxy.com`;\n }\n}\n","// ---------------------------------------------------------------------------\n// VGS — Card Brand Detection and BIN Utilities\n// ---------------------------------------------------------------------------\n\nexport type CardBrand =\n | 'visa'\n | 'mastercard'\n | 'amex'\n | 'discover'\n | 'diners'\n | 'jcb'\n | 'unionpay'\n | 'unknown';\n\ninterface BINRange {\n brand: CardBrand;\n prefixes: string[];\n lengths: number[];\n}\n\nconst BIN_RANGES: BINRange[] = [\n { brand: 'visa', prefixes: ['4'], lengths: [13, 16, 19] },\n { brand: 'mastercard', prefixes: ['51', '52', '53', '54', '55', '2221', '2720'], lengths: [16] },\n { brand: 'amex', prefixes: ['34', '37'], lengths: [15] },\n { brand: 'discover', prefixes: ['6011', '644', '645', '646', '647', '648', '649', '65'], lengths: [16, 19] },\n { brand: 'diners', prefixes: ['300', '301', '302', '303', '304', '305', '36', '38'], lengths: [14, 16] },\n { brand: 'jcb', prefixes: ['3528', '3589'], lengths: [16, 17, 18, 19] },\n { brand: 'unionpay', prefixes: ['62', '81'], lengths: [16, 17, 18, 19] },\n];\n\n/**\n * Detect card brand from a card number or VGS alias token.\n * Only uses the BIN (first 6-8 digits) — safe to call with tokenized values\n * as long as the BIN prefix is preserved (VGS format-preserving tokens).\n */\nexport function detectCardBrand(cardNumber: string): CardBrand {\n const digits = cardNumber.replace(/\\D/g, '');\n\n for (const range of BIN_RANGES) {\n for (const prefix of range.prefixes) {\n if (digits.startsWith(prefix)) {\n return range.brand;\n }\n }\n }\n\n return 'unknown';\n}\n\n/**\n * Validate a card number using the Luhn algorithm.\n * NOTE: Only works with real PANs — NOT VGS aliases.\n * This is used only in test mode or client-side pre-validation.\n */\nexport function luhnCheck(cardNumber: string): boolean {\n const digits = cardNumber.replace(/\\D/g, '');\n if (digits.length < 12 || digits.length > 19) return false;\n\n let sum = 0;\n let alternate = false;\n\n for (let i = digits.length - 1; i >= 0; i--) {\n let n = parseInt(digits[i]!, 10);\n if (alternate) {\n n *= 2;\n if (n > 9) n -= 9;\n }\n sum += n;\n alternate = !alternate;\n }\n\n return sum % 10 === 0;\n}\n\n/**\n * Mask a card number, showing only the last 4 digits.\n * Works with both real PANs and VGS aliases.\n */\nexport function maskCardNumber(cardNumber: string): string {\n const digits = cardNumber.replace(/\\D/g, '');\n if (digits.length < 4) return '****';\n return `****${digits.slice(-4)}`;\n}\n","// ---------------------------------------------------------------------------\n// VGS Collect — Card Entry Page Generator\n// ---------------------------------------------------------------------------\n// Generates the HTML page served during `lane add-card`.\n// The page loads VGS Collect.js which creates secure iframes for\n// PAN/CVV/expiry entry. Card data goes directly to VGS vault — Lane\n// never sees, stores, or transmits raw card numbers.\n//\n// PCI DSS: This is the ONE browser moment in the flow. VGS Collect is\n// PCI Level 1 certified. The iframe fields are hosted on VGS's domain.\n// ---------------------------------------------------------------------------\n\nexport interface VGSCollectConfig {\n /** VGS vault ID. */\n vaultId: string;\n /** VGS environment. */\n environment: 'sandbox' | 'live';\n /** VGS route ID for inbound collection. */\n routeId: string;\n /** Callback URL after successful tokenization. */\n callbackUrl: string;\n /** Lane developer ID (for associating the card). */\n developerId: string;\n}\n\n/**\n * Generate the VGS Collect HTML page for secure card entry.\n * The page:\n * 1. Loads VGS Collect.js from VGS CDN\n * 2. Creates secure iframe fields for card number, CVV, expiry\n * 3. On submit, sends card data directly to VGS vault\n * 4. VGS returns aliases (tok_xxx) — Lane stores only the alias\n * 5. Redirects to callbackUrl with the alias + last4 + brand\n */\nexport function generateCollectPage(config: VGSCollectConfig): string {\n const vgsEnv = config.environment === 'live' ? 'live' : 'sandbox';\n const vgsUrl = `https://${config.vaultId}.${vgsEnv}.verygoodproxy.com`;\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Lane — Add Payment Method</title>\n <script src=\"https://js.verygoodvault.com/vgs-collect/2.18.0/vgs-collect.js\"></script>\n <style>\n * { box-sizing: border-box; margin: 0; padding: 0; }\n body {\n font-family: 'At Aero', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n background: #0A0A0A;\n color: #FFFFFF;\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 100vh;\n }\n .container {\n width: 100%;\n max-width: 440px;\n padding: 40px 32px;\n background: #141414;\n border: 1px solid #2A2A2A;\n border-radius: 16px;\n }\n .logo {\n font-size: 24px;\n font-weight: 700;\n color: #1201FF;\n letter-spacing: -0.5px;\n margin-bottom: 8px;\n }\n .subtitle {\n color: #888;\n font-size: 14px;\n margin-bottom: 32px;\n }\n .field-group {\n margin-bottom: 20px;\n }\n .field-group label {\n display: block;\n font-size: 12px;\n font-weight: 600;\n color: #888;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 8px;\n }\n .field-wrapper {\n background: #1A1A1A;\n border: 1px solid #333;\n border-radius: 8px;\n padding: 0;\n height: 48px;\n transition: border-color 0.2s;\n }\n .field-wrapper:focus-within {\n border-color: #1201FF;\n }\n .field-wrapper iframe {\n height: 48px !important;\n }\n .row {\n display: flex;\n gap: 12px;\n }\n .row .field-group {\n flex: 1;\n }\n .submit-btn {\n width: 100%;\n height: 48px;\n background: #1201FF;\n color: #FFFFFF;\n border: none;\n border-radius: 8px;\n font-size: 16px;\n font-weight: 600;\n cursor: pointer;\n margin-top: 24px;\n transition: background 0.2s;\n }\n .submit-btn:hover { background: #0E01CC; }\n .submit-btn:disabled {\n background: #333;\n cursor: not-allowed;\n }\n .security-note {\n text-align: center;\n margin-top: 16px;\n font-size: 12px;\n color: #555;\n }\n .security-note svg {\n vertical-align: middle;\n margin-right: 4px;\n }\n .error-msg {\n color: #FF4444;\n font-size: 13px;\n margin-top: 8px;\n display: none;\n }\n .success-container {\n text-align: center;\n display: none;\n }\n .success-container .check {\n font-size: 48px;\n margin-bottom: 16px;\n }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div id=\"form-view\">\n <div class=\"logo\">Lane</div>\n <div class=\"subtitle\">Add a payment method. Your card data goes directly to our PCI Level 1 vault.</div>\n\n <form id=\"card-form\">\n <div class=\"field-group\">\n <label>Card Number</label>\n <div id=\"cc-number\" class=\"field-wrapper\"></div>\n </div>\n\n <div class=\"row\">\n <div class=\"field-group\">\n <label>Expiry</label>\n <div id=\"cc-expiry\" class=\"field-wrapper\"></div>\n </div>\n <div class=\"field-group\">\n <label>CVC</label>\n <div id=\"cc-cvc\" class=\"field-wrapper\"></div>\n </div>\n </div>\n\n <div class=\"field-group\">\n <label>Cardholder Name</label>\n <div id=\"cc-name\" class=\"field-wrapper\"></div>\n </div>\n\n <div id=\"error-msg\" class=\"error-msg\"></div>\n\n <button type=\"submit\" id=\"submit-btn\" class=\"submit-btn\" disabled>\n Add Card\n </button>\n </form>\n\n <div class=\"security-note\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"#555\"><path d=\"M6 1a3 3 0 0 0-3 3v1H2.5A.5.5 0 0 0 2 5.5v5a.5.5 0 0 0 .5.5h7a.5.5 0 0 0 .5-.5v-5A.5.5 0 0 0 9.5 5H9V4a3 3 0 0 0-3-3zm2 4H4V4a2 2 0 1 1 4 0v1z\"/></svg>\n Secured by VGS. Lane never sees your card number.\n </div>\n </div>\n\n <div id=\"success-view\" class=\"success-container\">\n <div class=\"check\">✓</div>\n <div class=\"logo\">Card Added</div>\n <div class=\"subtitle\">You can close this window and return to your terminal.</div>\n </div>\n </div>\n\n <script>\n const form = VGSCollect.create('${config.vaultId}', '${vgsEnv}', function(state) {});\n const css = {\n 'font-family': '\"JetBrains Mono\", monospace',\n 'font-size': '16px',\n 'color': '#FFFFFF',\n 'padding': '12px 16px',\n '&::placeholder': { color: '#555' },\n };\n\n form.field('#cc-number', {\n type: 'card-number',\n name: 'card_number',\n placeholder: '4242 4242 4242 4242',\n validations: ['required', 'validCardNumber'],\n css: css,\n });\n\n form.field('#cc-expiry', {\n type: 'card-expiration-date',\n name: 'card_exp',\n placeholder: 'MM / YY',\n validations: ['required', 'validCardExpirationDate'],\n css: css,\n });\n\n form.field('#cc-cvc', {\n type: 'card-security-code',\n name: 'card_cvc',\n placeholder: 'CVC',\n validations: ['required', 'validCardSecurityCode'],\n css: css,\n });\n\n form.field('#cc-name', {\n type: 'text',\n name: 'card_name',\n placeholder: 'Name on card',\n validations: ['required'],\n css: css,\n });\n\n // Enable submit when all fields are valid\n let fieldStates = {};\n form.on('change', function(state) {\n fieldStates = state;\n const allValid = Object.values(state).every(function(f) { return f.isValid; });\n document.getElementById('submit-btn').disabled = !allValid;\n });\n\n document.getElementById('card-form').addEventListener('submit', function(e) {\n e.preventDefault();\n var btn = document.getElementById('submit-btn');\n btn.disabled = true;\n btn.textContent = 'Processing...';\n document.getElementById('error-msg').style.display = 'none';\n\n form.submit(\n '/post',\n {\n headers: { 'Content-Type': 'application/json' },\n data: function(fields) {\n return {\n card_number: fields.card_number,\n card_exp: fields.card_exp,\n card_cvc: fields.card_cvc,\n card_name: fields.card_name,\n developer_id: '${config.developerId}',\n };\n },\n },\n function(status, data) {\n if (status >= 200 && status < 300) {\n document.getElementById('form-view').style.display = 'none';\n document.getElementById('success-view').style.display = 'block';\n // Notify callback\n fetch('${config.callbackUrl}', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n alias: data.card_number,\n last4: data.last4 || 'xxxx',\n brand: data.brand || 'unknown',\n }),\n });\n } else {\n var errEl = document.getElementById('error-msg');\n errEl.textContent = 'Card could not be saved. Please check your details and try again.';\n errEl.style.display = 'block';\n btn.disabled = false;\n btn.textContent = 'Add Card';\n }\n },\n function(errors) {\n var errEl = document.getElementById('error-msg');\n errEl.textContent = 'Validation failed. Please check all fields.';\n errEl.style.display = 'block';\n btn.disabled = false;\n btn.textContent = 'Add Card';\n }\n );\n });\n </script>\n</body>\n</html>`;\n}\n","// ---------------------------------------------------------------------------\n// PSP Adapter — Registry\n// ---------------------------------------------------------------------------\n// Central registry for payment service provider adapters.\n// Supports dynamic registration and priority-based selection.\n// ---------------------------------------------------------------------------\n\nimport type { PSPAdapter, PSPName } from './types.js';\n\n/**\n * PSPRegistry manages available payment processor adapters.\n *\n * The payment engine queries the registry to find the best adapter\n * for a given transaction based on priority, card brand support,\n * and availability.\n */\nexport class PSPRegistry {\n private adapters = new Map<PSPName, { adapter: PSPAdapter; priority: number }>();\n\n /**\n * Register an adapter with a priority (lower = higher priority).\n */\n register(adapter: PSPAdapter, priority: number = 100): void {\n this.adapters.set(adapter.name, { adapter, priority });\n }\n\n /**\n * Remove an adapter from the registry.\n */\n unregister(name: PSPName): void {\n this.adapters.delete(name);\n }\n\n /**\n * Get a specific adapter by name.\n */\n get(name: PSPName): PSPAdapter | undefined {\n return this.adapters.get(name)?.adapter;\n }\n\n /**\n * Get the highest-priority adapter (lowest priority number).\n * Optionally exclude specific adapters (e.g., after a failure).\n */\n getPrimary(exclude?: Set<PSPName>): PSPAdapter | undefined {\n let best: { adapter: PSPAdapter; priority: number } | undefined;\n\n for (const [name, entry] of this.adapters) {\n if (exclude?.has(name)) continue;\n if (!best || entry.priority < best.priority) {\n best = entry;\n }\n }\n\n return best?.adapter;\n }\n\n /**\n * Get all registered adapters sorted by priority.\n */\n getAll(): PSPAdapter[] {\n return Array.from(this.adapters.values())\n .sort((a, b) => a.priority - b.priority)\n .map((entry) => entry.adapter);\n }\n\n /**\n * Run health checks on all adapters. Returns names of healthy adapters.\n */\n async healthCheckAll(): Promise<PSPName[]> {\n const results = await Promise.allSettled(\n Array.from(this.adapters.entries()).map(async ([name, { adapter }]) => {\n const ok = await adapter.healthCheck();\n return ok ? name : null;\n }),\n );\n\n return results\n .filter((r): r is PromiseFulfilledResult<PSPName> => r.status === 'fulfilled' && r.value !== null)\n .map((r) => r.value);\n }\n}\n","// ---------------------------------------------------------------------------\n// PSP Adapter — Stripe\n// ---------------------------------------------------------------------------\n// Sends charges through VGS outbound proxy to Stripe's API.\n// Card aliases are de-tokenized by VGS before reaching Stripe.\n// ---------------------------------------------------------------------------\n\nimport type { VGSOutboundProxy } from '../../vgs/proxy.js';\nimport type { PSPAdapter, PSPChargeParams, PSPChargeResult, PSPRefundParams, PSPRefundResult } from '../types.js';\n\nexport interface StripeAdapterConfig {\n /** Stripe secret key (sk_live_... or sk_test_...). */\n secretKey: string;\n /** VGS outbound proxy instance. */\n proxy: VGSOutboundProxy;\n /** Stripe API version. */\n apiVersion?: string;\n}\n\nexport class StripeAdapter implements PSPAdapter {\n readonly name = 'stripe' as const;\n private readonly config: StripeAdapterConfig;\n\n constructor(config: StripeAdapterConfig) {\n this.config = config;\n }\n\n async charge(params: PSPChargeParams): Promise<PSPChargeResult> {\n const body = {\n amount: params.amount,\n currency: params.currency.toLowerCase(),\n source: {\n object: 'card',\n number: params.cardAlias, // VGS reveals this to Stripe\n exp_month: params.expMonth,\n exp_year: params.expYear,\n cvc: params.cvvAlias,\n },\n description: params.merchantDescriptor,\n metadata: params.metadata ?? {},\n };\n\n const response = await this.config.proxy.forward({\n url: 'https://api.stripe.com/v1/charges',\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.config.secretKey}`,\n 'Stripe-Version': this.config.apiVersion ?? '2024-12-18.acacia',\n ...(params.idempotencyKey ? { 'Idempotency-Key': params.idempotencyKey } : {}),\n },\n body,\n });\n\n const data = response.body as Record<string, unknown>;\n const status = data['status'] === 'succeeded' ? 'succeeded' : data['status'] === 'pending' ? 'pending' : 'failed';\n\n return {\n pspTransactionId: String(data['id'] ?? ''),\n status,\n authorizationCode: data['authorization_code'] as string | undefined,\n declineReason: status === 'failed' ? String(data['failure_message'] ?? 'unknown') : undefined,\n rawResponse: data,\n };\n }\n\n async refund(params: PSPRefundParams): Promise<PSPRefundResult> {\n const body: Record<string, unknown> = {\n charge: params.pspTransactionId,\n ...(params.amount !== undefined ? { amount: params.amount } : {}),\n ...(params.reason ? { reason: params.reason } : {}),\n };\n\n const response = await this.config.proxy.forward({\n url: 'https://api.stripe.com/v1/refunds',\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.config.secretKey}`,\n 'Stripe-Version': this.config.apiVersion ?? '2024-12-18.acacia',\n ...(params.idempotencyKey ? { 'Idempotency-Key': params.idempotencyKey } : {}),\n },\n body,\n });\n\n const data = response.body as Record<string, unknown>;\n const status = data['status'] === 'succeeded' ? 'succeeded' : data['status'] === 'pending' ? 'pending' : 'failed';\n\n return {\n pspRefundId: String(data['id'] ?? ''),\n status,\n amount: Number(data['amount'] ?? 0),\n rawResponse: data,\n };\n }\n\n async healthCheck(): Promise<boolean> {\n try {\n const response = await fetch('https://api.stripe.com/v1/balance', {\n headers: { 'Authorization': `Bearer ${this.config.secretKey}` },\n });\n return response.ok;\n } catch {\n return false;\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// PSP Adapter — Worldpay\n// ---------------------------------------------------------------------------\n// Sends charges through VGS outbound proxy to Worldpay's API.\n// ---------------------------------------------------------------------------\n\nimport type { VGSOutboundProxy } from '../../vgs/proxy.js';\nimport type { PSPAdapter, PSPChargeParams, PSPChargeResult, PSPRefundParams, PSPRefundResult } from '../types.js';\n\nexport interface WorldpayAdapterConfig {\n /** Worldpay merchant ID. */\n merchantId: string;\n /** Worldpay API key. */\n apiKey: string;\n /** Worldpay API endpoint. */\n baseUrl: string;\n /** VGS outbound proxy instance. */\n proxy: VGSOutboundProxy;\n}\n\nexport class WorldpayAdapter implements PSPAdapter {\n readonly name = 'worldpay' as const;\n private readonly config: WorldpayAdapterConfig;\n\n constructor(config: WorldpayAdapterConfig) {\n this.config = config;\n }\n\n async charge(params: PSPChargeParams): Promise<PSPChargeResult> {\n const body = {\n transactionType: 'sale',\n amount: {\n value: params.amount,\n currencyCode: params.currency.toUpperCase(),\n },\n paymentInstrument: {\n type: 'card/plain',\n cardNumber: params.cardAlias, // VGS reveals to Worldpay\n expiryDate: {\n month: params.expMonth,\n year: params.expYear,\n },\n cvc: params.cvvAlias,\n },\n merchant: {\n entity: this.config.merchantId,\n },\n narrative: {\n line1: params.merchantDescriptor,\n },\n };\n\n const response = await this.config.proxy.forward({\n url: `${this.config.baseUrl}/payments/authorizations`,\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.config.apiKey}`,\n ...(params.idempotencyKey ? { 'Idempotency-Key': params.idempotencyKey } : {}),\n },\n body,\n });\n\n const data = response.body as Record<string, unknown>;\n const outcome = data['outcome'] as string | undefined;\n const status = outcome === 'approved' ? 'succeeded' : outcome === 'pending' ? 'pending' : 'failed';\n\n return {\n pspTransactionId: String(data['_links'] && (data['_links'] as Record<string, unknown>)['self'] || ''),\n status,\n authorizationCode: data['authorizationCode'] as string | undefined,\n declineReason: status === 'failed' ? String(data['description'] ?? 'declined') : undefined,\n rawResponse: data,\n };\n }\n\n async refund(params: PSPRefundParams): Promise<PSPRefundResult> {\n const body: Record<string, unknown> = {\n ...(params.amount !== undefined\n ? { value: { amount: params.amount, currencyCode: 'USD' } }\n : {}),\n ...(params.reason ? { reference: params.reason } : {}),\n };\n\n const response = await this.config.proxy.forward({\n url: `${this.config.baseUrl}/payments/${params.pspTransactionId}/refunds`,\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.config.apiKey}`,\n ...(params.idempotencyKey ? { 'Idempotency-Key': params.idempotencyKey } : {}),\n },\n body,\n });\n\n const data = response.body as Record<string, unknown>;\n\n return {\n pspRefundId: String(data['refundId'] ?? ''),\n status: 'succeeded',\n amount: params.amount ?? 0,\n rawResponse: data,\n };\n }\n\n async healthCheck(): Promise<boolean> {\n try {\n const response = await fetch(`${this.config.baseUrl}/health`, {\n headers: { 'Authorization': `Bearer ${this.config.apiKey}` },\n });\n return response.ok;\n } catch {\n return false;\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// PSP Adapter — CyberSource\n// ---------------------------------------------------------------------------\n// Sends charges through VGS outbound proxy to CyberSource's API.\n// Supports VIC network tokens with cryptogram.\n// ---------------------------------------------------------------------------\n\nimport type { VGSOutboundProxy } from '../../vgs/proxy.js';\nimport type { PSPAdapter, PSPChargeParams, PSPChargeResult, PSPRefundParams, PSPRefundResult } from '../types.js';\n\nexport interface CyberSourceAdapterConfig {\n /** CyberSource merchant ID. */\n merchantId: string;\n /** CyberSource API key ID. */\n apiKeyId: string;\n /** CyberSource shared secret. */\n sharedSecret: string;\n /** API endpoint. */\n baseUrl: string;\n /** VGS outbound proxy instance. */\n proxy: VGSOutboundProxy;\n}\n\nexport interface CyberSourceChargeParams extends PSPChargeParams {\n /** VIC network token cryptogram (for token-based payments). */\n cryptogram?: string;\n /** ECI value for network token transactions. */\n eci?: string;\n /** Whether this is a network token (DPAN) or regular PAN. */\n isNetworkToken?: boolean;\n}\n\nexport class CyberSourceAdapter implements PSPAdapter {\n readonly name = 'cybersource' as const;\n private readonly config: CyberSourceAdapterConfig;\n\n constructor(config: CyberSourceAdapterConfig) {\n this.config = config;\n }\n\n async charge(params: PSPChargeParams): Promise<PSPChargeResult> {\n const csParams = params as CyberSourceChargeParams;\n\n // Build payment information — supports both regular cards and network tokens\n const paymentInformation: Record<string, unknown> = csParams.isNetworkToken\n ? {\n tokenizedCard: {\n number: params.cardAlias, // VGS reveals to CyberSource\n expirationMonth: String(params.expMonth).padStart(2, '0'),\n expirationYear: String(params.expYear),\n cryptogram: csParams.cryptogram,\n type: '001', // Visa network token\n },\n }\n : {\n card: {\n number: params.cardAlias, // VGS reveals to CyberSource\n expirationMonth: String(params.expMonth).padStart(2, '0'),\n expirationYear: String(params.expYear),\n securityCode: params.cvvAlias,\n },\n };\n\n const body = {\n clientReferenceInformation: {\n code: params.idempotencyKey ?? `lane_${Date.now()}`,\n },\n processingInformation: {\n capture: true,\n ...(csParams.isNetworkToken ? { paymentSolution: '015' } : {}),\n ...(csParams.eci ? { commerceIndicator: csParams.eci } : {}),\n },\n orderInformation: {\n amountDetails: {\n totalAmount: (params.amount / 100).toFixed(2),\n currency: params.currency.toUpperCase(),\n },\n },\n paymentInformation,\n };\n\n const response = await this.config.proxy.forward({\n url: `${this.config.baseUrl}/pts/v2/payments`,\n method: 'POST',\n headers: {\n 'v-c-merchant-id': this.config.merchantId,\n 'Content-Type': 'application/json',\n },\n body,\n });\n\n const data = response.body as Record<string, unknown>;\n const csStatus = data['status'] as string | undefined;\n const status = csStatus === 'AUTHORIZED' || csStatus === 'PENDING'\n ? csStatus === 'AUTHORIZED' ? 'succeeded' : 'pending'\n : 'failed';\n\n return {\n pspTransactionId: String(data['id'] ?? ''),\n status,\n authorizationCode: (data['processorInformation'] as Record<string, unknown> | undefined)?.['approvalCode'] as string | undefined,\n declineReason: status === 'failed' ? String((data['errorInformation'] as Record<string, unknown> | undefined)?.['message'] ?? 'declined') : undefined,\n rawResponse: data,\n };\n }\n\n async refund(params: PSPRefundParams): Promise<PSPRefundResult> {\n const body = {\n clientReferenceInformation: {\n code: params.idempotencyKey ?? `lane_ref_${Date.now()}`,\n },\n orderInformation: {\n amountDetails: {\n ...(params.amount !== undefined ? { totalAmount: (params.amount / 100).toFixed(2) } : {}),\n currency: 'USD',\n },\n },\n };\n\n const response = await this.config.proxy.forward({\n url: `${this.config.baseUrl}/pts/v2/payments/${params.pspTransactionId}/refunds`,\n method: 'POST',\n headers: {\n 'v-c-merchant-id': this.config.merchantId,\n 'Content-Type': 'application/json',\n },\n body,\n });\n\n const data = response.body as Record<string, unknown>;\n const csStatus = data['status'] as string | undefined;\n\n return {\n pspRefundId: String(data['id'] ?? ''),\n status: csStatus === 'PENDING' ? 'pending' : 'succeeded',\n amount: params.amount ?? 0,\n rawResponse: data,\n };\n }\n\n async healthCheck(): Promise<boolean> {\n try {\n const response = await fetch(`${this.config.baseUrl}/reporting/v3/report-definitions`, {\n headers: { 'v-c-merchant-id': this.config.merchantId },\n });\n return response.status !== 500;\n } catch {\n return false;\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// Payment Routing Engine\n// ---------------------------------------------------------------------------\n// Three-tier payment routing: Billing API > ACP > VIC > Fallback\n//\n// The engine decides the best payment path for each transaction based on:\n// 1. Merchant capabilities (does the merchant have a billing API?)\n// 2. Payment protocol support (ACP, VIC)\n// 3. Card/token availability\n// 4. Budget constraints\n// ---------------------------------------------------------------------------\n\nimport type { PaymentRoute, RoutingDecision, BudgetConfig } from '../types.js';\n\n/** Merchant capability data used for routing decisions. */\nexport interface MerchantCapabilities {\n merchantId: string;\n hasBillingAPI: boolean;\n supportsACP: boolean;\n supportsVIC: boolean;\n acceptsVisa: boolean;\n acceptsMastercard: boolean;\n mccs: string[];\n}\n\n/** Context for a routing decision. */\nexport interface RoutingContext {\n /** Amount in cents. */\n amount: number;\n currency: string;\n merchantId: string;\n /** Card brand being used. */\n cardBrand: string;\n /** Whether a VIC token is available. */\n hasVICToken: boolean;\n /** Current effective budget. */\n budget?: BudgetConfig;\n /** Current spend for the period. */\n currentSpend?: number;\n}\n\n/** Registry of merchant capabilities (populated from Lane backend). */\nexport class MerchantRegistry {\n private merchants = new Map<string, MerchantCapabilities>();\n\n register(capabilities: MerchantCapabilities): void {\n this.merchants.set(capabilities.merchantId, capabilities);\n }\n\n get(merchantId: string): MerchantCapabilities | undefined {\n return this.merchants.get(merchantId);\n }\n\n registerBatch(merchants: MerchantCapabilities[]): void {\n for (const m of merchants) {\n this.merchants.set(m.merchantId, m);\n }\n }\n\n /** Create a registry pre-populated from directory capabilities. */\n static fromDirectory(capabilities: MerchantCapabilities[]): MerchantRegistry {\n const registry = new MerchantRegistry();\n registry.registerBatch(capabilities);\n return registry;\n }\n\n /** Clear and repopulate with new capabilities. */\n reload(capabilities: MerchantCapabilities[]): void {\n this.merchants.clear();\n this.registerBatch(capabilities);\n }\n\n /** Number of registered merchants. */\n get size(): number {\n return this.merchants.size;\n }\n\n /** List all registered merchant IDs. */\n listIds(): string[] {\n return Array.from(this.merchants.keys());\n }\n}\n\n/**\n * PaymentRouter determines the optimal payment path for a transaction.\n *\n * Priority order:\n * 1. Billing API — direct merchant API integration (cheapest, fastest)\n * 2. ACP — Agent Commerce Protocol checkout (Stripe-compatible)\n * 3. VIC — Visa Intelligent Commerce token (works at any Visa merchant)\n * 4. Fallback — standard card payment via PSP\n */\nexport class PaymentRouter {\n constructor(private readonly registry: MerchantRegistry) {}\n\n /**\n * Decide the payment route for a transaction.\n */\n route(context: RoutingContext): RoutingDecision {\n const merchant = this.registry.get(context.merchantId);\n const fallbacks: PaymentRoute[] = [];\n\n // Check budget first\n if (context.budget && context.currentSpend !== undefined) {\n const limit = context.budget.perTaskLimit ?? context.budget.dailyLimit;\n if (limit !== undefined && context.amount > limit - context.currentSpend) {\n return {\n route: 'fallback',\n merchantId: context.merchantId,\n reason: 'Transaction would exceed budget limits.',\n fallbacks: [],\n };\n }\n }\n\n // Tier 1: Billing API — direct merchant integration\n if (merchant?.hasBillingAPI) {\n fallbacks.push('acp', 'vic', 'fallback');\n return {\n route: 'billing_api',\n merchantId: context.merchantId,\n reason: 'Merchant has direct billing API integration (cheapest path).',\n fallbacks: this.filterFallbacks(fallbacks, merchant, context),\n };\n }\n\n // Tier 2: ACP — Agent Commerce Protocol\n if (merchant?.supportsACP) {\n fallbacks.push('vic', 'fallback');\n return {\n route: 'acp',\n merchantId: context.merchantId,\n reason: 'Merchant supports Agent Commerce Protocol checkout.',\n fallbacks: this.filterFallbacks(fallbacks, merchant, context),\n };\n }\n\n // Tier 3: VIC — Visa Intelligent Commerce token\n // VIC works at ANY Visa-accepting merchant — that's the moat.\n if (context.hasVICToken && context.cardBrand === 'visa' && (merchant?.acceptsVisa ?? true)) {\n fallbacks.push('fallback');\n return {\n route: 'vic',\n merchantId: context.merchantId,\n reason: 'Using VIC agentic token for Visa-authenticated payment.',\n fallbacks,\n };\n }\n\n // Tier 4: Fallback — standard card payment\n return {\n route: 'fallback',\n merchantId: context.merchantId,\n reason: merchant\n ? 'No preferred route available; using standard card payment.'\n : 'Unknown merchant; using standard card payment.',\n fallbacks: [],\n };\n }\n\n private filterFallbacks(\n routes: PaymentRoute[],\n merchant: MerchantCapabilities,\n context: RoutingContext,\n ): PaymentRoute[] {\n return routes.filter((r) => {\n if (r === 'acp') return merchant.supportsACP;\n if (r === 'vic') return context.hasVICToken && context.cardBrand === 'visa';\n return true;\n });\n }\n}\n","// ---------------------------------------------------------------------------\n// Lane SDK — Public API\n// ---------------------------------------------------------------------------\n\nexport { Lane } from './lane.js';\nexport default Lane;\n\n// Client\nexport { LaneClient } from './client.js';\n\n// Resources (Phase 1)\nexport { Resource } from './resources/base.js';\nexport { Auth } from './resources/auth.js';\nexport { Wallets } from './resources/wallets.js';\nexport { Pay } from './resources/pay.js';\nexport { Products } from './resources/products.js';\nexport { Checkout } from './resources/checkout.js';\nexport { Sell } from './resources/sell.js';\nexport { Admin } from './resources/admin.js';\nexport { Webhooks } from './resources/webhooks.js';\n\n// Resources (Phase 2 — VIC)\nexport { VIC } from './resources/vic.js';\n\n// Resources (Phase 4 — Make-a-SaaS)\nexport { Metering } from './resources/metering.js';\nexport { Payouts } from './resources/payouts.js';\n\n// Resources (Phase 5 — Corporate Agent Spend)\nexport { Teams } from './resources/teams.js';\nexport { Agents } from './resources/agents.js';\nexport { Audit } from './resources/audit.js';\n\n// Resources (Phase 6 — Agent Identity)\nexport { Identity } from './resources/identity.js';\n\n// Resources (SCP — Subscriptions)\nexport { Subscriptions } from './resources/subscriptions.js';\n\n// Resources (Merchant Directory)\nexport { Merchants } from './resources/merchants.js';\n\n// Errors\nexport {\n LaneError,\n LaneAuthError,\n LanePaymentError,\n LaneBudgetError,\n LaneNotFoundError,\n LaneRateLimitError,\n LaneValidationError,\n createErrorFromResponse,\n} from './errors.js';\n\n// Crypto\nexport { HMACSignature, verifyWebhookSignature } from './crypto/signature.js';\n\n// Auth\nexport { FileTokenStore } from './auth/token-store.js';\n\n// Config\nexport { resolveConfig } from './config.js';\n\n// MCP\nexport { LaneMCPServer } from './mcp/server.js';\nexport type { LaneMCPServerOptions } from './mcp/server.js';\n\n// VGS\nexport { VGSOutboundProxy, VGSTokenManager, detectCardBrand, luhnCheck, maskCardNumber, generateCollectPage } from './vgs/index.js';\nexport type { VGSProxyConfig, ProxyRequest, ProxyResponse, VGSTokenConfig, CardBrand, VGSCollectConfig } from './vgs/index.js';\n\n// PSP\nexport { PSPRegistry, StripeAdapter, WorldpayAdapter, CyberSourceAdapter } from './psp/index.js';\nexport type { PSPAdapter, PSPName, PSPChargeParams, PSPChargeResult, PSPRefundParams, PSPRefundResult, StripeAdapterConfig, WorldpayAdapterConfig, CyberSourceAdapterConfig, CyberSourceChargeParams } from './psp/index.js';\n\n// Routing\nexport { PaymentRouter, MerchantRegistry } from './routing/index.js';\nexport type { MerchantCapabilities, RoutingContext } from './routing/index.js';\n\n// Types — re-export everything\nexport type {\n // Core\n LaneConfig,\n ResolvedConfig,\n Credentials,\n DeveloperProfile,\n RotateKeyResult,\n Wallet,\n CreateWalletParams,\n Card,\n AgenticToken,\n CreateTokenParams,\n ExecutePaymentParams,\n Transaction,\n RefundParams,\n Refund,\n Product,\n PricingConfig,\n ProductSearchParams,\n CheckoutSession,\n CreateCheckoutParams,\n Order,\n CreateProductParams,\n ProductAnalytics,\n AnalyticsParams,\n BudgetConfig,\n SpendingSummary,\n TeamSpending,\n TeamMember,\n WebhookEvent,\n WebhookConfig,\n WebhookPayload,\n RequestOptions,\n APIResponse,\n PaginatedResponse,\n TokenStore,\n Merchant,\n // Phase 2: VIC\n VICToken,\n VICIssuanceParams,\n NetworkTokenPayload,\n PaymentRoute,\n RoutingDecision,\n // Phase 4: Metering\n UsageRecord,\n MeteringConfig,\n UsageReport,\n PayoutConfig,\n Payout,\n // Phase 5: Corporate\n Organization,\n Team,\n CreateTeamParams,\n AgentRecord,\n AgentPolicy,\n RegisterAgentParams,\n HierarchicalBudget,\n AuditEntry,\n AuditQueryParams,\n // Phase 6: Identity\n AgentIdentity,\n KYCChain,\n IdentityAttestation,\n RegisterIdentityParams,\n VerifyIdentityParams,\n // SCP\n SCPManifest,\n SCPProduct,\n SCPPlan,\n SCPPricing,\n SCPProvisioning,\n SCPSelectionParameters,\n SCPParameter,\n // Subscriptions\n Subscription,\n CreateSubscriptionParams,\n UpdateSubscriptionParams,\n // Credential Injection\n CredentialInjection,\n SDKInfo,\n // Enhanced Checkout\n SoftwareCheckoutParams,\n SoftwareOrder,\n // Enhanced Product Search\n SoftwareProductSearchParams,\n // Wallet Enhancements\n DepositParams,\n DepositResult,\n AutoReloadConfig,\n CardAttributes,\n WalletBalance,\n // Merchant Directory\n MerchantType,\n DirectoryMerchant,\n MerchantSearchParams,\n ProtocolDiscoveryResult,\n MerchantVerticalSummary,\n} from './types.js';\n\n// Needed for default import to work: `import Lane from 'lane'`\nimport { Lane } from './lane.js';\n"]}
|