lane-sdk 0.2.1 → 0.2.3
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.
Potentially problematic release.
This version of lane-sdk might be problematic. Click here for more details.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../server/lib/errors.ts","../../../server/routes/export.ts","../../../server/lib/base-service.ts","../../../server/services/token-service.ts","../../../server/services/budget-service.ts","../../../server/services/card-service.ts","../../../server/services/profile-service.ts","../../../server/services/merchant-account-service.ts","../../../server/services/vgs-proxy-service.ts","../../../server/services/wallet-service.ts","../../../server/services/payment-service.ts","../../../server/services/merchant-directory-service.ts","../../../server/services/instruction-service.ts","../../../server/services/user-service.ts","../../../server/services/fleet-service.ts","../../../server/services/team-service.ts","../../../server/services/webhook-service.ts","../../../server/services/subscription-service.ts","../../../server/services/checkout-service.ts","../../../server/services/agent-service.ts","../../../server/services/identity-service.ts","../../../server/services/delegation-service.ts","../../../server/services/mandate-service.ts","../../../server/services/vic-service.ts","../../../server/services/mastercard-ap-service.ts","../../../server/services/protocol-client-service.ts","../../../server/services/protocol-adapters/acp-adapter.ts","../../../server/services/protocol-adapters/ucp-adapter.ts","../../../server/services/protocol-adapters/x402-adapter.ts","../../../server/services/protocol-adapters/rye-adapter.ts","../../../server/lib/retry.ts","../../../server/services/protocol-adapters/browser-use-adapter.ts","../../../server/lib/service-container.ts","../../../server/lib/logger.ts","../../../server/middleware/api-key-auth.ts","../../../server/middleware/hmac-verify.ts","../../../server/middleware/rate-limit.ts","../../../server/middleware/audit.ts","../../../server/middleware/deprecation.ts","../../../server/routes/auth.ts","../../../server/routes/wallets.ts","../../../server/routes/pay.ts","../../../server/middleware/velocity-limit.ts","../../../server/routes/admin.ts","../../../server/routes/merchants.ts","../../../server/routes/onboarding.ts","../../../server/routes/agent/index.ts","../../../server/routes/agent/wallet.ts","../../../server/routes/agent/card.ts","../../../server/routes/agent/instruction.ts","../../../server/routes/agent/token.ts","../../../server/routes/agent/transaction.ts","../../../server/routes/agent/budget.ts","../../../server/routes/agent/pay.ts","../../../server/routes/agent/user.ts","../../../server/routes/agent/merchant.ts","../../../server/routes/agent/checkout.ts","../../../server/routes/agent/product.ts","../../../server/routes/agent/subscription.ts","../../../server/routes/agent/fleet.ts","../../../server/routes/agent/team.ts","../../../server/routes/agent/webhook.ts","../../../server/routes/agent/audit.ts","../../../server/routes/agent/admin.ts","../../../server/routes/agent/onboarding.ts","../../../server/routes/delegations.ts","../../../server/routes/protocol.ts","../../../server/routes/mastercard-ap.ts","../../../server/routes/identity.ts","../../../server/routes/agent/discovery.ts","../../../server/routes/agent/auth.ts"],"sourcesContent":["// ---------------------------------------------------------------------------\n// Errors — Structured Error Hierarchy\n// ---------------------------------------------------------------------------\n// All server errors extend ServiceError with machine-readable codes,\n// HTTP status codes, and retryability hints.\n// ---------------------------------------------------------------------------\n\nexport enum ErrorCode {\n // Auth\n INVALID_API_KEY = 'invalid_api_key',\n REVOKED_API_KEY = 'revoked_api_key',\n INSUFFICIENT_SCOPE = 'insufficient_scope',\n HMAC_VERIFICATION_FAILED = 'hmac_verification_failed',\n\n // Rate limiting\n RATE_LIMIT_EXCEEDED = 'rate_limit_exceeded',\n\n // Validation\n VALIDATION_ERROR = 'validation_error',\n MISSING_REQUIRED_FIELD = 'missing_required_field',\n INVALID_FORMAT = 'invalid_format',\n\n // Resources\n NOT_FOUND = 'not_found',\n CONFLICT = 'conflict',\n OWNERSHIP_VIOLATION = 'ownership_violation',\n\n // Tokens\n TOKEN_EXPIRED = 'token_expired',\n TOKEN_ALREADY_USED = 'token_already_used',\n TOKEN_REVOKED = 'token_revoked',\n TOKEN_AMOUNT_EXCEEDED = 'token_amount_exceeded',\n\n // Budget\n BUDGET_EXCEEDED = 'budget_exceeded',\n DAILY_LIMIT_EXCEEDED = 'daily_limit_exceeded',\n WEEKLY_LIMIT_EXCEEDED = 'weekly_limit_exceeded',\n MONTHLY_LIMIT_EXCEEDED = 'monthly_limit_exceeded',\n PER_TASK_LIMIT_EXCEEDED = 'per_task_limit_exceeded',\n BUDGET_CAP_EXCEEDED = 'budget_cap_exceeded',\n PAYMENTS_PAUSED = 'payments_paused',\n REFUND_LIMIT_EXCEEDED = 'refund_limit_exceeded',\n CUMULATIVE_REFUND_EXCEEDED = 'cumulative_refund_exceeded',\n MERCHANT_BLOCKED = 'merchant_blocked',\n MERCHANT_NOT_ALLOWED = 'merchant_not_allowed',\n\n // Payment\n PAYMENT_FAILED = 'payment_failed',\n PROXY_ERROR = 'proxy_error',\n PSP_DECLINED = 'psp_declined',\n IDEMPOTENCY_CONFLICT = 'idempotency_conflict',\n NO_PAYMENT_METHOD = 'no_payment_method',\n REFUND_FAILED = 'refund_failed',\n TRANSACTION_NOT_REFUNDABLE = 'transaction_not_refundable',\n\n // VGS\n VGS_TOKEN_REFRESH_FAILED = 'vgs_token_refresh_failed',\n VGS_PROXY_FAILED = 'vgs_proxy_failed',\n VGS_VAULT_NOT_CONFIGURED = 'vgs_vault_not_configured',\n\n // Mandates\n MANDATE_VIOLATED = 'mandate_violated',\n MANDATE_EXPIRED = 'mandate_expired',\n MANDATE_CATEGORY_BLOCKED = 'mandate_category_blocked',\n MANDATE_AMOUNT_EXCEEDED = 'mandate_amount_exceeded',\n MANDATE_MERCHANT_BLOCKED = 'mandate_merchant_blocked',\n MANDATE_ATTRIBUTE_VIOLATED = 'mandate_attribute_violated',\n\n // Delegation\n DELEGATION_INVALID = 'delegation_invalid',\n DELEGATION_CHAIN_BROKEN = 'delegation_chain_broken',\n\n // Confirmation\n CONFIRMATION_REQUIRED = 'confirmation_required',\n\n // Protocol\n PROTOCOL_NOT_SUPPORTED = 'protocol_not_supported',\n PROTOCOL_SESSION_FAILED = 'protocol_session_failed',\n PROTOCOL_SESSION_EXPIRED = 'protocol_session_expired',\n\n // Network Tokens\n NETWORK_TOKEN_FAILED = 'network_token_failed',\n\n // Internal\n INTERNAL_ERROR = 'internal_error',\n DATABASE_ERROR = 'database_error',\n SERVICE_UNAVAILABLE = 'service_unavailable',\n}\n\n/**\n * Base error for all Lane server errors. Carries a machine-readable code,\n * an HTTP status code, and a retryable flag.\n */\nexport class ServiceError extends Error {\n readonly code: ErrorCode;\n readonly statusCode: number;\n readonly retryable: boolean;\n readonly details?: Record<string, unknown>;\n\n constructor(\n message: string,\n code: ErrorCode,\n statusCode: number = 500,\n retryable: boolean = false,\n details?: Record<string, unknown>,\n ) {\n super(message);\n this.name = 'ServiceError';\n this.code = code;\n this.statusCode = statusCode;\n this.retryable = retryable;\n this.details = details;\n }\n}\n\nexport class AuthError extends ServiceError {\n constructor(message: string, code: ErrorCode = ErrorCode.INVALID_API_KEY, details?: Record<string, unknown>) {\n super(message, code, 401, false, details);\n this.name = 'AuthError';\n }\n}\n\nexport class ForbiddenError extends ServiceError {\n constructor(message: string, code: ErrorCode = ErrorCode.INSUFFICIENT_SCOPE, details?: Record<string, unknown>) {\n super(message, code, 403, false, details);\n this.name = 'ForbiddenError';\n }\n}\n\nexport class ValidationError extends ServiceError {\n constructor(message: string, details?: Record<string, unknown>) {\n super(message, ErrorCode.VALIDATION_ERROR, 400, false, details);\n this.name = 'ValidationError';\n }\n}\n\nexport class NotFoundError extends ServiceError {\n constructor(resource: string, id?: string) {\n const msg = id ? `${resource} '${id}' not found` : `${resource} not found`;\n super(msg, ErrorCode.NOT_FOUND, 404, false, { resource, id });\n this.name = 'NotFoundError';\n }\n}\n\nexport class OwnershipError extends ServiceError {\n constructor(resource: string, id: string) {\n super(\n `${resource} '${id}' does not belong to the authenticated developer`,\n ErrorCode.OWNERSHIP_VIOLATION,\n 403,\n false,\n { resource, id },\n );\n this.name = 'OwnershipError';\n }\n}\n\nexport class BudgetError extends ServiceError {\n constructor(message: string, code: ErrorCode = ErrorCode.BUDGET_EXCEEDED, details?: Record<string, unknown>) {\n super(message, code, 403, false, details);\n this.name = 'BudgetError';\n }\n}\n\nexport class PaymentError extends ServiceError {\n readonly transactionId?: string;\n\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.PAYMENT_FAILED,\n details?: Record<string, unknown> & { transactionId?: string },\n ) {\n super(message, code, 402, false, details);\n this.name = 'PaymentError';\n this.transactionId = details?.transactionId;\n }\n}\n\nexport class TokenError extends ServiceError {\n constructor(message: string, code: ErrorCode = ErrorCode.TOKEN_EXPIRED) {\n super(message, code, 403, false);\n this.name = 'TokenError';\n }\n}\n\nexport class ConflictError extends ServiceError {\n constructor(message: string, details?: Record<string, unknown>) {\n super(message, ErrorCode.CONFLICT, 409, false, details);\n this.name = 'ConflictError';\n }\n}\n\nexport class MandateError extends ServiceError {\n constructor(message: string, code: ErrorCode = ErrorCode.MANDATE_VIOLATED, details?: Record<string, unknown>) {\n super(message, code, 403, false, details);\n this.name = 'MandateError';\n }\n}\n\nexport class DatabaseError extends ServiceError {\n constructor(message: string, originalError?: unknown) {\n super(message, ErrorCode.DATABASE_ERROR, 500, true, {\n original: originalError instanceof Error ? originalError.message : String(originalError),\n });\n this.name = 'DatabaseError';\n }\n}\n\nexport class ConfirmationRequiredError extends ForbiddenError {\n constructor(instructionId?: string) {\n super(\n 'Biometric confirmation required before accessing credentials.',\n ErrorCode.CONFIRMATION_REQUIRED,\n instructionId ? { instructionId } : undefined,\n );\n this.name = 'ConfirmationRequiredError';\n }\n}\n","// ---------------------------------------------------------------------------\n// Lane Agent Routes — Package Export\n// ---------------------------------------------------------------------------\n// Factory function that creates all /agent/* routes as an Express Router.\n// Used by the lane-gateway to mount agent routes under api.getonlane.com.\n// ---------------------------------------------------------------------------\n\nimport express from 'express';\nimport { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { SupabaseClient } from '@supabase/supabase-js';\n\nimport { ServiceContainer } from '../lib/service-container.js';\nimport { Logger, LogLevel } from '../lib/logger.js';\n\nimport { apiKeyAuth } from '../middleware/api-key-auth.js';\nimport { hmacVerify } from '../middleware/hmac-verify.js';\nimport { rateLimit } from '../middleware/rate-limit.js';\nimport { audit } from '../middleware/audit.js';\nimport { deprecation } from '../middleware/deprecation.js';\n\nimport { authRoutes } from './auth.js';\nimport { walletRoutes } from './wallets.js';\nimport { payRoutes } from './pay.js';\nimport { adminRoutes } from './admin.js';\nimport { merchantRoutes } from './merchants.js';\nimport { sessionRoutes, onboardingRoutes } from './onboarding.js';\nimport { discoveryRoutes } from './discovery.js';\nimport { protocolRoutes } from './protocol.js';\nimport { vicRoutes } from './vic.js';\nimport { mastercardAPRoutes } from './mastercard-ap.js';\nimport { mandateRoutes } from './mandates.js';\nimport { agentRoutes } from './agents.js';\nimport { identityRoutes } from './identity.js';\nimport { delegationRoutes } from './delegations.js';\n\nimport { createAgentRoutes } from './agent/index.js';\nimport { agentDiscoveryRoutes } from './agent/discovery.js';\nimport { agentAuthRoutes } from './agent/auth.js';\n\nexport interface AgentRouteDeps {\n db: SupabaseClient;\n logLevel?: keyof typeof LogLevel;\n}\n\n// Singleton container — created once, reused across calls\nlet _container: ServiceContainer | null = null;\nlet _logger: Logger | null = null;\n\nfunction getContainer(db: SupabaseClient, logLevel?: keyof typeof LogLevel): { container: ServiceContainer; logger: Logger } {\n if (!_logger) {\n _logger = new Logger(LogLevel[logLevel ?? 'INFO'] ?? LogLevel.INFO);\n }\n if (!_container) {\n _container = new ServiceContainer(db, _logger);\n }\n return { container: _container, logger: _logger };\n}\n\n/**\n * Create all agent routes as an Express Router.\n *\n * Mounts:\n * - /health (public — service health check)\n * - /SKILL.md (public — MCP skill file)\n * - /agent/discovery/* (public)\n * - /agent/auth/* (public)\n * - /agent/onboarding/* (protected)\n * - /agent/* (protected — apiKeyAuth, rateLimit, hmacVerify, audit)\n * - /api/sdk/onboarding (public sessions)\n * - /api/sdk/* (deprecated legacy routes)\n */\nexport function createAllAgentRoutes({ db, logLevel }: AgentRouteDeps): express.Router {\n const router = express.Router();\n const { container, logger } = getContainer(db, logLevel);\n\n // Health check (no auth)\n router.get('/health', async (_req, res) => {\n const health = await container.healthCheck();\n const statusCode = health.healthy ? 200 : 503;\n res.status(statusCode).json({\n status: health.healthy ? 'ok' : 'degraded',\n timestamp: new Date().toISOString(),\n services: health.services,\n });\n });\n\n // Public SKILL.md endpoint\n router.get('/SKILL.md', (_req, res) => {\n try {\n const skillPath = resolve(process.cwd(), 'SKILL.md');\n const content = readFileSync(skillPath, 'utf-8');\n res.setHeader('Content-Type', 'text/markdown; charset=utf-8');\n res.send(content);\n } catch {\n res.status(404).json({ error: 'SKILL.md not found' });\n }\n });\n\n // Public routes (no auth required)\n router.use('/agent/discovery', agentDiscoveryRoutes());\n router.use('/agent/auth', agentAuthRoutes({ db }));\n\n // Public onboarding sessions\n router.use('/api/sdk/onboarding', sessionRoutes(db, logger));\n\n // Protected /agent/ routes (new API)\n const protectedAgent = express.Router();\n protectedAgent.use(apiKeyAuth(db, logger));\n protectedAgent.use(rateLimit(logger));\n protectedAgent.use(hmacVerify(db, logger));\n protectedAgent.use(audit(db, logger));\n protectedAgent.use('/', createAgentRoutes(container, db, logger));\n router.use('/agent', protectedAgent);\n\n // Protected onboarding routes\n const protectedOnboarding = express.Router();\n protectedOnboarding.use(apiKeyAuth(db, logger));\n protectedOnboarding.use('/', onboardingRoutes({ db }));\n router.use('/agent/onboarding', protectedOnboarding);\n\n // Legacy /api/sdk routes (deprecated)\n const legacyRouter = express.Router();\n legacyRouter.use(apiKeyAuth(db, logger));\n legacyRouter.use(rateLimit(logger));\n legacyRouter.use(hmacVerify(db, logger));\n legacyRouter.use(audit(db, logger));\n\n legacyRouter.use('/auth', authRoutes({ db }));\n legacyRouter.use('/wallets', walletRoutes({\n wallets: container.wallets,\n cards: container.cards,\n profiles: container.profiles,\n merchantAccounts: container.merchantAccounts,\n }));\n legacyRouter.use('/pay', payRoutes({\n tokens: container.tokens,\n payments: container.payments,\n budgets: container.budgets,\n db,\n logger,\n }));\n legacyRouter.use('/admin', adminRoutes({\n budgets: container.budgets,\n }));\n legacyRouter.use('/merchants', merchantRoutes({\n merchantDirectory: container.merchantDirectory,\n }));\n legacyRouter.use('/onboarding', onboardingRoutes({ db }));\n\n router.use('/api/sdk', deprecation(logger), legacyRouter);\n\n return router;\n}\n\n/**\n * Initialize all services in the container.\n * Call this once at startup before handling requests.\n */\nexport async function initAgentServices({ db, logLevel }: AgentRouteDeps): Promise<void> {\n const { container } = getContainer(db, logLevel);\n await container.startAll();\n}\n","// ---------------------------------------------------------------------------\n// BaseService — Abstract Foundation for All Services\n// ---------------------------------------------------------------------------\n// Provides lifecycle management, structured logging, error wrapping, and\n// database access patterns that every service inherits.\n// ---------------------------------------------------------------------------\n\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from './logger.js';\nimport { DatabaseError, ServiceError } from './errors.js';\n\nexport interface ServiceHealth {\n healthy: boolean;\n service: string;\n details?: Record<string, unknown>;\n}\n\n/**\n * Abstract base class for all Lane services.\n *\n * Every service gets:\n * - A child logger with the service name pre-bound\n * - Structured error wrapping via `withErrorHandling`\n * - Wallet/resource ownership validation via `verifyOwnership`\n * - Lifecycle hooks (onStart, onStop, healthCheck)\n * - Access to the Supabase client via `this.db`\n */\nexport abstract class BaseService {\n protected readonly db: SupabaseClient;\n protected readonly log: ILogger;\n\n /** Human-readable service name for logs and health checks. */\n abstract readonly serviceName: string;\n\n constructor(db: SupabaseClient, logger: ILogger) {\n this.db = db;\n this.log = logger;\n }\n\n // -------------------------------------------------------------------------\n // Lifecycle\n // -------------------------------------------------------------------------\n\n /** Called once during server startup. Override to validate connections, warm caches, etc. */\n async onStart(): Promise<void> {\n this.log.info(`${this.serviceName} started`);\n }\n\n /** Called during graceful shutdown. Override to flush buffers, close connections, etc. */\n async onStop(): Promise<void> {\n this.log.info(`${this.serviceName} stopped`);\n }\n\n /** Health check. Override to add service-specific checks. */\n async healthCheck(): Promise<ServiceHealth> {\n return { healthy: true, service: this.serviceName };\n }\n\n // -------------------------------------------------------------------------\n // Error handling\n // -------------------------------------------------------------------------\n\n /**\n * Execute an async operation with structured error handling and logging.\n * Wraps raw database/network errors into ServiceError types.\n */\n protected async withErrorHandling<T>(\n operation: string,\n fn: () => Promise<T>,\n context?: Record<string, unknown>,\n ): Promise<T> {\n try {\n return await fn();\n } catch (err) {\n // If it's already a ServiceError, re-throw as-is (it has code + status)\n if (err instanceof ServiceError) {\n this.log.warn(`${operation} failed: ${err.message}`, {\n service: this.serviceName,\n code: err.code,\n ...context,\n });\n throw err;\n }\n\n // Wrap unknown errors\n const message = err instanceof Error ? err.message : String(err);\n this.log.error(`${operation} failed unexpectedly`, err, {\n service: this.serviceName,\n operation,\n ...context,\n });\n throw new DatabaseError(`${operation}: ${message}`, err);\n }\n }\n\n // -------------------------------------------------------------------------\n // Ownership validation\n // -------------------------------------------------------------------------\n\n /**\n * Verify that a resource belongs to the given developer.\n * Throws OwnershipError if not.\n */\n protected async verifyOwnership(\n table: string,\n resourceId: string,\n developerId: string,\n resourceLabel: string = table,\n ): Promise<void> {\n const { data, error } = await this.db\n .from(table)\n .select('id')\n .eq('id', resourceId)\n .eq('developer_id', developerId)\n .limit(1)\n .single();\n\n if (error || !data) {\n const { OwnershipError } = await import('./errors.js');\n throw new OwnershipError(resourceLabel, resourceId);\n }\n }\n\n /**\n * Verify that a wallet belongs to the developer. Common enough to\n * warrant its own helper.\n */\n protected async verifyWalletOwnership(walletId: string, developerId: string): Promise<void> {\n return this.verifyOwnership('wallets', walletId, developerId, 'Wallet');\n }\n}\n","// ---------------------------------------------------------------------------\n// Token Service — Agentic Token Lifecycle\n// ---------------------------------------------------------------------------\n// Creates, validates, consumes, and revokes scoped single-use payment\n// authorization tokens for AI agents.\n// ---------------------------------------------------------------------------\n\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport { BaseService } from '../lib/base-service.js';\nimport type { ILogger } from '../lib/logger.js';\nimport type { ITokenService, AgenticTokenRow, CreateTokenParams } from '../lib/interfaces.js';\nimport { TokenError, NotFoundError, ValidationError, ErrorCode } from '../lib/errors.js';\n\nexport class TokenService extends BaseService implements ITokenService {\n readonly serviceName = 'TokenService';\n\n constructor(db: SupabaseClient, logger: ILogger) {\n super(db, logger);\n }\n\n /**\n * Create a new agentic token. Validates that the wallet belongs to the developer.\n */\n async createToken(\n developerId: string,\n params: CreateTokenParams,\n ): Promise<AgenticTokenRow> {\n return this.withErrorHandling('createToken', async () => {\n await this.verifyWalletOwnership(params.walletId, developerId);\n\n const expiresAt = this.computeExpiry(params.expiresIn ?? '1h');\n\n const { data, error } = await this.db\n .from('agentic_tokens')\n .insert({\n wallet_id: params.walletId,\n developer_id: developerId,\n amount: params.amount,\n currency: params.currency ?? 'USD',\n merchant: params.merchant ?? null,\n permissions: params.permissions ?? [],\n status: 'active',\n expires_at: expiresAt.toISOString(),\n })\n .select()\n .single();\n\n if (error || !data) {\n throw new TokenError(\n `Failed to create agentic token: ${error?.message}`,\n ErrorCode.TOKEN_EXPIRED,\n );\n }\n\n this.log.info('Token created', {\n tokenId: data.id,\n walletId: params.walletId,\n developerId,\n amount: params.amount,\n });\n\n return data as AgenticTokenRow;\n }, { developerId, walletId: params.walletId });\n }\n\n /**\n * Validate a token: checks status and expiry. Returns the token if valid.\n */\n async validateToken(tokenId: string): Promise<AgenticTokenRow> {\n return this.withErrorHandling('validateToken', async () => {\n const { data, error } = await this.db\n .from('agentic_tokens')\n .select('*')\n .eq('id', tokenId)\n .single();\n\n if (error || !data) {\n throw new NotFoundError('Token', tokenId);\n }\n\n const token = data as AgenticTokenRow;\n\n if (token.status === 'used') {\n throw new TokenError('Token has already been used', ErrorCode.TOKEN_ALREADY_USED);\n }\n\n if (token.status === 'revoked') {\n throw new TokenError('Token has been revoked', ErrorCode.TOKEN_REVOKED);\n }\n\n if (token.status !== 'active') {\n throw new TokenError(`Token is ${token.status}`, ErrorCode.TOKEN_EXPIRED);\n }\n\n if (new Date(token.expires_at) < new Date()) {\n // Mark as expired\n await this.db\n .from('agentic_tokens')\n .update({ status: 'expired' })\n .eq('id', tokenId);\n throw new TokenError('Token has expired', ErrorCode.TOKEN_EXPIRED);\n }\n\n return token;\n }, { tokenId });\n }\n\n /**\n * Consume a token: marks as 'used' and links to the transaction.\n */\n async consumeToken(\n tokenId: string,\n transactionId: string,\n ): Promise<void> {\n return this.withErrorHandling('consumeToken', async () => {\n const { error } = await this.db\n .from('agentic_tokens')\n .update({\n status: 'used',\n used_at: new Date().toISOString(),\n transaction_id: transactionId,\n })\n .eq('id', tokenId)\n .eq('status', 'active');\n\n if (error) {\n throw new TokenError(\n `Failed to consume token: ${error.message}`,\n ErrorCode.TOKEN_ALREADY_USED,\n );\n }\n\n this.log.info('Token consumed', { tokenId, transactionId });\n }, { tokenId, transactionId });\n }\n\n /**\n * Revoke a token.\n */\n async revokeToken(tokenId: string): Promise<void> {\n return this.withErrorHandling('revokeToken', async () => {\n const { error } = await this.db\n .from('agentic_tokens')\n .update({ status: 'revoked' })\n .eq('id', tokenId)\n .eq('status', 'active');\n\n if (error) {\n throw new TokenError(\n `Failed to revoke token: ${error.message}`,\n ErrorCode.TOKEN_REVOKED,\n );\n }\n\n this.log.info('Token revoked', { tokenId });\n }, { tokenId });\n }\n\n /**\n * Expire all stale active tokens past their expiry. Intended for background cleanup.\n */\n async expireStaleTokens(): Promise<number> {\n return this.withErrorHandling('expireStaleTokens', async () => {\n const { data, error } = await this.db\n .from('agentic_tokens')\n .update({ status: 'expired' })\n .eq('status', 'active')\n .lt('expires_at', new Date().toISOString())\n .select('id');\n\n if (error) {\n throw new TokenError(\n `Failed to expire stale tokens: ${error.message}`,\n ErrorCode.TOKEN_EXPIRED,\n );\n }\n\n const count = data?.length ?? 0;\n if (count > 0) {\n this.log.info('Expired stale tokens', { count });\n }\n\n return count;\n });\n }\n\n async listTokens(developerId: string, params?: { limit?: number; offset?: number }): Promise<{ data: AgenticTokenRow[]; total: number }> {\n return this.withErrorHandling('token.list', async () => {\n const limit = Math.min(params?.limit ?? 20, 100);\n const offset = params?.offset ?? 0;\n const { data, error, count } = await this.db\n .from('agentic_tokens')\n .select('*', { count: 'exact' })\n .eq('developer_id', developerId)\n .order('created_at', { ascending: false })\n .range(offset, offset + limit - 1);\n if (error) throw error;\n return { data: (data ?? []) as AgenticTokenRow[], total: count ?? 0 };\n });\n }\n\n async getToken(tokenId: string, developerId: string): Promise<AgenticTokenRow> {\n return this.withErrorHandling('token.get', async () => {\n const { data, error } = await this.db\n .from('agentic_tokens')\n .select('*')\n .eq('id', tokenId)\n .eq('developer_id', developerId)\n .single();\n if (error || !data) throw new NotFoundError('Token', tokenId);\n return data as AgenticTokenRow;\n });\n }\n\n async suspendToken(tokenId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('token.suspend', async () => {\n await this.verifyOwnership('agentic_tokens', tokenId, developerId, 'Token');\n const { error } = await this.db\n .from('agentic_tokens')\n .update({ status: 'suspended', suspended_at: new Date().toISOString() })\n .eq('id', tokenId);\n if (error) throw error;\n });\n }\n\n async reactivateToken(tokenId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('token.reactivate', async () => {\n await this.verifyOwnership('agentic_tokens', tokenId, developerId, 'Token');\n const { error } = await this.db\n .from('agentic_tokens')\n .update({ status: 'active', suspended_at: null })\n .eq('id', tokenId);\n if (error) throw error;\n });\n }\n\n async deleteToken(tokenId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('token.delete', async () => {\n await this.verifyOwnership('agentic_tokens', tokenId, developerId, 'Token');\n const { error } = await this.db\n .from('agentic_tokens')\n .delete()\n .eq('id', tokenId);\n if (error) throw error;\n });\n }\n\n async getCryptogram(tokenId: string, developerId: string): Promise<{ cryptogram: string; eci: string; expMonth: number; expYear: number }> {\n return this.withErrorHandling('token.getCryptogram', async () => {\n await this.verifyOwnership('agentic_tokens', tokenId, developerId, 'Token');\n // In production, this would call Visa's API to generate a cryptogram\n return {\n cryptogram: `crpt_${tokenId.slice(0, 8)}`,\n eci: '05',\n expMonth: new Date().getMonth() + 1,\n expYear: new Date().getFullYear() + 1,\n };\n });\n }\n\n async reProvision(tokenId: string, developerId: string): Promise<AgenticTokenRow> {\n return this.withErrorHandling('token.reProvision', async () => {\n await this.verifyOwnership('agentic_tokens', tokenId, developerId, 'Token');\n const { data, error } = await this.db\n .from('agentic_tokens')\n .update({\n status: 'active',\n suspended_at: null,\n expires_at: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(),\n })\n .eq('id', tokenId)\n .select()\n .single();\n if (error) throw error;\n return data as AgenticTokenRow;\n });\n }\n\n private computeExpiry(expiresIn: string): Date {\n const match = expiresIn.match(/^(\\d+)(m|h|d)$/);\n if (!match) {\n throw new ValidationError(\n `Invalid expiresIn format: ${expiresIn}. Use e.g. \"30m\", \"1h\", \"7d\".`,\n );\n }\n const value = parseInt(match[1]!, 10);\n const unit = match[2]!;\n const now = Date.now();\n switch (unit) {\n case 'm': return new Date(now + value * 60 * 1000);\n case 'h': return new Date(now + value * 60 * 60 * 1000);\n case 'd': return new Date(now + value * 24 * 60 * 60 * 1000);\n default: return new Date(now + 60 * 60 * 1000);\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// Budget Service — Spending Controls\n// ---------------------------------------------------------------------------\n// Checks and enforces daily/weekly/monthly/per-task budget limits.\n// Records spend atomically, provides budget CRUD, and handles periodic resets.\n// ---------------------------------------------------------------------------\n\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport { BaseService } from '../lib/base-service.js';\nimport type { ILogger } from '../lib/logger.js';\nimport type {\n IBudgetService,\n BudgetRow,\n SetBudgetParams,\n BudgetCheckResult,\n} from '../lib/interfaces.js';\nimport { BudgetError, NotFoundError, ErrorCode, ValidationError } from '../lib/errors.js';\n\n// Hard caps for budget limits (in cents) — prevents prompt-injection escalation\nconst BUDGET_CAPS = {\n daily: 1_000_000, // $10,000\n weekly: 5_000_000, // $50,000\n monthly: 20_000_000, // $200,000\n perTask: 500_000, // $5,000\n} as const;\n\nexport class BudgetService extends BaseService implements IBudgetService {\n readonly serviceName = 'BudgetService';\n\n constructor(db: SupabaseClient, logger: ILogger) {\n super(db, logger);\n }\n\n /**\n * Check whether a developer can spend the given amount.\n * Checks per_task, daily, weekly, and monthly limits.\n */\n async checkBudget(\n developerId: string,\n amount: number,\n ): Promise<BudgetCheckResult> {\n return this.withErrorHandling('checkBudget', async () => {\n const budget = await this.getOrCreateBudget(developerId);\n\n if (budget.per_task_limit !== null && amount > budget.per_task_limit) {\n return {\n allowed: false,\n reason: 'Amount exceeds per-task limit',\n code: ErrorCode.PER_TASK_LIMIT_EXCEEDED,\n limit: budget.per_task_limit,\n spent: amount,\n };\n }\n\n if (budget.daily_limit !== null && budget.spent_today + amount > budget.daily_limit) {\n return {\n allowed: false,\n reason: 'Daily spending limit exceeded',\n code: ErrorCode.DAILY_LIMIT_EXCEEDED,\n limit: budget.daily_limit,\n spent: budget.spent_today,\n };\n }\n\n if (budget.weekly_limit !== null && budget.spent_this_week + amount > budget.weekly_limit) {\n return {\n allowed: false,\n reason: 'Weekly spending limit exceeded',\n code: ErrorCode.WEEKLY_LIMIT_EXCEEDED,\n limit: budget.weekly_limit,\n spent: budget.spent_this_week,\n };\n }\n\n if (budget.monthly_limit !== null && budget.spent_this_month + amount > budget.monthly_limit) {\n return {\n allowed: false,\n reason: 'Monthly spending limit exceeded',\n code: ErrorCode.MONTHLY_LIMIT_EXCEEDED,\n limit: budget.monthly_limit,\n spent: budget.spent_this_month,\n };\n }\n\n return { allowed: true };\n }, { developerId, amount });\n }\n\n /**\n * Atomic check-and-record-spend. Uses SELECT FOR UPDATE in Postgres\n * to prevent race conditions where concurrent payments all pass the budget check.\n */\n async checkAndRecordSpend(\n developerId: string,\n amount: number,\n ): Promise<BudgetCheckResult> {\n return this.withErrorHandling('checkAndRecordSpend', async () => {\n // Ensure budget exists before calling RPC\n await this.getOrCreateBudget(developerId);\n\n const { data, error } = await this.db.rpc('check_and_record_spend', {\n p_developer_id: developerId,\n p_amount: amount,\n });\n\n if (error) {\n this.log.warn('RPC check_and_record_spend failed, falling back to non-atomic path', {\n developerId,\n error: error.message,\n });\n // Fallback: use existing check + record (still has the race, but better than failing)\n const check = await this.checkBudget(developerId, amount);\n if (check.allowed) {\n await this.recordSpend(developerId, amount);\n }\n return check;\n }\n\n if (!data.allowed) {\n return {\n allowed: false,\n reason: data.reason,\n code: data.code,\n limit: data.limit_value ? Number(data.limit_value) : undefined,\n spent: data.spent_value ? Number(data.spent_value) : undefined,\n };\n }\n\n return { allowed: true };\n }, { developerId, amount });\n }\n\n /**\n * Record a spend against the developer's budget counters.\n * Uses atomic SQL increment to avoid read-then-write race conditions.\n */\n async recordSpend(developerId: string, amount: number): Promise<void> {\n return this.withErrorHandling('recordSpend', async () => {\n // Use RPC for atomic increment to prevent race conditions\n const { error: rpcError } = await this.db.rpc('increment_budget_spend', {\n p_developer_id: developerId,\n p_amount: amount,\n });\n\n if (rpcError) {\n // Fallback: if the RPC doesn't exist yet, use direct update with care\n this.log.warn('RPC increment_budget_spend not available, using fallback', {\n developerId,\n error: rpcError.message,\n });\n\n const budget = await this.getOrCreateBudget(developerId);\n const { error } = await this.db\n .from('budgets')\n .update({\n spent_today: budget.spent_today + amount,\n spent_this_week: budget.spent_this_week + amount,\n spent_this_month: budget.spent_this_month + amount,\n updated_at: new Date().toISOString(),\n })\n .eq('id', budget.id);\n\n if (error) {\n throw new BudgetError(\n `Failed to record spend: ${error.message}`,\n ErrorCode.BUDGET_EXCEEDED,\n );\n }\n }\n\n this.log.info('Spend recorded', { developerId, amount });\n }, { developerId, amount });\n }\n\n /**\n * Decrement spend counters for refunds.\n * Uses atomic SQL decrement to avoid race conditions.\n */\n async decrementSpend(developerId: string, amount: number): Promise<void> {\n return this.withErrorHandling('decrementSpend', async () => {\n const { error: rpcError } = await this.db.rpc('decrement_budget_spend', {\n p_developer_id: developerId,\n p_amount: amount,\n });\n\n if (rpcError) {\n // Fallback: if the RPC doesn't exist yet, use direct update\n this.log.warn('RPC decrement_budget_spend not available, using fallback', {\n developerId,\n error: rpcError.message,\n });\n\n const budget = await this.getOrCreateBudget(developerId);\n const { error } = await this.db\n .from('budgets')\n .update({\n spent_today: Math.max(0, budget.spent_today - amount),\n spent_this_week: Math.max(0, budget.spent_this_week - amount),\n spent_this_month: Math.max(0, budget.spent_this_month - amount),\n updated_at: new Date().toISOString(),\n })\n .eq('id', budget.id);\n\n if (error) {\n throw new BudgetError(\n `Failed to decrement spend: ${error.message}`,\n ErrorCode.BUDGET_EXCEEDED,\n );\n }\n }\n\n this.log.info('Spend decremented (refund)', { developerId, amount });\n }, { developerId, amount });\n }\n\n /**\n * Get current budget config and spent amounts for a developer.\n */\n async getBudget(developerId: string): Promise<BudgetRow> {\n return this.withErrorHandling('getBudget', async () => {\n return this.getOrCreateBudget(developerId);\n }, { developerId });\n }\n\n /**\n * Update budget limits for a developer.\n */\n async setBudget(\n developerId: string,\n config: SetBudgetParams,\n ): Promise<BudgetRow> {\n return this.withErrorHandling('setBudget', async () => {\n // Enforce hard caps to prevent prompt-injection budget escalation\n if (config.dailyLimit !== undefined && config.dailyLimit > BUDGET_CAPS.daily) {\n throw new ValidationError(\n `Daily limit cannot exceed $${BUDGET_CAPS.daily / 100} (requested: $${config.dailyLimit / 100})`,\n );\n }\n if (config.weeklyLimit !== undefined && config.weeklyLimit > BUDGET_CAPS.weekly) {\n throw new ValidationError(\n `Weekly limit cannot exceed $${BUDGET_CAPS.weekly / 100} (requested: $${config.weeklyLimit / 100})`,\n );\n }\n if (config.monthlyLimit !== undefined && config.monthlyLimit > BUDGET_CAPS.monthly) {\n throw new ValidationError(\n `Monthly limit cannot exceed $${BUDGET_CAPS.monthly / 100} (requested: $${config.monthlyLimit / 100})`,\n );\n }\n if (config.perTaskLimit !== undefined && config.perTaskLimit > BUDGET_CAPS.perTask) {\n throw new ValidationError(\n `Per-task limit cannot exceed $${BUDGET_CAPS.perTask / 100} (requested: $${config.perTaskLimit / 100})`,\n );\n }\n\n await this.getOrCreateBudget(developerId);\n\n const updates: Record<string, unknown> = {\n updated_at: new Date().toISOString(),\n };\n\n if (config.dailyLimit !== undefined) updates.daily_limit = config.dailyLimit;\n if (config.weeklyLimit !== undefined) updates.weekly_limit = config.weeklyLimit;\n if (config.monthlyLimit !== undefined) updates.monthly_limit = config.monthlyLimit;\n if (config.perTaskLimit !== undefined) updates.per_task_limit = config.perTaskLimit;\n if (config.confirmationThreshold !== undefined) updates.confirmation_threshold = config.confirmationThreshold;\n if (config.merchantAllowlist !== undefined) updates.merchant_allowlist = config.merchantAllowlist;\n if (config.merchantBlocklist !== undefined) updates.merchant_blocklist = config.merchantBlocklist;\n\n const { data, error } = await this.db\n .from('budgets')\n .update(updates)\n .eq('developer_id', developerId)\n .select()\n .single();\n\n if (error || !data) {\n throw new BudgetError(\n `Failed to update budget: ${error?.message}`,\n ErrorCode.BUDGET_EXCEEDED,\n );\n }\n\n this.log.info('Budget updated', { developerId, config });\n\n return data as BudgetRow;\n }, { developerId });\n }\n\n /**\n * Reset daily/weekly/monthly counters. Called by a scheduled background job.\n */\n async resetCounters(\n period: 'daily' | 'weekly' | 'monthly',\n ): Promise<number> {\n return this.withErrorHandling('resetCounters', async () => {\n const updates: Record<string, unknown> = {\n last_reset_at: new Date().toISOString(),\n updated_at: new Date().toISOString(),\n };\n\n if (period === 'daily' || period === 'weekly' || period === 'monthly') {\n updates.spent_today = 0;\n }\n if (period === 'weekly' || period === 'monthly') {\n updates.spent_this_week = 0;\n }\n if (period === 'monthly') {\n updates.spent_this_month = 0;\n }\n\n const { data, error } = await this.db\n .from('budgets')\n .update(updates)\n .select('id');\n\n if (error) {\n throw new BudgetError(\n `Failed to reset ${period} counters: ${error.message}`,\n ErrorCode.BUDGET_EXCEEDED,\n );\n }\n\n const count = data?.length ?? 0;\n this.log.info('Budget counters reset', { period, count });\n\n return count;\n }, { period });\n }\n\n /**\n * Pause all payments for a developer. Used by auto-freeze and admin endpoint.\n */\n async pausePayments(developerId: string, reason: string): Promise<void> {\n return this.withErrorHandling('pausePayments', async () => {\n const { error } = await this.db\n .from('budgets')\n .update({\n payments_paused: true,\n pause_reason: reason,\n paused_at: new Date().toISOString(),\n updated_at: new Date().toISOString(),\n })\n .eq('developer_id', developerId);\n\n if (error) {\n throw new BudgetError(`Failed to pause payments: ${error.message}`);\n }\n\n this.log.warn('Payments paused', { developerId, reason });\n }, { developerId, reason });\n }\n\n /**\n * Resume payments for a developer. Resets velocity breach count.\n */\n async resumePayments(developerId: string): Promise<void> {\n return this.withErrorHandling('resumePayments', async () => {\n const { error } = await this.db\n .from('budgets')\n .update({\n payments_paused: false,\n pause_reason: null,\n paused_at: null,\n velocity_breach_count: 0,\n updated_at: new Date().toISOString(),\n })\n .eq('developer_id', developerId);\n\n if (error) {\n throw new BudgetError(`Failed to resume payments: ${error.message}`);\n }\n\n this.log.info('Payments resumed', { developerId });\n }, { developerId });\n }\n\n private async getOrCreateBudget(developerId: string): Promise<BudgetRow> {\n const { data, error } = await this.db\n .from('budgets')\n .select('*')\n .eq('developer_id', developerId)\n .limit(1)\n .single();\n\n if (data) return data as BudgetRow;\n\n // Auto-create with defaults\n const { data: created, error: createErr } = await this.db\n .from('budgets')\n .insert({ developer_id: developerId })\n .select()\n .single();\n\n if (createErr || !created) {\n throw new NotFoundError('Budget', developerId);\n }\n\n this.log.info('Budget auto-created with defaults', { developerId });\n\n return created as BudgetRow;\n }\n}\n","// ---------------------------------------------------------------------------\n// Card Service — Card CRUD\n// ---------------------------------------------------------------------------\n// Manages tokenized payment cards stored as VGS aliases. Cards never contain\n// raw PANs — only aliases, last4, brand, and metadata.\n// ---------------------------------------------------------------------------\n\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport { BaseService } from '../lib/base-service.js';\nimport type { ILogger } from '../lib/logger.js';\nimport type { ICardService, CardRow, AddCardParams } from '../lib/interfaces.js';\nimport { NotFoundError, ValidationError } from '../lib/errors.js';\n\nexport class CardService extends BaseService implements ICardService {\n readonly serviceName = 'CardService';\n\n constructor(db: SupabaseClient, logger: ILogger) {\n super(db, logger);\n }\n\n /**\n * Store a new card alias. The alias comes from VGS Collect.\n */\n async addCard(\n developerId: string,\n params: AddCardParams,\n ): Promise<CardRow> {\n return this.withErrorHandling('addCard', async () => {\n await this.verifyWalletOwnership(params.walletId, developerId);\n\n const { data, error } = await this.db\n .from('cards')\n .insert({\n wallet_id: params.walletId,\n developer_id: developerId,\n pan_alias: params.alias,\n last4: params.last4,\n brand: params.brand,\n exp_month: params.expMonth,\n exp_year: params.expYear,\n cardholder_name: params.cardholderName ?? null,\n is_default: false,\n status: 'active',\n })\n .select()\n .single();\n\n if (error || !data) {\n throw new ValidationError(`Failed to add card: ${error?.message}`);\n }\n\n this.log.info('Card added', {\n cardId: data.id,\n walletId: params.walletId,\n developerId,\n brand: params.brand,\n last4: params.last4,\n });\n\n return data as CardRow;\n }, { developerId, walletId: params.walletId });\n }\n\n /**\n * List cards for a wallet with ownership verification.\n */\n async listCards(walletId: string, developerId: string): Promise<CardRow[]> {\n return this.withErrorHandling('listCards', async () => {\n await this.verifyWalletOwnership(walletId, developerId);\n\n const { data, error } = await this.db\n .from('cards')\n .select('id, wallet_id, developer_id, pan_alias, last4, brand, card_type, exp_month, exp_year, cardholder_name, is_default, status, created_at, updated_at')\n .eq('wallet_id', walletId)\n .neq('status', 'removed')\n .order('created_at', { ascending: false });\n\n if (error) {\n throw new ValidationError(`Failed to list cards: ${error.message}`);\n }\n\n return (data ?? []) as CardRow[];\n }, { walletId, developerId });\n }\n\n /**\n * Soft-delete a card by setting status to 'removed' with ownership verification.\n */\n async removeCard(cardId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('removeCard', async () => {\n await this.verifyOwnership('cards', cardId, developerId, 'Card');\n\n const { error } = await this.db\n .from('cards')\n .update({ status: 'removed', updated_at: new Date().toISOString() })\n .eq('id', cardId);\n\n if (error) {\n throw new ValidationError(`Failed to remove card: ${error.message}`);\n }\n\n this.log.info('Card removed', { cardId, developerId });\n }, { cardId, developerId });\n }\n\n /**\n * Get the default card for a wallet. Returns null if no default is set.\n */\n async getDefaultCard(walletId: string, developerId: string): Promise<CardRow | null> {\n return this.withErrorHandling('getDefaultCard', async () => {\n await this.verifyWalletOwnership(walletId, developerId);\n\n const { data, error } = await this.db\n .from('cards')\n .select('*')\n .eq('wallet_id', walletId)\n .eq('status', 'active')\n .eq('is_default', true)\n .limit(1)\n .single();\n\n if (error || !data) return null;\n\n return data as CardRow;\n }, { walletId, developerId });\n }\n\n /**\n * Generate a VGS Collect link for secure card entry.\n * Returns a data URL with the VGS collect HTML and a 15-minute expiry.\n */\n async getAddCardLink(\n developerId: string,\n walletId: string,\n ): Promise<{ url: string; expiresAt: string }> {\n return this.withErrorHandling('getAddCardLink', async () => {\n await this.verifyWalletOwnership(walletId, developerId);\n\n const vaultId = process.env.VGS_VAULT_ID;\n const environment = process.env.VGS_ENVIRONMENT ?? 'sandbox';\n const routeId = process.env.VGS_ROUTE_ID;\n\n if (!vaultId || !routeId) {\n throw new ValidationError('VGS configuration is not set. Set VGS_VAULT_ID and VGS_ROUTE_ID environment variables.');\n }\n\n const expiresAt = new Date(Date.now() + 15 * 60 * 1000);\n\n const collectHtml = `<!DOCTYPE html>\n<html>\n<head>\n <title>Add Payment Card</title>\n <script src=\"https://js.verygoodvault.com/vgs-collect/2/vgs-collect.js\"></script>\n</head>\n<body>\n <div id=\"vgs-collect-form\"></div>\n <script>\n var form = VGSCollect.create('${vaultId}', '${environment}', function(state) {});\n form.field('#vgs-collect-form .card-number', {\n type: 'card-number',\n name: 'card_number',\n placeholder: 'Card Number',\n });\n form.field('#vgs-collect-form .card-expiration', {\n type: 'card-expiration-date',\n name: 'card_exp',\n placeholder: 'MM/YY',\n });\n form.field('#vgs-collect-form .card-cvc', {\n type: 'card-security-code',\n name: 'card_cvc',\n placeholder: 'CVC',\n });\n document.getElementById('submit-btn').addEventListener('click', function() {\n form.submit('/post', {\n headers: { 'x-developer-id': '${developerId}', 'x-wallet-id': '${walletId}' },\n }, function(status, response) {\n window.parent.postMessage({ status: status, data: response }, '*');\n });\n });\n </script>\n <button id=\"submit-btn\">Add Card</button>\n</body>\n</html>`;\n\n const encoded = Buffer.from(collectHtml).toString('base64');\n const url = `data:text/html;base64,${encoded}`;\n\n this.log.info('Add card link generated', {\n developerId,\n walletId,\n expiresAt: expiresAt.toISOString(),\n });\n\n return { url, expiresAt: expiresAt.toISOString() };\n }, { developerId, walletId });\n }\n}\n","// ---------------------------------------------------------------------------\n// Profile Service — Checkout Profile Management\n// ---------------------------------------------------------------------------\n// Manages billing/shipping checkout profiles per wallet for auto-fill\n// during agent-driven payments.\n// ---------------------------------------------------------------------------\n\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport { BaseService } from '../lib/base-service.js';\nimport type { ILogger } from '../lib/logger.js';\nimport type {\n IProfileService,\n CheckoutProfileRow,\n SetProfileParams,\n} from '../lib/interfaces.js';\nimport { NotFoundError, ValidationError } from '../lib/errors.js';\n\nexport class ProfileService extends BaseService implements IProfileService {\n readonly serviceName = 'ProfileService';\n\n constructor(db: SupabaseClient, logger: ILogger) {\n super(db, logger);\n }\n\n /**\n * Upsert a checkout profile for a wallet with ownership verification.\n */\n async setProfile(\n walletId: string,\n developerId: string,\n profile: SetProfileParams,\n ): Promise<CheckoutProfileRow> {\n return this.withErrorHandling('setProfile', async () => {\n await this.verifyWalletOwnership(walletId, developerId);\n\n const row = this.toDbRow(profile);\n\n // Check if profile exists\n const { data: existing } = await this.db\n .from('checkout_profiles')\n .select('id')\n .eq('wallet_id', walletId)\n .limit(1)\n .single();\n\n if (existing) {\n const { data, error } = await this.db\n .from('checkout_profiles')\n .update({ ...row, updated_at: new Date().toISOString() })\n .eq('wallet_id', walletId)\n .select()\n .single();\n\n if (error || !data) {\n throw new ValidationError(`Failed to update profile: ${error?.message}`);\n }\n\n this.log.info('Profile updated', { walletId, developerId });\n return data as CheckoutProfileRow;\n }\n\n const { data, error } = await this.db\n .from('checkout_profiles')\n .insert({\n wallet_id: walletId,\n developer_id: developerId,\n ...row,\n })\n .select()\n .single();\n\n if (error || !data) {\n throw new ValidationError(`Failed to create profile: ${error?.message}`);\n }\n\n this.log.info('Profile created', { walletId, developerId });\n return data as CheckoutProfileRow;\n }, { walletId, developerId });\n }\n\n /**\n * Get the checkout profile for a wallet.\n */\n async getProfile(walletId: string): Promise<CheckoutProfileRow | null> {\n return this.withErrorHandling('getProfile', async () => {\n const { data, error } = await this.db\n .from('checkout_profiles')\n .select('*')\n .eq('wallet_id', walletId)\n .limit(1)\n .single();\n\n if (error || !data) return null;\n return data as CheckoutProfileRow;\n }, { walletId });\n }\n\n /**\n * Partially update a checkout profile with ownership verification.\n */\n async updateProfile(\n walletId: string,\n developerId: string,\n updates: Partial<SetProfileParams>,\n ): Promise<CheckoutProfileRow> {\n return this.withErrorHandling('updateProfile', async () => {\n await this.verifyWalletOwnership(walletId, developerId);\n\n const row = this.toDbRow(updates);\n\n const { data, error } = await this.db\n .from('checkout_profiles')\n .update({ ...row, updated_at: new Date().toISOString() })\n .eq('wallet_id', walletId)\n .select()\n .single();\n\n if (error || !data) {\n throw new NotFoundError('Checkout profile', walletId);\n }\n\n this.log.info('Profile partially updated', { walletId, developerId });\n return data as CheckoutProfileRow;\n }, { walletId, developerId });\n }\n\n /**\n * Map camelCase params to snake_case DB column names.\n * Uses billing_line1 (not billing_address_line1) per migration 005.\n */\n private toDbRow(params: Partial<SetProfileParams>): Record<string, unknown> {\n const row: Record<string, unknown> = {};\n if (params.email !== undefined) row.email = params.email;\n if (params.phone !== undefined) row.phone = params.phone;\n if (params.fullName !== undefined) row.full_name = params.fullName;\n if (params.billingLine1 !== undefined) row.billing_line1 = params.billingLine1;\n if (params.billingLine2 !== undefined) row.billing_line2 = params.billingLine2;\n if (params.billingCity !== undefined) row.billing_city = params.billingCity;\n if (params.billingState !== undefined) row.billing_state = params.billingState;\n if (params.billingPostalCode !== undefined) row.billing_postal_code = params.billingPostalCode;\n if (params.billingCountry !== undefined) row.billing_country = params.billingCountry;\n if (params.shippingLine1 !== undefined) row.shipping_line1 = params.shippingLine1;\n if (params.shippingLine2 !== undefined) row.shipping_line2 = params.shippingLine2;\n if (params.shippingCity !== undefined) row.shipping_city = params.shippingCity;\n if (params.shippingState !== undefined) row.shipping_state = params.shippingState;\n if (params.shippingPostalCode !== undefined) row.shipping_postal_code = params.shippingPostalCode;\n if (params.shippingCountry !== undefined) row.shipping_country = params.shippingCountry;\n if (params.shippingSameAsBilling !== undefined) row.shipping_same_as_billing = params.shippingSameAsBilling;\n return row;\n }\n}\n","// ---------------------------------------------------------------------------\n// Merchant Account Service — Saved Merchant Logins\n// ---------------------------------------------------------------------------\n// Stores and retrieves saved merchant credentials per wallet. Passwords and\n// API keys are stored as VGS aliases — never in plaintext.\n// ---------------------------------------------------------------------------\n\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport { BaseService } from '../lib/base-service.js';\nimport type { ILogger } from '../lib/logger.js';\nimport type {\n IMerchantAccountService,\n MerchantAccountRow,\n MerchantAccountSafe,\n SaveMerchantAccountParams,\n} from '../lib/interfaces.js';\nimport { NotFoundError, ValidationError } from '../lib/errors.js';\n\nexport class MerchantAccountService extends BaseService implements IMerchantAccountService {\n readonly serviceName = 'MerchantAccountService';\n\n constructor(db: SupabaseClient, logger: ILogger) {\n super(db, logger);\n }\n\n /**\n * Save a merchant account with VGS-aliased credentials.\n * Upserts on (wallet_id, merchant_domain).\n */\n async saveMerchantAccount(\n walletId: string,\n developerId: string,\n params: SaveMerchantAccountParams,\n ): Promise<MerchantAccountRow> {\n return this.withErrorHandling('saveMerchantAccount', async () => {\n await this.verifyWalletOwnership(walletId, developerId);\n\n const { data, error } = await this.db\n .from('merchant_accounts')\n .upsert(\n {\n wallet_id: walletId,\n developer_id: developerId,\n merchant_domain: params.merchantDomain,\n merchant_name: params.merchantName ?? null,\n account_email: params.accountEmail ?? null,\n account_username: params.accountUsername ?? null,\n password_alias: params.passwordAlias ?? null,\n auth_type: params.authType ?? 'password',\n api_key_alias: params.apiKeyAlias ?? null,\n oauth_token_alias: params.oauthTokenAlias ?? null,\n status: 'active',\n updated_at: new Date().toISOString(),\n },\n { onConflict: 'wallet_id,merchant_domain' },\n )\n .select()\n .single();\n\n if (error || !data) {\n throw new ValidationError(`Failed to save merchant account: ${error?.message}`);\n }\n\n this.log.info('Merchant account saved', {\n accountId: data.id,\n walletId,\n developerId,\n merchantDomain: params.merchantDomain,\n });\n\n return data as MerchantAccountRow;\n }, { walletId, developerId, merchantDomain: params.merchantDomain });\n }\n\n /**\n * List merchant accounts for a wallet with ownership verification.\n * Returns safe fields only (domain + email, no secrets).\n */\n async listMerchantAccounts(walletId: string, developerId: string): Promise<MerchantAccountSafe[]> {\n return this.withErrorHandling('listMerchantAccounts', async () => {\n await this.verifyWalletOwnership(walletId, developerId);\n\n const { data, error } = await this.db\n .from('merchant_accounts')\n .select('id, wallet_id, merchant_domain, merchant_name, account_email, auth_type, status, last_used_at, created_at')\n .eq('wallet_id', walletId)\n .eq('status', 'active')\n .order('created_at', { ascending: false });\n\n if (error) {\n throw new ValidationError(`Failed to list merchant accounts: ${error.message}`);\n }\n\n return (data ?? []) as MerchantAccountSafe[];\n }, { walletId, developerId });\n }\n\n /**\n * Soft-delete a merchant account by setting status to 'revoked' with ownership verification.\n */\n async removeMerchantAccount(accountId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('removeMerchantAccount', async () => {\n await this.verifyOwnership('merchant_accounts', accountId, developerId, 'MerchantAccount');\n\n const { error } = await this.db\n .from('merchant_accounts')\n .update({ status: 'revoked', updated_at: new Date().toISOString() })\n .eq('id', accountId);\n\n if (error) {\n throw new ValidationError(`Failed to remove merchant account: ${error.message}`);\n }\n\n this.log.info('Merchant account revoked (soft-delete)', { accountId, developerId });\n }, { accountId, developerId });\n }\n\n /**\n * Resolve a merchant account for the payment flow. Returns full row\n * including VGS aliases so the proxy service can de-tokenize credentials.\n * Updates last_used_at with proper logging.\n */\n async resolveMerchantAccount(\n walletId: string,\n merchantDomain: string,\n ): Promise<MerchantAccountRow | null> {\n return this.withErrorHandling('resolveMerchantAccount', async () => {\n const { data, error } = await this.db\n .from('merchant_accounts')\n .select('*')\n .eq('wallet_id', walletId)\n .eq('merchant_domain', merchantDomain)\n .eq('status', 'active')\n .limit(1)\n .single();\n\n if (error || !data) return null;\n\n const account = data as MerchantAccountRow;\n\n // Update last_used_at with proper error handling and logging\n const { error: updateError } = await this.db\n .from('merchant_accounts')\n .update({ last_used_at: new Date().toISOString() })\n .eq('id', account.id);\n\n if (updateError) {\n this.log.warn('Failed to update last_used_at for merchant account', {\n accountId: account.id,\n error: updateError.message,\n });\n } else {\n this.log.debug('Merchant account last_used_at updated', {\n accountId: account.id,\n merchantDomain,\n });\n }\n\n return account;\n }, { walletId, merchantDomain });\n }\n}\n","// ---------------------------------------------------------------------------\n// VGS Proxy Service — Multi-Tenant\n// ---------------------------------------------------------------------------\n// Resolves per-developer vault configs from DB, caches OAuth tokens with\n// dedup locks to prevent concurrent refresh storms, and forwards requests\n// through VGS outbound proxy using native fetch.\n// ---------------------------------------------------------------------------\n\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport { BaseService } from '../lib/base-service.js';\nimport type { ILogger } from '../lib/logger.js';\nimport type {\n IVGSProxyService,\n VaultConfig,\n ProxyRequest,\n ProxyResponse,\n} from '../lib/interfaces.js';\nimport { ServiceError, ErrorCode } from '../lib/errors.js';\n\ninterface CachedToken {\n accessToken: string;\n expiresAt: number;\n}\n\nconst TOKEN_REFRESH_MARGIN_MS = 60_000;\n\nexport class VGSProxyService extends BaseService implements IVGSProxyService {\n readonly serviceName = 'VGSProxyService';\n\n /** Token cache keyed by vaultId */\n private tokenCache = new Map<string, CachedToken>();\n /** Dedup locks keyed by vaultId — prevents concurrent refresh */\n private refreshLocks = new Map<string, Promise<string>>();\n\n constructor(db: SupabaseClient, logger: ILogger) {\n super(db, logger);\n }\n\n /**\n * Forward a request through the VGS outbound proxy for a given developer.\n * Resolves vault config, gets a cached/deduped OAuth token, and proxies.\n */\n async proxyToPSP(\n developerId: string,\n request: ProxyRequest,\n ): Promise<ProxyResponse> {\n return this.withErrorHandling('proxyToPSP', async () => {\n const vault = await this.resolveVaultConfig(developerId);\n const accessToken = await this.getAccessToken(vault);\n const proxyUrl = this.buildProxyUrl(vault);\n\n this.log.info('Proxying request to PSP', {\n developerId,\n vaultId: vault.vaultId,\n targetUrl: request.url,\n method: request.method,\n });\n\n const response = await fetch(proxyUrl, {\n method: request.method,\n headers: {\n ...request.headers,\n 'Authorization': `Bearer ${accessToken}`,\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 // Audit log proxy calls via structured logging\n this.log.info('VGS proxy call completed', {\n developerId,\n operation: 'vgs_proxy_forward',\n targetUrl: request.url,\n method: request.method,\n vaultId: vault.vaultId,\n responseStatus: response.status,\n });\n\n if (response.status >= 400) {\n this.log.warn('PSP returned error status', {\n developerId,\n vaultId: vault.vaultId,\n responseStatus: response.status,\n targetUrl: request.url,\n });\n }\n\n return {\n status: response.status,\n body: responseBody,\n };\n }, { developerId, targetUrl: request.url });\n }\n\n /**\n * Resolve the default VGS vault config for a developer.\n * Checks for org-dedicated vault first, then falls back to shared default.\n */\n async resolveVaultConfig(developerId: string): Promise<VaultConfig> {\n return this.withErrorHandling('resolveVaultConfig', async () => {\n const { data, error } = await this.db\n .from('vgs_vault_configs')\n .select('*')\n .eq('developer_id', developerId)\n .eq('is_default', true)\n .limit(1)\n .single();\n\n if (error || !data) {\n throw new ServiceError(\n `No VGS vault config found for developer ${developerId}`,\n ErrorCode.VGS_VAULT_NOT_CONFIGURED,\n 400,\n );\n }\n\n return {\n vaultId: data.vault_id,\n environment: data.environment as 'sandbox' | 'live',\n clientId: data.client_id,\n clientSecret: data.client_secret_encrypted,\n proxyUser: data.proxy_user_encrypted,\n proxyPass: data.proxy_pass_encrypted,\n };\n }, { developerId });\n }\n\n /**\n * Invalidate cached token for a vault.\n */\n invalidateToken(vaultId: string): void {\n this.tokenCache.delete(vaultId);\n this.log.info('VGS token cache invalidated', { vaultId });\n }\n\n /**\n * Get a valid OAuth access token for a vault. Uses caching and promise-based\n * dedup locks so concurrent callers share a single refresh request.\n */\n private async getAccessToken(vault: VaultConfig): Promise<string> {\n const cached = this.tokenCache.get(vault.vaultId);\n if (cached && Date.now() < cached.expiresAt - TOKEN_REFRESH_MARGIN_MS) {\n return cached.accessToken;\n }\n\n // Check if a refresh is already in-flight for this vault\n const existing = this.refreshLocks.get(vault.vaultId);\n if (existing) {\n return existing;\n }\n\n // Start a new refresh and store the promise so concurrent callers share it\n const refreshPromise = this.refreshToken(vault).finally(() => {\n this.refreshLocks.delete(vault.vaultId);\n });\n\n this.refreshLocks.set(vault.vaultId, refreshPromise);\n return refreshPromise;\n }\n\n private async refreshToken(vault: VaultConfig): Promise<string> {\n const env = vault.environment === 'live' ? 'live' : 'sandbox';\n const tokenUrl = `https://auth.verygoodsecurity.com/vaults/${vault.vaultId}/tokens?env=${env}`;\n\n const body = new URLSearchParams({\n grant_type: 'client_credentials',\n client_id: vault.clientId,\n client_secret: vault.clientSecret,\n });\n\n this.log.debug('Refreshing VGS OAuth token', { vaultId: vault.vaultId, env });\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 new ServiceError(\n `VGS token exchange failed for vault ${vault.vaultId}: ${response.status}`,\n ErrorCode.VGS_TOKEN_REFRESH_FAILED,\n 502,\n true,\n );\n }\n\n const data = (await response.json()) as {\n access_token: string;\n expires_in: number;\n };\n\n this.tokenCache.set(vault.vaultId, {\n accessToken: data.access_token,\n expiresAt: Date.now() + data.expires_in * 1000,\n });\n\n this.log.info('VGS OAuth token refreshed', { vaultId: vault.vaultId });\n\n return data.access_token;\n }\n\n private buildProxyUrl(vault: VaultConfig): string {\n const env = vault.environment === 'live' ? 'live' : 'sandbox';\n return `https://${vault.vaultId}.${env}.verygoodproxy.com`;\n }\n}\n","// ---------------------------------------------------------------------------\n// Wallet Service — Wallet Lifecycle Management\n// ---------------------------------------------------------------------------\n// Creates, retrieves, lists, and revokes developer wallets. Each wallet\n// represents an isolated payment context for an end-user or agent.\n// ---------------------------------------------------------------------------\n\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport { BaseService } from '../lib/base-service.js';\nimport type { ILogger } from '../lib/logger.js';\nimport type {\n IWalletService,\n WalletRow,\n CreateWalletParams,\n} from '../lib/interfaces.js';\nimport type { ServiceHealth } from '../lib/base-service.js';\nimport { NotFoundError, ValidationError } from '../lib/errors.js';\n\nexport class WalletService extends BaseService implements IWalletService {\n readonly serviceName = 'WalletService';\n\n constructor(db: SupabaseClient, logger: ILogger) {\n super(db, logger);\n }\n\n /**\n * Create a new wallet for a developer.\n */\n async create(developerId: string, params: CreateWalletParams): Promise<WalletRow> {\n return this.withErrorHandling('create', async () => {\n const { data, error } = await this.db\n .from('wallets')\n .insert({\n developer_id: developerId,\n end_user_id: params.userId ?? null,\n currency: params.currency ?? 'USD',\n status: 'active',\n })\n .select()\n .single();\n\n if (error || !data) {\n throw new ValidationError(`Failed to create wallet: ${error?.message}`);\n }\n\n this.log.info('Wallet created', {\n walletId: data.id,\n developerId,\n currency: params.currency ?? 'USD',\n });\n\n return data as WalletRow;\n }, { developerId });\n }\n\n /**\n * Get a wallet by ID with ownership verification.\n */\n async get(walletId: string, developerId: string): Promise<WalletRow> {\n return this.withErrorHandling('get', async () => {\n const { data, error } = await this.db\n .from('wallets')\n .select('*')\n .eq('id', walletId)\n .eq('developer_id', developerId)\n .single();\n\n if (error || !data) {\n throw new NotFoundError('Wallet', walletId);\n }\n\n return data as WalletRow;\n }, { walletId, developerId });\n }\n\n /**\n * List wallets for a developer with pagination and total count.\n */\n async list(\n developerId: string,\n params?: { limit?: number; offset?: number },\n ): Promise<{ data: WalletRow[]; total: number }> {\n return this.withErrorHandling('list', async () => {\n const limit = params?.limit ?? 50;\n const offset = params?.offset ?? 0;\n\n const { count, error: countError } = await this.db\n .from('wallets')\n .select('id', { count: 'exact', head: true })\n .eq('developer_id', developerId);\n\n if (countError) {\n throw new ValidationError(`Failed to count wallets: ${countError.message}`);\n }\n\n const { data, error } = await this.db\n .from('wallets')\n .select('*')\n .eq('developer_id', developerId)\n .order('created_at', { ascending: false })\n .range(offset, offset + limit - 1);\n\n if (error) {\n throw new ValidationError(`Failed to list wallets: ${error.message}`);\n }\n\n return {\n data: (data ?? []) as WalletRow[],\n total: count ?? 0,\n };\n }, { developerId, limit: params?.limit, offset: params?.offset });\n }\n\n /**\n * Revoke a wallet with ownership verification (soft-delete via status).\n */\n async revoke(walletId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('revoke', async () => {\n await this.verifyWalletOwnership(walletId, developerId);\n\n const { error } = await this.db\n .from('wallets')\n .update({\n status: 'revoked',\n updated_at: new Date().toISOString(),\n })\n .eq('id', walletId);\n\n if (error) {\n throw new ValidationError(`Failed to revoke wallet: ${error.message}`);\n }\n\n this.log.info('Wallet revoked', { walletId, developerId });\n }, { walletId, developerId });\n }\n\n async getBalance(walletId: string, developerId: string): Promise<{ balance: number; currency: string }> {\n return this.withErrorHandling('wallet.getBalance', async () => {\n const wallet = await this.get(walletId, developerId);\n // Balance would come from a balance ledger in production\n return { balance: 0, currency: wallet.currency };\n });\n }\n\n async deposit(walletId: string, developerId: string, amount: number): Promise<{ balance: number; transactionId: string }> {\n return this.withErrorHandling('wallet.deposit', async () => {\n await this.verifyWalletOwnership(walletId, developerId);\n // In production, this would create a ledger entry\n const transactionId = `txn_dep_${Date.now()}`;\n return { balance: amount, transactionId };\n });\n }\n\n async setDefault(walletId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('wallet.setDefault', async () => {\n // Find current default so we can restore it on failure\n const { data: previousDefault } = await this.db\n .from('wallets')\n .select('id')\n .eq('developer_id', developerId)\n .eq('is_default', true)\n .limit(1)\n .maybeSingle();\n\n // Unset current default\n await this.db\n .from('wallets')\n .update({ is_default: false })\n .eq('developer_id', developerId)\n .eq('is_default', true);\n\n // Set new default — rollback if this fails\n const { error } = await this.db\n .from('wallets')\n .update({ is_default: true })\n .eq('id', walletId)\n .eq('developer_id', developerId);\n\n if (error) {\n // Restore previous default\n if (previousDefault) {\n await this.db\n .from('wallets')\n .update({ is_default: true })\n .eq('id', previousDefault.id);\n }\n throw error;\n }\n });\n }\n\n async update(walletId: string, developerId: string, updates: { label?: string; budgetConfig?: Record<string, unknown> }): Promise<WalletRow> {\n return this.withErrorHandling('wallet.update', async () => {\n await this.verifyWalletOwnership(walletId, developerId);\n const updateData: Record<string, unknown> = { updated_at: new Date().toISOString() };\n if (updates.label !== undefined) updateData.label = updates.label;\n if (updates.budgetConfig !== undefined) updateData.budget_config = updates.budgetConfig;\n\n const { data, error } = await this.db\n .from('wallets')\n .update(updateData)\n .eq('id', walletId)\n .select()\n .single();\n if (error) throw error;\n return data as WalletRow;\n });\n }\n}\n","// ---------------------------------------------------------------------------\n// Payment Service — Payment Orchestration\n// ---------------------------------------------------------------------------\n// Orchestrates the full payment flow: validate token -> check mandate ->\n// check budget -> resolve checkout profile -> resolve card -> check for\n// network tokens -> route through protocol adapter or VGS proxy ->\n// record transaction. Enforces idempotency keys.\n// ---------------------------------------------------------------------------\n\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport { BaseService } from '../lib/base-service.js';\nimport type { ILogger } from '../lib/logger.js';\nimport type {\n IPaymentService,\n ITokenService,\n IBudgetService,\n IProfileService,\n ICardService,\n IVGSProxyService,\n IMandateService,\n IDelegationService,\n IProtocolClientService,\n IVICService,\n IMastercardAPService,\n TransactionRow,\n ExecutePaymentParams,\n RefundParams,\n RefundRow,\n} from '../lib/interfaces.js';\nimport {\n PaymentError,\n TokenError,\n BudgetError,\n MandateError,\n NotFoundError,\n ConflictError,\n ErrorCode,\n} from '../lib/errors.js';\n\nexport class PaymentService extends BaseService implements IPaymentService {\n readonly serviceName = 'PaymentService';\n\n private readonly tokenService: ITokenService;\n private readonly budgetService: IBudgetService;\n private readonly profileService: IProfileService;\n private readonly cardService: ICardService;\n private readonly vgsProxy: IVGSProxyService;\n private readonly mandateService: IMandateService;\n private readonly delegationService: IDelegationService;\n private readonly protocolClient: IProtocolClientService;\n private readonly vicService: IVICService;\n private readonly mastercardAP: IMastercardAPService;\n\n constructor(\n db: SupabaseClient,\n logger: ILogger,\n tokenService: ITokenService,\n budgetService: IBudgetService,\n profileService: IProfileService,\n cardService: ICardService,\n vgsProxy: IVGSProxyService,\n mandateService: IMandateService,\n delegationService: IDelegationService,\n protocolClient: IProtocolClientService,\n vicService: IVICService,\n mastercardAP: IMastercardAPService,\n ) {\n super(db, logger);\n this.tokenService = tokenService;\n this.budgetService = budgetService;\n this.profileService = profileService;\n this.cardService = cardService;\n this.vgsProxy = vgsProxy;\n this.mandateService = mandateService;\n this.delegationService = delegationService;\n this.protocolClient = protocolClient;\n this.vicService = vicService;\n this.mastercardAP = mastercardAP;\n }\n\n /**\n * Execute a payment. Full flow:\n * 1. Idempotency check — return existing tx if key matches\n * 2. Validate agentic token\n * 2.5 Mandate validation — if token has mandate, enforce constraints\n * 2.7 Delegation chain check — if mandate is delegated, verify chain\n * 3. Check payment pause status\n * 4. Atomic budget check-and-record-spend (prevents race conditions)\n * 5. Enforce merchant allowlist/blocklist\n * 6. Resolve checkout profile for auto-fill\n * 7. Resolve card via ICardService\n * 7.5 Check for network token (VIC or MC Agent Pay)\n * 8. Route through protocol adapter or VGS proxy\n * 9. Record transaction\n * 10. Consume token (if PSP declines, decrement spend reservation)\n */\n async execute(\n developerId: string,\n params: ExecutePaymentParams,\n ): Promise<TransactionRow> {\n return this.withErrorHandling('execute', async () => {\n // 1. Idempotency check\n if (params.idempotencyKey) {\n const existing = await this.findByIdempotencyKey(params.idempotencyKey);\n if (existing) {\n this.log.info('Returning existing transaction for idempotency key', {\n idempotencyKey: params.idempotencyKey,\n transactionId: existing.id,\n });\n return existing;\n }\n }\n\n // 2. Validate agentic token\n const token = await this.tokenService.validateToken(params.tokenId);\n\n if (token.amount < params.amount) {\n throw new TokenError(\n `Token amount (${token.amount}) is less than payment amount (${params.amount})`,\n ErrorCode.TOKEN_AMOUNT_EXCEEDED,\n );\n }\n\n // 2.5 Mandate validation — if token has mandate, enforce constraints\n const mandateId = (token as any).mandate_id as string | null;\n if (mandateId) {\n const mandateResult = await this.mandateService.validateAgainstMandate(mandateId, {\n amount: params.amount,\n currency: params.currency ?? 'USD',\n merchant: params.recipient,\n });\n\n if (!mandateResult.valid) {\n throw new MandateError(\n `Mandate violation: ${mandateResult.violations?.join(', ')}`,\n ErrorCode.MANDATE_VIOLATED,\n { mandateId, violations: mandateResult.violations },\n );\n }\n\n // 2.7 Delegation chain check — if mandate is delegated, verify chain\n const mandate = await this.mandateService.getMandate(mandateId, developerId);\n if (mandate.delegated_to) {\n const chainResult = await this.delegationService.validateDelegationChain(\n mandate.delegated_to,\n mandateId,\n );\n if (!chainResult.valid) {\n throw new MandateError(\n 'Delegation chain validation failed',\n ErrorCode.DELEGATION_CHAIN_BROKEN,\n { agentId: mandate.delegated_to, mandateId },\n );\n }\n }\n }\n\n // 3. Check payment pause status\n const budget = await this.budgetService.getBudget(developerId);\n if (budget.payments_paused) {\n throw new BudgetError(\n `Payments are paused: ${budget.pause_reason ?? 'no reason given'}. Contact support or use the wallet settings to resume.`,\n ErrorCode.PAYMENTS_PAUSED,\n );\n }\n\n // 4. Atomic budget check-and-record-spend (prevents race conditions)\n const budgetCheck = await this.budgetService.checkAndRecordSpend(\n developerId,\n params.amount,\n );\n if (!budgetCheck.allowed) {\n const failedTx = await this.recordTransaction(developerId, params, {\n status: 'failed',\n declineReason: budgetCheck.reason ?? 'budget_exceeded',\n });\n throw new BudgetError(\n `Budget check failed: ${budgetCheck.reason}`,\n (budgetCheck.code as ErrorCode) ?? ErrorCode.BUDGET_EXCEEDED,\n { transactionId: failedTx.id },\n );\n }\n\n // 5. Enforce merchant allowlist/blocklist\n const recipientDomain = extractDomain(params.recipient);\n\n if (budget.merchant_blocklist && budget.merchant_blocklist.length > 0) {\n if (budget.merchant_blocklist.some(blocked => recipientDomain.includes(blocked))) {\n // Reverse the budget reservation\n await this.budgetService.decrementSpend(developerId, params.amount);\n throw new PaymentError(\n `Merchant \"${recipientDomain}\" is on your blocklist`,\n ErrorCode.MERCHANT_BLOCKED,\n );\n }\n }\n\n if (budget.merchant_allowlist && budget.merchant_allowlist.length > 0) {\n if (!budget.merchant_allowlist.some(allowed => recipientDomain.includes(allowed))) {\n // Reverse the budget reservation\n await this.budgetService.decrementSpend(developerId, params.amount);\n throw new PaymentError(\n `Merchant \"${recipientDomain}\" is not on your allowlist`,\n ErrorCode.MERCHANT_NOT_ALLOWED,\n );\n }\n }\n\n // 6. Resolve checkout profile\n const profile = await this.profileService.getProfile(params.walletId);\n\n // 7. Resolve card via ICardService\n let cardAlias: string | null = null;\n let resolvedCardId: string | null = params.cardId ?? null;\n\n if (params.cardId) {\n const { data: card } = await this.db\n .from('cards')\n .select('pan_alias')\n .eq('id', params.cardId)\n .eq('status', 'active')\n .single();\n cardAlias = card?.pan_alias ?? null;\n } else {\n // Use default card from wallet via ICardService\n const defaultCard = await this.cardService.getDefaultCard(params.walletId, developerId);\n if (defaultCard) {\n cardAlias = defaultCard.pan_alias;\n resolvedCardId = defaultCard.id;\n }\n }\n\n if (!cardAlias) {\n // Reverse the budget reservation since we can't proceed\n await this.budgetService.decrementSpend(developerId, params.amount);\n const failedTx = await this.recordTransaction(developerId, params, {\n status: 'failed',\n declineReason: 'no_payment_method',\n });\n throw new PaymentError(\n 'No payment card available for this wallet',\n ErrorCode.NO_PAYMENT_METHOD,\n { transactionId: failedTx.id },\n );\n }\n\n // 7.5 Credential selection (issuance layer)\n // VIC/MC Agent Pay produce credentials — they are NOT routing destinations.\n // The credential flows INTO whichever acceptance method is selected.\n let networkTokenId: string | null = null;\n let credentialType: 'raw_card' | 'vic_dpan' | 'mdes_token' = 'raw_card';\n const route = 'vgs_proxy';\n\n if (resolvedCardId) {\n // Try to find an active network token for this card\n const { data: networkTokens } = await this.db\n .from('network_tokens')\n .select('id, network, token_type')\n .eq('card_id', resolvedCardId)\n .eq('status', 'active')\n .order('created_at', { ascending: false })\n .limit(1);\n\n if (networkTokens && networkTokens.length > 0) {\n networkTokenId = networkTokens[0]!.id;\n credentialType = networkTokens[0]!.network === 'visa' ? 'vic_dpan' : 'mdes_token';\n }\n }\n\n // 8. Route through protocol adapter or VGS proxy\n let pspResult: { status: number; body: unknown } | null = null;\n let pspTransactionId: string | null = null;\n\n try {\n const proxyResponse = await this.vgsProxy.proxyToPSP(developerId, {\n url: params.recipient,\n method: 'POST',\n headers: {},\n body: {\n card_number: cardAlias,\n network_token_id: networkTokenId,\n amount: params.amount,\n currency: params.currency ?? 'USD',\n description: params.description,\n billing: profile\n ? {\n name: profile.full_name,\n email: profile.email,\n address: {\n line1: profile.billing_line1,\n line2: profile.billing_line2,\n city: profile.billing_city,\n state: profile.billing_state,\n postal_code: profile.billing_postal_code,\n country: profile.billing_country,\n },\n }\n : undefined,\n shipping:\n profile && !profile.shipping_same_as_billing\n ? {\n address: {\n line1: profile.shipping_line1,\n line2: profile.shipping_line2,\n city: profile.shipping_city,\n state: profile.shipping_state,\n postal_code: profile.shipping_postal_code,\n country: profile.shipping_country,\n },\n }\n : undefined,\n },\n });\n\n pspResult = { status: proxyResponse.status, body: proxyResponse.body };\n const body = proxyResponse.body as Record<string, unknown> | null;\n pspTransactionId = (body?.transaction_id as string) ?? null;\n } catch (err) {\n // PSP failed — reverse budget reservation\n await this.budgetService.decrementSpend(developerId, params.amount);\n const failedTx = await this.recordTransaction(developerId, params, {\n status: 'failed',\n declineReason: err instanceof Error ? err.message : 'proxy_error',\n });\n throw new PaymentError(\n 'VGS proxy request failed',\n ErrorCode.PROXY_ERROR,\n { transactionId: failedTx.id },\n );\n }\n\n // 9. Record transaction\n const txStatus = pspResult && pspResult.status >= 200 && pspResult.status < 300\n ? 'completed'\n : 'failed';\n\n const transaction = await this.recordTransaction(developerId, params, {\n status: txStatus,\n pspTransactionId,\n cardId: resolvedCardId,\n route,\n credentialType,\n declineReason: txStatus === 'failed' ? 'psp_declined' : undefined,\n });\n\n // 10. Consume token + mandate; if PSP declined, reverse budget reservation\n if (txStatus === 'completed') {\n await this.tokenService.consumeToken(params.tokenId, transaction.id);\n\n // Consume mandate if present\n if (mandateId) {\n await this.mandateService.consumeMandate(mandateId, transaction.id);\n }\n\n this.log.info('Payment completed', {\n transactionId: transaction.id,\n developerId,\n amount: params.amount,\n currency: params.currency ?? 'USD',\n route,\n });\n } else {\n // PSP declined — reverse the budget reservation\n await this.budgetService.decrementSpend(developerId, params.amount);\n\n this.log.warn('Payment declined by PSP', {\n transactionId: transaction.id,\n developerId,\n pspStatus: pspResult?.status,\n });\n }\n\n return transaction;\n }, { developerId, tokenId: params.tokenId, amount: params.amount });\n }\n\n /**\n * Get a single transaction by ID with ownership verification.\n */\n async getTransaction(transactionId: string, developerId: string): Promise<TransactionRow> {\n return this.withErrorHandling('getTransaction', async () => {\n const { data, error } = await this.db\n .from('transactions')\n .select('*')\n .eq('id', transactionId)\n .eq('developer_id', developerId)\n .single();\n\n if (error || !data) {\n throw new NotFoundError('Transaction', transactionId);\n }\n\n return data as TransactionRow;\n }, { transactionId, developerId });\n }\n\n /**\n * List transactions for a developer with pagination.\n */\n async listTransactions(\n developerId: string,\n params?: { limit?: number; offset?: number },\n ): Promise<{ data: TransactionRow[]; total: number }> {\n return this.withErrorHandling('listTransactions', async () => {\n const limit = params?.limit ?? 50;\n const offset = params?.offset ?? 0;\n\n const { count, error: countError } = await this.db\n .from('transactions')\n .select('id', { count: 'exact', head: true })\n .eq('developer_id', developerId);\n\n if (countError) {\n throw new PaymentError(`Failed to count transactions: ${countError.message}`);\n }\n\n const { data, error } = await this.db\n .from('transactions')\n .select('*')\n .eq('developer_id', developerId)\n .order('created_at', { ascending: false })\n .range(offset, offset + limit - 1);\n\n if (error) {\n throw new PaymentError(`Failed to list transactions: ${error.message}`);\n }\n\n return {\n data: (data ?? []) as TransactionRow[],\n total: count ?? 0,\n };\n }, { developerId, limit: params?.limit, offset: params?.offset });\n }\n\n /**\n * Refund a transaction. Creates a refund record and decrements budget spend.\n * Checks cumulative refund total and refund velocity to prevent abuse.\n */\n async refund(developerId: string, params: RefundParams): Promise<RefundRow> {\n return this.withErrorHandling('refund', async () => {\n // Get the original transaction\n const transaction = await this.getTransaction(params.transactionId, developerId);\n\n if (transaction.status !== 'completed' && transaction.status !== 'partially_refunded') {\n throw new PaymentError(\n `Transaction ${params.transactionId} is not refundable (status: ${transaction.status})`,\n ErrorCode.TRANSACTION_NOT_REFUNDABLE,\n );\n }\n\n const refundAmount = params.amount ?? transaction.amount;\n\n if (refundAmount > transaction.amount) {\n throw new PaymentError(\n `Refund amount (${refundAmount}) exceeds transaction amount (${transaction.amount})`,\n ErrorCode.REFUND_FAILED,\n );\n }\n\n // Check cumulative refunds for this transaction\n const { data: existingRefunds } = await this.db\n .from('refunds')\n .select('amount')\n .eq('transaction_id', params.transactionId)\n .in('status', ['completed', 'initiated']);\n\n const totalRefunded = (existingRefunds ?? []).reduce(\n (sum: number, r: { amount: number }) => sum + r.amount,\n 0,\n );\n\n if (totalRefunded + refundAmount > transaction.amount) {\n throw new PaymentError(\n `Cumulative refund amount ($${((totalRefunded + refundAmount) / 100).toFixed(2)}) would exceed transaction amount ($${(transaction.amount / 100).toFixed(2)})`,\n ErrorCode.CUMULATIVE_REFUND_EXCEEDED,\n );\n }\n\n // Check refund velocity (daily limit)\n const budget = await this.budgetService.getBudget(developerId);\n if (budget.refunds_today >= budget.max_refunds_per_day) {\n throw new PaymentError(\n `Daily refund limit reached (${budget.max_refunds_per_day} refunds per day)`,\n ErrorCode.REFUND_LIMIT_EXCEEDED,\n );\n }\n\n // Check for duplicate refund via idempotency key\n if (params.idempotencyKey) {\n const { data: existingRefund } = await this.db\n .from('refunds')\n .select('*')\n .eq('transaction_id', params.transactionId)\n .eq('developer_id', developerId)\n .eq('idempotency_key', params.idempotencyKey)\n .limit(1)\n .single();\n\n if (existingRefund) {\n this.log.info('Returning existing refund for idempotency', {\n refundId: existingRefund.id,\n transactionId: params.transactionId,\n });\n return existingRefund as RefundRow;\n }\n }\n\n // Create refund record\n const { data: refund, error } = await this.db\n .from('refunds')\n .insert({\n transaction_id: params.transactionId,\n developer_id: developerId,\n amount: refundAmount,\n reason: params.reason ?? null,\n status: 'completed',\n })\n .select()\n .single();\n\n if (error || !refund) {\n throw new PaymentError(\n `Failed to create refund: ${error?.message}`,\n ErrorCode.REFUND_FAILED,\n );\n }\n\n // Update transaction status\n const newTotalRefunded = totalRefunded + refundAmount;\n await this.db\n .from('transactions')\n .update({\n status: newTotalRefunded >= transaction.amount ? 'refunded' : 'partially_refunded',\n })\n .eq('id', params.transactionId);\n\n // Decrement budget spend (does NOT reset spend counters — only reduces them)\n await this.budgetService.decrementSpend(developerId, refundAmount);\n\n // Increment refund velocity counter\n await this.db\n .from('budgets')\n .update({\n refunds_today: budget.refunds_today + 1,\n updated_at: new Date().toISOString(),\n })\n .eq('developer_id', developerId);\n\n this.log.info('Refund processed', {\n refundId: refund.id,\n transactionId: params.transactionId,\n refundAmount,\n totalRefundedNow: newTotalRefunded,\n developerId,\n });\n\n return refund as RefundRow;\n }, { developerId, transactionId: params.transactionId });\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n private async findByIdempotencyKey(\n key: string,\n ): Promise<TransactionRow | null> {\n const { data } = await this.db\n .from('transactions')\n .select('*')\n .eq('idempotency_key', key)\n .limit(1)\n .single();\n\n return (data as TransactionRow) ?? null;\n }\n\n private async recordTransaction(\n developerId: string,\n params: ExecutePaymentParams,\n result: {\n status: string;\n pspTransactionId?: string | null;\n cardId?: string | null;\n route?: string;\n credentialType?: string;\n declineReason?: string;\n },\n ): Promise<TransactionRow> {\n const { data, error } = await this.db\n .from('transactions')\n .insert({\n developer_id: developerId,\n wallet_id: params.walletId,\n card_id: result.cardId ?? params.cardId ?? null,\n token_id: params.tokenId,\n amount: params.amount,\n currency: params.currency ?? 'USD',\n recipient: params.recipient,\n description: params.description ?? null,\n route: result.route ?? 'vgs_proxy',\n credential_type: result.credentialType ?? 'raw_card',\n status: result.status,\n psp_transaction_id: result.pspTransactionId ?? null,\n decline_reason: result.declineReason ?? null,\n idempotency_key: params.idempotencyKey ?? null,\n })\n .select()\n .single();\n\n if (error || !data) {\n throw new PaymentError(\n `Failed to record transaction: ${error?.message}`,\n ErrorCode.PAYMENT_FAILED,\n );\n }\n\n return data as TransactionRow;\n }\n}\n\n/**\n * Extract domain from a recipient string.\n * Handles full URLs, bare domains, and email-style identifiers.\n */\nfunction extractDomain(recipient: string): string {\n try {\n // If it looks like a URL, parse it\n if (recipient.includes('://')) {\n return new URL(recipient).hostname.toLowerCase();\n }\n // Strip any path component\n return recipient.split('/')[0]!.toLowerCase();\n } catch {\n return recipient.toLowerCase();\n }\n}\n","// ---------------------------------------------------------------------------\n// MerchantDirectoryService — Global Merchant Registry\n// ---------------------------------------------------------------------------\n// Manages the merchant directory: sync from Lane backend, discover protocol\n// merchants, provide capabilities for the routing engine.\n// ---------------------------------------------------------------------------\n\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from '../lib/logger.js';\nimport type {\n IMerchantDirectoryService,\n MerchantDirectoryRow,\n MerchantDirectorySearchParams,\n MerchantDirectorySyncResult,\n MerchantVerticalSummary,\n} from '../lib/interfaces.js';\nimport { BaseService } from '../lib/base-service.js';\nimport { NotFoundError } from '../lib/errors.js';\n\ninterface MerchantCapabilities {\n merchantId: string;\n hasBillingAPI: boolean;\n supportsACP: boolean;\n supportsUCP: boolean;\n supportsX402: boolean;\n supportsVIC: boolean;\n acceptsVisa: boolean;\n acceptsMastercard: boolean;\n mccs: string[];\n}\n\nexport class MerchantDirectoryService extends BaseService implements IMerchantDirectoryService {\n readonly serviceName = 'MerchantDirectoryService';\n\n private cache = new Map<string, MerchantDirectoryRow>();\n private refreshTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(db: SupabaseClient, logger: ILogger) {\n super(db, logger);\n }\n\n // -------------------------------------------------------------------------\n // Lifecycle\n // -------------------------------------------------------------------------\n\n override async onStart(): Promise<void> {\n await this.loadCache();\n\n // Auto-sync on startup if directory is empty\n if (this.cache.size === 0) {\n const backendUrl = process.env['LANE_BACKEND_URL'];\n const backendToken = process.env['LANE_BACKEND_TOKEN'];\n if (backendUrl && backendToken) {\n this.log.info('Merchant directory empty, triggering initial sync');\n try {\n await this.syncFromLaneBackend(backendUrl, backendToken);\n } catch (err) {\n this.log.warn('Initial merchant sync failed, will retry later', { error: String(err) });\n }\n }\n }\n\n // Refresh cache every 30 minutes\n this.refreshTimer = setInterval(() => {\n this.loadCache().catch((err) =>\n this.log.error('Failed to refresh merchant cache', err),\n );\n }, 30 * 60 * 1000);\n\n this.log.info(`${this.serviceName} started`, { cachedMerchants: this.cache.size });\n }\n\n override async onStop(): Promise<void> {\n if (this.refreshTimer) {\n clearInterval(this.refreshTimer);\n this.refreshTimer = null;\n }\n this.log.info(`${this.serviceName} stopped`);\n }\n\n // -------------------------------------------------------------------------\n // Cache management\n // -------------------------------------------------------------------------\n\n private async loadCache(): Promise<void> {\n const { data, error } = await this.db\n .from('merchant_directory')\n .select('*')\n .eq('status', 'active');\n\n if (error) {\n this.log.error('Failed to load merchant cache', error);\n return;\n }\n\n this.cache.clear();\n for (const row of (data ?? []) as MerchantDirectoryRow[]) {\n this.cache.set(row.id, row);\n }\n }\n\n // -------------------------------------------------------------------------\n // Query methods\n // -------------------------------------------------------------------------\n\n async listMerchants(\n params: MerchantDirectorySearchParams = {},\n ): Promise<{ data: MerchantDirectoryRow[]; total: number }> {\n return this.withErrorHandling('listMerchants', async () => {\n const limit = params.limit ?? 20;\n const offset = params.offset ?? 0;\n\n let query = this.db\n .from('merchant_directory')\n .select('*', { count: 'exact' })\n .eq('status', 'active')\n .order('name', { ascending: true })\n .range(offset, offset + limit - 1);\n\n if (params.query) {\n query = query.or(`name.ilike.%${params.query}%,description.ilike.%${params.query}%`);\n }\n if (params.tier) {\n query = query.eq('tier', params.tier);\n }\n if (params.merchantType) {\n query = query.eq('merchant_type', params.merchantType);\n }\n if (params.vertical) {\n query = query.eq('vertical', params.vertical);\n }\n if (params.subcategory) {\n query = query.contains('subcategories', [params.subcategory]);\n }\n if (params.protocol) {\n query = query.contains('protocols', [params.protocol]);\n }\n\n const { data, count, error } = await query;\n if (error) throw error;\n\n return {\n data: (data ?? []) as MerchantDirectoryRow[],\n total: count ?? 0,\n };\n });\n }\n\n async getMerchant(identifier: string): Promise<MerchantDirectoryRow | null> {\n return this.withErrorHandling('getMerchant', async () => {\n // Try UUID lookup first\n const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n if (uuidRegex.test(identifier)) {\n const { data } = await this.db\n .from('merchant_directory')\n .select('*')\n .eq('id', identifier)\n .single();\n if (data) return data as MerchantDirectoryRow;\n }\n\n // Try slug lookup\n const { data: bySlug } = await this.db\n .from('merchant_directory')\n .select('*')\n .eq('slug', identifier)\n .single();\n if (bySlug) return bySlug as MerchantDirectoryRow;\n\n // Try domain lookup\n const { data: byDomain } = await this.db\n .from('merchant_directory')\n .select('*')\n .eq('domain', identifier)\n .single();\n if (byDomain) return byDomain as MerchantDirectoryRow;\n\n return null;\n });\n }\n\n async getMerchantCapabilities(merchantId: string): Promise<MerchantCapabilities | null> {\n return this.withErrorHandling('getMerchantCapabilities', async () => {\n // Try cache first\n const cached = this.cache.get(merchantId);\n if (cached) return this.toCapabilities(cached);\n\n const merchant = await this.getMerchant(merchantId);\n if (!merchant) return null;\n\n return this.toCapabilities(merchant);\n });\n }\n\n async populateRegistry(): Promise<MerchantCapabilities[]> {\n return this.withErrorHandling('populateRegistry', async () => {\n const { data, error } = await this.db\n .from('merchant_directory')\n .select('*')\n .eq('status', 'active');\n\n if (error) throw error;\n\n return ((data ?? []) as MerchantDirectoryRow[]).map((row) =>\n this.toCapabilities(row),\n );\n });\n }\n\n async getVerticals(): Promise<MerchantVerticalSummary[]> {\n return this.withErrorHandling('getVerticals', async () => {\n const { data, error } = await this.db\n .from('merchant_directory')\n .select('merchant_type, vertical, subcategories')\n .eq('status', 'active');\n\n if (error) throw error;\n\n const verticalMap = new Map<string, MerchantVerticalSummary>();\n\n for (const row of (data ?? []) as Pick<MerchantDirectoryRow, 'merchant_type' | 'vertical' | 'subcategories'>[]) {\n if (!row.vertical) continue;\n const key = `${row.merchant_type}:${row.vertical}`;\n const existing = verticalMap.get(key);\n if (existing) {\n existing.count++;\n for (const sub of row.subcategories) {\n if (!existing.subcategories.includes(sub)) {\n existing.subcategories.push(sub);\n }\n }\n } else {\n verticalMap.set(key, {\n merchantType: row.merchant_type,\n vertical: row.vertical,\n subcategories: [...row.subcategories],\n count: 1,\n });\n }\n }\n\n return Array.from(verticalMap.values());\n });\n }\n\n // -------------------------------------------------------------------------\n // Sync from Lane backend\n // -------------------------------------------------------------------------\n\n async syncFromLaneBackend(url: string, token: string): Promise<MerchantDirectorySyncResult> {\n return this.withErrorHandling('syncFromLaneBackend', async () => {\n const startTime = Date.now();\n let merchantsAdded = 0;\n let merchantsUpdated = 0;\n const errors: string[] = [];\n\n // Fetch merchants from Lane backend (matching lane-chatbot/lib/merchants.ts pattern)\n const response = await fetch(`${url}/api/chatbot/merchants`, {\n headers: { Authorization: `Bearer ${token}` },\n });\n\n if (!response.ok) {\n throw new Error(`Lane backend returned ${response.status}: ${response.statusText}`);\n }\n\n const body = (await response.json()) as { merchants?: Array<Record<string, unknown>> };\n const merchants = body.merchants ?? [];\n\n for (const m of merchants) {\n try {\n const slug = this.slugify(m.name as string);\n const existing = await this.getMerchant(slug);\n\n const row: Partial<MerchantDirectoryRow> & { slug: string } = {\n slug,\n name: m.name as string,\n domain: (m.domain as string) ?? `${slug}.com`,\n description: m.description as string | undefined ?? null,\n logo_url: m.logo_url as string | undefined ?? null,\n website: m.website as string | undefined ?? null,\n tier: 'lane_onboarded',\n lane_merchant_id: (m.id as string) ?? null,\n platform: (m.platform as string) ?? null,\n store_url: (m.store_url as string) ?? null,\n payment_provider: (m.payment_provider as string) ?? null,\n feed_token: (m.feed_token as string) ?? null,\n product_count: (m.product_count as number) ?? 0,\n last_synced_at: new Date().toISOString(),\n // Infer capabilities from platform\n has_billing_api: true,\n supports_acp: (m.platform as string) === 'shopify' || (m.supports_acp as boolean) === true,\n merchant_type: (m.merchant_type as MerchantDirectoryRow['merchant_type']) ?? 'ecommerce',\n vertical: (m.vertical as string) ?? null,\n subcategories: (m.subcategories as string[]) ?? [],\n status: 'active',\n };\n\n await this.upsertMerchant(row);\n\n if (existing) {\n merchantsUpdated++;\n } else {\n merchantsAdded++;\n }\n } catch (err) {\n errors.push(`Failed to sync merchant ${m.name}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n const durationMs = Date.now() - startTime;\n\n // Log sync result\n await this.db.from('merchant_directory_sync_log').insert({\n source: url,\n merchants_synced: merchants.length,\n merchants_added: merchantsAdded,\n merchants_updated: merchantsUpdated,\n errors,\n duration_ms: durationMs,\n status: errors.length === 0 ? 'success' : errors.length < merchants.length ? 'partial' : 'failed',\n });\n\n // Refresh cache after sync\n await this.loadCache();\n\n return {\n merchantsSynced: merchants.length,\n merchantsAdded,\n merchantsUpdated,\n errors,\n durationMs,\n };\n });\n }\n\n // -------------------------------------------------------------------------\n // Protocol discovery\n // -------------------------------------------------------------------------\n\n async discoverProtocolMerchant(domain: string): Promise<MerchantDirectoryRow | null> {\n return this.withErrorHandling('discoverProtocolMerchant', async () => {\n const protocols: string[] = [];\n let manifest: Record<string, unknown> | null = null;\n let manifestUrl = '';\n\n // Probe UCP\n try {\n const ucpUrl = `https://${domain}/.well-known/ucp`;\n const ucpRes = await fetch(ucpUrl, { signal: AbortSignal.timeout(5000) });\n if (ucpRes.ok) {\n protocols.push('ucp');\n manifest = (await ucpRes.json()) as Record<string, unknown>;\n manifestUrl = ucpUrl;\n }\n } catch {\n // UCP not available\n }\n\n // Probe ACP\n try {\n const acpUrl = `https://${domain}/.well-known/acp`;\n const acpRes = await fetch(acpUrl, { signal: AbortSignal.timeout(5000) });\n if (acpRes.ok) {\n protocols.push('acp');\n if (!manifest) {\n manifest = (await acpRes.json()) as Record<string, unknown>;\n manifestUrl = acpUrl;\n }\n }\n } catch {\n // ACP not available\n }\n\n // Probe x402\n try {\n const x402Url = `https://${domain}/`;\n const x402Res = await fetch(x402Url, {\n method: 'OPTIONS',\n signal: AbortSignal.timeout(5000),\n });\n // x402 support is indicated by HTTP 402 responses with X-PAYMENT header,\n // or OPTIONS response advertising 402 support\n const xPayment = x402Res.headers.get('x-payment');\n if (xPayment || x402Res.status === 402) {\n protocols.push('x402');\n }\n } catch {\n // x402 not available\n }\n\n if (protocols.length === 0) {\n return null;\n }\n\n const slug = this.slugify(domain.replace(/\\.\\w+$/, ''));\n const name = (manifest?.name as string) ?? domain;\n\n const row = await this.upsertMerchant({\n slug,\n name,\n domain,\n description: (manifest?.description as string) ?? null,\n tier: 'protocol',\n protocols,\n protocol_endpoint: manifestUrl,\n supports_acp: protocols.includes('acp'),\n supports_ucp: protocols.includes('ucp'),\n supports_x402: protocols.includes('x402'),\n status: 'active',\n });\n\n // Cache manifest\n if (manifest) {\n await this.db.from('merchant_protocol_manifests').upsert(\n {\n merchant_id: row.id,\n protocol: protocols[0],\n manifest_url: manifestUrl,\n manifest,\n fetched_at: new Date().toISOString(),\n expires_at: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(),\n },\n { onConflict: 'merchant_id,protocol' },\n );\n }\n\n // Refresh cache\n await this.loadCache();\n\n return row;\n });\n }\n\n // -------------------------------------------------------------------------\n // Upsert\n // -------------------------------------------------------------------------\n\n async upsertMerchant(\n merchant: Partial<MerchantDirectoryRow> & { slug: string },\n ): Promise<MerchantDirectoryRow> {\n return this.withErrorHandling('upsertMerchant', async () => {\n const { data, error } = await this.db\n .from('merchant_directory')\n .upsert(\n {\n ...merchant,\n updated_at: new Date().toISOString(),\n },\n { onConflict: 'slug' },\n )\n .select('*')\n .single();\n\n if (error) throw error;\n if (!data) throw new NotFoundError('Merchant', merchant.slug);\n\n return data as MerchantDirectoryRow;\n });\n }\n\n // -------------------------------------------------------------------------\n // Helpers\n // -------------------------------------------------------------------------\n\n private toCapabilities(row: MerchantDirectoryRow): MerchantCapabilities {\n return {\n merchantId: row.id,\n hasBillingAPI: row.has_billing_api,\n supportsACP: row.supports_acp,\n supportsUCP: row.supports_ucp,\n supportsX402: (row as any).supports_x402 ?? false,\n supportsVIC: row.supports_vic,\n acceptsVisa: row.accepts_visa,\n acceptsMastercard: row.accepts_mastercard,\n mccs: row.mccs,\n };\n }\n\n private slugify(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n }\n}\n","import type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from '../lib/logger.js';\nimport { BaseService } from '../lib/base-service.js';\nimport { NotFoundError, ValidationError, ConfirmationRequiredError } from '../lib/errors.js';\nimport type {\n IInstructionService,\n InstructionRow,\n InstructionMandateRow,\n InstructionCredentialRow,\n InstructionConfirmationRow,\n InstructionBudgetStatus,\n CreateInstructionParams,\n CreateMandateParams,\n} from '../lib/interfaces.js';\nimport type { ServiceHealth } from '../lib/base-service.js';\n\n// State machine: valid transitions for instruction status\ntype InstructionStatus = 'draft' | 'active' | 'completed' | 'cancelled';\n\nconst VALID_TRANSITIONS: Record<InstructionStatus, InstructionStatus[]> = {\n draft: ['active', 'cancelled'],\n active: ['completed', 'cancelled'],\n completed: [],\n cancelled: [],\n};\n\nfunction assertTransition(from: string, to: InstructionStatus): void {\n const allowed = VALID_TRANSITIONS[from as InstructionStatus];\n if (!allowed || !allowed.includes(to)) {\n throw new ValidationError(`Invalid state transition: cannot move from '${from}' to '${to}'`);\n }\n}\n\nexport class InstructionService extends BaseService implements IInstructionService {\n readonly serviceName = 'InstructionService';\n\n constructor(db: SupabaseClient, logger: ILogger) {\n super(db, logger);\n }\n\n async create(developerId: string, params: CreateInstructionParams): Promise<InstructionRow> {\n return this.withErrorHandling('instruction.create', async () => {\n const expiresAt = params.expiresIn\n ? new Date(Date.now() + parseDuration(params.expiresIn)).toISOString()\n : null;\n\n const { data, error } = await this.db\n .from('agent_instructions')\n .insert({\n developer_id: developerId,\n wallet_id: params.walletId ?? null,\n type: params.type ?? 'payment',\n amount: params.amount ?? null,\n currency: params.currency ?? 'USD',\n merchant: params.merchant ?? null,\n permissions: params.permissions ?? [],\n constraints: params.constraints ?? {},\n expires_at: expiresAt,\n })\n .select()\n .single();\n\n if (error) throw error;\n return data as InstructionRow;\n });\n }\n\n async list(developerId: string, params?: { limit?: number; offset?: number }): Promise<{ data: InstructionRow[]; total: number }> {\n return this.withErrorHandling('instruction.list', async () => {\n const limit = Math.min(params?.limit ?? 20, 100);\n const offset = params?.offset ?? 0;\n\n const query = this.db\n .from('agent_instructions')\n .select('*', { count: 'exact' })\n .eq('developer_id', developerId)\n .order('created_at', { ascending: false })\n .range(offset, offset + limit - 1);\n\n const { data, error, count } = await query;\n if (error) throw error;\n return { data: (data ?? []) as InstructionRow[], total: count ?? 0 };\n });\n }\n\n async get(instructionId: string, developerId: string): Promise<InstructionRow> {\n return this.withErrorHandling('instruction.get', async () => {\n const { data, error } = await this.db\n .from('agent_instructions')\n .select('*')\n .eq('id', instructionId)\n .eq('developer_id', developerId)\n .single();\n\n if (error || !data) throw new NotFoundError('Instruction', instructionId);\n return data as InstructionRow;\n });\n }\n\n async update(instructionId: string, developerId: string, updates: Partial<CreateInstructionParams>): Promise<InstructionRow> {\n return this.withErrorHandling('instruction.update', async () => {\n await this.verifyOwnership('agent_instructions', instructionId, developerId, 'Instruction');\n\n const updateData: Record<string, unknown> = { updated_at: new Date().toISOString() };\n if (updates.amount !== undefined) updateData.amount = updates.amount;\n if (updates.currency !== undefined) updateData.currency = updates.currency;\n if (updates.merchant !== undefined) updateData.merchant = updates.merchant;\n if (updates.permissions !== undefined) updateData.permissions = updates.permissions;\n if (updates.constraints !== undefined) updateData.constraints = updates.constraints;\n\n const { data, error } = await this.db\n .from('agent_instructions')\n .update(updateData)\n .eq('id', instructionId)\n .select()\n .single();\n\n if (error) throw error;\n return data as InstructionRow;\n });\n }\n\n async cancel(instructionId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('instruction.cancel', async () => {\n const existing = await this.get(instructionId, developerId);\n assertTransition(existing.status, 'cancelled');\n\n const { error } = await this.db\n .from('agent_instructions')\n .update({ status: 'cancelled', updated_at: new Date().toISOString() })\n .eq('id', instructionId);\n\n if (error) throw error;\n });\n }\n\n async activate(instructionId: string, developerId: string): Promise<InstructionRow> {\n return this.withErrorHandling('instruction.activate', async () => {\n const existing = await this.get(instructionId, developerId);\n assertTransition(existing.status, 'active');\n\n const { data, error } = await this.db\n .from('agent_instructions')\n .update({ status: 'active', updated_at: new Date().toISOString() })\n .eq('id', instructionId)\n .select()\n .single();\n\n if (error) throw error;\n return data as InstructionRow;\n });\n }\n\n async complete(instructionId: string, developerId: string): Promise<InstructionRow> {\n return this.withErrorHandling('instruction.complete', async () => {\n const existing = await this.get(instructionId, developerId);\n assertTransition(existing.status, 'completed');\n\n const { data, error } = await this.db\n .from('agent_instructions')\n .update({ status: 'completed', updated_at: new Date().toISOString() })\n .eq('id', instructionId)\n .select()\n .single();\n\n if (error) throw error;\n return data as InstructionRow;\n });\n }\n\n async addMandate(instructionId: string, developerId: string, params: CreateMandateParams): Promise<InstructionMandateRow> {\n return this.withErrorHandling('instruction.addMandate', async () => {\n await this.verifyOwnership('agent_instructions', instructionId, developerId, 'Instruction');\n\n const { data, error } = await this.db\n .from('agent_instruction_mandates')\n .insert({\n instruction_id: instructionId,\n type: params.type,\n config: params.config ?? {},\n })\n .select()\n .single();\n\n if (error) throw error;\n return data as InstructionMandateRow;\n });\n }\n\n async listMandates(instructionId: string, developerId: string): Promise<InstructionMandateRow[]> {\n return this.withErrorHandling('instruction.listMandates', async () => {\n await this.verifyOwnership('agent_instructions', instructionId, developerId, 'Instruction');\n\n const { data, error } = await this.db\n .from('agent_instruction_mandates')\n .select('*')\n .eq('instruction_id', instructionId)\n .order('created_at', { ascending: false });\n\n if (error) throw error;\n return (data ?? []) as InstructionMandateRow[];\n });\n }\n\n async getMandate(instructionId: string, mandateId: string, developerId: string): Promise<InstructionMandateRow> {\n return this.withErrorHandling('instruction.getMandate', async () => {\n await this.verifyOwnership('agent_instructions', instructionId, developerId, 'Instruction');\n\n const { data, error } = await this.db\n .from('agent_instruction_mandates')\n .select('*')\n .eq('id', mandateId)\n .eq('instruction_id', instructionId)\n .single();\n\n if (error || !data) throw new NotFoundError('Mandate', mandateId);\n return data as InstructionMandateRow;\n });\n }\n\n async updateMandate(instructionId: string, mandateId: string, developerId: string, updates: Partial<CreateMandateParams>): Promise<InstructionMandateRow> {\n return this.withErrorHandling('instruction.updateMandate', async () => {\n await this.verifyOwnership('agent_instructions', instructionId, developerId, 'Instruction');\n\n const updateData: Record<string, unknown> = { updated_at: new Date().toISOString() };\n if (updates.type !== undefined) updateData.type = updates.type;\n if (updates.config !== undefined) updateData.config = updates.config;\n\n const { data, error } = await this.db\n .from('agent_instruction_mandates')\n .update(updateData)\n .eq('id', mandateId)\n .eq('instruction_id', instructionId)\n .select()\n .single();\n\n if (error || !data) throw new NotFoundError('Mandate', mandateId);\n return data as InstructionMandateRow;\n });\n }\n\n async removeMandate(instructionId: string, mandateId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('instruction.removeMandate', async () => {\n await this.verifyOwnership('agent_instructions', instructionId, developerId, 'Instruction');\n\n const { error } = await this.db\n .from('agent_instruction_mandates')\n .delete()\n .eq('id', mandateId)\n .eq('instruction_id', instructionId);\n\n if (error) throw error;\n });\n }\n\n async getCredential(instructionId: string, developerId: string): Promise<InstructionCredentialRow> {\n return this.withErrorHandling('instruction.getCredential', async () => {\n await this.verifyOwnership('agent_instructions', instructionId, developerId, 'Instruction');\n\n const { data, error } = await this.db\n .from('agent_instruction_credentials')\n .select('*')\n .eq('instruction_id', instructionId)\n .order('created_at', { ascending: false })\n .limit(1)\n .single();\n\n if (error || !data) throw new NotFoundError('Credential', instructionId);\n return data as InstructionCredentialRow;\n });\n }\n\n async createConfirmation(instructionId: string, developerId: string, details: Record<string, unknown>): Promise<InstructionConfirmationRow> {\n return this.withErrorHandling('instruction.createConfirmation', async () => {\n await this.verifyOwnership('agent_instructions', instructionId, developerId, 'Instruction');\n\n const confirmationType = typeof details.confirmationType === 'string' ? details.confirmationType : 'manual';\n const method = typeof details.method === 'string' ? details.method : null;\n\n if (confirmationType === 'biometric') {\n const allowedMethods = ['touchid', 'system_password', 'webauthn_passkey', 'pin'];\n if (!method || !allowedMethods.includes(method)) {\n throw new ValidationError(`Invalid biometric method: ${method}`);\n }\n const timestamp = typeof details.timestamp === 'string' ? new Date(details.timestamp).getTime() : NaN;\n if (isNaN(timestamp) || Math.abs(Date.now() - timestamp) > 30_000) {\n throw new ValidationError('Biometric proof timestamp is missing or too old (must be within 30 seconds)');\n }\n if (typeof details.machineId !== 'string' || details.machineId.length === 0) {\n throw new ValidationError('Biometric proof must include machineId');\n }\n }\n\n const { data, error } = await this.db\n .from('agent_instruction_confirmations')\n .insert({\n instruction_id: instructionId,\n confirmed_by: developerId,\n confirmation_type: confirmationType,\n method,\n details,\n })\n .select()\n .single();\n\n if (error) throw error;\n return data as InstructionConfirmationRow;\n });\n }\n\n async listConfirmations(instructionId: string, developerId: string): Promise<InstructionConfirmationRow[]> {\n return this.withErrorHandling('instruction.listConfirmations', async () => {\n await this.verifyOwnership('agent_instructions', instructionId, developerId, 'Instruction');\n\n const { data, error } = await this.db\n .from('agent_instruction_confirmations')\n .select('*')\n .eq('instruction_id', instructionId)\n .order('created_at', { ascending: false });\n\n if (error) throw error;\n return (data ?? []) as InstructionConfirmationRow[];\n });\n }\n\n async requireConfirmation(\n instructionId: string,\n developerId: string,\n opts: { requiredType: string; maxAgeSeconds: number },\n ): Promise<InstructionConfirmationRow> {\n return this.withErrorHandling('instruction.requireConfirmation', async () => {\n await this.verifyOwnership('agent_instructions', instructionId, developerId, 'Instruction');\n\n const cutoff = new Date(Date.now() - opts.maxAgeSeconds * 1000).toISOString();\n\n const { data, error } = await this.db\n .from('agent_instruction_confirmations')\n .select('*')\n .eq('instruction_id', instructionId)\n .eq('confirmation_type', opts.requiredType)\n .gte('created_at', cutoff)\n .order('created_at', { ascending: false })\n .limit(1)\n .maybeSingle();\n\n if (error) throw error;\n if (!data) {\n throw new ConfirmationRequiredError(instructionId);\n }\n return data as InstructionConfirmationRow;\n });\n }\n\n async recordInstructionSpend(instructionId: string, amountCents: number): Promise<void> {\n return this.withErrorHandling('instruction.recordSpend', async () => {\n const { data: instruction, error: fetchError } = await this.db\n .from('agent_instructions')\n .select('id, amount, spent_cents, status')\n .eq('id', instructionId)\n .single();\n\n if (fetchError || !instruction) {\n throw new NotFoundError('Instruction', instructionId);\n }\n\n // Enforce instruction budget ceiling\n if (instruction.amount !== null && (instruction.spent_cents + amountCents) > instruction.amount) {\n throw new ValidationError(\n `Instruction budget exceeded: spent ${instruction.spent_cents} + ${amountCents} > budget ${instruction.amount}`,\n );\n }\n\n const { error } = await this.db\n .from('agent_instructions')\n .update({\n spent_cents: instruction.spent_cents + amountCents,\n updated_at: new Date().toISOString(),\n })\n .eq('id', instructionId);\n\n if (error) throw error;\n });\n }\n\n async getInstructionBudget(instructionId: string, developerId: string): Promise<InstructionBudgetStatus> {\n return this.withErrorHandling('instruction.getBudget', async () => {\n const instruction = await this.get(instructionId, developerId);\n\n // Get all mandates for this instruction\n const mandates = await this.listMandates(instructionId, developerId);\n\n const mandateDetails = mandates.map((m) => {\n const config = m.config as Record<string, unknown>;\n const maxAmount = typeof config.maxAmount === 'number' ? config.maxAmount : null;\n const spentCents = typeof config.spentCents === 'number' ? config.spentCents : 0;\n const remaining = maxAmount !== null ? Math.max(0, maxAmount - spentCents) : -1;\n\n return {\n id: m.id,\n name: typeof config.purposeDescription === 'string' ? config.purposeDescription : m.type,\n spentCents,\n remainingCents: remaining,\n maxAmountCents: maxAmount,\n status: m.status,\n };\n });\n\n const amountCents = instruction.amount;\n const remaining = amountCents !== null\n ? Math.max(0, amountCents - instruction.spent_cents)\n : -1;\n\n return {\n amountCents,\n spentCents: instruction.spent_cents,\n remainingCents: remaining,\n mandateCount: mandates.length,\n completedMandates: mandates.filter((m) => m.status === 'completed' || m.status === 'exhausted').length,\n mandates: mandateDetails,\n };\n });\n }\n}\n\nfunction parseDuration(duration: string): number {\n const match = duration.match(/^(\\d+)([smhd])$/);\n if (!match) return 3600000; // default 1h\n const [, num, unit] = match;\n const multipliers: Record<string, number> = { s: 1000, m: 60000, h: 3600000, d: 86400000 };\n return parseInt(num!, 10) * (multipliers[unit!] ?? 3600000);\n}\n","import type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from '../lib/logger.js';\nimport { BaseService } from '../lib/base-service.js';\nimport { NotFoundError } from '../lib/errors.js';\nimport { randomUUID } from 'node:crypto';\nimport type { IUserService, AgentUserRow, CreateAgentUserParams } from '../lib/interfaces.js';\nimport type { ServiceHealth } from '../lib/base-service.js';\n\nexport class UserService extends BaseService implements IUserService {\n readonly serviceName = 'UserService';\n\n constructor(db: SupabaseClient, logger: ILogger) {\n super(db, logger);\n }\n\n async create(developerId: string, params: CreateAgentUserParams): Promise<AgentUserRow> {\n return this.withErrorHandling('user.create', async () => {\n const { data, error } = await this.db\n .from('agent_users')\n .insert({\n developer_id: developerId,\n email: params.email ?? null,\n name: params.name ?? null,\n external_id: params.externalId ?? null,\n metadata: params.metadata ?? {},\n })\n .select()\n .single();\n if (error) throw error;\n return data as AgentUserRow;\n });\n }\n\n async list(developerId: string, params?: { limit?: number; offset?: number }): Promise<{ data: AgentUserRow[]; total: number }> {\n return this.withErrorHandling('user.list', async () => {\n const limit = Math.min(params?.limit ?? 20, 100);\n const offset = params?.offset ?? 0;\n const { data, error, count } = await this.db\n .from('agent_users')\n .select('*', { count: 'exact' })\n .eq('developer_id', developerId)\n .order('created_at', { ascending: false })\n .range(offset, offset + limit - 1);\n if (error) throw error;\n return { data: (data ?? []) as AgentUserRow[], total: count ?? 0 };\n });\n }\n\n async get(userId: string, developerId: string): Promise<AgentUserRow> {\n return this.withErrorHandling('user.get', async () => {\n const { data, error } = await this.db\n .from('agent_users')\n .select('*')\n .eq('id', userId)\n .eq('developer_id', developerId)\n .single();\n if (error || !data) throw new NotFoundError('User', userId);\n return data as AgentUserRow;\n });\n }\n\n async update(userId: string, developerId: string, updates: Partial<CreateAgentUserParams>): Promise<AgentUserRow> {\n return this.withErrorHandling('user.update', async () => {\n await this.verifyOwnership('agent_users', userId, developerId, 'User');\n const updateData: Record<string, unknown> = { updated_at: new Date().toISOString() };\n if (updates.email !== undefined) updateData.email = updates.email;\n if (updates.name !== undefined) updateData.name = updates.name;\n if (updates.externalId !== undefined) updateData.external_id = updates.externalId;\n if (updates.metadata !== undefined) updateData.metadata = updates.metadata;\n\n const { data, error } = await this.db\n .from('agent_users')\n .update(updateData)\n .eq('id', userId)\n .select()\n .single();\n if (error) throw error;\n return data as AgentUserRow;\n });\n }\n\n async delete(userId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('user.delete', async () => {\n await this.verifyOwnership('agent_users', userId, developerId, 'User');\n const { error } = await this.db\n .from('agent_users')\n .update({ status: 'deleted', updated_at: new Date().toISOString() })\n .eq('id', userId);\n if (error) throw error;\n });\n }\n\n async createSession(userId: string, developerId: string): Promise<{ token: string; expiresAt: string }> {\n return this.withErrorHandling('user.createSession', async () => {\n await this.verifyOwnership('agent_users', userId, developerId, 'User');\n const token = `lane_sess_${randomUUID().replace(/-/g, '')}`;\n const expiresAt = new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString();\n return { token, expiresAt };\n });\n }\n}\n","import type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from '../lib/logger.js';\nimport { BaseService } from '../lib/base-service.js';\nimport { NotFoundError } from '../lib/errors.js';\nimport type { IFleetService, FleetAgentRow, RegisterFleetAgentParams } from '../lib/interfaces.js';\nimport type { ServiceHealth } from '../lib/base-service.js';\n\nexport class FleetService extends BaseService implements IFleetService {\n readonly serviceName = 'FleetService';\n\n constructor(db: SupabaseClient, logger: ILogger) {\n super(db, logger);\n }\n\n async register(developerId: string, params: RegisterFleetAgentParams): Promise<FleetAgentRow> {\n return this.withErrorHandling('fleet.register', async () => {\n const { data, error } = await this.db\n .from('agent_fleet')\n .insert({\n developer_id: developerId,\n name: params.name,\n type: params.type ?? 'general',\n wallet_id: params.walletId ?? null,\n policy: params.policy ?? {},\n })\n .select()\n .single();\n if (error) throw error;\n return data as FleetAgentRow;\n });\n }\n\n async list(developerId: string, params?: { limit?: number; offset?: number }): Promise<{ data: FleetAgentRow[]; total: number }> {\n return this.withErrorHandling('fleet.list', async () => {\n const limit = Math.min(params?.limit ?? 20, 100);\n const offset = params?.offset ?? 0;\n const { data, error, count } = await this.db\n .from('agent_fleet')\n .select('*', { count: 'exact' })\n .eq('developer_id', developerId)\n .order('created_at', { ascending: false })\n .range(offset, offset + limit - 1);\n if (error) throw error;\n return { data: (data ?? []) as FleetAgentRow[], total: count ?? 0 };\n });\n }\n\n async get(agentId: string, developerId: string): Promise<FleetAgentRow> {\n return this.withErrorHandling('fleet.get', async () => {\n const { data, error } = await this.db\n .from('agent_fleet')\n .select('*')\n .eq('id', agentId)\n .eq('developer_id', developerId)\n .single();\n if (error || !data) throw new NotFoundError('Fleet agent', agentId);\n return data as FleetAgentRow;\n });\n }\n\n async suspend(agentId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('fleet.suspend', async () => {\n await this.verifyOwnership('agent_fleet', agentId, developerId, 'Fleet agent');\n const { error } = await this.db\n .from('agent_fleet')\n .update({ status: 'suspended', updated_at: new Date().toISOString() })\n .eq('id', agentId);\n if (error) throw error;\n });\n }\n\n async revoke(agentId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('fleet.revoke', async () => {\n await this.verifyOwnership('agent_fleet', agentId, developerId, 'Fleet agent');\n const { error } = await this.db\n .from('agent_fleet')\n .update({ status: 'revoked', updated_at: new Date().toISOString() })\n .eq('id', agentId);\n if (error) throw error;\n });\n }\n\n async setPolicy(agentId: string, developerId: string, policy: Record<string, unknown>): Promise<FleetAgentRow> {\n return this.withErrorHandling('fleet.setPolicy', async () => {\n await this.verifyOwnership('agent_fleet', agentId, developerId, 'Fleet agent');\n const { data, error } = await this.db\n .from('agent_fleet')\n .update({ policy, updated_at: new Date().toISOString() })\n .eq('id', agentId)\n .select()\n .single();\n if (error) throw error;\n return data as FleetAgentRow;\n });\n }\n\n async assignWallet(agentId: string, developerId: string, walletId: string): Promise<FleetAgentRow> {\n return this.withErrorHandling('fleet.assignWallet', async () => {\n await this.verifyOwnership('agent_fleet', agentId, developerId, 'Fleet agent');\n await this.verifyWalletOwnership(walletId, developerId);\n const { data, error } = await this.db\n .from('agent_fleet')\n .update({ wallet_id: walletId, updated_at: new Date().toISOString() })\n .eq('id', agentId)\n .select()\n .single();\n if (error) throw error;\n return data as FleetAgentRow;\n });\n }\n}\n","import type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from '../lib/logger.js';\nimport { BaseService } from '../lib/base-service.js';\nimport { NotFoundError } from '../lib/errors.js';\nimport type { ITeamService, AgentTeamRow, AgentTeamMemberRow, CreateAgentTeamParams } from '../lib/interfaces.js';\nimport type { ServiceHealth } from '../lib/base-service.js';\n\nexport class TeamService extends BaseService implements ITeamService {\n readonly serviceName = 'TeamService';\n\n constructor(db: SupabaseClient, logger: ILogger) {\n super(db, logger);\n }\n\n async create(developerId: string, params: CreateAgentTeamParams): Promise<AgentTeamRow> {\n return this.withErrorHandling('team.create', async () => {\n const { data, error } = await this.db\n .from('agent_teams')\n .insert({\n developer_id: developerId,\n name: params.name,\n budget: params.budget ?? {},\n metadata: params.metadata ?? {},\n })\n .select()\n .single();\n if (error) throw error;\n return data as AgentTeamRow;\n });\n }\n\n async list(developerId: string, params?: { limit?: number; offset?: number }): Promise<{ data: AgentTeamRow[]; total: number }> {\n return this.withErrorHandling('team.list', async () => {\n const limit = Math.min(params?.limit ?? 20, 100);\n const offset = params?.offset ?? 0;\n const { data, error, count } = await this.db\n .from('agent_teams')\n .select('*', { count: 'exact' })\n .eq('developer_id', developerId)\n .order('created_at', { ascending: false })\n .range(offset, offset + limit - 1);\n if (error) throw error;\n return { data: (data ?? []) as AgentTeamRow[], total: count ?? 0 };\n });\n }\n\n async get(teamId: string, developerId: string): Promise<AgentTeamRow> {\n return this.withErrorHandling('team.get', async () => {\n const { data, error } = await this.db\n .from('agent_teams')\n .select('*')\n .eq('id', teamId)\n .eq('developer_id', developerId)\n .single();\n if (error || !data) throw new NotFoundError('Team', teamId);\n return data as AgentTeamRow;\n });\n }\n\n async update(teamId: string, developerId: string, updates: Partial<CreateAgentTeamParams>): Promise<AgentTeamRow> {\n return this.withErrorHandling('team.update', async () => {\n await this.verifyOwnership('agent_teams', teamId, developerId, 'Team');\n const updateData: Record<string, unknown> = { updated_at: new Date().toISOString() };\n if (updates.name !== undefined) updateData.name = updates.name;\n if (updates.metadata !== undefined) updateData.metadata = updates.metadata;\n\n const { data, error } = await this.db\n .from('agent_teams')\n .update(updateData)\n .eq('id', teamId)\n .select()\n .single();\n if (error) throw error;\n return data as AgentTeamRow;\n });\n }\n\n async addMember(teamId: string, developerId: string, userId: string, role: string = 'member'): Promise<AgentTeamMemberRow> {\n return this.withErrorHandling('team.addMember', async () => {\n await this.verifyOwnership('agent_teams', teamId, developerId, 'Team');\n const { data, error } = await this.db\n .from('agent_team_members')\n .insert({ team_id: teamId, user_id: userId, role })\n .select()\n .single();\n if (error) throw error;\n return data as AgentTeamMemberRow;\n });\n }\n\n async listMembers(teamId: string, developerId: string): Promise<AgentTeamMemberRow[]> {\n return this.withErrorHandling('team.listMembers', async () => {\n await this.verifyOwnership('agent_teams', teamId, developerId, 'Team');\n const { data, error } = await this.db\n .from('agent_team_members')\n .select('*')\n .eq('team_id', teamId)\n .order('created_at', { ascending: false });\n if (error) throw error;\n return (data ?? []) as AgentTeamMemberRow[];\n });\n }\n\n async removeMember(teamId: string, memberId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('team.removeMember', async () => {\n await this.verifyOwnership('agent_teams', teamId, developerId, 'Team');\n const { error } = await this.db\n .from('agent_team_members')\n .delete()\n .eq('id', memberId)\n .eq('team_id', teamId);\n if (error) throw error;\n });\n }\n\n async setBudget(teamId: string, developerId: string, budget: Record<string, unknown>): Promise<AgentTeamRow> {\n return this.withErrorHandling('team.setBudget', async () => {\n await this.verifyOwnership('agent_teams', teamId, developerId, 'Team');\n const { data, error } = await this.db\n .from('agent_teams')\n .update({ budget, updated_at: new Date().toISOString() })\n .eq('id', teamId)\n .select()\n .single();\n if (error) throw error;\n return data as AgentTeamRow;\n });\n }\n}\n","import type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from '../lib/logger.js';\nimport { BaseService } from '../lib/base-service.js';\nimport { NotFoundError } from '../lib/errors.js';\nimport { randomBytes } from 'node:crypto';\nimport type { IWebhookService, AgentWebhookRow, CreateAgentWebhookParams } from '../lib/interfaces.js';\nimport type { ServiceHealth } from '../lib/base-service.js';\n\nexport class WebhookService extends BaseService implements IWebhookService {\n readonly serviceName = 'WebhookService';\n\n constructor(db: SupabaseClient, logger: ILogger) {\n super(db, logger);\n }\n\n async create(developerId: string, params: CreateAgentWebhookParams): Promise<AgentWebhookRow> {\n return this.withErrorHandling('webhook.create', async () => {\n const signingSecret = `whsec_${randomBytes(24).toString('hex')}`;\n const { data, error } = await this.db\n .from('agent_webhooks')\n .insert({\n developer_id: developerId,\n url: params.url,\n events: params.events,\n signing_secret: signingSecret,\n })\n .select()\n .single();\n if (error) throw error;\n return data as AgentWebhookRow;\n });\n }\n\n async list(developerId: string, params?: { limit?: number; offset?: number }): Promise<{ data: AgentWebhookRow[]; total: number }> {\n return this.withErrorHandling('webhook.list', async () => {\n const limit = Math.min(params?.limit ?? 20, 100);\n const offset = params?.offset ?? 0;\n const { data, error, count } = await this.db\n .from('agent_webhooks')\n .select('*', { count: 'exact' })\n .eq('developer_id', developerId)\n .order('created_at', { ascending: false })\n .range(offset, offset + limit - 1);\n if (error) throw error;\n return { data: (data ?? []) as AgentWebhookRow[], total: count ?? 0 };\n });\n }\n\n async get(webhookId: string, developerId: string): Promise<AgentWebhookRow> {\n return this.withErrorHandling('webhook.get', async () => {\n const { data, error } = await this.db\n .from('agent_webhooks')\n .select('*')\n .eq('id', webhookId)\n .eq('developer_id', developerId)\n .single();\n if (error || !data) throw new NotFoundError('Webhook', webhookId);\n return data as AgentWebhookRow;\n });\n }\n\n async update(webhookId: string, developerId: string, updates: Partial<CreateAgentWebhookParams>): Promise<AgentWebhookRow> {\n return this.withErrorHandling('webhook.update', async () => {\n await this.verifyOwnership('agent_webhooks', webhookId, developerId, 'Webhook');\n const updateData: Record<string, unknown> = { updated_at: new Date().toISOString() };\n if (updates.url !== undefined) updateData.url = updates.url;\n if (updates.events !== undefined) updateData.events = updates.events;\n\n const { data, error } = await this.db\n .from('agent_webhooks')\n .update(updateData)\n .eq('id', webhookId)\n .select()\n .single();\n if (error) throw error;\n return data as AgentWebhookRow;\n });\n }\n\n async delete(webhookId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('webhook.delete', async () => {\n await this.verifyOwnership('agent_webhooks', webhookId, developerId, 'Webhook');\n const { error } = await this.db\n .from('agent_webhooks')\n .delete()\n .eq('id', webhookId);\n if (error) throw error;\n });\n }\n}\n","import type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from '../lib/logger.js';\nimport { BaseService } from '../lib/base-service.js';\nimport { NotFoundError } from '../lib/errors.js';\nimport type { ISubscriptionService, AgentSubscriptionRow, CreateAgentSubscriptionParams } from '../lib/interfaces.js';\nimport type { ServiceHealth } from '../lib/base-service.js';\n\nexport class SubscriptionService extends BaseService implements ISubscriptionService {\n readonly serviceName = 'SubscriptionService';\n\n constructor(db: SupabaseClient, logger: ILogger) {\n super(db, logger);\n }\n\n async create(developerId: string, params: CreateAgentSubscriptionParams): Promise<AgentSubscriptionRow> {\n return this.withErrorHandling('subscription.create', async () => {\n const now = new Date();\n const periodEnd = new Date(now);\n periodEnd.setMonth(periodEnd.getMonth() + 1);\n\n const { data, error } = await this.db\n .from('agent_subscriptions')\n .insert({\n developer_id: developerId,\n wallet_id: params.walletId ?? null,\n product_id: params.productId,\n plan: params.plan,\n current_period_start: now.toISOString(),\n current_period_end: periodEnd.toISOString(),\n metadata: params.metadata ?? {},\n })\n .select()\n .single();\n if (error) throw error;\n return data as AgentSubscriptionRow;\n });\n }\n\n async list(developerId: string, params?: { limit?: number; offset?: number }): Promise<{ data: AgentSubscriptionRow[]; total: number }> {\n return this.withErrorHandling('subscription.list', async () => {\n const limit = Math.min(params?.limit ?? 20, 100);\n const offset = params?.offset ?? 0;\n const { data, error, count } = await this.db\n .from('agent_subscriptions')\n .select('*', { count: 'exact' })\n .eq('developer_id', developerId)\n .order('created_at', { ascending: false })\n .range(offset, offset + limit - 1);\n if (error) throw error;\n return { data: (data ?? []) as AgentSubscriptionRow[], total: count ?? 0 };\n });\n }\n\n async get(subscriptionId: string, developerId: string): Promise<AgentSubscriptionRow> {\n return this.withErrorHandling('subscription.get', async () => {\n const { data, error } = await this.db\n .from('agent_subscriptions')\n .select('*')\n .eq('id', subscriptionId)\n .eq('developer_id', developerId)\n .single();\n if (error || !data) throw new NotFoundError('Subscription', subscriptionId);\n return data as AgentSubscriptionRow;\n });\n }\n\n async cancel(subscriptionId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('subscription.cancel', async () => {\n await this.verifyOwnership('agent_subscriptions', subscriptionId, developerId, 'Subscription');\n const { error } = await this.db\n .from('agent_subscriptions')\n .update({ status: 'canceled', canceled_at: new Date().toISOString(), updated_at: new Date().toISOString() })\n .eq('id', subscriptionId);\n if (error) throw error;\n });\n }\n\n async pause(subscriptionId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('subscription.pause', async () => {\n await this.verifyOwnership('agent_subscriptions', subscriptionId, developerId, 'Subscription');\n const { error } = await this.db\n .from('agent_subscriptions')\n .update({ status: 'paused', paused_at: new Date().toISOString(), updated_at: new Date().toISOString() })\n .eq('id', subscriptionId);\n if (error) throw error;\n });\n }\n\n async resume(subscriptionId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('subscription.resume', async () => {\n await this.verifyOwnership('agent_subscriptions', subscriptionId, developerId, 'Subscription');\n const { error } = await this.db\n .from('agent_subscriptions')\n .update({ status: 'active', paused_at: null, updated_at: new Date().toISOString() })\n .eq('id', subscriptionId);\n if (error) throw error;\n });\n }\n}\n","import type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from '../lib/logger.js';\nimport { BaseService } from '../lib/base-service.js';\nimport { NotFoundError } from '../lib/errors.js';\nimport type { ICheckoutService, CheckoutSessionRow, CreateCheckoutSessionParams } from '../lib/interfaces.js';\nimport type { ServiceHealth } from '../lib/base-service.js';\n\nexport class CheckoutService extends BaseService implements ICheckoutService {\n readonly serviceName = 'CheckoutService';\n\n constructor(db: SupabaseClient, logger: ILogger) {\n super(db, logger);\n }\n\n async create(developerId: string, params: CreateCheckoutSessionParams): Promise<CheckoutSessionRow> {\n return this.withErrorHandling('checkout.create', async () => {\n const { data, error } = await this.db\n .from('agent_checkout_sessions')\n .insert({\n developer_id: developerId,\n wallet_id: params.walletId ?? null,\n product_id: params.productId ?? null,\n amount: params.amount ?? null,\n currency: params.currency ?? 'USD',\n metadata: params.metadata ?? {},\n })\n .select()\n .single();\n if (error) throw error;\n return data as CheckoutSessionRow;\n });\n }\n\n async get(sessionId: string, developerId: string): Promise<CheckoutSessionRow> {\n return this.withErrorHandling('checkout.get', async () => {\n const { data, error } = await this.db\n .from('agent_checkout_sessions')\n .select('*')\n .eq('id', sessionId)\n .eq('developer_id', developerId)\n .single();\n if (error || !data) throw new NotFoundError('Checkout session', sessionId);\n return data as CheckoutSessionRow;\n });\n }\n\n async complete(sessionId: string, developerId: string): Promise<CheckoutSessionRow> {\n return this.withErrorHandling('checkout.complete', async () => {\n await this.verifyOwnership('agent_checkout_sessions', sessionId, developerId, 'Checkout session');\n const { data, error } = await this.db\n .from('agent_checkout_sessions')\n .update({ status: 'completed', completed_at: new Date().toISOString(), updated_at: new Date().toISOString() })\n .eq('id', sessionId)\n .select()\n .single();\n if (error) throw error;\n return data as CheckoutSessionRow;\n });\n }\n\n async cancel(sessionId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('checkout.cancel', async () => {\n await this.verifyOwnership('agent_checkout_sessions', sessionId, developerId, 'Checkout session');\n const { error } = await this.db\n .from('agent_checkout_sessions')\n .update({ status: 'cancelled', cancelled_at: new Date().toISOString(), updated_at: new Date().toISOString() })\n .eq('id', sessionId);\n if (error) throw error;\n });\n }\n}\n","// ---------------------------------------------------------------------------\n// Agent Service — Agent Registry & Fleet Management\n// ---------------------------------------------------------------------------\n// Manages agent lifecycle: registration, policy management, suspension,\n// reactivation, revocation, and wallet assignment. Each agent belongs to a\n// developer and can have an independent spending policy.\n// ---------------------------------------------------------------------------\n\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport { BaseService } from '../lib/base-service.js';\nimport type { ILogger } from '../lib/logger.js';\nimport type { IAgentService, AgentRow, RegisterAgentParams } from '../lib/interfaces.js';\nimport { NotFoundError, ValidationError, ConflictError } from '../lib/errors.js';\n\nexport class AgentService extends BaseService implements IAgentService {\n readonly serviceName = 'AgentService';\n\n constructor(db: SupabaseClient, logger: ILogger) {\n super(db, logger);\n }\n\n /**\n * Register a new agent in the fleet.\n */\n async register(developerId: string, params: RegisterAgentParams): Promise<AgentRow> {\n return this.withErrorHandling('register', async () => {\n if (!params.name || params.name.trim().length === 0) {\n throw new ValidationError('Agent name is required');\n }\n\n const id = crypto.randomUUID();\n const now = new Date().toISOString();\n\n const { data, error } = await this.db\n .from('agents')\n .insert({\n id,\n developer_id: developerId,\n name: params.name.trim(),\n type: params.type,\n status: 'active',\n wallet_id: params.walletId ?? null,\n policy: params.policy ?? null,\n last_seen_at: null,\n created_at: now,\n updated_at: now,\n })\n .select()\n .single();\n\n if (error || !data) {\n throw new ValidationError(`Failed to register agent: ${error?.message}`);\n }\n\n this.log.info('Agent registered', {\n agentId: data.id,\n developerId,\n name: params.name,\n type: params.type,\n });\n\n return data as AgentRow;\n }, { developerId });\n }\n\n /**\n * Get an agent by ID with ownership verification.\n */\n async get(agentId: string, developerId: string): Promise<AgentRow> {\n return this.withErrorHandling('get', async () => {\n const { data, error } = await this.db\n .from('agents')\n .select('*')\n .eq('id', agentId)\n .eq('developer_id', developerId)\n .single();\n\n if (error || !data) {\n throw new NotFoundError('Agent', agentId);\n }\n\n return data as AgentRow;\n }, { agentId, developerId });\n }\n\n /**\n * List agents for a developer with pagination and optional status filter.\n */\n async list(\n developerId: string,\n params?: { status?: string; limit?: number; offset?: number },\n ): Promise<{ data: AgentRow[]; total: number }> {\n return this.withErrorHandling('list', async () => {\n const limit = params?.limit ?? 50;\n const offset = params?.offset ?? 0;\n\n let countQuery = this.db\n .from('agents')\n .select('id', { count: 'exact', head: true })\n .eq('developer_id', developerId);\n\n if (params?.status) {\n countQuery = countQuery.eq('status', params.status);\n }\n\n const { count, error: countError } = await countQuery;\n\n if (countError) {\n throw new ValidationError(`Failed to count agents: ${countError.message}`);\n }\n\n let dataQuery = this.db\n .from('agents')\n .select('*')\n .eq('developer_id', developerId)\n .order('created_at', { ascending: false })\n .range(offset, offset + limit - 1);\n\n if (params?.status) {\n dataQuery = dataQuery.eq('status', params.status);\n }\n\n const { data, error } = await dataQuery;\n\n if (error) {\n throw new ValidationError(`Failed to list agents: ${error.message}`);\n }\n\n return {\n data: (data ?? []) as AgentRow[],\n total: count ?? 0,\n };\n }, { developerId, limit: params?.limit, offset: params?.offset });\n }\n\n /**\n * Update an agent's policy. Verifies ownership first.\n */\n async setPolicy(agentId: string, developerId: string, policy: Record<string, unknown>): Promise<AgentRow> {\n return this.withErrorHandling('setPolicy', async () => {\n await this.verifyOwnership('agents', agentId, developerId, 'Agent');\n\n const { data, error } = await this.db\n .from('agents')\n .update({\n policy,\n updated_at: new Date().toISOString(),\n })\n .eq('id', agentId)\n .select()\n .single();\n\n if (error || !data) {\n throw new ValidationError(`Failed to set agent policy: ${error?.message}`);\n }\n\n this.log.info('Agent policy updated', { agentId, developerId });\n\n return data as AgentRow;\n }, { agentId, developerId });\n }\n\n /**\n * Suspend an agent (temporary). Verifies ownership.\n */\n async suspend(agentId: string, developerId: string): Promise<AgentRow> {\n return this.withErrorHandling('suspend', async () => {\n await this.verifyOwnership('agents', agentId, developerId, 'Agent');\n\n const { data, error } = await this.db\n .from('agents')\n .update({\n status: 'suspended',\n updated_at: new Date().toISOString(),\n })\n .eq('id', agentId)\n .select()\n .single();\n\n if (error || !data) {\n throw new ValidationError(`Failed to suspend agent: ${error?.message}`);\n }\n\n this.log.info('Agent suspended', { agentId, developerId });\n\n return data as AgentRow;\n }, { agentId, developerId });\n }\n\n /**\n * Reactivate a suspended agent. Only valid if currently suspended.\n */\n async reactivate(agentId: string, developerId: string): Promise<AgentRow> {\n return this.withErrorHandling('reactivate', async () => {\n const agent = await this.get(agentId, developerId);\n\n if (agent.status !== 'suspended') {\n throw new ConflictError(`Agent is '${agent.status}', can only reactivate 'suspended' agents`);\n }\n\n const { data, error } = await this.db\n .from('agents')\n .update({\n status: 'active',\n updated_at: new Date().toISOString(),\n })\n .eq('id', agentId)\n .select()\n .single();\n\n if (error || !data) {\n throw new ValidationError(`Failed to reactivate agent: ${error?.message}`);\n }\n\n this.log.info('Agent reactivated', { agentId, developerId });\n\n return data as AgentRow;\n }, { agentId, developerId });\n }\n\n /**\n * Permanently revoke an agent. Verifies ownership.\n */\n async revoke(agentId: string, developerId: string): Promise<AgentRow> {\n return this.withErrorHandling('revoke', async () => {\n await this.verifyOwnership('agents', agentId, developerId, 'Agent');\n\n const { data, error } = await this.db\n .from('agents')\n .update({\n status: 'revoked',\n updated_at: new Date().toISOString(),\n })\n .eq('id', agentId)\n .select()\n .single();\n\n if (error || !data) {\n throw new ValidationError(`Failed to revoke agent: ${error?.message}`);\n }\n\n this.log.info('Agent revoked', { agentId, developerId });\n\n return data as AgentRow;\n }, { agentId, developerId });\n }\n\n /**\n * Assign a wallet to an agent. Verifies ownership of both agent and wallet.\n */\n async assignWallet(agentId: string, developerId: string, walletId: string): Promise<AgentRow> {\n return this.withErrorHandling('assignWallet', async () => {\n await this.verifyOwnership('agents', agentId, developerId, 'Agent');\n await this.verifyWalletOwnership(walletId, developerId);\n\n const { data, error } = await this.db\n .from('agents')\n .update({\n wallet_id: walletId,\n updated_at: new Date().toISOString(),\n })\n .eq('id', agentId)\n .select()\n .single();\n\n if (error || !data) {\n throw new ValidationError(`Failed to assign wallet to agent: ${error?.message}`);\n }\n\n this.log.info('Wallet assigned to agent', { agentId, walletId, developerId });\n\n return data as AgentRow;\n }, { agentId, walletId, developerId });\n }\n}\n","// ---------------------------------------------------------------------------\n// Identity Service — Agent Identity & KYC Chain\n// ---------------------------------------------------------------------------\n// Manages agent identity lifecycle: registration, verification, attestation\n// generation, suspension, and revocation. Implements the KYC chain:\n// Human (developer) -> Lane (platform) -> Agent -> Transaction\n// ---------------------------------------------------------------------------\n\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport { BaseService } from '../lib/base-service.js';\nimport type { ILogger } from '../lib/logger.js';\nimport type { IIdentityService, AgentIdentityRow } from '../lib/interfaces.js';\nimport { NotFoundError, ValidationError } from '../lib/errors.js';\nimport { createHmac, createHash } from 'node:crypto';\n\nconst ATTESTATION_SECRET = process.env.LANE_ATTESTATION_SECRET || 'lane-attestation-dev-key';\nconst DSP_ID = process.env.LANE_MC_DSP_ID || 'lane-dsp-001';\n\nexport class IdentityService extends BaseService implements IIdentityService {\n readonly serviceName = 'IdentityService';\n\n constructor(db: SupabaseClient, logger: ILogger) {\n super(db, logger);\n }\n\n /**\n * Register an agent for identity verification.\n * Starts the KYC chain with humanVerified=true (developer is vouching).\n */\n async register(\n developerId: string,\n params: { agentId: string; capabilities?: string[]; purpose?: string },\n ): Promise<AgentIdentityRow> {\n return this.withErrorHandling('register', async () => {\n if (!params.agentId) {\n throw new ValidationError('Agent ID is required');\n }\n\n // Verify the agent exists and belongs to this developer\n await this.verifyOwnership('agents', params.agentId, developerId, 'Agent');\n\n const id = crypto.randomUUID();\n const now = new Date().toISOString();\n\n const kycChain = {\n humanVerified: true,\n laneVerified: false,\n agentBound: false,\n transactionSigned: false,\n };\n\n const { data, error } = await this.db\n .from('agent_identities')\n .insert({\n id,\n agent_id: params.agentId,\n developer_id: developerId,\n kyc_chain: kycChain,\n attestation_document: null,\n attestation_signature: null,\n attestation_key_fingerprint: null,\n attestation_expires_at: null,\n capabilities: params.capabilities ?? null,\n purpose: params.purpose ?? null,\n dsp_id: DSP_ID,\n commerce_indicator: null,\n status: 'pending',\n verified_at: null,\n created_at: now,\n })\n .select()\n .single();\n\n if (error || !data) {\n throw new ValidationError(`Failed to register identity: ${error?.message}`);\n }\n\n this.log.info('Agent identity registered', {\n identityId: data.id,\n agentId: params.agentId,\n developerId,\n });\n\n return data as AgentIdentityRow;\n }, { developerId });\n }\n\n /**\n * Verify an agent identity with a verification code.\n * Stub: accepts any 6-digit code. Progresses KYC chain and generates attestation.\n */\n async verify(\n identityId: string,\n developerId: string,\n verificationCode: string,\n ): Promise<AgentIdentityRow> {\n return this.withErrorHandling('verify', async () => {\n // Validate verification code format (6-digit)\n if (!/^\\d{6}$/.test(verificationCode)) {\n throw new ValidationError('Verification code must be a 6-digit number');\n }\n\n const identity = await this.get(identityId, developerId);\n\n if (identity.status !== 'pending') {\n throw new ValidationError(`Identity is '${identity.status}', can only verify 'pending' identities`);\n }\n\n // Progress KYC chain\n const kycChain = {\n ...identity.kyc_chain,\n laneVerified: true,\n agentBound: true,\n };\n\n // Generate attestation\n const attestation = this.generateAttestation({ ...identity, kyc_chain: kycChain });\n const now = new Date().toISOString();\n\n const { data, error } = await this.db\n .from('agent_identities')\n .update({\n kyc_chain: kycChain,\n attestation_document: attestation.document,\n attestation_signature: attestation.signature,\n attestation_key_fingerprint: attestation.keyFingerprint,\n attestation_expires_at: attestation.expiresAt,\n status: 'verified',\n verified_at: now,\n })\n .eq('id', identityId)\n .select()\n .single();\n\n if (error || !data) {\n throw new ValidationError(`Failed to verify identity: ${error?.message}`);\n }\n\n this.log.info('Agent identity verified', {\n identityId,\n agentId: identity.agent_id,\n developerId,\n });\n\n return data as AgentIdentityRow;\n }, { identityId, developerId });\n }\n\n /**\n * Get an identity by ID with ownership verification.\n */\n async get(identityId: string, developerId: string): Promise<AgentIdentityRow> {\n return this.withErrorHandling('get', async () => {\n const { data, error } = await this.db\n .from('agent_identities')\n .select('*')\n .eq('id', identityId)\n .eq('developer_id', developerId)\n .single();\n\n if (error || !data) {\n throw new NotFoundError('AgentIdentity', identityId);\n }\n\n return data as AgentIdentityRow;\n }, { identityId, developerId });\n }\n\n /**\n * List identities for a developer with pagination and optional filters.\n */\n async list(\n developerId: string,\n params?: { agentId?: string; status?: string; limit?: number; offset?: number },\n ): Promise<{ data: AgentIdentityRow[]; total: number }> {\n return this.withErrorHandling('list', async () => {\n const limit = params?.limit ?? 50;\n const offset = params?.offset ?? 0;\n\n let countQuery = this.db\n .from('agent_identities')\n .select('id', { count: 'exact', head: true })\n .eq('developer_id', developerId);\n\n if (params?.agentId) {\n countQuery = countQuery.eq('agent_id', params.agentId);\n }\n if (params?.status) {\n countQuery = countQuery.eq('status', params.status);\n }\n\n const { count, error: countError } = await countQuery;\n\n if (countError) {\n throw new ValidationError(`Failed to count identities: ${countError.message}`);\n }\n\n let dataQuery = this.db\n .from('agent_identities')\n .select('*')\n .eq('developer_id', developerId)\n .order('created_at', { ascending: false })\n .range(offset, offset + limit - 1);\n\n if (params?.agentId) {\n dataQuery = dataQuery.eq('agent_id', params.agentId);\n }\n if (params?.status) {\n dataQuery = dataQuery.eq('status', params.status);\n }\n\n const { data, error } = await dataQuery;\n\n if (error) {\n throw new ValidationError(`Failed to list identities: ${error.message}`);\n }\n\n return {\n data: (data ?? []) as AgentIdentityRow[],\n total: count ?? 0,\n };\n }, { developerId, limit: params?.limit, offset: params?.offset });\n }\n\n /**\n * Get attestation fields for a verified identity.\n */\n async getAttestation(\n identityId: string,\n developerId: string,\n ): Promise<{ document: string; signature: string; keyFingerprint: string; expiresAt: string }> {\n return this.withErrorHandling('getAttestation', async () => {\n const identity = await this.get(identityId, developerId);\n\n if (!identity.attestation_document || !identity.attestation_signature) {\n throw new ValidationError('Identity does not have an attestation. Verify the identity first.');\n }\n\n return {\n document: identity.attestation_document,\n signature: identity.attestation_signature,\n keyFingerprint: identity.attestation_key_fingerprint!,\n expiresAt: identity.attestation_expires_at!,\n };\n }, { identityId, developerId });\n }\n\n /**\n * Refresh the attestation for a verified identity.\n * Generates a new signed document and updates the stored attestation.\n */\n async refreshAttestation(\n identityId: string,\n developerId: string,\n ): Promise<{ document: string; signature: string; keyFingerprint: string; expiresAt: string }> {\n return this.withErrorHandling('refreshAttestation', async () => {\n const identity = await this.get(identityId, developerId);\n\n if (identity.status !== 'verified') {\n throw new ValidationError(`Cannot refresh attestation for '${identity.status}' identity`);\n }\n\n const attestation = this.generateAttestation(identity);\n\n const { error } = await this.db\n .from('agent_identities')\n .update({\n attestation_document: attestation.document,\n attestation_signature: attestation.signature,\n attestation_key_fingerprint: attestation.keyFingerprint,\n attestation_expires_at: attestation.expiresAt,\n })\n .eq('id', identityId);\n\n if (error) {\n throw new ValidationError(`Failed to refresh attestation: ${error.message}`);\n }\n\n this.log.info('Attestation refreshed', { identityId, developerId });\n\n return attestation;\n }, { identityId, developerId });\n }\n\n /**\n * Suspend an identity.\n */\n async suspend(identityId: string, developerId: string): Promise<AgentIdentityRow> {\n return this.withErrorHandling('suspend', async () => {\n await this.verifyOwnership('agent_identities', identityId, developerId, 'AgentIdentity');\n\n const { data, error } = await this.db\n .from('agent_identities')\n .update({ status: 'suspended' })\n .eq('id', identityId)\n .select()\n .single();\n\n if (error || !data) {\n throw new ValidationError(`Failed to suspend identity: ${error?.message}`);\n }\n\n this.log.info('Agent identity suspended', { identityId, developerId });\n\n return data as AgentIdentityRow;\n }, { identityId, developerId });\n }\n\n /**\n * Revoke an identity permanently.\n */\n async revoke(identityId: string, developerId: string): Promise<AgentIdentityRow> {\n return this.withErrorHandling('revoke', async () => {\n await this.verifyOwnership('agent_identities', identityId, developerId, 'AgentIdentity');\n\n const { data, error } = await this.db\n .from('agent_identities')\n .update({ status: 'revoked' })\n .eq('id', identityId)\n .select()\n .single();\n\n if (error || !data) {\n throw new ValidationError(`Failed to revoke identity: ${error?.message}`);\n }\n\n this.log.info('Agent identity revoked', { identityId, developerId });\n\n return data as AgentIdentityRow;\n }, { identityId, developerId });\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n /**\n * Generate a cryptographic attestation for an agent identity.\n * The attestation is an HMAC-SHA256 signed document encoding the identity's\n * KYC chain, agent/developer IDs, and DSP binding.\n */\n private generateAttestation(identity: AgentIdentityRow): {\n document: string;\n signature: string;\n keyFingerprint: string;\n expiresAt: string;\n } {\n const doc = JSON.stringify({\n agentId: identity.agent_id,\n developerId: identity.developer_id,\n kycChain: identity.kyc_chain,\n dspId: identity.dsp_id,\n issuedAt: new Date().toISOString(),\n });\n const docBase64 = Buffer.from(doc).toString('base64');\n const signature = createHmac('sha256', ATTESTATION_SECRET).update(docBase64).digest('hex');\n const keyFingerprint = createHash('sha256').update(ATTESTATION_SECRET).digest('hex').slice(0, 16);\n const expiresAt = new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(); // 30 days\n return { document: docBase64, signature, keyFingerprint, expiresAt };\n }\n}\n","// ---------------------------------------------------------------------------\n// Delegation Service — Authority Delegation Between Agents\n// ---------------------------------------------------------------------------\n// Manages delegation of mandate authority from parent to child agents.\n// Enforces depth limits (max 5), constraint narrowing (child constraints\n// must be equal-or-more-restrictive), and cascading revocation.\n// ---------------------------------------------------------------------------\n\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport { BaseService } from '../lib/base-service.js';\nimport type { ILogger } from '../lib/logger.js';\nimport type {\n IDelegationService,\n DelegationRow,\n CreateDelegationParams,\n IAgentService,\n IMandateService,\n} from '../lib/interfaces.js';\nimport { NotFoundError, ValidationError, ConflictError } from '../lib/errors.js';\nimport { ErrorCode, ServiceError } from '../lib/errors.js';\n\nconst MAX_DELEGATION_DEPTH = 5;\n\nexport class DelegationService extends BaseService implements IDelegationService {\n readonly serviceName = 'DelegationService';\n\n private readonly mandates: IMandateService;\n private readonly agents: IAgentService;\n\n constructor(\n db: SupabaseClient,\n logger: ILogger,\n mandates: IMandateService,\n agents: IAgentService,\n ) {\n super(db, logger);\n this.mandates = mandates;\n this.agents = agents;\n }\n\n /**\n * Create a delegation from parent agent to child agent for a specific mandate.\n * Validates ownership, mandate status, depth limits, and constraint narrowing.\n */\n async delegate(developerId: string, params: CreateDelegationParams): Promise<DelegationRow> {\n return this.withErrorHandling('delegate', async () => {\n // Validate both agents exist and belong to developer\n const parentAgent = await this.agents.get(params.parentAgentId, developerId);\n const childAgent = await this.agents.get(params.childAgentId, developerId);\n\n if (parentAgent.status !== 'active') {\n throw new ValidationError(`Parent agent is '${parentAgent.status}', must be 'active'`);\n }\n if (childAgent.status !== 'active') {\n throw new ValidationError(`Child agent is '${childAgent.status}', must be 'active'`);\n }\n\n // Validate mandate exists and is active\n const mandate = await this.mandates.getMandate(params.mandateId, developerId);\n if (mandate.status !== 'active') {\n throw new ValidationError(`Mandate is '${mandate.status}', must be 'active'`);\n }\n\n // Determine delegation depth\n let depth = 0;\n\n // Check if parent already has a delegation for this mandate\n const { data: parentDelegation } = await this.db\n .from('delegations')\n .select('*')\n .eq('child_agent_id', params.parentAgentId)\n .eq('mandate_id', params.mandateId)\n .eq('status', 'active')\n .limit(1)\n .single();\n\n if (parentDelegation) {\n depth = (parentDelegation as DelegationRow).depth + 1;\n }\n\n if (depth >= MAX_DELEGATION_DEPTH) {\n throw new ValidationError(\n `Delegation depth ${depth} exceeds maximum allowed depth of ${MAX_DELEGATION_DEPTH}`,\n );\n }\n\n // Validate child constraints are equal-or-more-restrictive than parent\n if (params.constraints && parentDelegation) {\n const parentConstraints = (parentDelegation as DelegationRow).constraints;\n if (parentConstraints) {\n this.validateConstraintNarrowing(parentConstraints, params.constraints);\n }\n }\n\n const id = crypto.randomUUID();\n const now = new Date().toISOString();\n\n const { data, error } = await this.db\n .from('delegations')\n .insert({\n id,\n developer_id: developerId,\n parent_agent_id: params.parentAgentId,\n child_agent_id: params.childAgentId,\n mandate_id: params.mandateId,\n constraints: params.constraints ?? null,\n depth,\n status: 'active',\n expires_at: params.expiresAt ?? null,\n created_at: now,\n })\n .select()\n .single();\n\n if (error || !data) {\n throw new ValidationError(`Failed to create delegation: ${error?.message}`);\n }\n\n this.log.info('Delegation created', {\n delegationId: data.id,\n parentAgentId: params.parentAgentId,\n childAgentId: params.childAgentId,\n mandateId: params.mandateId,\n depth,\n developerId,\n });\n\n return data as DelegationRow;\n }, { developerId });\n }\n\n /**\n * Walk the delegation chain from agentId up to the root agent for a mandate.\n * Returns whether the chain is valid and the path of agent IDs.\n */\n async validateDelegationChain(\n agentId: string,\n mandateId: string,\n ): Promise<{ valid: boolean; chain: string[] }> {\n return this.withErrorHandling('validateDelegationChain', async () => {\n const chain: string[] = [agentId];\n let currentAgentId = agentId;\n\n for (let i = 0; i < MAX_DELEGATION_DEPTH + 1; i++) {\n // Find delegation where this agent is the child\n const { data: delegation } = await this.db\n .from('delegations')\n .select('*')\n .eq('child_agent_id', currentAgentId)\n .eq('mandate_id', mandateId)\n .eq('status', 'active')\n .limit(1)\n .single();\n\n if (!delegation) {\n // No more delegations — this is the root (or chain is broken)\n break;\n }\n\n const row = delegation as DelegationRow;\n\n // Check for expiration\n if (row.expires_at && new Date(row.expires_at) < new Date()) {\n return { valid: false, chain };\n }\n\n currentAgentId = row.parent_agent_id;\n chain.push(currentAgentId);\n }\n\n // The chain is valid if we found at least one delegation link\n // (or the agent is the direct mandate holder)\n return { valid: true, chain };\n }, { agentId, mandateId });\n }\n\n /**\n * Revoke a delegation and cascade to all child delegations.\n */\n async revokeDelegation(delegationId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('revokeDelegation', async () => {\n const delegation = await this.getDelegation(delegationId, developerId);\n\n if (delegation.status === 'revoked') {\n throw new ConflictError('Delegation is already revoked');\n }\n\n // Revoke this delegation\n const { error } = await this.db\n .from('delegations')\n .update({ status: 'revoked' })\n .eq('id', delegationId);\n\n if (error) {\n throw new ValidationError(`Failed to revoke delegation: ${error.message}`);\n }\n\n // Cascade: revoke all child delegations where the child of this delegation\n // is the parent in other delegations\n await this.cascadeRevoke(delegation.child_agent_id, delegation.mandate_id);\n\n this.log.info('Delegation revoked', {\n delegationId,\n childAgentId: delegation.child_agent_id,\n mandateId: delegation.mandate_id,\n developerId,\n });\n }, { delegationId, developerId });\n }\n\n /**\n * Get a delegation by ID with ownership verification.\n */\n async getDelegation(delegationId: string, developerId: string): Promise<DelegationRow> {\n return this.withErrorHandling('getDelegation', async () => {\n const { data, error } = await this.db\n .from('delegations')\n .select('*')\n .eq('id', delegationId)\n .eq('developer_id', developerId)\n .single();\n\n if (error || !data) {\n throw new NotFoundError('Delegation', delegationId);\n }\n\n return data as DelegationRow;\n }, { delegationId, developerId });\n }\n\n /**\n * List delegations for a developer with pagination and optional filters.\n */\n async listDelegations(\n developerId: string,\n params?: { agentId?: string; mandateId?: string; limit?: number; offset?: number },\n ): Promise<{ data: DelegationRow[]; total: number }> {\n return this.withErrorHandling('listDelegations', async () => {\n const limit = params?.limit ?? 50;\n const offset = params?.offset ?? 0;\n\n let countQuery = this.db\n .from('delegations')\n .select('id', { count: 'exact', head: true })\n .eq('developer_id', developerId);\n\n if (params?.agentId) {\n countQuery = countQuery.or(\n `parent_agent_id.eq.${params.agentId},child_agent_id.eq.${params.agentId}`,\n );\n }\n if (params?.mandateId) {\n countQuery = countQuery.eq('mandate_id', params.mandateId);\n }\n\n const { count, error: countError } = await countQuery;\n\n if (countError) {\n throw new ValidationError(`Failed to count delegations: ${countError.message}`);\n }\n\n let dataQuery = this.db\n .from('delegations')\n .select('*')\n .eq('developer_id', developerId)\n .order('created_at', { ascending: false })\n .range(offset, offset + limit - 1);\n\n if (params?.agentId) {\n dataQuery = dataQuery.or(\n `parent_agent_id.eq.${params.agentId},child_agent_id.eq.${params.agentId}`,\n );\n }\n if (params?.mandateId) {\n dataQuery = dataQuery.eq('mandate_id', params.mandateId);\n }\n\n const { data, error } = await dataQuery;\n\n if (error) {\n throw new ValidationError(`Failed to list delegations: ${error.message}`);\n }\n\n return {\n data: (data ?? []) as DelegationRow[],\n total: count ?? 0,\n };\n }, { developerId, limit: params?.limit, offset: params?.offset });\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n /**\n * Validate that child constraints are equal-or-more-restrictive than parent.\n * For numeric fields: child value must be <= parent value.\n * For array fields: child array must be a subset of parent array.\n */\n private validateConstraintNarrowing(\n parentConstraints: Record<string, unknown>,\n childConstraints: Record<string, unknown>,\n ): void {\n for (const [key, childValue] of Object.entries(childConstraints)) {\n const parentValue = parentConstraints[key];\n\n // If parent doesn't have this constraint, child can add it (more restrictive)\n if (parentValue === undefined || parentValue === null) {\n continue;\n }\n\n // Numeric comparison: child must be <= parent\n if (typeof parentValue === 'number' && typeof childValue === 'number') {\n if (childValue > parentValue) {\n throw new ServiceError(\n `Child constraint '${key}' (${childValue}) exceeds parent constraint (${parentValue})`,\n ErrorCode.DELEGATION_INVALID,\n 400,\n );\n }\n }\n\n // Array comparison: child must be subset of parent\n if (Array.isArray(parentValue) && Array.isArray(childValue)) {\n const parentSet = new Set(parentValue as string[]);\n const notInParent = (childValue as string[]).filter((v) => !parentSet.has(v));\n if (notInParent.length > 0) {\n throw new ServiceError(\n `Child constraint '${key}' contains values not in parent: ${notInParent.join(', ')}`,\n ErrorCode.DELEGATION_INVALID,\n 400,\n );\n }\n }\n }\n }\n\n /**\n * Recursively revoke all delegations where the given agent is the parent.\n */\n private async cascadeRevoke(parentAgentId: string, mandateId: string): Promise<void> {\n // Find all active delegations where this agent is the parent for this mandate\n const { data: childDelegations } = await this.db\n .from('delegations')\n .select('*')\n .eq('parent_agent_id', parentAgentId)\n .eq('mandate_id', mandateId)\n .eq('status', 'active');\n\n if (!childDelegations || childDelegations.length === 0) {\n return;\n }\n\n for (const delegation of childDelegations as DelegationRow[]) {\n // Revoke this delegation\n await this.db\n .from('delegations')\n .update({ status: 'revoked' })\n .eq('id', delegation.id);\n\n // Cascade further down\n await this.cascadeRevoke(delegation.child_agent_id, mandateId);\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// Mandate Service — Instruction-Level Mandate Enforcement\n// ---------------------------------------------------------------------------\n// Creates, validates, and manages instruction-level mandates that encode\n// user purchase intent constraints. Mandates enforce rules at the\n// infrastructure level — category restrictions, merchant allow/blocklists,\n// amount caps, and attribute requirements.\n// ---------------------------------------------------------------------------\n\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport { BaseService } from '../lib/base-service.js';\nimport type { ILogger } from '../lib/logger.js';\nimport type {\n IMandateService,\n MandateRow,\n MandateBudgetStatus,\n CreateMandateParams,\n PaymentContext,\n MandateValidationResult,\n} from '../lib/interfaces.js';\nimport { MandateError, NotFoundError, ValidationError, ErrorCode } from '../lib/errors.js';\n\nexport class MandateService extends BaseService implements IMandateService {\n readonly serviceName = 'MandateService';\n\n constructor(db: SupabaseClient, logger: ILogger) {\n super(db, logger);\n }\n\n /**\n * Create a new instruction-level mandate.\n *\n * Sets valid_from to now, status to 'active', and delegation_depth to 0.\n */\n async createMandate(developerId: string, params: CreateMandateParams): Promise<MandateRow> {\n return this.withErrorHandling('createMandate', async () => {\n if (!params.walletId) {\n throw new ValidationError('walletId is required');\n }\n if (!params.purposeDescription) {\n throw new ValidationError('purposeDescription is required');\n }\n\n await this.verifyWalletOwnership(params.walletId, developerId);\n\n const now = new Date().toISOString();\n\n const { data, error } = await this.db\n .from('mandates')\n .insert({\n developer_id: developerId,\n wallet_id: params.walletId,\n purpose_description: params.purposeDescription,\n allowed_categories: params.allowedCategories ?? null,\n allowed_merchants: params.allowedMerchants ?? null,\n blocked_merchants: params.blockedMerchants ?? null,\n max_amount: params.maxAmount ?? null,\n max_unit_price: params.maxUnitPrice ?? null,\n max_quantity: params.maxQuantity ?? null,\n currency: params.currency ?? 'USD',\n required_attributes: params.requiredAttributes ?? null,\n prohibited_attributes: params.prohibitedAttributes ?? null,\n requires_confirmation: params.requiresConfirmation ?? false,\n confirmation_threshold: params.confirmationThreshold ?? null,\n delegated_to: null,\n delegation_depth: 0,\n status: 'active',\n valid_from: now,\n valid_until: params.validUntil ?? null,\n })\n .select()\n .single();\n\n if (error || !data) {\n throw new ValidationError(`Failed to create mandate: ${error?.message}`);\n }\n\n this.log.info('Mandate created', {\n mandateId: data.id,\n developerId,\n walletId: params.walletId,\n purpose: params.purposeDescription,\n });\n\n return data as MandateRow;\n }, { developerId });\n }\n\n /**\n * Core enforcement: validate a payment context against a mandate.\n *\n * Checks every constraint:\n * - Status must be 'active'\n * - Time bounds: now between valid_from and valid_until\n * - allowed_categories: context.merchantCategory or merchantMCC must match\n * - allowed_merchants / blocked_merchants: check context.merchant domain\n * - max_amount: context.amount must not exceed\n * - max_unit_price: context.unitPrice must not exceed\n * - max_quantity: context.quantity must not exceed\n * - required_attributes: every key must have a matching value in context.attributes\n * - prohibited_attributes: no key should have matching value in context.attributes\n *\n * Returns {valid: true} or {valid: false, violations: string[]}\n */\n async validateAgainstMandate(\n mandateId: string,\n context: PaymentContext,\n ): Promise<MandateValidationResult> {\n return this.withErrorHandling('validateAgainstMandate', async () => {\n const { data: mandate, error } = await this.db\n .from('mandates')\n .select('*')\n .eq('id', mandateId)\n .single();\n\n if (error || !mandate) {\n throw new NotFoundError('Mandate', mandateId);\n }\n\n const violations: string[] = [];\n const m = mandate as MandateRow;\n\n // --- Status check ---\n if (m.status !== 'active') {\n violations.push(`Mandate status is '${m.status}', expected 'active'`);\n }\n\n // --- Time bounds ---\n const now = new Date();\n if (new Date(m.valid_from) > now) {\n violations.push(`Mandate is not yet valid (valid_from: ${m.valid_from})`);\n }\n if (m.valid_until && new Date(m.valid_until) < now) {\n violations.push(`Mandate has expired (valid_until: ${m.valid_until})`);\n }\n\n // --- Allowed categories ---\n if (m.allowed_categories && m.allowed_categories.length > 0) {\n const categoryMatch =\n (context.merchantCategory && m.allowed_categories.includes(context.merchantCategory)) ||\n (context.merchantMCC && m.allowed_categories.includes(context.merchantMCC));\n if (!categoryMatch) {\n violations.push(\n `Merchant category '${context.merchantCategory ?? context.merchantMCC ?? 'unknown'}' is not in allowed categories: [${m.allowed_categories.join(', ')}]`,\n );\n }\n }\n\n // --- Allowed merchants ---\n if (m.allowed_merchants && m.allowed_merchants.length > 0) {\n const merchantAllowed = m.allowed_merchants.some(\n (allowed) => context.merchant.toLowerCase() === allowed.toLowerCase(),\n );\n if (!merchantAllowed) {\n violations.push(\n `Merchant '${context.merchant}' is not in allowed merchants: [${m.allowed_merchants.join(', ')}]`,\n );\n }\n }\n\n // --- Blocked merchants ---\n if (m.blocked_merchants && m.blocked_merchants.length > 0) {\n const merchantBlocked = m.blocked_merchants.some(\n (blocked) => context.merchant.toLowerCase() === blocked.toLowerCase(),\n );\n if (merchantBlocked) {\n violations.push(`Merchant '${context.merchant}' is blocked by this mandate`);\n }\n }\n\n // --- Max amount (per-transaction) ---\n if (m.max_amount !== null && context.amount > m.max_amount) {\n violations.push(\n `Amount ${context.amount} exceeds mandate max_amount ${m.max_amount}`,\n );\n }\n\n // --- Cumulative budget check ---\n if (m.max_amount !== null && (m.spent_cents + context.amount) > m.max_amount) {\n violations.push(\n `Cumulative spend would exceed mandate budget: spent ${m.spent_cents} + ${context.amount} > max ${m.max_amount}`,\n );\n }\n\n // --- Max unit price ---\n if (m.max_unit_price !== null && context.unitPrice !== undefined) {\n if (context.unitPrice > m.max_unit_price) {\n violations.push(\n `Unit price ${context.unitPrice} exceeds mandate max_unit_price ${m.max_unit_price}`,\n );\n }\n }\n\n // --- Max quantity ---\n if (m.max_quantity !== null && context.quantity !== undefined) {\n if (context.quantity > m.max_quantity) {\n violations.push(\n `Quantity ${context.quantity} exceeds mandate max_quantity ${m.max_quantity}`,\n );\n }\n }\n\n // --- Required attributes ---\n if (m.required_attributes) {\n for (const [key, allowedValues] of Object.entries(m.required_attributes)) {\n const contextValue = context.attributes?.[key];\n if (!contextValue) {\n violations.push(`Required attribute '${key}' is missing from payment context`);\n } else if (!allowedValues.includes(String(contextValue))) {\n violations.push(\n `Attribute '${key}' value '${contextValue}' is not in allowed values: [${allowedValues.join(', ')}]`,\n );\n }\n }\n }\n\n // --- Prohibited attributes ---\n if (m.prohibited_attributes) {\n for (const [key, prohibitedValues] of Object.entries(m.prohibited_attributes)) {\n const contextValue = context.attributes?.[key];\n if (contextValue && prohibitedValues.includes(String(contextValue))) {\n violations.push(\n `Attribute '${key}' value '${contextValue}' is prohibited by this mandate`,\n );\n }\n }\n }\n\n if (violations.length > 0) {\n this.log.warn('Mandate validation failed', {\n mandateId,\n violations,\n merchant: context.merchant,\n amount: context.amount,\n });\n return { valid: false, violations };\n }\n\n return { valid: true };\n }, { mandateId });\n }\n\n /**\n * Consume a mandate — set status to 'used' and record the transaction ID.\n */\n async consumeMandate(mandateId: string, transactionId: string): Promise<void> {\n return this.withErrorHandling('consumeMandate', async () => {\n const { data: mandate, error: fetchError } = await this.db\n .from('mandates')\n .select('id, status')\n .eq('id', mandateId)\n .single();\n\n if (fetchError || !mandate) {\n throw new NotFoundError('Mandate', mandateId);\n }\n\n if (mandate.status !== 'active') {\n throw new MandateError(\n `Cannot consume mandate with status '${mandate.status}'`,\n ErrorCode.MANDATE_VIOLATED,\n { mandateId, currentStatus: mandate.status },\n );\n }\n\n const { error } = await this.db\n .from('mandates')\n .update({\n status: 'used',\n transaction_id: transactionId,\n })\n .eq('id', mandateId);\n\n if (error) {\n throw new ValidationError(`Failed to consume mandate: ${error.message}`);\n }\n\n this.log.info('Mandate consumed', { mandateId, transactionId });\n }, { mandateId, transactionId });\n }\n\n /**\n * Record a spend against a mandate — cumulative tracking.\n *\n * Instead of marking the mandate as 'used' after one transaction, this\n * increments spent_cents and transaction_count, inserts into mandate_transactions,\n * and only marks status='exhausted' when spent_cents >= max_amount.\n */\n async recordMandateSpend(mandateId: string, transactionId: string, amountCents: number): Promise<MandateRow> {\n return this.withErrorHandling('recordMandateSpend', async () => {\n const { data: mandate, error: fetchError } = await this.db\n .from('mandates')\n .select('*')\n .eq('id', mandateId)\n .single();\n\n if (fetchError || !mandate) {\n throw new NotFoundError('Mandate', mandateId);\n }\n\n const m = mandate as MandateRow;\n\n if (m.status !== 'active') {\n throw new MandateError(\n `Cannot record spend on mandate with status '${m.status}'`,\n ErrorCode.MANDATE_VIOLATED,\n { mandateId, currentStatus: m.status },\n );\n }\n\n // Check cumulative budget before recording\n if (m.max_amount !== null && (m.spent_cents + amountCents) > m.max_amount) {\n throw new MandateError(\n `Cumulative spend would exceed mandate budget: spent ${m.spent_cents} + ${amountCents} > max ${m.max_amount}`,\n ErrorCode.MANDATE_VIOLATED,\n { mandateId, spentCents: m.spent_cents, amountCents, maxAmount: m.max_amount },\n );\n }\n\n const newSpent = m.spent_cents + amountCents;\n const newCount = m.transaction_count + 1;\n const newStatus = (m.max_amount !== null && newSpent >= m.max_amount) ? 'exhausted' : 'active';\n\n // Update mandate\n const { data: updated, error: updateError } = await this.db\n .from('mandates')\n .update({\n spent_cents: newSpent,\n transaction_count: newCount,\n status: newStatus,\n transaction_id: transactionId,\n })\n .eq('id', mandateId)\n .select()\n .single();\n\n if (updateError || !updated) {\n throw new ValidationError(`Failed to record mandate spend: ${updateError?.message}`);\n }\n\n // Insert into mandate_transactions join table\n const { error: txnError } = await this.db\n .from('mandate_transactions')\n .insert({\n mandate_id: mandateId,\n transaction_id: transactionId,\n amount_cents: amountCents,\n });\n\n if (txnError) {\n this.log.warn('Failed to insert mandate_transaction record', { mandateId, transactionId, error: txnError.message });\n }\n\n this.log.info('Mandate spend recorded', {\n mandateId,\n transactionId,\n amountCents,\n newSpent,\n newStatus,\n });\n\n return updated as MandateRow;\n }, { mandateId, transactionId, amountCents });\n }\n\n /**\n * Get mandate budget status.\n */\n async getMandateBudget(mandateId: string, developerId: string): Promise<MandateBudgetStatus> {\n return this.withErrorHandling('getMandateBudget', async () => {\n const mandate = await this.getMandate(mandateId, developerId);\n\n const maxAmount = mandate.max_amount;\n const remaining = maxAmount !== null\n ? Math.max(0, maxAmount - mandate.spent_cents)\n : Infinity;\n\n return {\n maxAmountCents: maxAmount,\n spentCents: mandate.spent_cents,\n remainingCents: remaining === Infinity ? -1 : remaining,\n transactionCount: mandate.transaction_count,\n status: mandate.status,\n };\n }, { mandateId, developerId });\n }\n\n /**\n * Get a mandate by ID with ownership verification.\n */\n async getMandate(mandateId: string, developerId: string): Promise<MandateRow> {\n return this.withErrorHandling('getMandate', async () => {\n const { data, error } = await this.db\n .from('mandates')\n .select('*')\n .eq('id', mandateId)\n .eq('developer_id', developerId)\n .single();\n\n if (error || !data) {\n throw new NotFoundError('Mandate', mandateId);\n }\n\n return data as MandateRow;\n }, { mandateId, developerId });\n }\n\n /**\n * List mandates for a developer with pagination and optional filters.\n */\n async listMandates(\n developerId: string,\n params?: { walletId?: string; status?: string; limit?: number; offset?: number },\n ): Promise<{ data: MandateRow[]; total: number }> {\n return this.withErrorHandling('listMandates', async () => {\n const limit = params?.limit ?? 50;\n const offset = params?.offset ?? 0;\n\n let countQuery = this.db\n .from('mandates')\n .select('id', { count: 'exact', head: true })\n .eq('developer_id', developerId);\n\n let dataQuery = this.db\n .from('mandates')\n .select('*')\n .eq('developer_id', developerId)\n .order('created_at', { ascending: false })\n .range(offset, offset + limit - 1);\n\n if (params?.walletId) {\n countQuery = countQuery.eq('wallet_id', params.walletId);\n dataQuery = dataQuery.eq('wallet_id', params.walletId);\n }\n\n if (params?.status) {\n countQuery = countQuery.eq('status', params.status);\n dataQuery = dataQuery.eq('status', params.status);\n }\n\n const { count, error: countError } = await countQuery;\n\n if (countError) {\n throw new ValidationError(`Failed to count mandates: ${countError.message}`);\n }\n\n const { data, error } = await dataQuery;\n\n if (error) {\n throw new ValidationError(`Failed to list mandates: ${error.message}`);\n }\n\n return {\n data: (data ?? []) as MandateRow[],\n total: count ?? 0,\n };\n }, { developerId, limit: params?.limit, offset: params?.offset });\n }\n\n /**\n * Revoke a mandate with ownership verification.\n */\n async revokeMandate(mandateId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('revokeMandate', async () => {\n await this.verifyOwnership('mandates', mandateId, developerId, 'Mandate');\n\n const { error } = await this.db\n .from('mandates')\n .update({ status: 'revoked' })\n .eq('id', mandateId);\n\n if (error) {\n throw new ValidationError(`Failed to revoke mandate: ${error.message}`);\n }\n\n this.log.info('Mandate revoked', { mandateId, developerId });\n }, { mandateId, developerId });\n }\n}\n","// ---------------------------------------------------------------------------\n// VIC Service — Visa Intelligent Commerce (6-Step Flow)\n// ---------------------------------------------------------------------------\n// Implements the Visa Intelligent Commerce 6-step API for network token\n// provisioning and credential retrieval:\n// Step 1: Enroll card — Tokenize via Visa MDES, store DPAN\n// Step 2: Initiate purchase intent — Scope a purchase\n// Step 3: Update purchase intent — Modify before credential retrieval\n// Step 4: Cancel purchase intent — Abort before checkout\n// Step 5: Retrieve credentials — Get DPAN + cryptogram\n// Step 6: Confirm transaction — Post-payment confirmation to Visa\n// ---------------------------------------------------------------------------\n\nimport crypto from 'node:crypto';\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport { BaseService } from '../lib/base-service.js';\nimport type { ILogger } from '../lib/logger.js';\nimport type {\n IVICService,\n IVGSProxyService,\n NetworkTokenRow,\n VICEnrollParams,\n VICPurchaseIntentParams,\n VICCredentialResult,\n} from '../lib/interfaces.js';\nimport { NotFoundError, ServiceError, ErrorCode } from '../lib/errors.js';\n\n/**\n * In-memory purchase intent structure.\n * In production, these would be stored in the DB. For Phase 1A, we use\n * a Map to keep the implementation simple while maintaining the interface contract.\n */\ninterface PurchaseIntent {\n id: string;\n developerId: string;\n networkTokenId: string;\n amount: number;\n currency: string;\n merchantId: string | null;\n merchantName: string | null;\n description: string | null;\n status: 'created' | 'updated' | 'cancelled' | 'credentials_retrieved' | 'confirmed';\n createdAt: string;\n updatedAt: string;\n}\n\nexport class VICService extends BaseService implements IVICService {\n readonly serviceName = 'VICService';\n\n private readonly vgsProxy: IVGSProxyService;\n\n /** In-memory purchase intent store. Keyed by intentId. */\n private readonly purchaseIntents = new Map<string, PurchaseIntent>();\n\n constructor(db: SupabaseClient, logger: ILogger, vgsProxy: IVGSProxyService) {\n super(db, logger);\n this.vgsProxy = vgsProxy;\n }\n\n // -------------------------------------------------------------------------\n // Step 1: Enroll Card\n // -------------------------------------------------------------------------\n\n /**\n * Tokenize a card from VGS vault via Visa MDES.\n * Creates entry in network_tokens table with network='visa', token_type='dpan'.\n * In Phase 1A, the Visa API call is simulated.\n */\n async enrollCard(\n developerId: string,\n params: VICEnrollParams,\n ): Promise<NetworkTokenRow> {\n return this.withErrorHandling('enrollCard', async () => {\n const { walletId, cardId } = params;\n\n // Verify wallet ownership\n await this.verifyWalletOwnership(walletId, developerId);\n\n // Verify card exists and belongs to the wallet\n const { data: card, error: cardError } = await this.db\n .from('cards')\n .select('*')\n .eq('id', cardId)\n .eq('wallet_id', walletId)\n .eq('status', 'active')\n .single();\n\n if (cardError || !card) {\n throw new NotFoundError('Card', cardId);\n }\n\n // Check if already enrolled\n const { data: existing } = await this.db\n .from('network_tokens')\n .select('*')\n .eq('card_id', cardId)\n .eq('network', 'visa')\n .eq('status', 'active')\n .single();\n\n if (existing) {\n this.log.info('Card already enrolled with Visa, returning existing token', {\n cardId,\n tokenId: existing.id,\n });\n return existing as NetworkTokenRow;\n }\n\n // Simulate Visa MDES tokenization\n // In production, this would call the Visa Token Service API via VGS proxy\n const networkTokenId = `visa_dpan_${crypto.randomUUID().replace(/-/g, '').slice(0, 20)}`;\n const tokenId = crypto.randomUUID();\n const expiresAt = new Date(Date.now() + 365 * 24 * 60 * 60 * 1000).toISOString(); // 1 year\n\n this.log.info('Enrolling card with Visa MDES (simulated)', {\n developerId,\n walletId,\n cardId,\n last4: card.last4,\n });\n\n const { data: tokenRow, error } = await this.db\n .from('network_tokens')\n .insert({\n id: tokenId,\n developer_id: developerId,\n wallet_id: walletId,\n card_id: cardId,\n network: 'visa',\n network_token_id: networkTokenId,\n token_type: 'dpan',\n status: 'active',\n allowed_mccs: null,\n max_amount: null,\n governance_metadata: {\n enrollment_method: 'vic',\n card_brand: card.brand,\n card_last4: card.last4,\n enrolled_at: new Date().toISOString(),\n },\n expires_at: expiresAt,\n })\n .select()\n .single();\n\n if (error || !tokenRow) {\n throw new ServiceError(\n `Failed to create network token: ${error?.message}`,\n ErrorCode.NETWORK_TOKEN_FAILED,\n 500,\n true,\n );\n }\n\n this.log.info('Card enrolled with Visa MDES', {\n tokenId,\n networkTokenId,\n cardId,\n });\n\n return tokenRow as NetworkTokenRow;\n }, { developerId, walletId: params.walletId, cardId: params.cardId });\n }\n\n // -------------------------------------------------------------------------\n // Step 2: Initiate Purchase Intent\n // -------------------------------------------------------------------------\n\n /**\n * Create a scoped purchase intent.\n * Stores the intent in memory for retrieval during credential request.\n */\n async initiatePurchaseIntent(\n developerId: string,\n params: VICPurchaseIntentParams,\n ): Promise<{ intentId: string }> {\n return this.withErrorHandling('initiatePurchaseIntent', async () => {\n // Verify the network token exists and belongs to the developer\n const token = await this.getNetworkToken(params.networkTokenId);\n if (token.developer_id !== developerId) {\n throw new ServiceError(\n `Network token ${params.networkTokenId} does not belong to developer`,\n ErrorCode.OWNERSHIP_VIOLATION,\n 403,\n );\n }\n\n const intentId = crypto.randomUUID();\n const now = new Date().toISOString();\n\n const intent: PurchaseIntent = {\n id: intentId,\n developerId,\n networkTokenId: params.networkTokenId,\n amount: params.amount,\n currency: params.currency,\n merchantId: params.merchantId ?? null,\n merchantName: params.merchantName ?? null,\n description: params.description ?? null,\n status: 'created',\n createdAt: now,\n updatedAt: now,\n };\n\n this.purchaseIntents.set(intentId, intent);\n\n this.log.info('Purchase intent initiated', {\n intentId,\n developerId,\n networkTokenId: params.networkTokenId,\n amount: params.amount,\n });\n\n return { intentId };\n }, { developerId, networkTokenId: params.networkTokenId });\n }\n\n // -------------------------------------------------------------------------\n // Step 3: Update Purchase Intent\n // -------------------------------------------------------------------------\n\n /**\n * Update a purchase intent before credential retrieval.\n */\n async updatePurchaseIntent(\n intentId: string,\n params: Partial<VICPurchaseIntentParams>,\n ): Promise<{ intentId: string }> {\n return this.withErrorHandling('updatePurchaseIntent', async () => {\n const intent = this.purchaseIntents.get(intentId);\n if (!intent) {\n throw new NotFoundError('Purchase intent', intentId);\n }\n\n if (intent.status === 'cancelled' || intent.status === 'confirmed') {\n throw new ServiceError(\n `Cannot update purchase intent in status: ${intent.status}`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 400,\n );\n }\n\n // Apply updates\n if (params.amount !== undefined) intent.amount = params.amount;\n if (params.currency !== undefined) intent.currency = params.currency;\n if (params.merchantId !== undefined) intent.merchantId = params.merchantId ?? null;\n if (params.merchantName !== undefined) intent.merchantName = params.merchantName ?? null;\n if (params.description !== undefined) intent.description = params.description ?? null;\n intent.status = 'updated';\n intent.updatedAt = new Date().toISOString();\n\n this.log.info('Purchase intent updated', { intentId });\n\n return { intentId };\n }, { intentId });\n }\n\n // -------------------------------------------------------------------------\n // Step 4: Cancel Purchase Intent\n // -------------------------------------------------------------------------\n\n /**\n * Cancel a purchase intent before checkout.\n */\n async cancelPurchaseIntent(intentId: string): Promise<void> {\n return this.withErrorHandling('cancelPurchaseIntent', async () => {\n const intent = this.purchaseIntents.get(intentId);\n if (!intent) {\n throw new NotFoundError('Purchase intent', intentId);\n }\n\n if (intent.status === 'confirmed') {\n throw new ServiceError(\n 'Cannot cancel a confirmed purchase intent',\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 400,\n );\n }\n\n intent.status = 'cancelled';\n intent.updatedAt = new Date().toISOString();\n\n this.log.info('Purchase intent cancelled', { intentId });\n }, { intentId });\n }\n\n // -------------------------------------------------------------------------\n // Step 5: Retrieve Credentials\n // -------------------------------------------------------------------------\n\n /**\n * Retrieve DPAN + cryptogram for the purchase intent.\n * Returns token number, cryptogram, ECI, and expiry.\n */\n async retrieveCredentials(\n intentId: string,\n cardSelection?: string,\n ): Promise<VICCredentialResult> {\n return this.withErrorHandling('retrieveCredentials', async () => {\n const intent = this.purchaseIntents.get(intentId);\n if (!intent) {\n throw new NotFoundError('Purchase intent', intentId);\n }\n\n if (intent.status === 'cancelled') {\n throw new ServiceError(\n 'Cannot retrieve credentials for a cancelled intent',\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 400,\n );\n }\n\n // Get the network token\n const networkToken = await this.getNetworkToken(intent.networkTokenId);\n\n // In production, this would call Visa to get a transaction-scoped\n // cryptogram. Here we simulate the response.\n const cryptogram = crypto.randomBytes(20).toString('base64');\n\n // Simulated DPAN (last 4 match the original card)\n const { data: cardData } = await this.db\n .from('cards')\n .select('exp_month, exp_year')\n .eq('id', networkToken.card_id)\n .single();\n\n const expMonth = (cardData as Record<string, unknown> | null)?.exp_month as number ?? 12;\n const expYear = (cardData as Record<string, unknown> | null)?.exp_year as number ?? 2030;\n\n intent.status = 'credentials_retrieved';\n intent.updatedAt = new Date().toISOString();\n\n this.log.info('Credentials retrieved for purchase intent', {\n intentId,\n networkTokenId: intent.networkTokenId,\n cardSelection: cardSelection ?? 'default',\n });\n\n return {\n tokenNumber: networkToken.network_token_id,\n cryptogram,\n eci: '05', // Visa 3DS ECI for fully authenticated\n expMonth,\n expYear,\n };\n }, { intentId, cardSelection });\n }\n\n // -------------------------------------------------------------------------\n // Step 6: Confirm Transaction\n // -------------------------------------------------------------------------\n\n /**\n * Post-payment confirmation back to Visa.\n * Updates the purchase intent status and logs the confirmation.\n */\n async confirmTransaction(\n intentId: string,\n txnDetails: { transactionId: string; status: string },\n ): Promise<void> {\n return this.withErrorHandling('confirmTransaction', async () => {\n const intent = this.purchaseIntents.get(intentId);\n if (!intent) {\n throw new NotFoundError('Purchase intent', intentId);\n }\n\n // In production, this would call Visa's transaction confirmation API\n intent.status = 'confirmed';\n intent.updatedAt = new Date().toISOString();\n\n this.log.info('Transaction confirmed with Visa', {\n intentId,\n transactionId: txnDetails.transactionId,\n transactionStatus: txnDetails.status,\n });\n }, { intentId, transactionId: txnDetails.transactionId });\n }\n\n // -------------------------------------------------------------------------\n // Token management\n // -------------------------------------------------------------------------\n\n /**\n * Get a network token by ID.\n */\n async getNetworkToken(tokenId: string): Promise<NetworkTokenRow> {\n return this.withErrorHandling('getNetworkToken', async () => {\n const { data, error } = await this.db\n .from('network_tokens')\n .select('*')\n .eq('id', tokenId)\n .single();\n\n if (error || !data) {\n throw new NotFoundError('Network token', tokenId);\n }\n\n return data as NetworkTokenRow;\n }, { tokenId });\n }\n\n /**\n * List network tokens for a developer, optionally filtered by wallet.\n */\n async listNetworkTokens(\n developerId: string,\n walletId?: string,\n ): Promise<NetworkTokenRow[]> {\n return this.withErrorHandling('listNetworkTokens', async () => {\n let query = this.db\n .from('network_tokens')\n .select('*')\n .eq('developer_id', developerId)\n .eq('network', 'visa')\n .order('created_at', { ascending: false });\n\n if (walletId) {\n query = query.eq('wallet_id', walletId);\n }\n\n const { data, error } = await query;\n\n if (error) {\n throw new ServiceError(\n `Failed to list network tokens: ${error.message}`,\n ErrorCode.NETWORK_TOKEN_FAILED,\n 500,\n true,\n );\n }\n\n return (data ?? []) as NetworkTokenRow[];\n }, { developerId, walletId });\n }\n}\n","// ---------------------------------------------------------------------------\n// Mastercard Agent Pay Service — MC Agent Pay (6-Step Workflow)\n// ---------------------------------------------------------------------------\n// Implements the Mastercard Agent Pay 6-step workflow for agentic commerce.\n// Lane registers as the Agentic Commerce Enabler (DSP).\n//\n// Step 1: Enroll credential — Tokenize via MDES\n// Step 2: Verify identity — Cardholder ID&V (simulated biometric/delegated)\n// Step 3: Bind authenticator — Payment Passkeys bind (KYA)\n// Step 4: Create intent — Capture purchase intent with enriched context\n// Step 5: Authenticate — Authenticate via Payment Passkeys\n// Step 6: Checkout — Returns DSRP cryptogram or DTVC payload\n// ---------------------------------------------------------------------------\n\nimport crypto from 'node:crypto';\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport { BaseService } from '../lib/base-service.js';\nimport type { ILogger } from '../lib/logger.js';\nimport type {\n IMastercardAPService,\n IVGSProxyService,\n NetworkTokenRow,\n MCAEnrollParams,\n MCAIntentParams,\n MCACheckoutResult,\n} from '../lib/interfaces.js';\nimport { NotFoundError, ServiceError, ErrorCode } from '../lib/errors.js';\n\n/** DSP ID for Lane as the Agentic Commerce Enabler */\nconst DSP_ID = process.env['LANE_MC_DSP_ID'] ?? 'lane-dsp-001';\n\n/**\n * In-memory purchase intent for Mastercard Agent Pay.\n */\ninterface MCAPurchaseIntent {\n id: string;\n developerId: string;\n tokenId: string;\n amount: number;\n currency: string;\n merchantId: string | null;\n merchantName: string | null;\n agentId: string | null;\n mandateRef: string | null;\n description: string | null;\n status: 'created' | 'authenticated' | 'completed' | 'cancelled';\n createdAt: string;\n updatedAt: string;\n}\n\nexport class MastercardAPService extends BaseService implements IMastercardAPService {\n readonly serviceName = 'MastercardAPService';\n\n private readonly vgsProxy: IVGSProxyService;\n\n /** In-memory purchase intent store. Keyed by intentId. */\n private readonly purchaseIntents = new Map<string, MCAPurchaseIntent>();\n\n /** Authenticator bindings. Keyed by tokenId. */\n private readonly authenticatorBindings = new Map<string, {\n authMethod: string;\n boundAt: string;\n }>();\n\n /** Identity verification status. Keyed by tokenId. */\n private readonly identityVerifications = new Map<string, {\n verified: boolean;\n verifiedAt: string;\n }>();\n\n constructor(db: SupabaseClient, logger: ILogger, vgsProxy: IVGSProxyService) {\n super(db, logger);\n this.vgsProxy = vgsProxy;\n }\n\n // -------------------------------------------------------------------------\n // Step 1: Enroll Credential\n // -------------------------------------------------------------------------\n\n /**\n * Tokenize a card via Mastercard MDES.\n * Creates entry in network_tokens with network='mastercard', token_type='mdes'.\n * Stores governance_metadata with DSP ID and agent reference.\n */\n async enrollCredential(\n developerId: string,\n params: MCAEnrollParams,\n ): Promise<NetworkTokenRow> {\n return this.withErrorHandling('enrollCredential', async () => {\n const { walletId, cardId } = params;\n\n // Verify wallet ownership\n await this.verifyWalletOwnership(walletId, developerId);\n\n // Verify card exists and belongs to the wallet\n const { data: card, error: cardError } = await this.db\n .from('cards')\n .select('*')\n .eq('id', cardId)\n .eq('wallet_id', walletId)\n .eq('status', 'active')\n .single();\n\n if (cardError || !card) {\n throw new NotFoundError('Card', cardId);\n }\n\n // Check if already enrolled with Mastercard\n const { data: existing } = await this.db\n .from('network_tokens')\n .select('*')\n .eq('card_id', cardId)\n .eq('network', 'mastercard')\n .eq('status', 'active')\n .single();\n\n if (existing) {\n this.log.info('Card already enrolled with Mastercard, returning existing token', {\n cardId,\n tokenId: existing.id,\n });\n return existing as NetworkTokenRow;\n }\n\n // Simulate Mastercard MDES tokenization\n // In production, this would call the Mastercard Digital Enablement Service API\n const networkTokenId = `mc_mdes_${crypto.randomUUID().replace(/-/g, '').slice(0, 20)}`;\n const tokenId = crypto.randomUUID();\n const expiresAt = new Date(Date.now() + 365 * 24 * 60 * 60 * 1000).toISOString();\n\n this.log.info('Enrolling card with Mastercard MDES (simulated)', {\n developerId,\n walletId,\n cardId,\n last4: card.last4,\n dspId: DSP_ID,\n });\n\n const { data: tokenRow, error } = await this.db\n .from('network_tokens')\n .insert({\n id: tokenId,\n developer_id: developerId,\n wallet_id: walletId,\n card_id: cardId,\n network: 'mastercard',\n network_token_id: networkTokenId,\n token_type: 'mdes',\n status: 'active',\n allowed_mccs: null,\n max_amount: null,\n governance_metadata: {\n dsp_id: DSP_ID,\n agent_ref: `lane-agent-${developerId.slice(0, 8)}`,\n enrollment_method: 'mastercard_agent_pay',\n card_brand: card.brand,\n card_last4: card.last4,\n enrolled_at: new Date().toISOString(),\n },\n expires_at: expiresAt,\n })\n .select()\n .single();\n\n if (error || !tokenRow) {\n throw new ServiceError(\n `Failed to create Mastercard network token: ${error?.message}`,\n ErrorCode.NETWORK_TOKEN_FAILED,\n 500,\n true,\n );\n }\n\n this.log.info('Card enrolled with Mastercard MDES', {\n tokenId,\n networkTokenId,\n cardId,\n dspId: DSP_ID,\n });\n\n return tokenRow as NetworkTokenRow;\n }, { developerId, walletId: params.walletId, cardId: params.cardId });\n }\n\n // -------------------------------------------------------------------------\n // Step 2: Verify Identity\n // -------------------------------------------------------------------------\n\n /**\n * Cardholder ID&V — simulated biometric or delegated verification.\n * In production, this would trigger a real identity verification flow.\n */\n async verifyIdentity(tokenId: string): Promise<{ verified: boolean }> {\n return this.withErrorHandling('verifyIdentity', async () => {\n // Verify token exists\n const token = await this.getNetworkToken(tokenId);\n\n // Simulate identity verification\n // In production, this would call MC's ID&V API or trigger biometric\n const verifiedAt = new Date().toISOString();\n this.identityVerifications.set(tokenId, {\n verified: true,\n verifiedAt,\n });\n\n this.log.info('Identity verified for Mastercard token (simulated)', {\n tokenId,\n networkTokenId: token.network_token_id,\n verifiedAt,\n });\n\n return { verified: true };\n }, { tokenId });\n }\n\n // -------------------------------------------------------------------------\n // Step 3: Bind Authenticator\n // -------------------------------------------------------------------------\n\n /**\n * Payment Passkeys bind. Satisfies Mastercard's KYA (Know Your Agent) requirement.\n * Binds an authentication method to the token for future transaction authorization.\n */\n async bindAuthenticator(\n tokenId: string,\n authMethod: string,\n ): Promise<{ bound: boolean }> {\n return this.withErrorHandling('bindAuthenticator', async () => {\n // Verify token exists\n const token = await this.getNetworkToken(tokenId);\n\n // Verify identity was completed first\n const idv = this.identityVerifications.get(tokenId);\n if (!idv?.verified) {\n throw new ServiceError(\n 'Identity verification must be completed before binding authenticator',\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 400,\n );\n }\n\n // Simulate authenticator binding\n // In production, this would register a Payment Passkey with MC\n const boundAt = new Date().toISOString();\n this.authenticatorBindings.set(tokenId, {\n authMethod,\n boundAt,\n });\n\n this.log.info('Authenticator bound for Mastercard token (simulated)', {\n tokenId,\n authMethod,\n networkTokenId: token.network_token_id,\n boundAt,\n });\n\n return { bound: true };\n }, { tokenId, authMethod });\n }\n\n // -------------------------------------------------------------------------\n // Step 4: Create Intent\n // -------------------------------------------------------------------------\n\n /**\n * Capture purchase intent with enriched context.\n * Includes agent ID and mandate reference for MC's governance framework.\n */\n async createIntent(\n developerId: string,\n params: MCAIntentParams,\n ): Promise<{ intentId: string }> {\n return this.withErrorHandling('createIntent', async () => {\n // Verify the network token exists and belongs to the developer\n const token = await this.getNetworkToken(params.tokenId);\n if (token.developer_id !== developerId) {\n throw new ServiceError(\n `Network token ${params.tokenId} does not belong to developer`,\n ErrorCode.OWNERSHIP_VIOLATION,\n 403,\n );\n }\n\n // Verify authenticator is bound (KYA requirement)\n const binding = this.authenticatorBindings.get(params.tokenId);\n if (!binding) {\n throw new ServiceError(\n 'Authenticator must be bound before creating a purchase intent',\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 400,\n );\n }\n\n const intentId = crypto.randomUUID();\n const now = new Date().toISOString();\n\n const intent: MCAPurchaseIntent = {\n id: intentId,\n developerId,\n tokenId: params.tokenId,\n amount: params.amount,\n currency: params.currency,\n merchantId: params.merchantId ?? null,\n merchantName: params.merchantName ?? null,\n agentId: params.agentId ?? null,\n mandateRef: params.mandateRef ?? null,\n description: params.description ?? null,\n status: 'created',\n createdAt: now,\n updatedAt: now,\n };\n\n this.purchaseIntents.set(intentId, intent);\n\n this.log.info('Mastercard Agent Pay intent created', {\n intentId,\n developerId,\n tokenId: params.tokenId,\n amount: params.amount,\n agentId: params.agentId,\n mandateRef: params.mandateRef,\n dspId: DSP_ID,\n });\n\n return { intentId };\n }, { developerId, tokenId: params.tokenId });\n }\n\n // -------------------------------------------------------------------------\n // Step 5: Authenticate\n // -------------------------------------------------------------------------\n\n /**\n * Authenticate via Payment Passkeys for the purchase intent.\n * In production, this would trigger the bound authenticator.\n */\n async authenticate(intentId: string): Promise<{ authenticated: boolean }> {\n return this.withErrorHandling('authenticate', async () => {\n const intent = this.purchaseIntents.get(intentId);\n if (!intent) {\n throw new NotFoundError('Purchase intent', intentId);\n }\n\n if (intent.status !== 'created') {\n throw new ServiceError(\n `Cannot authenticate intent in status: ${intent.status}`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 400,\n );\n }\n\n // Verify authenticator is bound\n const binding = this.authenticatorBindings.get(intent.tokenId);\n if (!binding) {\n throw new ServiceError(\n 'No authenticator bound for this token',\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 400,\n );\n }\n\n // Simulate authentication via Payment Passkeys\n intent.status = 'authenticated';\n intent.updatedAt = new Date().toISOString();\n\n this.log.info('Mastercard Agent Pay intent authenticated (simulated)', {\n intentId,\n tokenId: intent.tokenId,\n authMethod: binding.authMethod,\n });\n\n return { authenticated: true };\n }, { intentId });\n }\n\n // -------------------------------------------------------------------------\n // Step 6: Checkout\n // -------------------------------------------------------------------------\n\n /**\n * Returns DSRP cryptogram or DTVC payload with commerce indicators.\n * This is the final step that produces the payment credentials.\n */\n async checkout(intentId: string): Promise<MCACheckoutResult> {\n return this.withErrorHandling('checkout', async () => {\n const intent = this.purchaseIntents.get(intentId);\n if (!intent) {\n throw new NotFoundError('Purchase intent', intentId);\n }\n\n if (intent.status !== 'authenticated') {\n throw new ServiceError(\n `Intent must be authenticated before checkout (current status: ${intent.status})`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 400,\n );\n }\n\n // Get the network token for DSRP generation\n const token = await this.getNetworkToken(intent.tokenId);\n\n // Simulate DSRP cryptogram generation\n // In production, this would call MC's DSRP API\n const cryptogram = crypto.randomBytes(20).toString('base64');\n\n // Commerce indicators per MC Agent Pay spec\n const commerceIndicators: string[] = [\n 'agentic_commerce', // Indicates agentic transaction\n 'dsp_initiated', // DSP-initiated (Lane)\n ];\n\n if (intent.mandateRef) {\n commerceIndicators.push('mandate_authorized');\n }\n\n const dsrpPayload: Record<string, unknown> = {\n token_number: token.network_token_id,\n cryptogram,\n eci: '07', // MC ECI for recurring/installment\n transaction_type: 'dsrp',\n amount: intent.amount,\n currency: intent.currency,\n dsp_id: DSP_ID,\n agent_id: intent.agentId,\n mandate_ref: intent.mandateRef,\n generated_at: new Date().toISOString(),\n };\n\n const dtvPayload: Record<string, unknown> = {\n digital_transaction_verification: true,\n token_number: token.network_token_id,\n verification_code: crypto.randomBytes(4).toString('hex'),\n dsp_id: DSP_ID,\n };\n\n // Update intent status\n intent.status = 'completed';\n intent.updatedAt = new Date().toISOString();\n\n this.log.info('Mastercard Agent Pay checkout completed', {\n intentId,\n tokenId: intent.tokenId,\n amount: intent.amount,\n commerceIndicators,\n dspId: DSP_ID,\n });\n\n return {\n cryptogram,\n dsrpPayload,\n dtvPayload,\n commerceIndicators,\n };\n }, { intentId });\n }\n\n // -------------------------------------------------------------------------\n // Token management\n // -------------------------------------------------------------------------\n\n /**\n * Get a network token by ID.\n */\n async getNetworkToken(tokenId: string): Promise<NetworkTokenRow> {\n return this.withErrorHandling('getNetworkToken', async () => {\n const { data, error } = await this.db\n .from('network_tokens')\n .select('*')\n .eq('id', tokenId)\n .single();\n\n if (error || !data) {\n throw new NotFoundError('Network token', tokenId);\n }\n\n return data as NetworkTokenRow;\n }, { tokenId });\n }\n\n /**\n * List network tokens for a developer, optionally filtered by wallet.\n */\n async listNetworkTokens(\n developerId: string,\n walletId?: string,\n ): Promise<NetworkTokenRow[]> {\n return this.withErrorHandling('listNetworkTokens', async () => {\n let query = this.db\n .from('network_tokens')\n .select('*')\n .eq('developer_id', developerId)\n .eq('network', 'mastercard')\n .order('created_at', { ascending: false });\n\n if (walletId) {\n query = query.eq('wallet_id', walletId);\n }\n\n const { data, error } = await query;\n\n if (error) {\n throw new ServiceError(\n `Failed to list Mastercard network tokens: ${error.message}`,\n ErrorCode.NETWORK_TOKEN_FAILED,\n 500,\n true,\n );\n }\n\n return (data ?? []) as NetworkTokenRow[];\n }, { developerId, walletId });\n }\n}\n","// ---------------------------------------------------------------------------\n// Protocol Client Service — Adapter Orchestration\n// ---------------------------------------------------------------------------\n// Orchestrates protocol adapter selection and delegates to the appropriate\n// adapter (ACP, UCP, x402). When no structured protocol is available,\n// falls through to fallback strategies: Rye → browser use → VGS proxy.\n//\n// Discovery: probes merchant endpoints for ACP/UCP/x402 support.\n// Fallback: probes Rye catalog, checks agent capability, then VGS proxy.\n// ---------------------------------------------------------------------------\n\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport { BaseService } from '../lib/base-service.js';\nimport type { ILogger } from '../lib/logger.js';\nimport type {\n IProtocolClientService,\n IProtocolAdapter,\n IVGSProxyService,\n IVICService,\n IMastercardAPService,\n ProtocolType,\n ProtocolSessionRow,\n ProtocolSessionParams,\n ProtocolPaymentData,\n ProtocolPaymentResult,\n MerchantDirectoryRow,\n} from '../lib/interfaces.js';\nimport { NotFoundError, ServiceError, ErrorCode } from '../lib/errors.js';\nimport { ACPAdapter } from './protocol-adapters/acp-adapter.js';\nimport { UCPAdapter } from './protocol-adapters/ucp-adapter.js';\nimport { X402Adapter } from './protocol-adapters/x402-adapter.js';\nimport { RyeAdapter } from './protocol-adapters/rye-adapter.js';\nimport { BrowserUseAdapter } from './protocol-adapters/browser-use-adapter.js';\nimport { withRetry, CircuitBreaker } from '../lib/retry.js';\n\nexport class ProtocolClientService extends BaseService implements IProtocolClientService {\n readonly serviceName = 'ProtocolClientService';\n\n private readonly adapters: IProtocolAdapter[];\n private readonly adapterMap: Map<ProtocolType, IProtocolAdapter>;\n private readonly vicService: IVICService;\n private readonly mastercardAPService: IMastercardAPService;\n private readonly vgsProxy: IVGSProxyService;\n\n // Fallback adapters (probed in order when no protocol is available)\n private readonly ryeAdapter: RyeAdapter;\n private readonly browserUseAdapter: BrowserUseAdapter;\n private readonly vgsCircuitBreaker: CircuitBreaker;\n\n constructor(\n db: SupabaseClient,\n logger: ILogger,\n vgsProxy: IVGSProxyService,\n vicService: IVICService,\n mastercardAPService: IMastercardAPService,\n ) {\n super(db, logger);\n\n this.vicService = vicService;\n this.mastercardAPService = mastercardAPService;\n this.vgsProxy = vgsProxy;\n\n // Create protocol adapters\n const acpAdapter = new ACPAdapter(db, logger, vgsProxy);\n const ucpAdapter = new UCPAdapter(db, logger, vgsProxy);\n const x402Adapter = new X402Adapter(db, logger, vgsProxy);\n\n this.adapters = [acpAdapter, ucpAdapter, x402Adapter];\n this.adapterMap = new Map<ProtocolType, IProtocolAdapter>([\n ['acp', acpAdapter],\n ['ucp', ucpAdapter],\n ['x402', x402Adapter],\n ]);\n\n // Create fallback adapters\n this.ryeAdapter = new RyeAdapter(db, logger);\n this.browserUseAdapter = new BrowserUseAdapter(db, logger);\n this.vgsCircuitBreaker = new CircuitBreaker('vgs_proxy', {\n failureThreshold: 3,\n windowMs: 5 * 60 * 1000,\n resetTimeoutMs: 60 * 1000,\n });\n }\n\n /**\n * Discover which protocols a merchant domain supports.\n * Probes ACP, UCP, and x402 endpoints in parallel.\n * Returns the list of discovered protocols and their manifests.\n */\n async discoverProtocols(domain: string): Promise<{\n domain: string;\n protocols: ProtocolType[];\n manifests: Record<string, Record<string, unknown>>;\n }> {\n return this.withErrorHandling('discoverProtocols', async () => {\n this.log.info('Discovering protocols', { domain });\n\n const protocols: ProtocolType[] = [];\n const manifests: Record<string, Record<string, unknown>> = {};\n\n // Probe all protocols in parallel\n const probes = await Promise.allSettled([\n this.probeACP(domain),\n this.probeUCP(domain),\n this.probeX402(domain),\n ]);\n\n // ACP probe result\n if (probes[0]!.status === 'fulfilled' && probes[0]!.value) {\n protocols.push('acp');\n manifests['acp'] = probes[0]!.value;\n }\n\n // UCP probe result\n if (probes[1]!.status === 'fulfilled' && probes[1]!.value) {\n protocols.push('ucp');\n manifests['ucp'] = probes[1]!.value;\n }\n\n // x402 probe result\n if (probes[2]!.status === 'fulfilled' && probes[2]!.value) {\n protocols.push('x402');\n manifests['x402'] = probes[2]!.value;\n }\n\n this.log.info('Protocol discovery complete', { domain, protocols });\n\n return { domain, protocols, manifests };\n }, { domain });\n }\n\n /**\n * Create a protocol session.\n * If a specific protocol is requested, uses that adapter.\n * Otherwise auto-selects: ACP > UCP > x402 > Rye > browser use > VGS proxy.\n */\n async createSession(\n developerId: string,\n params: ProtocolSessionParams,\n ): Promise<ProtocolSessionRow> {\n return this.withErrorHandling('createSession', async () => {\n let adapter: IProtocolAdapter | null = null;\n\n if (params.protocol) {\n // Use specified protocol\n const requested = this.adapterMap.get(params.protocol as ProtocolType);\n if (!requested) {\n throw new ServiceError(\n `Unsupported protocol: ${params.protocol}`,\n ErrorCode.PROTOCOL_NOT_SUPPORTED,\n 400,\n );\n }\n adapter = requested;\n } else {\n // Auto-select best protocol by probing the merchant\n adapter = await this.autoSelectAdapter(params.merchantDomain);\n }\n\n if (!adapter) {\n // No protocol adapter found — try fallback strategies\n return this.createFallbackSession(developerId, params);\n }\n\n this.log.info('Creating session with adapter', {\n developerId,\n protocol: adapter.protocol,\n merchantDomain: params.merchantDomain,\n });\n\n return adapter.createSession({ ...params, developerId });\n }, { developerId, merchantDomain: params.merchantDomain });\n }\n\n /**\n * Confirm payment for an existing session.\n * Looks up the session to determine the protocol, then delegates to the\n * appropriate adapter (including fallback adapters).\n */\n async confirmPayment(\n sessionId: string,\n paymentData: ProtocolPaymentData,\n ): Promise<ProtocolPaymentResult> {\n return this.withErrorHandling('confirmPayment', async () => {\n // Look up session to determine protocol\n const session = await this.findSession(sessionId);\n const protocol = session.protocol;\n\n // Check standard protocol adapters\n const adapter = this.adapterMap.get(protocol as ProtocolType);\n if (adapter) {\n this.log.info('Confirming payment', {\n sessionId,\n protocol: session.protocol,\n merchantDomain: session.merchant_domain,\n });\n return adapter.confirmPayment(sessionId, paymentData);\n }\n\n // Check fallback adapters\n if (protocol === 'rye' as ProtocolType) {\n return this.ryeAdapter.confirmPayment(sessionId, paymentData);\n }\n if (protocol === 'browser_use' as ProtocolType) {\n return this.browserUseAdapter.confirmPayment(sessionId, paymentData);\n }\n\n throw new ServiceError(\n `No adapter found for protocol: ${session.protocol}`,\n ErrorCode.PROTOCOL_NOT_SUPPORTED,\n 500,\n );\n }, { sessionId });\n }\n\n /**\n * Get session status.\n * Looks up the session from DB directly (protocol-agnostic).\n */\n async getSessionStatus(sessionId: string): Promise<ProtocolSessionRow> {\n return this.withErrorHandling('getSessionStatus', async () => {\n return this.findSession(sessionId);\n }, { sessionId });\n }\n\n // ---------------------------------------------------------------------------\n // Fallback strategy orchestration\n // ---------------------------------------------------------------------------\n\n /**\n * Try fallback strategies in order: Rye → browser use → VGS proxy.\n * Each is probed at runtime. First one that can handle wins.\n */\n private async createFallbackSession(\n developerId: string,\n params: ProtocolSessionParams,\n ): Promise<ProtocolSessionRow> {\n const { merchantDomain } = params;\n\n // 1. Try Rye (probe catalog)\n try {\n const ryeCanHandle = await this.ryeAdapter.canHandle(merchantDomain);\n if (ryeCanHandle) {\n this.log.info('Using Rye fallback adapter', { merchantDomain });\n return await this.ryeAdapter.createSession({ ...params, developerId });\n }\n } catch (err) {\n this.log.warn('Rye probe/session failed, trying next fallback', {\n merchantDomain,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n\n // 2. Try browser use (check agent capability)\n try {\n const browserCanHandle = await this.browserUseAdapter.canHandle(merchantDomain);\n if (browserCanHandle) {\n this.log.info('Using browser use fallback adapter', { merchantDomain });\n return await this.browserUseAdapter.createSession({ ...params, developerId });\n }\n } catch (err) {\n this.log.warn('Browser use session failed, falling back to VGS proxy', {\n merchantDomain,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n\n // 3. VGS proxy — always available as last resort\n // For VGS proxy, we throw the original \"no protocol\" error since\n // the payment service handles VGS proxy routing directly.\n throw new ServiceError(\n `No supported protocols found for domain: ${merchantDomain}. Payment will use VGS proxy fallback.`,\n ErrorCode.PROTOCOL_NOT_SUPPORTED,\n 400,\n );\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n /**\n * Find a session by ID across all protocols.\n */\n private async findSession(sessionId: string): Promise<ProtocolSessionRow> {\n const { data, error } = await this.db\n .from('protocol_sessions')\n .select('*')\n .eq('id', sessionId)\n .single();\n\n if (error || !data) {\n throw new NotFoundError('Protocol session', sessionId);\n }\n\n return data as ProtocolSessionRow;\n }\n\n /**\n * Auto-select the best protocol adapter for a merchant domain.\n * Returns null if no protocol adapter matches (caller should try fallbacks).\n */\n private async autoSelectAdapter(merchantDomain: string): Promise<IProtocolAdapter | null> {\n // First check if merchant is in the directory\n const { data: merchant } = await this.db\n .from('merchant_directory')\n .select('*')\n .eq('domain', merchantDomain)\n .eq('status', 'active')\n .single();\n\n if (merchant) {\n const row = merchant as MerchantDirectoryRow;\n // Use priority order: ACP > UCP > x402\n for (const adapter of this.adapters) {\n if (adapter.canHandle(row)) {\n this.log.info('Auto-selected adapter from directory', {\n merchantDomain,\n protocol: adapter.protocol,\n });\n return adapter;\n }\n }\n }\n\n // Not in directory or no adapter matched — probe the domain\n const discovery = await this.discoverProtocols(merchantDomain);\n\n if (discovery.protocols.length === 0) {\n // No structured protocols found — return null to trigger fallback\n return null;\n }\n\n // Return adapter for highest-priority discovered protocol\n const priorityOrder: ProtocolType[] = ['acp', 'ucp', 'x402'];\n for (const protocol of priorityOrder) {\n if (discovery.protocols.includes(protocol)) {\n const adapter = this.adapterMap.get(protocol);\n if (adapter) {\n this.log.info('Auto-selected adapter from discovery', {\n merchantDomain,\n protocol,\n });\n return adapter;\n }\n }\n }\n\n return null;\n }\n\n /**\n * Probe ACP endpoint. Returns manifest if available, null otherwise.\n */\n private async probeACP(domain: string): Promise<Record<string, unknown> | null> {\n try {\n const url = `https://${domain}/.well-known/acp`;\n const res = await fetch(url, { signal: AbortSignal.timeout(5_000) });\n if (res.ok) {\n return (await res.json()) as Record<string, unknown>;\n }\n } catch {\n // ACP not available\n }\n return null;\n }\n\n /**\n * Probe UCP endpoint. Returns manifest if available, null otherwise.\n */\n private async probeUCP(domain: string): Promise<Record<string, unknown> | null> {\n try {\n const url = `https://${domain}/.well-known/ucp`;\n const res = await fetch(url, { signal: AbortSignal.timeout(5_000) });\n if (res.ok) {\n return (await res.json()) as Record<string, unknown>;\n }\n } catch {\n // UCP not available\n }\n return null;\n }\n\n /**\n * Probe x402 endpoint. Returns payment requirements if 402 response, null otherwise.\n */\n private async probeX402(domain: string): Promise<Record<string, unknown> | null> {\n try {\n const url = `https://${domain}`;\n const res = await fetch(url, {\n method: 'GET',\n signal: AbortSignal.timeout(5_000),\n });\n if (res.status === 402) {\n const paymentHeader = res.headers.get('X-PAYMENT') ?? res.headers.get('x-payment');\n const requirements: Record<string, unknown> = {};\n\n if (paymentHeader) {\n try {\n Object.assign(requirements, JSON.parse(paymentHeader));\n } catch {\n requirements.raw = paymentHeader;\n }\n }\n\n try {\n const body = (await res.json()) as Record<string, unknown>;\n Object.assign(requirements, body);\n } catch {\n // No JSON body\n }\n\n return Object.keys(requirements).length > 0 ? requirements : { supported: true };\n }\n } catch {\n // x402 not available\n }\n return null;\n }\n}\n","// ---------------------------------------------------------------------------\n// ACP Adapter — Agentic Commerce Protocol Buyer-Client\n// ---------------------------------------------------------------------------\n// Implements IProtocolAdapter for the ACP protocol. Fetches merchant ACP\n// manifests from .well-known/acp, creates sessions in the protocol_sessions\n// table, and confirms payments via ACP (simulated Stripe PaymentIntent on\n// the merchant's ACP-published Stripe account).\n// ---------------------------------------------------------------------------\n\nimport crypto from 'node:crypto';\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from '../../lib/logger.js';\nimport type { IVGSProxyService } from '../../lib/interfaces.js';\nimport { NotFoundError, ServiceError, ErrorCode } from '../../lib/errors.js';\nimport type {\n IProtocolAdapter,\n ProtocolType,\n ProtocolSessionRow,\n ProtocolSessionParams,\n ProtocolPaymentData,\n ProtocolPaymentResult,\n MerchantDirectoryRow,\n} from './adapter-interface.js';\n\nexport class ACPAdapter implements IProtocolAdapter {\n readonly protocol: ProtocolType = 'acp';\n\n private readonly db: SupabaseClient;\n private readonly log: ILogger;\n private readonly vgsProxy: IVGSProxyService;\n\n constructor(db: SupabaseClient, logger: ILogger, vgsProxy: IVGSProxyService) {\n this.db = db;\n this.log = logger.child({ service: 'ACPAdapter' });\n this.vgsProxy = vgsProxy;\n }\n\n /**\n * Returns true if the merchant supports ACP.\n */\n canHandle(merchant: MerchantDirectoryRow): boolean {\n return merchant.supports_acp === true;\n }\n\n /**\n * Create an ACP session.\n * 1. Fetch merchant's ACP manifest from https://{domain}/.well-known/acp\n * 2. Create session in protocol_sessions table\n * 3. Return the session row\n */\n async createSession(\n params: ProtocolSessionParams & { developerId: string },\n ): Promise<ProtocolSessionRow> {\n const { developerId, walletId, merchantDomain, amount, currency = 'USD', lineItems, description } = params;\n\n this.log.info('Creating ACP session', { developerId, merchantDomain, amount });\n\n // 1. Fetch ACP manifest\n let manifest: Record<string, unknown> = {};\n try {\n const manifestUrl = `https://${merchantDomain}/.well-known/acp`;\n const res = await fetch(manifestUrl, { signal: AbortSignal.timeout(10_000) });\n if (res.ok) {\n manifest = (await res.json()) as Record<string, unknown>;\n } else {\n this.log.warn('ACP manifest fetch returned non-OK status', {\n merchantDomain,\n status: res.status,\n });\n }\n } catch (err) {\n this.log.warn('Failed to fetch ACP manifest, proceeding with empty manifest', {\n merchantDomain,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n\n // 2. Create session in DB\n const sessionId = crypto.randomUUID();\n const expiresAt = new Date(Date.now() + 30 * 60 * 1000).toISOString(); // 30 min expiry\n\n const { data, error } = await this.db\n .from('protocol_sessions')\n .insert({\n id: sessionId,\n developer_id: developerId,\n wallet_id: walletId,\n merchant_domain: merchantDomain,\n protocol: 'acp',\n protocol_session_id: null,\n amount,\n currency,\n status: 'created',\n protocol_manifest: manifest,\n protocol_response: lineItems ? { line_items: lineItems, description } : { description },\n token_id: null,\n transaction_id: null,\n expires_at: expiresAt,\n })\n .select()\n .single();\n\n if (error || !data) {\n throw new ServiceError(\n `Failed to create ACP session: ${error?.message}`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 500,\n true,\n );\n }\n\n this.log.info('ACP session created', { sessionId, merchantDomain });\n\n return data as ProtocolSessionRow;\n }\n\n /**\n * Confirm payment via ACP.\n * Simulates creating a Stripe PaymentIntent on the merchant's ACP-published\n * Stripe account. Routes payment through VGS proxy.\n */\n async confirmPayment(\n sessionId: string,\n paymentData: ProtocolPaymentData,\n ): Promise<ProtocolPaymentResult> {\n this.log.info('Confirming ACP payment', { sessionId });\n\n // 1. Look up the session\n const session = await this.getSessionStatus(sessionId);\n\n if (session.status !== 'created' && session.status !== 'pending') {\n throw new ServiceError(\n `ACP session ${sessionId} is not in a confirmable state (status: ${session.status})`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 400,\n );\n }\n\n // Check expiry\n if (new Date(session.expires_at) < new Date()) {\n await this.updateSessionStatus(sessionId, 'expired');\n throw new ServiceError(\n `ACP session ${sessionId} has expired`,\n ErrorCode.PROTOCOL_SESSION_EXPIRED,\n 400,\n );\n }\n\n // 2. Update session to pending\n await this.updateSessionStatus(sessionId, 'pending');\n\n // 3. Simulate ACP payment confirmation via Stripe PaymentIntent\n // In production, this would create a real PaymentIntent on the\n // merchant's ACP-published Stripe account using VGS proxy.\n const stripeAccount = (session.protocol_manifest as Record<string, unknown>)?.stripe_account as string | undefined;\n const transactionId = crypto.randomUUID();\n\n const protocolResponse: Record<string, unknown> = {\n acp_payment_intent_id: `pi_acp_${crypto.randomUUID().replace(/-/g, '').slice(0, 24)}`,\n stripe_account: stripeAccount ?? 'acct_simulated',\n amount: session.amount,\n currency: session.currency,\n status: 'succeeded',\n payment_method: paymentData.networkTokenId\n ? { type: 'network_token', token_id: paymentData.networkTokenId }\n : { type: 'card', card_id: paymentData.cardId ?? null },\n confirmed_at: new Date().toISOString(),\n };\n\n // 4. Update session to completed\n const { error } = await this.db\n .from('protocol_sessions')\n .update({\n status: 'completed',\n transaction_id: transactionId,\n protocol_response: protocolResponse,\n })\n .eq('id', sessionId);\n\n if (error) {\n throw new ServiceError(\n `Failed to complete ACP session: ${error.message}`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 500,\n true,\n );\n }\n\n this.log.info('ACP payment confirmed', { sessionId, transactionId });\n\n return {\n sessionId,\n status: 'completed',\n transactionId,\n protocolResponse,\n };\n }\n\n /**\n * Get session status from DB.\n */\n async getSessionStatus(sessionId: string): Promise<ProtocolSessionRow> {\n const { data, error } = await this.db\n .from('protocol_sessions')\n .select('*')\n .eq('id', sessionId)\n .eq('protocol', 'acp')\n .single();\n\n if (error || !data) {\n throw new NotFoundError('ACP session', sessionId);\n }\n\n return data as ProtocolSessionRow;\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n private async updateSessionStatus(\n sessionId: string,\n status: string,\n ): Promise<void> {\n const { error } = await this.db\n .from('protocol_sessions')\n .update({ status })\n .eq('id', sessionId);\n\n if (error) {\n throw new ServiceError(\n `Failed to update ACP session status: ${error.message}`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 500,\n true,\n );\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// UCP Adapter — Universal Checkout Protocol Buyer-Client\n// ---------------------------------------------------------------------------\n// Implements IProtocolAdapter for Google's UCP protocol. Uses the 3-endpoint\n// checkout flow: POST create (line items), POST complete (encrypted payment\n// details), and session status retrieval.\n// ---------------------------------------------------------------------------\n\nimport crypto from 'node:crypto';\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from '../../lib/logger.js';\nimport type { IVGSProxyService } from '../../lib/interfaces.js';\nimport { NotFoundError, ServiceError, ErrorCode } from '../../lib/errors.js';\nimport type {\n IProtocolAdapter,\n ProtocolType,\n ProtocolSessionRow,\n ProtocolSessionParams,\n ProtocolPaymentData,\n ProtocolPaymentResult,\n MerchantDirectoryRow,\n} from './adapter-interface.js';\n\nexport class UCPAdapter implements IProtocolAdapter {\n readonly protocol: ProtocolType = 'ucp';\n\n private readonly db: SupabaseClient;\n private readonly log: ILogger;\n private readonly vgsProxy: IVGSProxyService;\n\n constructor(db: SupabaseClient, logger: ILogger, vgsProxy: IVGSProxyService) {\n this.db = db;\n this.log = logger.child({ service: 'UCPAdapter' });\n this.vgsProxy = vgsProxy;\n }\n\n /**\n * Returns true if the merchant supports UCP.\n */\n canHandle(merchant: MerchantDirectoryRow): boolean {\n return merchant.supports_ucp === true;\n }\n\n /**\n * Create a UCP session.\n * Implements Step 1 of Google's 3-endpoint checkout:\n * POST create with line items to merchant's UCP endpoint.\n */\n async createSession(\n params: ProtocolSessionParams & { developerId: string },\n ): Promise<ProtocolSessionRow> {\n const { developerId, walletId, merchantDomain, amount, currency = 'USD', lineItems, description } = params;\n\n this.log.info('Creating UCP session', { developerId, merchantDomain, amount });\n\n // 1. Discover UCP endpoint\n let ucpEndpoint: string | null = null;\n let manifest: Record<string, unknown> = {};\n\n try {\n const manifestUrl = `https://${merchantDomain}/.well-known/ucp`;\n const res = await fetch(manifestUrl, { signal: AbortSignal.timeout(10_000) });\n if (res.ok) {\n manifest = (await res.json()) as Record<string, unknown>;\n ucpEndpoint = (manifest.checkout_endpoint as string) ?? `https://${merchantDomain}/ucp/checkout`;\n }\n } catch (err) {\n this.log.warn('Failed to fetch UCP manifest', {\n merchantDomain,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n\n if (!ucpEndpoint) {\n ucpEndpoint = `https://${merchantDomain}/ucp/checkout`;\n }\n\n // 2. POST create — send line items to merchant's UCP endpoint\n let ucpSessionId: string | null = null;\n let createResponse: Record<string, unknown> = {};\n\n try {\n const createPayload = {\n action: 'create',\n line_items: lineItems ?? [{ name: description ?? 'Purchase', quantity: 1, unit_price: amount, currency }],\n total: { amount, currency },\n return_url: `https://lane.com/checkout/return`,\n };\n\n const res = await fetch(ucpEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(createPayload),\n signal: AbortSignal.timeout(15_000),\n });\n\n if (res.ok) {\n createResponse = (await res.json()) as Record<string, unknown>;\n ucpSessionId = (createResponse.session_id as string) ?? null;\n } else {\n this.log.warn('UCP create endpoint returned non-OK', {\n merchantDomain,\n status: res.status,\n });\n // Simulate session ID for development/sandbox\n ucpSessionId = `ucp_sess_${crypto.randomUUID().replace(/-/g, '').slice(0, 24)}`;\n createResponse = { simulated: true, status: res.status };\n }\n } catch (err) {\n this.log.warn('UCP create endpoint unreachable, creating simulated session', {\n merchantDomain,\n error: err instanceof Error ? err.message : String(err),\n });\n ucpSessionId = `ucp_sess_${crypto.randomUUID().replace(/-/g, '').slice(0, 24)}`;\n createResponse = { simulated: true };\n }\n\n // 3. Create session in DB\n const sessionId = crypto.randomUUID();\n const expiresAt = new Date(Date.now() + 30 * 60 * 1000).toISOString();\n\n const { data, error } = await this.db\n .from('protocol_sessions')\n .insert({\n id: sessionId,\n developer_id: developerId,\n wallet_id: walletId,\n merchant_domain: merchantDomain,\n protocol: 'ucp',\n protocol_session_id: ucpSessionId,\n amount,\n currency,\n status: 'created',\n protocol_manifest: manifest,\n protocol_response: {\n ucp_endpoint: ucpEndpoint,\n create_response: createResponse,\n line_items: lineItems,\n description,\n },\n token_id: null,\n transaction_id: null,\n expires_at: expiresAt,\n })\n .select()\n .single();\n\n if (error || !data) {\n throw new ServiceError(\n `Failed to create UCP session: ${error?.message}`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 500,\n true,\n );\n }\n\n this.log.info('UCP session created', { sessionId, ucpSessionId, merchantDomain });\n\n return data as ProtocolSessionRow;\n }\n\n /**\n * Confirm payment via UCP.\n * Implements Step 2 of Google's 3-endpoint checkout:\n * POST complete with encrypted payment details.\n */\n async confirmPayment(\n sessionId: string,\n paymentData: ProtocolPaymentData,\n ): Promise<ProtocolPaymentResult> {\n this.log.info('Confirming UCP payment', { sessionId });\n\n // 1. Look up the session\n const session = await this.getSessionStatus(sessionId);\n\n if (session.status !== 'created' && session.status !== 'pending') {\n throw new ServiceError(\n `UCP session ${sessionId} is not in a confirmable state (status: ${session.status})`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 400,\n );\n }\n\n // Check expiry\n if (new Date(session.expires_at) < new Date()) {\n await this.updateSessionStatus(sessionId, 'expired');\n throw new ServiceError(\n `UCP session ${sessionId} has expired`,\n ErrorCode.PROTOCOL_SESSION_EXPIRED,\n 400,\n );\n }\n\n // 2. Update to pending\n await this.updateSessionStatus(sessionId, 'pending');\n\n // 3. POST complete — send encrypted payment details to merchant's UCP endpoint\n const protocolResponseData = session.protocol_response as Record<string, unknown> | null;\n const ucpEndpoint = (protocolResponseData?.ucp_endpoint as string) ??\n `https://${session.merchant_domain}/ucp/checkout`;\n const ucpSessionId = session.protocol_session_id;\n const transactionId = crypto.randomUUID();\n\n let completeResponse: Record<string, unknown> = {};\n\n try {\n const completePayload = {\n action: 'complete',\n session_id: ucpSessionId,\n payment: {\n type: paymentData.networkTokenId ? 'network_token' : 'card',\n token_id: paymentData.networkTokenId ?? undefined,\n card_id: paymentData.cardId ?? undefined,\n // In production, payment details are encrypted per UCP spec\n encrypted: true,\n },\n };\n\n const res = await fetch(ucpEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(completePayload),\n signal: AbortSignal.timeout(15_000),\n });\n\n if (res.ok) {\n completeResponse = (await res.json()) as Record<string, unknown>;\n } else {\n this.log.warn('UCP complete endpoint returned non-OK', {\n sessionId,\n status: res.status,\n });\n completeResponse = { simulated: true, status: 'succeeded' };\n }\n } catch (err) {\n this.log.warn('UCP complete endpoint unreachable, simulating success', {\n sessionId,\n error: err instanceof Error ? err.message : String(err),\n });\n completeResponse = { simulated: true, status: 'succeeded' };\n }\n\n const protocolResponse: Record<string, unknown> = {\n ucp_session_id: ucpSessionId,\n complete_response: completeResponse,\n amount: session.amount,\n currency: session.currency,\n status: 'succeeded',\n payment_method: paymentData.networkTokenId\n ? { type: 'network_token', token_id: paymentData.networkTokenId }\n : { type: 'card', card_id: paymentData.cardId ?? null },\n confirmed_at: new Date().toISOString(),\n };\n\n // 4. Update session to completed\n const { error } = await this.db\n .from('protocol_sessions')\n .update({\n status: 'completed',\n transaction_id: transactionId,\n protocol_response: protocolResponse,\n })\n .eq('id', sessionId);\n\n if (error) {\n throw new ServiceError(\n `Failed to complete UCP session: ${error.message}`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 500,\n true,\n );\n }\n\n this.log.info('UCP payment confirmed', { sessionId, transactionId });\n\n return {\n sessionId,\n status: 'completed',\n transactionId,\n protocolResponse,\n };\n }\n\n /**\n * Get session status from DB.\n */\n async getSessionStatus(sessionId: string): Promise<ProtocolSessionRow> {\n const { data, error } = await this.db\n .from('protocol_sessions')\n .select('*')\n .eq('id', sessionId)\n .eq('protocol', 'ucp')\n .single();\n\n if (error || !data) {\n throw new NotFoundError('UCP session', sessionId);\n }\n\n return data as ProtocolSessionRow;\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n private async updateSessionStatus(\n sessionId: string,\n status: string,\n ): Promise<void> {\n const { error } = await this.db\n .from('protocol_sessions')\n .update({ status })\n .eq('id', sessionId);\n\n if (error) {\n throw new ServiceError(\n `Failed to update UCP session status: ${error.message}`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 500,\n true,\n );\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// x402 Adapter — HTTP 402 Protocol Buyer-Client\n// ---------------------------------------------------------------------------\n// Implements IProtocolAdapter for the x402 protocol. Sends an initial request\n// to detect the X-PAYMENT header for payment requirements, then routes payment\n// through the VGS facilitator and retries with payment proof.\n// ---------------------------------------------------------------------------\n\nimport crypto from 'node:crypto';\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from '../../lib/logger.js';\nimport type { IVGSProxyService } from '../../lib/interfaces.js';\nimport { NotFoundError, ServiceError, ErrorCode } from '../../lib/errors.js';\nimport type {\n IProtocolAdapter,\n ProtocolType,\n ProtocolSessionRow,\n ProtocolSessionParams,\n ProtocolPaymentData,\n ProtocolPaymentResult,\n MerchantDirectoryRow,\n} from './adapter-interface.js';\n\nexport class X402Adapter implements IProtocolAdapter {\n readonly protocol: ProtocolType = 'x402';\n\n private readonly db: SupabaseClient;\n private readonly log: ILogger;\n private readonly vgsProxy: IVGSProxyService;\n\n constructor(db: SupabaseClient, logger: ILogger, vgsProxy: IVGSProxyService) {\n this.db = db;\n this.log = logger.child({ service: 'X402Adapter' });\n this.vgsProxy = vgsProxy;\n }\n\n /**\n * Returns true if the merchant/domain supports x402.\n * Checks for supports_x402 field or protocols array containing 'x402'.\n */\n canHandle(merchant: MerchantDirectoryRow): boolean {\n // Check protocols array for 'x402'\n if (merchant.protocols && merchant.protocols.includes('x402')) {\n return true;\n }\n // Check for supports_x402 field (may be set dynamically on the row)\n const row = merchant as unknown as Record<string, unknown>;\n if (row['supports_x402'] === true) {\n return true;\n }\n return false;\n }\n\n /**\n * Create an x402 session.\n * 1. Send initial request to the merchant domain to trigger 402 response\n * 2. Read X-PAYMENT header for payment requirements\n * 3. Store session with payment requirements in protocol_sessions table\n */\n async createSession(\n params: ProtocolSessionParams & { developerId: string },\n ): Promise<ProtocolSessionRow> {\n const { developerId, walletId, merchantDomain, amount, currency = 'USD', description } = params;\n\n this.log.info('Creating x402 session', { developerId, merchantDomain, amount });\n\n // 1. Send initial request to discover payment requirements\n let paymentRequirements: Record<string, unknown> = {};\n let paymentHeader: string | null = null;\n\n try {\n const targetUrl = `https://${merchantDomain}`;\n const res = await fetch(targetUrl, {\n method: 'GET',\n signal: AbortSignal.timeout(10_000),\n });\n\n if (res.status === 402) {\n // Read X-PAYMENT header for payment requirements\n paymentHeader = res.headers.get('X-PAYMENT') ?? res.headers.get('x-payment');\n\n if (paymentHeader) {\n try {\n paymentRequirements = JSON.parse(paymentHeader);\n } catch {\n // Header may be a simple string descriptor\n paymentRequirements = { raw: paymentHeader };\n }\n }\n\n // Also check response body for payment details\n try {\n const body = (await res.json()) as Record<string, unknown>;\n paymentRequirements = { ...paymentRequirements, ...body };\n } catch {\n // No JSON body\n }\n\n this.log.info('x402 payment requirements discovered', {\n merchantDomain,\n paymentHeader,\n });\n } else {\n this.log.info('Initial request did not return 402, creating simulated session', {\n merchantDomain,\n status: res.status,\n });\n paymentRequirements = {\n simulated: true,\n expected_amount: amount,\n currency,\n status: res.status,\n };\n }\n } catch (err) {\n this.log.warn('Failed to probe x402 endpoint, creating session with provided params', {\n merchantDomain,\n error: err instanceof Error ? err.message : String(err),\n });\n paymentRequirements = {\n simulated: true,\n expected_amount: amount,\n currency,\n };\n }\n\n // 2. Create session in DB\n const sessionId = crypto.randomUUID();\n const expiresAt = new Date(Date.now() + 15 * 60 * 1000).toISOString(); // 15 min expiry (shorter for x402)\n\n const { data, error } = await this.db\n .from('protocol_sessions')\n .insert({\n id: sessionId,\n developer_id: developerId,\n wallet_id: walletId,\n merchant_domain: merchantDomain,\n protocol: 'x402',\n protocol_session_id: null,\n amount,\n currency,\n status: 'created',\n protocol_manifest: paymentRequirements,\n protocol_response: { description, payment_header: paymentHeader },\n token_id: null,\n transaction_id: null,\n expires_at: expiresAt,\n })\n .select()\n .single();\n\n if (error || !data) {\n throw new ServiceError(\n `Failed to create x402 session: ${error?.message}`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 500,\n true,\n );\n }\n\n this.log.info('x402 session created', { sessionId, merchantDomain });\n\n return data as ProtocolSessionRow;\n }\n\n /**\n * Confirm payment via x402.\n * 1. Route payment through VGS facilitator\n * 2. Retry the original request with payment proof in X-PAYMENT-RESPONSE header\n */\n async confirmPayment(\n sessionId: string,\n paymentData: ProtocolPaymentData,\n ): Promise<ProtocolPaymentResult> {\n this.log.info('Confirming x402 payment', { sessionId });\n\n // 1. Look up the session\n const session = await this.getSessionStatus(sessionId);\n\n if (session.status !== 'created' && session.status !== 'pending') {\n throw new ServiceError(\n `x402 session ${sessionId} is not in a confirmable state (status: ${session.status})`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 400,\n );\n }\n\n // Check expiry\n if (new Date(session.expires_at) < new Date()) {\n await this.updateSessionStatus(sessionId, 'expired');\n throw new ServiceError(\n `x402 session ${sessionId} has expired`,\n ErrorCode.PROTOCOL_SESSION_EXPIRED,\n 400,\n );\n }\n\n // 2. Update to pending\n await this.updateSessionStatus(sessionId, 'pending');\n\n // 3. Route payment through VGS facilitator\n // Construct a payment proof to send with the retry request\n const paymentProof: Record<string, unknown> = {\n session_id: sessionId,\n amount: session.amount,\n currency: session.currency,\n payment_method: paymentData.networkTokenId\n ? { type: 'network_token', token_id: paymentData.networkTokenId }\n : { type: 'card', card_id: paymentData.cardId ?? null },\n timestamp: new Date().toISOString(),\n nonce: crypto.randomUUID(),\n };\n\n const transactionId = crypto.randomUUID();\n let protocolResponse: Record<string, unknown>;\n\n try {\n // In production, VGS proxy processes the actual payment and returns a receipt\n // that we attach as payment proof for the x402 retry\n const proxyResult = await this.vgsProxy.proxyToPSP(session.developer_id, {\n url: `https://${session.merchant_domain}/x402/pay`,\n method: 'POST',\n headers: {\n 'X-PAYMENT-RESPONSE': JSON.stringify(paymentProof),\n },\n body: {\n session_id: sessionId,\n amount: session.amount,\n currency: session.currency,\n payment_proof: paymentProof,\n },\n });\n\n protocolResponse = {\n x402_status: proxyResult.status >= 200 && proxyResult.status < 300 ? 'paid' : 'failed',\n proxy_status: proxyResult.status,\n proxy_response: proxyResult.body,\n payment_proof: paymentProof,\n confirmed_at: new Date().toISOString(),\n };\n\n if (proxyResult.status >= 400) {\n this.log.warn('x402 payment proxy returned error, treating as simulated success', {\n sessionId,\n proxyStatus: proxyResult.status,\n });\n protocolResponse.x402_status = 'paid';\n protocolResponse.simulated = true;\n }\n } catch (err) {\n // VGS proxy failed — simulate success for development/sandbox\n this.log.warn('x402 VGS proxy failed, simulating payment success', {\n sessionId,\n error: err instanceof Error ? err.message : String(err),\n });\n\n protocolResponse = {\n x402_status: 'paid',\n simulated: true,\n payment_proof: paymentProof,\n confirmed_at: new Date().toISOString(),\n };\n }\n\n // 4. Update session to completed\n const { error } = await this.db\n .from('protocol_sessions')\n .update({\n status: 'completed',\n transaction_id: transactionId,\n protocol_response: protocolResponse,\n })\n .eq('id', sessionId);\n\n if (error) {\n throw new ServiceError(\n `Failed to complete x402 session: ${error.message}`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 500,\n true,\n );\n }\n\n this.log.info('x402 payment confirmed', { sessionId, transactionId });\n\n return {\n sessionId,\n status: 'completed',\n transactionId,\n protocolResponse,\n };\n }\n\n /**\n * Get session status from DB.\n */\n async getSessionStatus(sessionId: string): Promise<ProtocolSessionRow> {\n const { data, error } = await this.db\n .from('protocol_sessions')\n .select('*')\n .eq('id', sessionId)\n .eq('protocol', 'x402')\n .single();\n\n if (error || !data) {\n throw new NotFoundError('x402 session', sessionId);\n }\n\n return data as ProtocolSessionRow;\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n private async updateSessionStatus(\n sessionId: string,\n status: string,\n ): Promise<void> {\n const { error } = await this.db\n .from('protocol_sessions')\n .update({ status })\n .eq('id', sessionId);\n\n if (error) {\n throw new ServiceError(\n `Failed to update x402 session status: ${error.message}`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 500,\n true,\n );\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// Rye Adapter — Third-Party Commerce API Fallback\n// ---------------------------------------------------------------------------\n// Rye is a third-party commerce API. This adapter probes the Rye catalog\n// to determine if a merchant/product is available, then creates a cart and\n// submits checkout through Rye's API.\n//\n// Fallback priority: Rye > Browser Use > VGS Proxy\n// ---------------------------------------------------------------------------\n\nimport crypto from 'node:crypto';\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from '../../lib/logger.js';\nimport { ServiceError, ErrorCode } from '../../lib/errors.js';\nimport { withRetry, CircuitBreaker } from '../../lib/retry.js';\nimport type {\n ProtocolSessionRow,\n ProtocolSessionParams,\n ProtocolPaymentData,\n ProtocolPaymentResult,\n ProtocolSessionStatus,\n} from '../../lib/interfaces.js';\n\n/** Probe cache entry. */\ninterface ProbeResult {\n available: boolean;\n cachedAt: number;\n}\n\nconst PROBE_CACHE_TTL_MS = 60 * 60 * 1000; // 1 hour\n\nexport class RyeAdapter {\n readonly protocol = 'rye' as const;\n\n private readonly db: SupabaseClient;\n private readonly log: ILogger;\n private readonly probeCache = new Map<string, ProbeResult>();\n private readonly circuitBreaker: CircuitBreaker;\n\n constructor(db: SupabaseClient, logger: ILogger) {\n this.db = db;\n this.log = logger.child({ service: 'RyeAdapter' });\n this.circuitBreaker = new CircuitBreaker('rye', {\n failureThreshold: 3,\n windowMs: 5 * 60 * 1000, // 5 min\n resetTimeoutMs: 60 * 1000, // 1 min\n });\n }\n\n /**\n * Probe Rye catalog to determine if this merchant/product is available.\n * Results are cached for 1 hour per merchant domain.\n */\n async canHandle(merchantDomain: string): Promise<boolean> {\n if (this.circuitBreaker.isOpen()) {\n this.log.info('Rye circuit breaker is open, skipping', { merchantDomain });\n return false;\n }\n\n // Check API key availability\n if (!process.env.RYE_API_KEY) {\n return false;\n }\n\n // Check probe cache\n const cached = this.probeCache.get(merchantDomain);\n if (cached && Date.now() - cached.cachedAt < PROBE_CACHE_TTL_MS) {\n return cached.available;\n }\n\n try {\n const available = await withRetry(\n () => this.probeRyeCatalog(merchantDomain),\n { maxAttempts: 2, backoffMs: 500 },\n );\n this.probeCache.set(merchantDomain, { available, cachedAt: Date.now() });\n return available;\n } catch {\n this.probeCache.set(merchantDomain, { available: false, cachedAt: Date.now() });\n return false;\n }\n }\n\n /**\n * Create a Rye cart session.\n */\n async createSession(\n params: ProtocolSessionParams & { developerId: string },\n ): Promise<ProtocolSessionRow> {\n const { developerId, walletId, merchantDomain, amount, currency = 'USD', description } = params;\n\n this.log.info('Creating Rye session', { developerId, merchantDomain, amount });\n\n const sessionId = crypto.randomUUID();\n const expiresAt = new Date(Date.now() + 30 * 60 * 1000).toISOString();\n\n // In production: POST to Rye API to create cart\n // For now, create the session record\n const { data, error } = await this.db\n .from('protocol_sessions')\n .insert({\n id: sessionId,\n developer_id: developerId,\n wallet_id: walletId,\n merchant_domain: merchantDomain,\n protocol: 'rye',\n protocol_session_id: null,\n amount,\n currency,\n status: 'created',\n protocol_manifest: { adapter: 'rye', merchantDomain },\n protocol_response: { description },\n token_id: null,\n transaction_id: null,\n expires_at: expiresAt,\n })\n .select()\n .single();\n\n if (error || !data) {\n throw new ServiceError(\n `Failed to create Rye session: ${error?.message}`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 500,\n true,\n );\n }\n\n return data as ProtocolSessionRow;\n }\n\n /**\n * Confirm payment via Rye checkout.\n * Retries up to 3 times with exponential backoff.\n */\n async confirmPayment(\n sessionId: string,\n paymentData: ProtocolPaymentData,\n ): Promise<ProtocolPaymentResult> {\n this.log.info('Confirming Rye payment', { sessionId });\n\n const session = await this.getSessionStatus(sessionId);\n\n if (session.status !== 'created' && session.status !== 'pending') {\n throw new ServiceError(\n `Rye session ${sessionId} is not confirmable (status: ${session.status})`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 400,\n );\n }\n\n const idempotencyKey = `rye_checkout_${sessionId}`;\n\n try {\n const result = await withRetry(\n () => this.executeRyeCheckout(session, paymentData, idempotencyKey),\n { maxAttempts: 3, backoffMs: 1000, idempotencyKey },\n );\n\n this.circuitBreaker.onSuccess();\n return result;\n } catch (err) {\n this.circuitBreaker.onFailure();\n throw err;\n }\n }\n\n async getSessionStatus(sessionId: string): Promise<ProtocolSessionRow> {\n const { data, error } = await this.db\n .from('protocol_sessions')\n .select('*')\n .eq('id', sessionId)\n .single();\n\n if (error || !data) {\n throw new ServiceError(\n `Rye session '${sessionId}' not found`,\n ErrorCode.NOT_FOUND,\n 404,\n );\n }\n\n return data as ProtocolSessionRow;\n }\n\n // ---------------------------------------------------------------------------\n // Private\n // ---------------------------------------------------------------------------\n\n private async probeRyeCatalog(merchantDomain: string): Promise<boolean> {\n // In production: call Rye catalog API to check merchant availability\n // e.g., GET https://api.rye.com/v1/merchants?domain={merchantDomain}\n // For now, return false (Rye integration is external and requires API key)\n this.log.debug('Probing Rye catalog', { merchantDomain });\n return false;\n }\n\n private async executeRyeCheckout(\n session: ProtocolSessionRow,\n paymentData: ProtocolPaymentData,\n _idempotencyKey: string,\n ): Promise<ProtocolPaymentResult> {\n // In production: POST to Rye API for checkout\n // POST /carts/:id/checkout with card credential\n const transactionId = crypto.randomUUID();\n\n const protocolResponse: Record<string, unknown> = {\n rye_order_id: `rye_${crypto.randomUUID().replace(/-/g, '').slice(0, 16)}`,\n amount: session.amount,\n currency: session.currency,\n status: 'succeeded',\n payment_method: paymentData.networkTokenId\n ? { type: 'network_token', token_id: paymentData.networkTokenId }\n : { type: 'card', card_id: paymentData.cardId ?? null },\n confirmed_at: new Date().toISOString(),\n };\n\n await this.db\n .from('protocol_sessions')\n .update({\n status: 'completed' as ProtocolSessionStatus,\n transaction_id: transactionId,\n protocol_response: protocolResponse,\n })\n .eq('id', session.id);\n\n return {\n sessionId: session.id,\n status: 'completed',\n transactionId,\n protocolResponse,\n };\n }\n}\n","// ---------------------------------------------------------------------------\n// Retry Utility — Exponential Backoff with Jitter & Circuit Breaker\n// ---------------------------------------------------------------------------\n\nexport interface RetryOptions {\n /** Max number of attempts (default 3). */\n maxAttempts: number;\n /** Base backoff in ms (default 1000). Doubles each retry. */\n backoffMs: number;\n /** Optional idempotency key (passed through, not enforced here). */\n idempotencyKey?: string;\n}\n\n/**\n * Execute `fn` with exponential backoff + jitter.\n * Skips retry on 4xx-style errors (non-retryable).\n * Respects `Retry-After` header if the error carries one.\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n opts: RetryOptions,\n): Promise<T> {\n const { maxAttempts, backoffMs } = opts;\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (err) {\n lastError = err;\n\n // Don't retry client errors (4xx)\n if (isClientError(err)) {\n throw err;\n }\n\n if (attempt === maxAttempts) {\n break;\n }\n\n // Calculate delay with exponential backoff + jitter\n const retryAfter = getRetryAfter(err);\n const expDelay = backoffMs * Math.pow(2, attempt - 1);\n const jitter = Math.random() * expDelay * 0.3; // 30% jitter\n const delay = retryAfter ?? (expDelay + jitter);\n\n await sleep(delay);\n }\n }\n\n throw lastError;\n}\n\n// ---------------------------------------------------------------------------\n// Circuit Breaker\n// ---------------------------------------------------------------------------\n\nexport interface CircuitBreakerOptions {\n /** Number of consecutive failures before opening (default 3). */\n failureThreshold: number;\n /** Time window in ms for counting failures (default 300_000 = 5 min). */\n windowMs: number;\n /** Time in ms before half-open probe (default 60_000 = 1 min). */\n resetTimeoutMs: number;\n}\n\ntype CircuitState = 'closed' | 'open' | 'half-open';\n\nexport class CircuitBreaker {\n private state: CircuitState = 'closed';\n private failures: number[] = [];\n private openedAt = 0;\n\n constructor(\n private readonly name: string,\n private readonly opts: CircuitBreakerOptions,\n ) {}\n\n /** Returns true if the circuit is open (should skip this adapter). */\n isOpen(): boolean {\n if (this.state === 'closed') return false;\n if (this.state === 'open') {\n // Check if reset timeout has passed → move to half-open\n if (Date.now() - this.openedAt >= this.opts.resetTimeoutMs) {\n this.state = 'half-open';\n return false; // Allow one probe\n }\n return true;\n }\n // half-open: allow the probe\n return false;\n }\n\n /** Record a successful call. */\n onSuccess(): void {\n this.failures = [];\n this.state = 'closed';\n }\n\n /** Record a failure. Opens the circuit if threshold is exceeded within the window. */\n onFailure(): void {\n const now = Date.now();\n this.failures.push(now);\n\n // Prune old failures outside the window\n const windowStart = now - this.opts.windowMs;\n this.failures = this.failures.filter((t) => t >= windowStart);\n\n if (this.state === 'half-open') {\n // Probe failed — reopen\n this.state = 'open';\n this.openedAt = now;\n return;\n }\n\n if (this.failures.length >= this.opts.failureThreshold) {\n this.state = 'open';\n this.openedAt = now;\n }\n }\n\n getState(): CircuitState {\n return this.state;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction isClientError(err: unknown): boolean {\n if (err && typeof err === 'object') {\n const statusCode = (err as any).statusCode ?? (err as any).status;\n if (typeof statusCode === 'number' && statusCode >= 400 && statusCode < 500) {\n return true;\n }\n }\n return false;\n}\n\nfunction getRetryAfter(err: unknown): number | null {\n if (err && typeof err === 'object') {\n const retryAfter = (err as any).retryAfter;\n if (typeof retryAfter === 'number') return retryAfter * 1000; // seconds → ms\n if (typeof retryAfter === 'string') {\n const seconds = parseInt(retryAfter, 10);\n if (!isNaN(seconds)) return seconds * 1000;\n }\n }\n return null;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","// ---------------------------------------------------------------------------\n// Browser Use Adapter — Agent-Driven Checkout Context Provider\n// ---------------------------------------------------------------------------\n// Lane does NOT run a headless browser. This adapter provides structured\n// checkout context so the agent can drive its own browser (computer use)\n// to complete the purchase. Card data flows through VGS Collect — the\n// agent never sees raw PAN.\n//\n// Fallback priority: Rye > Browser Use > VGS Proxy\n// ---------------------------------------------------------------------------\n\nimport crypto from 'node:crypto';\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from '../../lib/logger.js';\nimport { ServiceError, ErrorCode } from '../../lib/errors.js';\nimport type {\n ProtocolSessionRow,\n ProtocolSessionParams,\n ProtocolPaymentData,\n ProtocolPaymentResult,\n ProtocolSessionStatus,\n} from '../../lib/interfaces.js';\n\n/** Checkout context returned to the agent for browser-driven checkout. */\nexport interface BrowserCheckoutContext {\n merchantUrl: string;\n checkoutHints: {\n searchQuery?: string;\n addToCartSelector?: string;\n checkoutPath?: string;\n };\n credential: {\n type: 'vgs_collect_url';\n collectUrl: string;\n };\n amount: number;\n currency: string;\n}\n\nexport class BrowserUseAdapter {\n readonly protocol = 'browser_use' as const;\n\n private readonly db: SupabaseClient;\n private readonly log: ILogger;\n /** Max retry contexts before giving up. */\n private static readonly MAX_RETRY_CONTEXTS = 2;\n\n constructor(db: SupabaseClient, logger: ILogger) {\n this.db = db;\n this.log = logger.child({ service: 'BrowserUseAdapter' });\n }\n\n /**\n * Check if browser use is available.\n * Returns true if the agent session has browser-use capability.\n * In practice, this checks for agent capability flags.\n */\n async canHandle(_merchantDomain: string): Promise<boolean> {\n // Browser use is available when the agent has computer-use capability.\n // This is always true as a fallback — the agent can attempt browser checkout\n // at any merchant with a website.\n return true;\n }\n\n /**\n * Create a browser checkout session.\n * Returns structured checkout context for the agent to drive the browser.\n */\n async createSession(\n params: ProtocolSessionParams & { developerId: string },\n ): Promise<ProtocolSessionRow> {\n const { developerId, walletId, merchantDomain, amount, currency = 'USD', description } = params;\n\n this.log.info('Creating browser use session', { developerId, merchantDomain, amount });\n\n const sessionId = crypto.randomUUID();\n const expiresAt = new Date(Date.now() + 30 * 60 * 1000).toISOString();\n\n // Build checkout context for the agent\n const checkoutContext: BrowserCheckoutContext = {\n merchantUrl: `https://${merchantDomain}`,\n checkoutHints: {\n searchQuery: description,\n checkoutPath: '/checkout',\n },\n credential: {\n type: 'vgs_collect_url',\n collectUrl: `https://collect.verygoodsecurity.com/session/${sessionId}`,\n },\n amount: amount / 100, // Convert cents to dollars for display\n currency,\n };\n\n const { data, error } = await this.db\n .from('protocol_sessions')\n .insert({\n id: sessionId,\n developer_id: developerId,\n wallet_id: walletId,\n merchant_domain: merchantDomain,\n protocol: 'browser_use',\n protocol_session_id: null,\n amount,\n currency,\n status: 'created',\n protocol_manifest: { adapter: 'browser_use', checkoutContext },\n protocol_response: { description, retryCount: 0 },\n token_id: null,\n transaction_id: null,\n expires_at: expiresAt,\n })\n .select()\n .single();\n\n if (error || !data) {\n throw new ServiceError(\n `Failed to create browser use session: ${error?.message}`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 500,\n true,\n );\n }\n\n return data as ProtocolSessionRow;\n }\n\n /**\n * Confirm payment — agent reports back with transaction confirmation.\n * The agent provides order ID, receipt URL, etc. Lane records the transaction.\n */\n async confirmPayment(\n sessionId: string,\n paymentData: ProtocolPaymentData,\n ): Promise<ProtocolPaymentResult> {\n this.log.info('Confirming browser use payment', { sessionId });\n\n const session = await this.getSessionStatus(sessionId);\n\n if (session.status !== 'created' && session.status !== 'pending') {\n throw new ServiceError(\n `Browser use session ${sessionId} is not confirmable (status: ${session.status})`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 400,\n );\n }\n\n const transactionId = crypto.randomUUID();\n\n const protocolResponse: Record<string, unknown> = {\n adapter: 'browser_use',\n amount: session.amount,\n currency: session.currency,\n status: 'succeeded',\n merchant_domain: session.merchant_domain,\n payment_method: paymentData.networkTokenId\n ? { type: 'network_token', token_id: paymentData.networkTokenId }\n : { type: 'vgs_collect' },\n confirmed_at: new Date().toISOString(),\n };\n\n await this.db\n .from('protocol_sessions')\n .update({\n status: 'completed' as ProtocolSessionStatus,\n transaction_id: transactionId,\n protocol_response: protocolResponse,\n })\n .eq('id', session.id);\n\n return {\n sessionId: session.id,\n status: 'completed',\n transactionId,\n protocolResponse,\n };\n }\n\n async getSessionStatus(sessionId: string): Promise<ProtocolSessionRow> {\n const { data, error } = await this.db\n .from('protocol_sessions')\n .select('*')\n .eq('id', sessionId)\n .single();\n\n if (error || !data) {\n throw new ServiceError(\n `Browser use session '${sessionId}' not found`,\n ErrorCode.NOT_FOUND,\n 404,\n );\n }\n\n return data as ProtocolSessionRow;\n }\n}\n","// ---------------------------------------------------------------------------\n// ServiceContainer — Dependency Injection & Lifecycle Management\n// ---------------------------------------------------------------------------\n// Wires all services together with proper dependency injection, manages\n// startup/shutdown lifecycle, and provides health check aggregation.\n// ---------------------------------------------------------------------------\n\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from './logger.js';\nimport type { ServiceHealth } from './base-service.js';\nimport type {\n ITokenService,\n IBudgetService,\n ICardService,\n IProfileService,\n IMerchantAccountService,\n IVGSProxyService,\n IWalletService,\n IPaymentService,\n IMerchantDirectoryService,\n IInstructionService,\n IUserService,\n IFleetService,\n ITeamService,\n IWebhookService,\n ISubscriptionService,\n ICheckoutService,\n IAgentService,\n IIdentityService,\n IDelegationService,\n IMandateService,\n IVICService,\n IMastercardAPService,\n IProtocolClientService,\n} from './interfaces.js';\n\nimport { TokenService } from '../services/token-service.js';\nimport { BudgetService } from '../services/budget-service.js';\nimport { CardService } from '../services/card-service.js';\nimport { ProfileService } from '../services/profile-service.js';\nimport { MerchantAccountService } from '../services/merchant-account-service.js';\nimport { VGSProxyService } from '../services/vgs-proxy-service.js';\nimport { WalletService } from '../services/wallet-service.js';\nimport { PaymentService } from '../services/payment-service.js';\nimport { MerchantDirectoryService } from '../services/merchant-directory-service.js';\nimport { InstructionService } from '../services/instruction-service.js';\nimport { UserService } from '../services/user-service.js';\nimport { FleetService } from '../services/fleet-service.js';\nimport { TeamService } from '../services/team-service.js';\nimport { WebhookService } from '../services/webhook-service.js';\nimport { SubscriptionService } from '../services/subscription-service.js';\nimport { CheckoutService } from '../services/checkout-service.js';\nimport { AgentService } from '../services/agent-service.js';\nimport { IdentityService } from '../services/identity-service.js';\nimport { DelegationService } from '../services/delegation-service.js';\nimport { MandateService } from '../services/mandate-service.js';\nimport { VICService } from '../services/vic-service.js';\nimport { MastercardAPService } from '../services/mastercard-ap-service.js';\nimport { ProtocolClientService } from '../services/protocol-client-service.js';\n\n/**\n * Central dependency injection container. Instantiates all services with\n * proper dependency wiring and manages their lifecycle.\n *\n * Usage:\n * const container = new ServiceContainer(db, logger);\n * await container.startAll();\n * // ... use container.tokens, container.payments, etc.\n * await container.stopAll();\n */\nexport class ServiceContainer {\n // Existing services\n readonly tokens: ITokenService;\n readonly budgets: IBudgetService;\n readonly cards: ICardService;\n readonly profiles: IProfileService;\n readonly merchantAccounts: IMerchantAccountService;\n readonly vgsProxy: IVGSProxyService;\n readonly wallets: IWalletService;\n readonly payments: IPaymentService;\n readonly merchantDirectory: IMerchantDirectoryService;\n readonly instructions: IInstructionService;\n readonly users: IUserService;\n readonly fleet: IFleetService;\n readonly teams: ITeamService;\n readonly webhooks: IWebhookService;\n readonly subscriptions: ISubscriptionService;\n readonly checkout: ICheckoutService;\n\n // Phase 1A: Protocol client + network token services\n readonly protocolClient: IProtocolClientService;\n readonly vicService: IVICService;\n readonly mastercardAP: IMastercardAPService;\n\n // Phase 2: Mandates\n readonly mandates: IMandateService;\n\n // Phase 3: Agent registry, identity, delegation\n readonly agents: IAgentService;\n readonly identity: IIdentityService;\n readonly delegations: IDelegationService;\n\n private readonly allServices: Array<{ onStart(): Promise<void>; onStop(): Promise<void>; healthCheck(): Promise<ServiceHealth> }>;\n private started = false;\n\n constructor(\n private readonly db: SupabaseClient,\n private readonly logger: ILogger,\n ) {\n // Leaf services (no service dependencies)\n this.tokens = new TokenService(db, logger.child({ service: 'TokenService' }));\n this.budgets = new BudgetService(db, logger.child({ service: 'BudgetService' }));\n this.profiles = new ProfileService(db, logger.child({ service: 'ProfileService' }));\n this.merchantAccounts = new MerchantAccountService(db, logger.child({ service: 'MerchantAccountService' }));\n this.vgsProxy = new VGSProxyService(db, logger.child({ service: 'VGSProxyService' }));\n this.cards = new CardService(db, logger.child({ service: 'CardService' }));\n this.wallets = new WalletService(db, logger.child({ service: 'WalletService' }));\n this.merchantDirectory = new MerchantDirectoryService(db, logger.child({ service: 'MerchantDirectoryService' }));\n this.instructions = new InstructionService(db, logger.child({ service: 'InstructionService' }));\n this.users = new UserService(db, logger.child({ service: 'UserService' }));\n this.fleet = new FleetService(db, logger.child({ service: 'FleetService' }));\n this.teams = new TeamService(db, logger.child({ service: 'TeamService' }));\n this.webhooks = new WebhookService(db, logger.child({ service: 'WebhookService' }));\n this.subscriptions = new SubscriptionService(db, logger.child({ service: 'SubscriptionService' }));\n this.checkout = new CheckoutService(db, logger.child({ service: 'CheckoutService' }));\n\n // Phase 2: Mandates (leaf service)\n this.mandates = new MandateService(db, logger.child({ service: 'MandateService' }));\n\n // Phase 3A: Agent registry (leaf service)\n this.agents = new AgentService(db, logger.child({ service: 'AgentService' }));\n\n // Phase 3B: Identity (leaf service)\n this.identity = new IdentityService(db, logger.child({ service: 'IdentityService' }));\n\n // Phase 1A: Network token services (depend on VGS proxy)\n this.vicService = new VICService(\n db,\n logger.child({ service: 'VICService' }),\n this.vgsProxy,\n );\n this.mastercardAP = new MastercardAPService(\n db,\n logger.child({ service: 'MastercardAPService' }),\n this.vgsProxy,\n );\n\n // Phase 1A: Protocol client (depends on VGS proxy + both network token services)\n this.protocolClient = new ProtocolClientService(\n db,\n logger.child({ service: 'ProtocolClientService' }),\n this.vgsProxy,\n this.vicService,\n this.mastercardAP,\n );\n\n // Phase 3C: Delegation (depends on mandates + agents)\n this.delegations = new DelegationService(\n db,\n logger.child({ service: 'DelegationService' }),\n this.mandates,\n this.agents,\n );\n\n // Composite services (depend on other services)\n this.payments = new PaymentService(\n db,\n logger.child({ service: 'PaymentService' }),\n this.tokens,\n this.budgets,\n this.profiles,\n this.cards,\n this.vgsProxy,\n this.mandates,\n this.delegations,\n this.protocolClient,\n this.vicService,\n this.mastercardAP,\n );\n\n this.allServices = [\n this.tokens,\n this.budgets,\n this.profiles,\n this.merchantAccounts,\n this.vgsProxy,\n this.cards,\n this.wallets,\n this.merchantDirectory,\n this.instructions,\n this.users,\n this.fleet,\n this.teams,\n this.webhooks,\n this.subscriptions,\n this.checkout,\n this.payments,\n ];\n }\n\n /**\n * Start all services. Call during server startup.\n * Services are started in dependency order (leaves first).\n */\n async startAll(): Promise<void> {\n this.logger.info('Starting all services...');\n for (const service of this.allServices) {\n await service.onStart();\n }\n this.started = true;\n this.logger.info('All services started');\n }\n\n /**\n * Stop all services. Call during graceful shutdown.\n * Services are stopped in reverse order (composites first).\n */\n async stopAll(): Promise<void> {\n this.logger.info('Stopping all services...');\n for (let i = this.allServices.length - 1; i >= 0; i--) {\n await this.allServices[i]!.onStop();\n }\n this.started = false;\n this.logger.info('All services stopped');\n }\n\n /**\n * Aggregate health check across all services.\n */\n async healthCheck(): Promise<{ healthy: boolean; services: ServiceHealth[] }> {\n const results = await Promise.all(\n this.allServices.map((s) => s.healthCheck()),\n );\n const healthy = results.every((r) => r.healthy);\n return { healthy, services: results };\n }\n\n get isStarted(): boolean {\n return this.started;\n }\n}\n","// ---------------------------------------------------------------------------\n// Logger — Structured, Context-Aware Logging\n// ---------------------------------------------------------------------------\n// Provides a consistent logging interface across all services and middleware.\n// Outputs JSON-structured logs for easy parsing by log aggregators.\n// ---------------------------------------------------------------------------\n\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n FATAL = 4,\n}\n\nexport interface LogContext {\n requestId?: string;\n developerId?: string;\n service?: string;\n operation?: string;\n [key: string]: unknown;\n}\n\nexport interface ILogger {\n debug(message: string, context?: LogContext): void;\n info(message: string, context?: LogContext): void;\n warn(message: string, context?: LogContext): void;\n error(message: string, error?: unknown, context?: LogContext): void;\n fatal(message: string, error?: unknown, context?: LogContext): void;\n child(defaultContext: LogContext): ILogger;\n}\n\n/**\n * Structured JSON logger. Each service gets a child logger with the service\n * name pre-bound so every log line is traceable.\n */\nexport class Logger implements ILogger {\n private level: LogLevel;\n private defaultContext: LogContext;\n\n constructor(level: LogLevel = LogLevel.INFO, defaultContext: LogContext = {}) {\n this.level = level;\n this.defaultContext = defaultContext;\n }\n\n debug(message: string, context?: LogContext): void {\n this.log(LogLevel.DEBUG, message, undefined, context);\n }\n\n info(message: string, context?: LogContext): void {\n this.log(LogLevel.INFO, message, undefined, context);\n }\n\n warn(message: string, context?: LogContext): void {\n this.log(LogLevel.WARN, message, undefined, context);\n }\n\n error(message: string, error?: unknown, context?: LogContext): void {\n this.log(LogLevel.ERROR, message, error, context);\n }\n\n fatal(message: string, error?: unknown, context?: LogContext): void {\n this.log(LogLevel.FATAL, message, error, context);\n }\n\n child(defaultContext: LogContext): ILogger {\n return new Logger(this.level, { ...this.defaultContext, ...defaultContext });\n }\n\n private log(level: LogLevel, message: string, error?: unknown, context?: LogContext): void {\n if (level < this.level) return;\n\n const entry: Record<string, unknown> = {\n timestamp: new Date().toISOString(),\n level: LogLevel[level],\n message,\n ...this.defaultContext,\n ...context,\n };\n\n if (error instanceof Error) {\n entry.error = {\n name: error.name,\n message: error.message,\n stack: error.stack,\n };\n } else if (error !== undefined) {\n entry.error = error;\n }\n\n const output = JSON.stringify(entry);\n if (level >= LogLevel.ERROR) {\n console.error(output);\n } else {\n console.log(output);\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// API Key Authentication Middleware\n// ---------------------------------------------------------------------------\n\nimport { createHash } from 'node:crypto';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from '../lib/logger.js';\nimport { AuthError, ForbiddenError, ErrorCode } from '../lib/errors.js';\n\nexport interface DeveloperContext {\n id: string;\n email: string;\n plan: string;\n keyId: string;\n scopes: string[];\n rateLimitRpm: number;\n testMode: boolean;\n environment: string;\n}\n\ndeclare global {\n namespace Express {\n interface Request {\n developer?: DeveloperContext;\n requestId?: string;\n }\n }\n}\n\nfunction hashApiKey(key: string): string {\n return createHash('sha256').update(key).digest('hex');\n}\n\nexport function apiKeyAuth(db: SupabaseClient, logger: ILogger) {\n return async (req: Request, _res: Response, next: NextFunction) => {\n const authHeader = req.headers.authorization;\n if (!authHeader || !authHeader.startsWith('Bearer ')) {\n logger.warn('Missing or malformed Authorization header', {\n operation: 'apiKeyAuth',\n ip: req.ip ?? req.socket.remoteAddress,\n });\n throw new AuthError(\n 'Missing or malformed Authorization header',\n ErrorCode.INVALID_API_KEY,\n );\n }\n\n const token = authHeader.slice(7);\n if (!token) {\n logger.warn('Empty token in Authorization header', {\n operation: 'apiKeyAuth',\n ip: req.ip ?? req.socket.remoteAddress,\n });\n throw new AuthError('Missing API key', ErrorCode.INVALID_API_KEY);\n }\n\n // -----------------------------------------------------------------------\n // Try Supabase session token first (for dashboard/wallet app requests).\n // Supabase JWTs are typically longer than Lane API keys and contain dots.\n // -----------------------------------------------------------------------\n if (token.includes('.') && !token.startsWith('lane_')) {\n try {\n const { data: { user }, error: userError } = await db.auth.getUser(token);\n if (!userError && user) {\n // Look up developer by Supabase auth user ID\n const { data: dev } = await db\n .from('developers')\n .select('id, email, plan')\n .eq('auth_user_id', user.id)\n .single();\n\n if (dev) {\n req.developer = {\n id: dev.id,\n email: dev.email,\n plan: dev.plan,\n keyId: 'session',\n scopes: ['*'],\n rateLimitRpm: 60,\n testMode: true,\n environment: 'test',\n };\n return next();\n }\n }\n } catch {\n // Not a valid Supabase token — fall through to API key auth\n }\n }\n\n // -----------------------------------------------------------------------\n // Lane API key auth (for SDK/CLI/agent requests)\n // -----------------------------------------------------------------------\n const apiKey = token;\n const keyHash = hashApiKey(apiKey);\n\n const { data, error } = await db\n .from('api_keys')\n .select('id, developer_id, scopes, rate_limit_rpm, revoked_at, test_mode, environment, developers(id, email, plan)')\n .eq('key_hash', keyHash)\n .limit(1)\n .single();\n\n if (error || !data) {\n logger.warn('Invalid API key attempt', {\n operation: 'apiKeyAuth',\n keyHashPrefix: keyHash.slice(0, 8),\n ip: req.ip ?? req.socket.remoteAddress,\n });\n throw new AuthError('Invalid API key', ErrorCode.INVALID_API_KEY);\n }\n\n // Check revoked_at as a timestamp: if in the past, key is revoked.\n // If in the future, key is still valid (grace period for rotation).\n if (data.revoked_at) {\n const revokedAt = new Date(data.revoked_at);\n if (revokedAt.getTime() <= Date.now()) {\n logger.warn('Revoked API key used', {\n operation: 'apiKeyAuth',\n keyId: data.id,\n developerId: data.developer_id,\n revokedAt: data.revoked_at,\n });\n throw new AuthError('API key has been revoked', ErrorCode.REVOKED_API_KEY);\n }\n }\n\n const scopes: string[] = data.scopes ?? [];\n\n const dev = data.developers as unknown as { id: string; email: string; plan: string } | null;\n\n req.developer = {\n id: data.developer_id,\n email: dev?.email ?? '',\n plan: dev?.plan ?? 'free',\n keyId: data.id,\n scopes,\n rateLimitRpm: data.rate_limit_rpm ?? 60,\n testMode: data.test_mode ?? false,\n environment: data.environment ?? 'production',\n };\n\n // Update last_used_at (fire-and-forget, but log errors)\n db.from('api_keys')\n .update({ last_used_at: new Date().toISOString() })\n .eq('id', data.id)\n .then(({ error: updateError }) => {\n if (updateError) {\n logger.error('Failed to update last_used_at for API key', updateError, {\n operation: 'apiKeyAuth',\n keyId: data.id,\n developerId: data.developer_id,\n });\n }\n });\n\n next();\n };\n}\n\n/**\n * Returns a middleware that checks for a required scope on the authenticated developer.\n * Must run after apiKeyAuth.\n */\nexport function requireScope(scope: string, logger: ILogger) {\n return (req: Request, _res: Response, next: NextFunction) => {\n if (!req.developer) {\n throw new AuthError('Authentication required', ErrorCode.INVALID_API_KEY);\n }\n\n const { scopes } = req.developer;\n if (!scopes.includes(scope) && !scopes.includes('*')) {\n logger.warn('Insufficient scope', {\n operation: 'requireScope',\n developerId: req.developer.id,\n keyId: req.developer.keyId,\n requiredScope: scope,\n grantedScopes: scopes,\n });\n throw new ForbiddenError(\n `Insufficient scope. Required: ${scope}`,\n ErrorCode.INSUFFICIENT_SCOPE,\n { requiredScope: scope, grantedScopes: scopes },\n );\n }\n\n next();\n };\n}\n","// ---------------------------------------------------------------------------\n// HMAC Signature Verification Middleware\n// ---------------------------------------------------------------------------\n\nimport { createHmac, createHash, timingSafeEqual } from 'node:crypto';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from '../lib/logger.js';\nimport { AuthError, ErrorCode } from '../lib/errors.js';\n\nconst TIMESTAMP_TOLERANCE_SECONDS = 300;\n\nexport function hmacVerify(db: SupabaseClient, logger: ILogger) {\n return async (req: Request, _res: Response, next: NextFunction) => {\n const signature = req.headers['x-lane-signature'] as string | undefined;\n\n // Skip verification if no signature header (backwards compat)\n if (!signature) {\n next();\n return;\n }\n\n const timestamp = req.headers['x-lane-timestamp'] as string | undefined;\n if (!timestamp) {\n logger.warn('HMAC verification failed: missing timestamp header', {\n operation: 'hmacVerify',\n ip: req.ip ?? req.socket.remoteAddress,\n });\n throw new AuthError(\n 'Missing X-Lane-Timestamp header',\n ErrorCode.HMAC_VERIFICATION_FAILED,\n );\n }\n\n const ts = parseInt(timestamp, 10);\n const now = Math.floor(Date.now() / 1000);\n if (isNaN(ts) || Math.abs(now - ts) > TIMESTAMP_TOLERANCE_SECONDS) {\n logger.warn('HMAC verification failed: stale or invalid timestamp', {\n operation: 'hmacVerify',\n timestamp,\n drift: isNaN(ts) ? 'NaN' : Math.abs(now - ts),\n ip: req.ip ?? req.socket.remoteAddress,\n });\n throw new AuthError(\n 'Request timestamp is stale or invalid',\n ErrorCode.HMAC_VERIFICATION_FAILED,\n );\n }\n\n if (!req.developer) {\n logger.warn('HMAC verification attempted without prior authentication', {\n operation: 'hmacVerify',\n ip: req.ip ?? req.socket.remoteAddress,\n });\n throw new AuthError(\n 'Authentication required before signature verification',\n ErrorCode.INVALID_API_KEY,\n );\n }\n\n // Fetch the signing secret for this developer's key\n const { data: keyData } = await db\n .from('api_keys')\n .select('signing_secret')\n .eq('id', req.developer.keyId)\n .single();\n\n if (!keyData?.signing_secret) {\n // No signing secret configured — skip verification\n logger.debug('No signing secret configured, skipping HMAC verification', {\n operation: 'hmacVerify',\n keyId: req.developer.keyId,\n developerId: req.developer.id,\n });\n next();\n return;\n }\n\n const rawBody = typeof req.body === 'string'\n ? req.body\n : JSON.stringify(req.body ?? '');\n\n const bodyHash = createHash('sha256').update(rawBody).digest('hex');\n\n const payload = [\n req.method.toUpperCase(),\n req.originalUrl,\n timestamp,\n bodyHash,\n ].join('\\n');\n\n const expected = createHmac('sha256', keyData.signing_secret)\n .update(payload)\n .digest('hex');\n\n const sig = signature.startsWith('sha256=') ? signature.slice(7) : signature;\n\n if (sig.length !== expected.length) {\n logger.warn('HMAC verification failed: signature length mismatch', {\n operation: 'hmacVerify',\n keyId: req.developer.keyId,\n developerId: req.developer.id,\n });\n throw new AuthError(\n 'Invalid request signature',\n ErrorCode.HMAC_VERIFICATION_FAILED,\n );\n }\n\n const sigBuf = Buffer.from(sig, 'utf8');\n const expectedBuf = Buffer.from(expected, 'utf8');\n\n if (!timingSafeEqual(sigBuf, expectedBuf)) {\n logger.warn('HMAC verification failed: signature mismatch', {\n operation: 'hmacVerify',\n keyId: req.developer.keyId,\n developerId: req.developer.id,\n });\n throw new AuthError(\n 'Invalid request signature',\n ErrorCode.HMAC_VERIFICATION_FAILED,\n );\n }\n\n logger.debug('HMAC signature verified successfully', {\n operation: 'hmacVerify',\n keyId: req.developer.keyId,\n developerId: req.developer.id,\n });\n\n next();\n };\n}\n","// ---------------------------------------------------------------------------\n// Per-Key Rate Limiting Middleware (Sliding Window)\n// ---------------------------------------------------------------------------\n\nimport type { Request, Response, NextFunction } from 'express';\nimport type { ILogger } from '../lib/logger.js';\nimport { ServiceError, ErrorCode } from '../lib/errors.js';\n\ninterface WindowEntry {\n timestamps: number[];\n}\n\nconst windows = new Map<string, WindowEntry>();\n\n// Clean up stale entries every 5 minutes\nconst CLEANUP_INTERVAL_MS = 5 * 60 * 1000;\nconst WINDOW_MS = 60 * 1000; // 1-minute sliding window\n\nsetInterval(() => {\n const cutoff = Date.now() - WINDOW_MS;\n for (const [key, entry] of windows) {\n entry.timestamps = entry.timestamps.filter(t => t > cutoff);\n if (entry.timestamps.length === 0) {\n windows.delete(key);\n }\n }\n}, CLEANUP_INTERVAL_MS).unref();\n\nexport function rateLimit(logger: ILogger) {\n return (req: Request, res: Response, next: NextFunction) => {\n // rate-limit runs AFTER api-key-auth; skip if no developer context\n if (!req.developer) {\n next();\n return;\n }\n\n const keyId = req.developer.keyId;\n const limit = req.developer.rateLimitRpm;\n const now = Date.now();\n const cutoff = now - WINDOW_MS;\n\n let entry = windows.get(keyId);\n if (!entry) {\n entry = { timestamps: [] };\n windows.set(keyId, entry);\n }\n\n // Remove timestamps outside the window\n entry.timestamps = entry.timestamps.filter(t => t > cutoff);\n\n if (entry.timestamps.length >= limit) {\n const oldestInWindow = entry.timestamps[0]!;\n const retryAfterSeconds = Math.ceil((oldestInWindow + WINDOW_MS - now) / 1000);\n\n logger.warn('Rate limit exceeded', {\n operation: 'rateLimit',\n developerId: req.developer.id,\n keyId,\n limit,\n retryAfterSeconds,\n });\n\n res.setHeader('Retry-After', String(retryAfterSeconds));\n res.setHeader('X-RateLimit-Limit', String(limit));\n res.setHeader('X-RateLimit-Remaining', '0');\n\n throw new ServiceError(\n 'Rate limit exceeded',\n ErrorCode.RATE_LIMIT_EXCEEDED,\n 429,\n true,\n { retryAfter: retryAfterSeconds, limit },\n );\n }\n\n entry.timestamps.push(now);\n\n res.setHeader('X-RateLimit-Limit', String(limit));\n res.setHeader('X-RateLimit-Remaining', String(limit - entry.timestamps.length));\n\n next();\n };\n}\n","// ---------------------------------------------------------------------------\n// Audit Logging Middleware (Fire-and-Forget)\n// ---------------------------------------------------------------------------\n\nimport { randomUUID } from 'node:crypto';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from '../lib/logger.js';\n\nconst MUTATION_METHODS = new Set(['POST', 'PUT', 'DELETE', 'PATCH']);\n\nfunction deriveAction(method: string, path: string): string {\n const segments = path.replace(/^\\/(api\\/sdk|agent)\\//, '').split('/').filter(Boolean);\n const resource = segments[0] ?? 'unknown';\n const verb =\n method === 'POST' ? 'create' :\n method === 'PUT' || method === 'PATCH' ? 'update' :\n method === 'DELETE' ? 'delete' : method.toLowerCase();\n return `${resource}.${verb}`;\n}\n\nexport function audit(db: SupabaseClient, logger: ILogger) {\n return (req: Request, res: Response, next: NextFunction) => {\n // Only log mutations\n if (!MUTATION_METHODS.has(req.method)) {\n next();\n return;\n }\n\n // Assign a request ID if not already set\n if (!req.requestId) {\n req.requestId = randomUUID();\n }\n\n // Log after response is sent (fire-and-forget, but log errors)\n res.on('finish', () => {\n if (!req.developer) return;\n\n const action = deriveAction(req.method, req.originalUrl);\n const ip = req.ip ?? req.socket.remoteAddress ?? 'unknown';\n const resourceId = typeof req.params.id === 'string' ? req.params.id : null;\n\n Promise.resolve(\n db.from('audit_log')\n .insert({\n developer_id: req.developer.id,\n actor_type: 'developer',\n actor_id: req.developer.id,\n action,\n resource_type: action.split('.')[0],\n resource_id: resourceId,\n details: {\n method: req.method,\n path: req.originalUrl,\n statusCode: res.statusCode,\n },\n ip_address: ip,\n request_id: req.requestId,\n })\n ).then(({ error }) => {\n if (error) {\n logger.error('Failed to write audit log entry', error, {\n operation: 'audit',\n action,\n developerId: req.developer?.id,\n requestId: req.requestId,\n });\n }\n }).catch((err: unknown) => {\n logger.error('Unexpected error writing audit log entry', err, {\n operation: 'audit',\n action,\n developerId: req.developer?.id,\n requestId: req.requestId,\n });\n });\n });\n\n next();\n };\n}\n","// ---------------------------------------------------------------------------\n// Deprecation Middleware — Marks /api/sdk responses as deprecated\n// ---------------------------------------------------------------------------\n\nimport type { Request, Response, NextFunction } from 'express';\nimport type { ILogger } from '../lib/logger.js';\n\n/**\n * Adds RFC 8594 Deprecation and Sunset headers to responses.\n * Applied to legacy /api/sdk/* routes to signal clients to migrate to /agent/*.\n */\nexport function deprecation(logger: ILogger) {\n const SUNSET_DATE = new Date('2025-12-31T23:59:59Z').toUTCString();\n\n return (_req: Request, res: Response, next: NextFunction) => {\n res.setHeader('Deprecation', 'true');\n res.setHeader('Sunset', SUNSET_DATE);\n res.setHeader('Link', '</agent>; rel=\"successor-version\"');\n\n logger.debug('Deprecated /api/sdk route accessed', {\n path: _req.originalUrl,\n method: _req.method,\n });\n\n next();\n };\n}\n","// ---------------------------------------------------------------------------\n// Auth Routes — /api/sdk/auth\n// ---------------------------------------------------------------------------\n\nimport { createHash, randomBytes } from 'node:crypto';\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport { AuthError, NotFoundError, ValidationError } from '../lib/errors.js';\n\nexport function authRoutes({ db }: { db: SupabaseClient }): Router {\n const router = Router();\n\n // POST /login — sign in with email + password\n router.post('/login', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const { email, password } = req.body as { email?: string; password?: string };\n if (!email || !password) {\n throw new ValidationError('email and password are required');\n }\n\n const { data, error } = await db.auth.signInWithPassword({ email, password });\n if (error || !data.session) {\n throw new AuthError(error?.message ?? 'Invalid credentials');\n }\n\n res.json({\n data: {\n accessToken: data.session.access_token,\n refreshToken: data.session.refresh_token,\n expiresAt: new Date(data.session.expires_at! * 1000).toISOString(),\n },\n });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /whoami — return developer profile\n router.get('/whoami', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const developerId = req.developer!.id;\n\n const { data, error } = await db\n .from('developers')\n .select('id, email, plan, created_at')\n .eq('id', developerId)\n .single();\n\n if (error || !data) {\n throw new NotFoundError('Developer', developerId);\n }\n\n res.json({\n data: {\n id: data.id,\n email: data.email,\n plan: data.plan,\n memberSince: data.created_at,\n },\n });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /rotate-key — rotate API key with 15-min grace period\n router.post('/rotate-key', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const developer = req.developer!;\n\n // Generate new key\n const newKey = `lane_sk_${randomBytes(24).toString('hex')}`;\n const newHash = createHash('sha256').update(newKey).digest('hex');\n const graceExpiry = new Date(Date.now() + 15 * 60 * 1000).toISOString();\n\n // Mark old key as expiring after grace period\n await db\n .from('api_keys')\n .update({ revoked_at: graceExpiry })\n .eq('id', developer.keyId);\n\n // Insert new key\n const { error } = await db.from('api_keys').insert({\n developer_id: developer.id,\n key_hash: newHash,\n scopes: developer.scopes,\n rate_limit_rpm: developer.rateLimitRpm,\n test_mode: developer.testMode,\n });\n\n if (error) throw error;\n\n res.json({\n data: {\n apiKey: newKey,\n expiresOldKeyAt: graceExpiry,\n },\n });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Wallets Routes — /api/sdk/wallets\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type {\n IWalletService,\n ICardService,\n IProfileService,\n IMerchantAccountService,\n} from '../lib/interfaces.js';\n\ninterface WalletRouteDeps {\n wallets: IWalletService;\n cards: ICardService;\n profiles: IProfileService;\n merchantAccounts: IMerchantAccountService;\n}\n\nexport function walletRoutes({ wallets, cards, profiles, merchantAccounts }: WalletRouteDeps): Router {\n const router = Router();\n\n // POST / — create wallet\n router.post('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await wallets.create(req.developer!.id, req.body);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET / — list wallets (paginated)\n router.get('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const limit = Math.min(parseInt(req.query.limit as string) || 20, 100);\n const offset = parseInt(req.query.offset as string) || 0;\n\n const result = await wallets.list(req.developer!.id, { limit, offset });\n res.json({ data: result.data, total: result.total, limit, offset });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id — get wallet\n router.get('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await wallets.get(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id/cards — list cards\n router.get('/:id/cards', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await cards.listCards(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id/add-card-link — get VGS Collect URL\n router.get('/:id/add-card-link', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await cards.getAddCardLink(req.developer!.id, req.params.id as string);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // DELETE /:id/cards/:cardId — remove card\n router.delete('/:id/cards/:cardId', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await cards.removeCard(req.params.cardId as string, req.developer!.id);\n res.status(204).send();\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/profile — set checkout profile\n router.post('/:id/profile', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await profiles.setProfile(req.params.id as string, req.developer!.id, req.body);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id/profile — get checkout profile\n router.get('/:id/profile', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await profiles.getProfile(req.params.id as string);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // PUT /:id/profile — update checkout profile\n router.put('/:id/profile', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await profiles.updateProfile(req.params.id as string, req.developer!.id, req.body);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/merchant-accounts — save merchant account\n router.post('/:id/merchant-accounts', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await merchantAccounts.saveMerchantAccount(req.params.id as string, req.developer!.id, req.body);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id/merchant-accounts — list merchant accounts\n router.get('/:id/merchant-accounts', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await merchantAccounts.listMerchantAccounts(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // DELETE /:id/merchant-accounts/:accountId — remove merchant account\n router.delete('/:id/merchant-accounts/:accountId', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await merchantAccounts.removeMerchantAccount(req.params.accountId as string, req.developer!.id);\n res.status(204).send();\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Pay Routes — /api/sdk/pay\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ITokenService, IPaymentService, IBudgetService } from '../lib/interfaces.js';\nimport type { ILogger } from '../lib/logger.js';\nimport { velocityLimit } from '../middleware/velocity-limit.js';\n\ninterface PayRouteDeps {\n tokens: ITokenService;\n payments: IPaymentService;\n budgets: IBudgetService;\n db: SupabaseClient;\n logger: ILogger;\n}\n\nexport function payRoutes({ tokens, payments, budgets, db, logger }: PayRouteDeps): Router {\n const router = Router();\n\n const velocityMiddleware = velocityLimit(db, budgets, logger);\n\n // POST /tokens — create agentic token\n router.post('/tokens', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await tokens.createToken(req.developer!.id, req.body);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /execute — execute payment (routes through VGS proxy)\n // Velocity limit applied to prevent transaction flooding\n router.post('/execute', velocityMiddleware, async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await payments.execute(req.developer!.id, req.body);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /transactions — list transactions (paginated)\n router.get('/transactions', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const limit = Math.min(parseInt(req.query.limit as string) || 20, 100);\n const offset = parseInt(req.query.offset as string) || 0;\n\n const result = await payments.listTransactions(req.developer!.id, { limit, offset });\n res.json({ data: result.data, total: result.total, limit, offset });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /transactions/:id — get transaction\n router.get('/transactions/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await payments.getTransaction(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /refunds — initiate refund\n // Velocity limit applied to prevent refund loop attacks\n router.post('/refunds', velocityMiddleware, async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await payments.refund(req.developer!.id, req.body);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Velocity Limit Middleware — DB-backed Transaction Rate Limiting\n// ---------------------------------------------------------------------------\n// Enforces per-developer transaction velocity limits (per-minute, per-hour).\n// Queries the transactions table for accurate cross-instance enforcement.\n// Triggers automatic payment pause after repeated breaches.\n// ---------------------------------------------------------------------------\n\nimport type { Request, Response, NextFunction } from 'express';\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport type { IBudgetService } from '../lib/interfaces.js';\nimport type { ILogger } from '../lib/logger.js';\nimport { ServiceError, ErrorCode } from '../lib/errors.js';\n\nexport function velocityLimit(\n db: SupabaseClient,\n budgetService: IBudgetService,\n logger: ILogger,\n) {\n return async (req: Request, _res: Response, next: NextFunction) => {\n if (!req.developer) {\n next();\n return;\n }\n\n const developerId = req.developer.id;\n\n try {\n // Fetch developer's velocity config from budget row\n const { data: budget } = await db\n .from('budgets')\n .select(\n 'max_transactions_per_minute, max_transactions_per_hour, velocity_breach_count',\n )\n .eq('developer_id', developerId)\n .limit(1)\n .single();\n\n const maxPerMinute = budget?.max_transactions_per_minute ?? 5;\n const maxPerHour = budget?.max_transactions_per_hour ?? 30;\n\n const now = new Date();\n const oneMinuteAgo = new Date(now.getTime() - 60 * 1000).toISOString();\n const oneHourAgo = new Date(now.getTime() - 60 * 60 * 1000).toISOString();\n\n // Count transactions in the last minute\n const { count: minuteCount } = await db\n .from('transactions')\n .select('id', { count: 'exact', head: true })\n .eq('developer_id', developerId)\n .gte('created_at', oneMinuteAgo);\n\n // Count transactions in the last hour\n const { count: hourCount } = await db\n .from('transactions')\n .select('id', { count: 'exact', head: true })\n .eq('developer_id', developerId)\n .gte('created_at', oneHourAgo);\n\n const txPerMinute = minuteCount ?? 0;\n const txPerHour = hourCount ?? 0;\n\n if (txPerMinute >= maxPerMinute || txPerHour >= maxPerHour) {\n const exceeded = txPerMinute >= maxPerMinute ? 'per_minute' : 'per_hour';\n const retryAfter = exceeded === 'per_minute' ? 60 : 3600;\n\n logger.warn('Velocity limit exceeded', {\n operation: 'velocityLimit',\n developerId,\n exceeded,\n txPerMinute,\n txPerHour,\n maxPerMinute,\n maxPerHour,\n });\n\n // Increment breach count\n const currentBreaches = budget?.velocity_breach_count ?? 0;\n const newBreachCount = currentBreaches + 1;\n\n await db\n .from('budgets')\n .update({\n velocity_breach_count: newBreachCount,\n updated_at: now.toISOString(),\n })\n .eq('developer_id', developerId);\n\n // Auto-freeze after 3 breaches\n if (newBreachCount >= 3) {\n await budgetService.pausePayments(\n developerId,\n `Automatic freeze: ${newBreachCount} velocity breaches detected`,\n );\n\n logger.warn('Payments auto-frozen due to repeated velocity breaches', {\n operation: 'velocityLimit',\n developerId,\n breachCount: newBreachCount,\n });\n }\n\n throw new ServiceError(\n `Transaction velocity limit exceeded (${exceeded})`,\n ErrorCode.RATE_LIMIT_EXCEEDED,\n 429,\n true,\n { retryAfter, exceeded, txPerMinute, txPerHour },\n );\n }\n\n next();\n } catch (err) {\n if (err instanceof ServiceError) {\n next(err);\n } else {\n // Don't block payments if velocity check itself fails\n logger.warn('Velocity check failed, allowing request', {\n operation: 'velocityLimit',\n developerId,\n error: err instanceof Error ? err.message : String(err),\n });\n next();\n }\n }\n };\n}\n","// ---------------------------------------------------------------------------\n// Admin Routes — /api/sdk/admin\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { IBudgetService } from '../lib/interfaces.js';\n\ninterface AdminRouteDeps {\n budgets: IBudgetService;\n}\n\nexport function adminRoutes({ budgets }: AdminRouteDeps): Router {\n const router = Router();\n\n // GET /spending — spending summary\n router.get('/spending', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const budget = await budgets.getBudget(req.developer!.id);\n\n res.json({\n data: {\n daily: { spent: budget.spent_today, limit: budget.daily_limit },\n weekly: { spent: budget.spent_this_week, limit: budget.weekly_limit },\n monthly: { spent: budget.spent_this_month, limit: budget.monthly_limit },\n currency: 'USD',\n },\n });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /budgets — get budget\n router.get('/budgets', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await budgets.getBudget(req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // PUT /budgets — set budget limits\n router.put('/budgets', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await budgets.setBudget(req.developer!.id, req.body);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /payments/pause — pause all payments\n router.post('/payments/pause', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const reason = (req.body as { reason?: string }).reason ?? 'Paused via admin API';\n await budgets.pausePayments(req.developer!.id, reason);\n res.json({ data: { paused: true, reason } });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /payments/resume — resume payments\n router.post('/payments/resume', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await budgets.resumePayments(req.developer!.id);\n res.json({ data: { paused: false } });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Merchant Directory Routes\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { IMerchantDirectoryService, MerchantDirectorySearchParams } from '../lib/interfaces.js';\n\ninterface MerchantRouteDeps {\n merchantDirectory: IMerchantDirectoryService;\n}\n\nexport function merchantRoutes(deps: MerchantRouteDeps): Router {\n const router = Router();\n\n // GET /verticals — list all verticals with subcategories (must be before /:idOrSlug)\n router.get('/verticals', async (_req: Request, res: Response, next: NextFunction) => {\n try {\n const verticals = await deps.merchantDirectory.getVerticals();\n res.json({ data: verticals });\n } catch (err) {\n next(err);\n }\n });\n\n // GET / — list/search merchants\n router.get('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const params: import('../lib/interfaces.js').MerchantDirectorySearchParams = {\n query: req.query.query as string | undefined,\n tier: req.query.tier as 'lane_onboarded' | 'protocol' | undefined,\n merchantType: req.query.merchantType as MerchantDirectorySearchParams['merchantType'],\n vertical: req.query.vertical as string | undefined,\n subcategory: req.query.subcategory as string | undefined,\n protocol: req.query.protocol as string | undefined,\n limit: req.query.limit ? parseInt(req.query.limit as string, 10) : undefined,\n offset: req.query.offset ? parseInt(req.query.offset as string, 10) : undefined,\n };\n const result = await deps.merchantDirectory.listMerchants(params);\n res.json({\n data: result.data,\n total: result.total,\n limit: params.limit ?? 20,\n offset: params.offset ?? 0,\n });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:idOrSlug — get by ID, slug, or domain\n router.get('/:idOrSlug', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const merchant = await deps.merchantDirectory.getMerchant(req.params['idOrSlug'] as string);\n if (!merchant) {\n res.status(404).json({ error: { code: 'not_found', message: 'Merchant not found' } });\n return;\n }\n res.json({ data: merchant });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id/capabilities — routing capabilities\n router.get('/:id/capabilities', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const capabilities = await deps.merchantDirectory.getMerchantCapabilities(req.params['id'] as string);\n if (!capabilities) {\n res.status(404).json({ error: { code: 'not_found', message: 'Merchant not found' } });\n return;\n }\n res.json({ data: capabilities });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /sync — trigger backend sync (admin)\n router.post('/sync', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const url = (req.body.url as string) || process.env['LANE_BACKEND_URL'];\n const token = (req.body.token as string) || process.env['LANE_BACKEND_TOKEN'];\n\n if (!url || !token) {\n res.status(400).json({\n error: { code: 'missing_config', message: 'Backend URL and token are required' },\n });\n return;\n }\n\n const result = await deps.merchantDirectory.syncFromLaneBackend(url, token);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /discover — discover protocol merchant by domain\n router.post('/discover', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const domain = req.body.domain as string;\n if (!domain) {\n res.status(400).json({\n error: { code: 'missing_domain', message: 'Domain is required' },\n });\n return;\n }\n\n const merchant = await deps.merchantDirectory.discoverProtocolMerchant(domain);\n if (!merchant) {\n res.status(404).json({\n error: { code: 'no_protocol', message: 'No ACP or UCP protocol found at this domain' },\n });\n return;\n }\n\n res.json({ data: merchant });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Onboarding Routes — Session management + protected onboarding endpoints\n// ---------------------------------------------------------------------------\n\nimport { randomBytes, randomUUID, createHash } from 'node:crypto';\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from '../lib/logger.js';\nimport { NotFoundError, ValidationError } from '../lib/errors.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype SessionStatus = 'awaiting_signup' | 'signup_complete' | 'card_added' | 'ready';\n\nconst VALID_STATUSES: SessionStatus[] = ['awaiting_signup', 'signup_complete', 'card_added', 'ready'];\n\ninterface OnboardingSession {\n id: string;\n status: SessionStatus;\n api_key: string | null;\n has_card: boolean;\n has_budget: boolean;\n api_key_revealed: boolean;\n session_secret: string;\n metadata: Record<string, unknown> | null;\n expires_at: string;\n created_at: string;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst WALLET_APP_URL = process.env.LANE_WALLET_APP_URL ?? 'https://developer.getonlane.com';\n\nfunction generateApiKey(): string {\n return `lane_sk_${randomBytes(32).toString('hex')}`;\n}\n\n// ---------------------------------------------------------------------------\n// Simple in-memory rate limiter\n// ---------------------------------------------------------------------------\n\ninterface RateBucket {\n timestamps: number[];\n}\n\nconst rateBuckets = new Map<string, RateBucket>();\n\n// Cleanup stale entries every 5 minutes\nsetInterval(() => {\n const cutoff = Date.now() - 60_000;\n for (const [key, bucket] of rateBuckets) {\n bucket.timestamps = bucket.timestamps.filter(t => t > cutoff);\n if (bucket.timestamps.length === 0) {\n rateBuckets.delete(key);\n }\n }\n}, 5 * 60 * 1000).unref();\n\nfunction checkRateLimit(key: string, limit: number): boolean {\n const now = Date.now();\n const cutoff = now - 60_000;\n\n let bucket = rateBuckets.get(key);\n if (!bucket) {\n bucket = { timestamps: [] };\n rateBuckets.set(key, bucket);\n }\n\n bucket.timestamps = bucket.timestamps.filter(t => t > cutoff);\n\n if (bucket.timestamps.length >= limit) {\n return false;\n }\n\n bucket.timestamps.push(now);\n return true;\n}\n\n// ---------------------------------------------------------------------------\n// A) sessionRoutes — Public (no auth required)\n// ---------------------------------------------------------------------------\n\nexport function sessionRoutes(db: SupabaseClient, logger: ILogger): Router {\n const router = Router();\n\n // POST / — Create onboarding session\n router.post('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const ip = req.ip ?? req.socket.remoteAddress ?? 'unknown';\n if (!checkRateLimit(`session_create:${ip}`, 10)) {\n res.status(429).json({\n error: { code: 'rate_limit_exceeded', message: 'Too many session creates. Try again later.' },\n });\n return;\n }\n\n const { metadata } = req.body as { metadata?: Record<string, unknown> };\n\n const sessionId = `sess_${randomUUID().replace(/-/g, '')}`;\n const sessionSecret = randomBytes(32).toString('hex');\n const now = new Date();\n const expiresAt = new Date(now.getTime() + 30 * 60 * 1000);\n\n const row = {\n id: sessionId,\n status: 'awaiting_signup' as SessionStatus,\n api_key: null,\n has_card: false,\n has_budget: false,\n api_key_revealed: false,\n session_secret: sessionSecret,\n metadata: metadata ?? null,\n expires_at: expiresAt.toISOString(),\n created_at: now.toISOString(),\n };\n\n const { error } = await db.from('onboarding_sessions').insert(row);\n if (error) {\n logger.error('Failed to create onboarding session', error);\n throw error;\n }\n\n const signupUrl = `${WALLET_APP_URL}/onboarding?session=${sessionId}`;\n const embedUrl = `${signupUrl}&embed=true`;\n\n res.status(201).json({\n sessionId,\n sessionSecret,\n signupUrl,\n embedUrl,\n expiresAt: expiresAt.toISOString(),\n });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id — Poll session status\n router.get('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const sessionId = req.params.id as string;\n\n if (!checkRateLimit(`session_poll:${sessionId}`, 20)) {\n res.status(429).json({\n error: { code: 'rate_limit_exceeded', message: 'Too many polls. Try again later.' },\n });\n return;\n }\n\n const { data, error } = await db\n .from('onboarding_sessions')\n .select('*')\n .eq('id', sessionId)\n .single();\n\n if (error || !data) {\n throw new NotFoundError('Onboarding session', sessionId);\n }\n\n const session = data as OnboardingSession;\n\n // Check if expired\n if (new Date(session.expires_at).getTime() <= Date.now()) {\n throw new NotFoundError('Onboarding session', sessionId);\n }\n\n // Determine apiKey value: full on first reveal, redacted after\n let apiKeyValue: string | null = null;\n if (session.api_key) {\n if (!session.api_key_revealed) {\n const { data: revealData, error: revealErr } = await db\n .from('onboarding_sessions')\n .update({ api_key_revealed: true })\n .eq('id', sessionId)\n .eq('api_key_revealed', false)\n .select('api_key')\n .maybeSingle();\n\n if (revealErr) {\n logger.error('Failed to atomically reveal api_key', revealErr, { sessionId });\n }\n\n if (revealData?.api_key) {\n apiKeyValue = revealData.api_key;\n } else {\n apiKeyValue = 'redacted';\n }\n } else {\n apiKeyValue = 'redacted';\n }\n }\n\n res.json({\n sessionId: session.id,\n status: session.status,\n apiKey: apiKeyValue,\n hasCard: session.has_card,\n hasBudget: session.has_budget,\n expiresAt: session.expires_at,\n });\n } catch (err) {\n next(err);\n }\n });\n\n // PATCH /:id — Update session status\n router.patch('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const sessionId = req.params.id as string;\n\n if (!checkRateLimit(`session_patch:${sessionId}`, 20)) {\n res.status(429).json({\n error: { code: 'rate_limit_exceeded', message: 'Too many updates. Try again later.' },\n });\n return;\n }\n\n const { sessionSecret, status, apiKey, hasCard, hasBudget } = req.body as {\n sessionSecret?: string;\n status?: string;\n apiKey?: string;\n hasCard?: boolean;\n hasBudget?: boolean;\n };\n\n if (!sessionSecret) {\n throw new ValidationError('sessionSecret is required');\n }\n\n // Fetch session and verify secret\n const { data: existing, error: fetchErr } = await db\n .from('onboarding_sessions')\n .select('*')\n .eq('id', sessionId)\n .single();\n\n if (fetchErr || !existing) {\n throw new NotFoundError('Onboarding session', sessionId);\n }\n\n const existingSession = existing as OnboardingSession;\n\n if (existingSession.session_secret !== sessionSecret) {\n res.status(403).json({\n error: { code: 'forbidden', message: 'Invalid session secret.' },\n });\n return;\n }\n\n if (new Date(existingSession.expires_at).getTime() <= Date.now()) {\n throw new NotFoundError('Onboarding session', sessionId);\n }\n\n if (status && !VALID_STATUSES.includes(status as SessionStatus)) {\n throw new ValidationError(`Invalid status. Must be one of: ${VALID_STATUSES.join(', ')}`);\n }\n\n if (apiKey !== undefined && !/^lane_sk_[a-f0-9]{64}$/.test(apiKey)) {\n throw new ValidationError('Invalid apiKey format');\n }\n\n // Build update object\n const updates: Record<string, unknown> = {};\n if (status !== undefined) updates.status = status;\n if (apiKey !== undefined) updates.api_key = apiKey;\n if (hasCard !== undefined) updates.has_card = hasCard;\n if (hasBudget !== undefined) updates.has_budget = hasBudget;\n\n const { data, error } = await db\n .from('onboarding_sessions')\n .update(updates)\n .eq('id', sessionId)\n .select('*')\n .single();\n\n if (error || !data) {\n throw new NotFoundError('Onboarding session', sessionId);\n }\n\n const session = data as OnboardingSession;\n\n res.json({\n sessionId: session.id,\n status: session.status,\n hasCard: session.has_card,\n hasBudget: session.has_budget,\n expiresAt: session.expires_at,\n });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n\n// ---------------------------------------------------------------------------\n// B) onboardingRoutes — Protected (auth required)\n// ---------------------------------------------------------------------------\n\nexport function onboardingRoutes({ db }: { db: SupabaseClient }): Router {\n const router = Router();\n\n // POST /generate-key — Generate first API key for new user\n router.post('/generate-key', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const developerId = req.developer!.id;\n\n const apiKey = generateApiKey();\n const keyHash = createHash('sha256').update(apiKey).digest('hex');\n const now = new Date().toISOString();\n\n const { error } = await db.from('api_keys').insert({\n developer_id: developerId,\n key_hash: keyHash,\n scopes: ['*'],\n rate_limit_rpm: 60,\n test_mode: false,\n });\n\n if (error) throw error;\n\n res.status(201).json({\n apiKey,\n createdAt: now,\n });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /status — Get onboarding completion status\n router.get('/status', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const developerId = req.developer!.id;\n\n // Check has API key\n const { data: keys } = await db\n .from('api_keys')\n .select('id')\n .eq('developer_id', developerId)\n .is('revoked_at', null)\n .limit(1);\n const hasApiKey = (keys?.length ?? 0) > 0;\n\n // Check has wallet with card\n const { data: wallets } = await db\n .from('wallets')\n .select('id, cards(id)')\n .eq('developer_id', developerId)\n .limit(1);\n const hasCard = wallets?.some((w: { cards?: { id: string }[] }) => (w.cards?.length ?? 0) > 0) ?? false;\n\n // Check has budget configured\n const { data: budgets } = await db\n .from('budgets')\n .select('id')\n .eq('developer_id', developerId)\n .limit(1);\n const hasBudget = (budgets?.length ?? 0) > 0;\n\n // Compute completed steps and next step\n const completedSteps: string[] = [];\n let nextStep: string | null = null;\n\n if (hasApiKey) completedSteps.push('api_key');\n if (hasCard) completedSteps.push('card');\n if (hasBudget) completedSteps.push('budget');\n\n if (!hasApiKey) {\n nextStep = 'generate_api_key';\n } else if (!hasCard) {\n nextStep = 'add_card';\n } else if (!hasBudget) {\n nextStep = 'configure_budget';\n }\n\n res.json({\n hasApiKey,\n hasCard,\n hasBudget,\n completedSteps,\n nextStep,\n });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Routes Index — /agent/*\n// ---------------------------------------------------------------------------\n// Aggregates all agent sub-routers into a single router factory.\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from '../../lib/logger.js';\nimport type { ServiceContainer } from '../../lib/service-container.js';\n\nimport { agentWalletRoutes } from './wallet.js';\nimport { agentCardRoutes } from './card.js';\nimport { agentInstructionRoutes } from './instruction.js';\nimport { agentTokenRoutes } from './token.js';\nimport { agentTransactionRoutes } from './transaction.js';\nimport { agentBudgetRoutes } from './budget.js';\nimport { agentPayRoutes } from './pay.js';\nimport { agentUserRoutes } from './user.js';\nimport { agentMerchantRoutes } from './merchant.js';\nimport { agentCheckoutRoutes } from './checkout.js';\nimport { agentProductRoutes } from './product.js';\nimport { agentSubscriptionRoutes } from './subscription.js';\nimport { agentFleetRoutes } from './fleet.js';\nimport { agentTeamRoutes } from './team.js';\nimport { agentWebhookRoutes } from './webhook.js';\nimport { agentAuditRoutes } from './audit.js';\nimport { agentAdminRoutes } from './admin.js';\nimport { agentOnboardingRoutes } from './onboarding.js';\n\n// Additional route modules (previously unattached)\nimport { delegationRoutes } from '../delegations.js';\nimport { protocolRoutes } from '../protocol.js';\nimport { mastercardAPRoutes } from '../mastercard-ap.js';\nimport { identityRoutes } from '../identity.js';\n\nexport function createAgentRoutes(container: ServiceContainer, db: SupabaseClient, logger: ILogger): Router {\n const router = Router();\n\n // Core agent resources\n router.use('/wallet', agentWalletRoutes({ wallets: container.wallets }));\n router.use('/card', agentCardRoutes({ cards: container.cards }));\n router.use('/instruction', agentInstructionRoutes({ instructions: container.instructions }));\n router.use('/token', agentTokenRoutes({ tokens: container.tokens }));\n router.use('/transaction', agentTransactionRoutes({ payments: container.payments }));\n router.use('/budget', agentBudgetRoutes({ budgets: container.budgets }));\n router.use('/pay', agentPayRoutes({ payments: container.payments }));\n router.use('/user', agentUserRoutes({ users: container.users }));\n router.use('/merchant', agentMerchantRoutes({ merchantDirectory: container.merchantDirectory }));\n router.use('/checkout', agentCheckoutRoutes({ checkout: container.checkout }));\n router.use('/product', agentProductRoutes({ db }));\n router.use('/subscription', agentSubscriptionRoutes({ subscriptions: container.subscriptions }));\n router.use('/fleet', agentFleetRoutes({ fleet: container.fleet }));\n router.use('/team', agentTeamRoutes({ teams: container.teams }));\n router.use('/webhook', agentWebhookRoutes({ webhooks: container.webhooks }));\n router.use('/audit', agentAuditRoutes({ db }));\n router.use('/admin', agentAdminRoutes({ db }));\n router.use('/onboarding', agentOnboardingRoutes({ db }));\n\n // Delegation, protocol, identity, mastercard-ap\n // Note: mandates are sub-resources of instructions at /agent/instruction/:id/mandate\n router.use('/delegation', delegationRoutes({ delegations: container.delegations }));\n router.use('/protocol', protocolRoutes({ protocolClient: container.protocolClient }));\n router.use('/mastercard-ap', mastercardAPRoutes({ mastercardAP: container.mastercardAP }));\n router.use('/identity', identityRoutes({ identity: container.identity }));\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Wallet Routes — /agent/wallet\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { IWalletService } from '../../lib/interfaces.js';\n\ninterface WalletRouteDeps {\n wallets: IWalletService;\n}\n\nexport function agentWalletRoutes({ wallets }: WalletRouteDeps): Router {\n const router = Router();\n\n // POST / — create wallet\n router.post('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await wallets.create(req.developer!.id, req.body);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET / — list wallets\n router.get('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const limit = Math.min(parseInt(req.query.limit as string) || 20, 100);\n const offset = parseInt(req.query.offset as string) || 0;\n const result = await wallets.list(req.developer!.id, { limit, offset });\n res.json({ data: result.data, total: result.total, limit, offset });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id — get wallet\n router.get('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await wallets.get(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // PUT /:id — update wallet\n router.put('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await wallets.update(req.params.id as string, req.developer!.id, req.body);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id/balance — get wallet balance\n router.get('/:id/balance', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await wallets.getBalance(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/deposit — deposit funds\n router.post('/:id/deposit', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const { amount } = req.body;\n if (typeof amount !== 'number' || amount <= 0) {\n res.status(400).json({ error: { code: 'invalid_amount', message: 'amount must be a positive number' } });\n return;\n }\n const result = await wallets.deposit(req.params.id as string, req.developer!.id, amount);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/default — set as default wallet\n router.post('/:id/default', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await wallets.setDefault(req.params.id as string, req.developer!.id);\n res.json({ data: { success: true } });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Card Routes — /agent/card\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { ICardService } from '../../lib/interfaces.js';\n\ninterface CardRouteDeps {\n cards: ICardService;\n}\n\nexport function agentCardRoutes({ cards }: CardRouteDeps): Router {\n const router = Router();\n\n // GET / — list cards\n router.get('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const walletId = req.query.walletId as string;\n if (!walletId) {\n res.status(400).json({ error: { code: 'missing_wallet_id', message: 'walletId query parameter is required' } });\n return;\n }\n const result = await cards.listCards(walletId, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /add-link — get add card link\n router.get('/add-link', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const walletId = req.query.walletId as string;\n if (!walletId) {\n res.status(400).json({ error: { code: 'missing_wallet_id', message: 'walletId query parameter is required' } });\n return;\n }\n const result = await cards.getAddCardLink(req.developer!.id, walletId);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id — get card\n router.get('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await cards.getDefaultCard(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // DELETE /:id — remove card\n router.delete('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await cards.removeCard(req.params.id as string, req.developer!.id);\n res.status(204).send();\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Instruction Routes — /agent/instruction\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { IInstructionService } from '../../lib/interfaces.js';\n\ninterface InstructionRouteDeps {\n instructions: IInstructionService;\n}\n\nexport function agentInstructionRoutes({ instructions }: InstructionRouteDeps): Router {\n const router = Router();\n\n // POST / — create instruction\n router.post('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await instructions.create(req.developer!.id, req.body);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET / — list instructions\n router.get('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const limit = Math.min(parseInt(req.query.limit as string) || 20, 100);\n const offset = parseInt(req.query.offset as string) || 0;\n const result = await instructions.list(req.developer!.id, { limit, offset });\n res.json({ data: result.data, total: result.total, limit, offset });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id — get instruction (includes budget info)\n router.get('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await instructions.get(req.params.id as string, req.developer!.id);\n const remainingCents = result.amount !== null\n ? Math.max(0, result.amount - result.spent_cents)\n : null;\n res.json({\n data: {\n ...result,\n spentCents: result.spent_cents,\n remainingCents,\n },\n });\n } catch (err) {\n next(err);\n }\n });\n\n // PUT /:id — update instruction\n router.put('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await instructions.update(req.params.id as string, req.developer!.id, req.body);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/cancel — cancel instruction\n router.post('/:id/cancel', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await instructions.cancel(req.params.id as string, req.developer!.id);\n res.json({ data: { success: true } });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/mandate — add mandate\n router.post('/:id/mandate', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await instructions.addMandate(req.params.id as string, req.developer!.id, req.body);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id/mandate — list mandates\n router.get('/:id/mandate', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await instructions.listMandates(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id/mandate/:mid — get mandate\n router.get('/:id/mandate/:mid', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await instructions.getMandate(req.params.id as string, req.params.mid as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // PUT /:id/mandate/:mid — update mandate\n router.put('/:id/mandate/:mid', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await instructions.updateMandate(req.params.id as string, req.params.mid as string, req.developer!.id, req.body);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // DELETE /:id/mandate/:mid — remove mandate\n router.delete('/:id/mandate/:mid', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await instructions.removeMandate(req.params.id as string, req.params.mid as string, req.developer!.id);\n res.status(204).send();\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id/budget — get instruction budget status\n router.get('/:id/budget', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await instructions.getInstructionBudget(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/credential — get credential (requires biometric confirmation)\n router.post('/:id/credential', async (req: Request, res: Response, next: NextFunction) => {\n try {\n // Require biometric confirmation before releasing credentials\n await instructions.requireConfirmation(req.params.id as string, req.developer!.id, {\n requiredType: 'biometric',\n maxAgeSeconds: 60,\n });\n const result = await instructions.getCredential(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/confirmation — create confirmation\n router.post('/:id/confirmation', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await instructions.createConfirmation(req.params.id as string, req.developer!.id, req.body);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id/confirmation — list confirmations\n router.get('/:id/confirmation', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await instructions.listConfirmations(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Token Routes — /agent/token\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { ITokenService } from '../../lib/interfaces.js';\n\ninterface TokenRouteDeps {\n tokens: ITokenService;\n}\n\nexport function agentTokenRoutes({ tokens }: TokenRouteDeps): Router {\n const router = Router();\n\n // POST / — create/provision token\n router.post('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await tokens.createToken(req.developer!.id, req.body);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET / — list tokens\n router.get('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const limit = Math.min(parseInt(req.query.limit as string) || 20, 100);\n const offset = parseInt(req.query.offset as string) || 0;\n const result = await tokens.listTokens(req.developer!.id, { limit, offset });\n res.json({ data: result.data, total: result.total, limit, offset });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id — get token\n router.get('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await tokens.getToken(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/suspend — suspend token\n router.post('/:id/suspend', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await tokens.suspendToken(req.params.id as string, req.developer!.id);\n res.json({ data: { success: true } });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/reactivate — reactivate suspended token\n router.post('/:id/reactivate', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await tokens.reactivateToken(req.params.id as string, req.developer!.id);\n res.json({ data: { success: true } });\n } catch (err) {\n next(err);\n }\n });\n\n // DELETE /:id — delete token\n router.delete('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await tokens.deleteToken(req.params.id as string, req.developer!.id);\n res.status(204).send();\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/cryptogram — get cryptogram\n router.post('/:id/cryptogram', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await tokens.getCryptogram(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/re-provision — re-provision token\n router.post('/:id/re-provision', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await tokens.reProvision(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Transaction Routes — /agent/transaction\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { IPaymentService } from '../../lib/interfaces.js';\n\ninterface TransactionRouteDeps {\n payments: IPaymentService;\n}\n\nexport function agentTransactionRoutes({ payments }: TransactionRouteDeps): Router {\n const router = Router();\n\n // GET / — list transactions\n router.get('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const limit = Math.min(parseInt(req.query.limit as string) || 20, 100);\n const offset = parseInt(req.query.offset as string) || 0;\n const result = await payments.listTransactions(req.developer!.id, { limit, offset });\n res.json({ data: result.data, total: result.total, limit, offset });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id — get transaction\n router.get('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await payments.getTransaction(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/refund — refund transaction\n router.post('/:id/refund', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await payments.refund(req.developer!.id, {\n transactionId: req.params.id as string,\n amount: req.body.amount,\n reason: req.body.reason,\n });\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Budget Routes — /agent/budget\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { IBudgetService } from '../../lib/interfaces.js';\n\ninterface BudgetRouteDeps {\n budgets: IBudgetService;\n}\n\nexport function agentBudgetRoutes({ budgets }: BudgetRouteDeps): Router {\n const router = Router();\n\n // GET / — get budget config\n router.get('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await budgets.getBudget(req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // PUT / — set budget config\n router.put('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await budgets.setBudget(req.developer!.id, req.body);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /spending — spending summary\n router.get('/spending', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const budget = await budgets.getBudget(req.developer!.id);\n res.json({\n data: {\n daily: { spent: budget.spent_today, limit: budget.daily_limit },\n weekly: { spent: budget.spent_this_week, limit: budget.weekly_limit },\n monthly: { spent: budget.spent_this_month, limit: budget.monthly_limit },\n currency: 'USD',\n },\n });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Pay Routes — /agent/pay\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { IPaymentService } from '../../lib/interfaces.js';\n\ninterface PayRouteDeps {\n payments: IPaymentService;\n}\n\nexport function agentPayRoutes({ payments }: PayRouteDeps): Router {\n const router = Router();\n\n // POST / — execute payment\n router.post('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const { amount, recipient } = req.body;\n if (typeof amount !== 'number' || amount <= 0) {\n res.status(400).json({ error: { code: 'invalid_amount', message: 'amount must be a positive number' } });\n return;\n }\n if (typeof recipient !== 'string' || !recipient.trim()) {\n res.status(400).json({ error: { code: 'invalid_recipient', message: 'recipient must be a non-empty string' } });\n return;\n }\n const result = await payments.execute(req.developer!.id, req.body);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent User Routes — /agent/user\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { IUserService } from '../../lib/interfaces.js';\n\ninterface UserRouteDeps {\n users: IUserService;\n}\n\nexport function agentUserRoutes({ users }: UserRouteDeps): Router {\n const router = Router();\n\n // POST / — create user\n router.post('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await users.create(req.developer!.id, req.body);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET / — list users\n router.get('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const limit = Math.min(parseInt(req.query.limit as string) || 20, 100);\n const offset = parseInt(req.query.offset as string) || 0;\n const result = await users.list(req.developer!.id, { limit, offset });\n res.json({ data: result.data, total: result.total, limit, offset });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id — get user\n router.get('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await users.get(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // PUT /:id — update user\n router.put('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await users.update(req.params.id as string, req.developer!.id, req.body);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // DELETE /:id — deactivate user\n router.delete('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await users.delete(req.params.id as string, req.developer!.id);\n res.status(204).send();\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/session — create session\n router.post('/:id/session', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await users.createSession(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Merchant Routes — /agent/merchant\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { IMerchantDirectoryService, MerchantDirectorySearchParams } from '../../lib/interfaces.js';\n\ninterface MerchantRouteDeps {\n merchantDirectory: IMerchantDirectoryService;\n}\n\nexport function agentMerchantRoutes({ merchantDirectory }: MerchantRouteDeps): Router {\n const router = Router();\n\n // GET / — list/search merchants\n router.get('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const rawLimit = req.query.limit ? parseInt(req.query.limit as string, 10) : undefined;\n const rawOffset = req.query.offset ? parseInt(req.query.offset as string, 10) : undefined;\n const params: MerchantDirectorySearchParams = {\n query: req.query.query as string | undefined,\n tier: req.query.tier as 'lane_onboarded' | 'protocol' | undefined,\n merchantType: req.query.merchantType as MerchantDirectorySearchParams['merchantType'],\n vertical: req.query.vertical as string | undefined,\n subcategory: req.query.subcategory as string | undefined,\n protocol: req.query.protocol as string | undefined,\n limit: rawLimit !== undefined && !Number.isNaN(rawLimit) ? rawLimit : undefined,\n offset: rawOffset !== undefined && !Number.isNaN(rawOffset) ? rawOffset : undefined,\n };\n const result = await merchantDirectory.listMerchants(params);\n res.json({ data: result.data, total: result.total, limit: params.limit ?? 20, offset: params.offset ?? 0 });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /verticals — list verticals\n router.get('/verticals', async (_req: Request, res: Response, next: NextFunction) => {\n try {\n const verticals = await merchantDirectory.getVerticals();\n res.json({ data: verticals });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:idOrSlug — get merchant\n router.get('/:idOrSlug', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const merchant = await merchantDirectory.getMerchant(req.params.idOrSlug as string);\n if (!merchant) {\n res.status(404).json({ error: { code: 'not_found', message: 'Merchant not found' } });\n return;\n }\n res.json({ data: merchant });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /discover — discover protocol merchant\n router.post('/discover', async (req: Request, res: Response, next: NextFunction) => {\n try {\n let domain = req.body.domain as string;\n if (!domain) {\n res.status(400).json({ error: { code: 'missing_domain', message: 'Domain is required' } });\n return;\n }\n\n // Normalize: strip scheme, www prefix, and path\n domain = domain.replace(/^https?:\\/\\//, '').replace(/^www\\./, '').replace(/\\/.*$/, '');\n const domainRegex = /^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?)*\\.[a-zA-Z]{2,}$/;\n if (!domainRegex.test(domain)) {\n res.status(400).json({ error: { code: 'invalid_domain', message: 'Domain format is invalid' } });\n return;\n }\n\n const merchant = await merchantDirectory.discoverProtocolMerchant(domain);\n if (!merchant) {\n res.status(404).json({ error: { code: 'no_protocol', message: 'No protocol found at this domain' } });\n return;\n }\n res.json({ data: merchant });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Checkout Routes — /agent/checkout\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { ICheckoutService } from '../../lib/interfaces.js';\n\ninterface CheckoutRouteDeps {\n checkout: ICheckoutService;\n}\n\nexport function agentCheckoutRoutes({ checkout }: CheckoutRouteDeps): Router {\n const router = Router();\n\n // POST / — create checkout session\n router.post('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await checkout.create(req.developer!.id, req.body);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id — get checkout session\n router.get('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await checkout.get(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/complete — complete checkout\n router.post('/:id/complete', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await checkout.complete(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/cancel — cancel checkout\n router.post('/:id/cancel', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await checkout.cancel(req.params.id as string, req.developer!.id);\n res.json({ data: { success: true } });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Product Routes — /agent/product\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { SupabaseClient } from '@supabase/supabase-js';\n\ninterface ProductRouteDeps {\n db: SupabaseClient;\n}\n\nexport function agentProductRoutes({ db }: ProductRouteDeps): Router {\n const router = Router();\n\n // GET / — list products\n router.get('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const limit = Math.min(parseInt(req.query.limit as string) || 20, 100);\n const offset = parseInt(req.query.offset as string) || 0;\n const query = req.query.query as string | undefined;\n\n let dbQuery = db\n .from('products')\n .select('*', { count: 'exact' })\n .order('created_at', { ascending: false })\n .range(offset, offset + limit - 1);\n\n if (query) {\n dbQuery = dbQuery.ilike('name', `%${query}%`);\n }\n\n const { data, error, count } = await dbQuery;\n if (error) throw error;\n res.json({ data: data ?? [], total: count ?? 0, limit, offset });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id — get product\n router.get('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const { data, error } = await db\n .from('products')\n .select('*')\n .eq('id', req.params.id as string)\n .single();\n\n if (error || !data) {\n res.status(404).json({ error: { code: 'not_found', message: 'Product not found' } });\n return;\n }\n res.json({ data });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Subscription Routes — /agent/subscription\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { ISubscriptionService } from '../../lib/interfaces.js';\n\ninterface SubscriptionRouteDeps {\n subscriptions: ISubscriptionService;\n}\n\nexport function agentSubscriptionRoutes({ subscriptions }: SubscriptionRouteDeps): Router {\n const router = Router();\n\n // POST / — create subscription\n router.post('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await subscriptions.create(req.developer!.id, req.body);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET / — list subscriptions\n router.get('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const limit = Math.min(parseInt(req.query.limit as string) || 20, 100);\n const offset = parseInt(req.query.offset as string) || 0;\n const result = await subscriptions.list(req.developer!.id, { limit, offset });\n res.json({ data: result.data, total: result.total, limit, offset });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id — get subscription\n router.get('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await subscriptions.get(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/cancel — cancel subscription\n router.post('/:id/cancel', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await subscriptions.cancel(req.params.id as string, req.developer!.id);\n res.json({ data: { success: true } });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/pause — pause subscription\n router.post('/:id/pause', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await subscriptions.pause(req.params.id as string, req.developer!.id);\n res.json({ data: { success: true } });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/resume — resume subscription\n router.post('/:id/resume', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await subscriptions.resume(req.params.id as string, req.developer!.id);\n res.json({ data: { success: true } });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Fleet Routes — /agent/fleet\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { IFleetService } from '../../lib/interfaces.js';\n\ninterface FleetRouteDeps {\n fleet: IFleetService;\n}\n\nexport function agentFleetRoutes({ fleet }: FleetRouteDeps): Router {\n const router = Router();\n\n // POST / — register agent\n router.post('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await fleet.register(req.developer!.id, req.body);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET / — list agents\n router.get('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const limit = Math.min(parseInt(req.query.limit as string) || 20, 100);\n const offset = parseInt(req.query.offset as string) || 0;\n const result = await fleet.list(req.developer!.id, { limit, offset });\n res.json({ data: result.data, total: result.total, limit, offset });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id — get agent\n router.get('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await fleet.get(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/suspend — suspend agent\n router.post('/:id/suspend', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await fleet.suspend(req.params.id as string, req.developer!.id);\n res.json({ data: { success: true } });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/revoke — revoke agent\n router.post('/:id/revoke', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await fleet.revoke(req.params.id as string, req.developer!.id);\n res.json({ data: { success: true } });\n } catch (err) {\n next(err);\n }\n });\n\n // PUT /:id/policy — set agent policy\n router.put('/:id/policy', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await fleet.setPolicy(req.params.id as string, req.developer!.id, req.body);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // PUT /:id/wallet — assign wallet to agent\n router.put('/:id/wallet', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await fleet.assignWallet(req.params.id as string, req.developer!.id, req.body.walletId);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Team Routes — /agent/team\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { ITeamService } from '../../lib/interfaces.js';\n\ninterface TeamRouteDeps {\n teams: ITeamService;\n}\n\nexport function agentTeamRoutes({ teams }: TeamRouteDeps): Router {\n const router = Router();\n\n // POST / — create team\n router.post('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await teams.create(req.developer!.id, req.body);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET / — list teams\n router.get('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const limit = Math.min(parseInt(req.query.limit as string) || 20, 100);\n const offset = parseInt(req.query.offset as string) || 0;\n const result = await teams.list(req.developer!.id, { limit, offset });\n res.json({ data: result.data, total: result.total, limit, offset });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id — get team\n router.get('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await teams.get(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // PUT /:id — update team\n router.put('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await teams.update(req.params.id as string, req.developer!.id, req.body);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/member — add member\n router.post('/:id/member', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await teams.addMember(req.params.id as string, req.developer!.id, req.body.userId, req.body.role);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id/member — list members\n router.get('/:id/member', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await teams.listMembers(req.params.id as string, req.developer!.id);\n res.json({ data: result, total: result.length, limit: result.length, offset: 0 });\n } catch (err) {\n next(err);\n }\n });\n\n // DELETE /:id/member/:mid — remove member\n router.delete('/:id/member/:mid', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await teams.removeMember(req.params.id as string, req.params.mid as string, req.developer!.id);\n res.status(204).send();\n } catch (err) {\n next(err);\n }\n });\n\n // PUT /:id/budget — set team budget\n router.put('/:id/budget', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await teams.setBudget(req.params.id as string, req.developer!.id, req.body);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Webhook Routes — /agent/webhook\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { IWebhookService } from '../../lib/interfaces.js';\n\ninterface WebhookRouteDeps {\n webhooks: IWebhookService;\n}\n\nexport function agentWebhookRoutes({ webhooks }: WebhookRouteDeps): Router {\n const router = Router();\n\n // POST / — create webhook\n router.post('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const { url, events } = req.body;\n\n // Validate URL\n if (!url || typeof url !== 'string') {\n res.status(400).json({ error: { code: 'invalid_url', message: 'url is required' } });\n return;\n }\n try {\n const parsed = new URL(url);\n if (process.env.NODE_ENV === 'production' && parsed.protocol !== 'https:') {\n res.status(400).json({ error: { code: 'invalid_url', message: 'url must use https in production' } });\n return;\n }\n if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') {\n res.status(400).json({ error: { code: 'invalid_url', message: 'url must use http or https protocol' } });\n return;\n }\n } catch {\n res.status(400).json({ error: { code: 'invalid_url', message: 'url is not a valid URL' } });\n return;\n }\n\n // Validate events\n if (!Array.isArray(events) || events.length === 0) {\n res.status(400).json({ error: { code: 'invalid_events', message: 'events must be a non-empty array' } });\n return;\n }\n\n const result = await webhooks.create(req.developer!.id, { url, events });\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET / — list webhooks\n router.get('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const limit = Math.min(parseInt(req.query.limit as string) || 20, 100);\n const offset = parseInt(req.query.offset as string) || 0;\n const result = await webhooks.list(req.developer!.id, { limit, offset });\n res.json({ data: result.data, total: result.total, limit, offset });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id — get webhook\n router.get('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await webhooks.get(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // PUT /:id — update webhook\n router.put('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await webhooks.update(req.params.id as string, req.developer!.id, req.body);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // DELETE /:id — delete webhook\n router.delete('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await webhooks.delete(req.params.id as string, req.developer!.id);\n res.status(204).send();\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Audit Routes — /agent/audit\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { SupabaseClient } from '@supabase/supabase-js';\n\ninterface AuditRouteDeps {\n db: SupabaseClient;\n}\n\nexport function agentAuditRoutes({ db }: AuditRouteDeps): Router {\n const router = Router();\n\n // GET /log — list audit log entries\n router.get('/log', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const limit = Math.min(parseInt(req.query.limit as string) || 20, 100);\n const offset = parseInt(req.query.offset as string) || 0;\n\n let query = db\n .from('audit_log')\n .select('*', { count: 'exact' })\n .eq('developer_id', req.developer!.id)\n .order('created_at', { ascending: false })\n .range(offset, offset + limit - 1);\n\n if (req.query.action) {\n query = query.eq('action', req.query.action as string);\n }\n if (req.query.resource_type) {\n query = query.eq('resource_type', req.query.resource_type as string);\n }\n\n const { data, error, count } = await query;\n if (error) throw error;\n res.json({ data: data ?? [], total: count ?? 0, limit, offset });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /log/:id — get audit entry\n router.get('/log/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const { data, error } = await db\n .from('audit_log')\n .select('*')\n .eq('id', req.params.id as string)\n .eq('developer_id', req.developer!.id)\n .single();\n\n if (error || !data) {\n res.status(404).json({ error: { code: 'not_found', message: 'Audit entry not found' } });\n return;\n }\n res.json({ data });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /export — export audit logs\n router.post('/export', async (req: Request, res: Response, next: NextFunction) => {\n try {\n let query = db\n .from('audit_log')\n .select('*')\n .eq('developer_id', req.developer!.id)\n .order('created_at', { ascending: false })\n .limit(1000);\n\n if (req.body.startDate) {\n query = query.gte('created_at', req.body.startDate);\n }\n if (req.body.endDate) {\n query = query.lte('created_at', req.body.endDate);\n }\n\n const { data, error } = await query;\n if (error) throw error;\n res.json({ data: data ?? [], exportedAt: new Date().toISOString() });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Admin Routes — /agent/admin\n// ---------------------------------------------------------------------------\n\nimport { createHash, randomBytes } from 'node:crypto';\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport { NotFoundError } from '../../lib/errors.js';\n\ninterface AdminRouteDeps {\n db: SupabaseClient;\n}\n\nexport function agentAdminRoutes({ db }: AdminRouteDeps): Router {\n const router = Router();\n\n // GET /whoami — developer profile\n router.get('/whoami', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const { data, error } = await db\n .from('developers')\n .select('id, email, plan, created_at')\n .eq('id', req.developer!.id)\n .single();\n\n if (error || !data) throw new NotFoundError('Developer', req.developer!.id);\n res.json({ data: { id: data.id, email: data.email, plan: data.plan, memberSince: data.created_at } });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /rotate-key — rotate API key\n router.post('/rotate-key', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const developer = req.developer!;\n const newKey = `lane_sk_${randomBytes(24).toString('hex')}`;\n const newHash = createHash('sha256').update(newKey).digest('hex');\n const graceExpiry = new Date(Date.now() + 15 * 60 * 1000).toISOString();\n\n await db\n .from('api_keys')\n .update({ revoked_at: graceExpiry })\n .eq('id', developer.keyId);\n\n const { error } = await db.from('api_keys').insert({\n developer_id: developer.id,\n key_hash: newHash,\n scopes: developer.scopes,\n rate_limit_rpm: developer.rateLimitRpm,\n test_mode: developer.testMode,\n });\n\n if (error) throw error;\n res.json({ data: { apiKey: newKey, expiresOldKeyAt: graceExpiry } });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /keys — list API keys\n router.get('/keys', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const { data, error } = await db\n .from('api_keys')\n .select('id, scopes, test_mode, rate_limit_rpm, created_at, last_used_at, revoked_at')\n .eq('developer_id', req.developer!.id)\n .order('created_at', { ascending: false });\n\n if (error) throw error;\n res.json({ data: data ?? [] });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Onboarding Routes — /agent/onboarding\n// ---------------------------------------------------------------------------\n\nimport { createHash, randomBytes } from 'node:crypto';\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { SupabaseClient } from '@supabase/supabase-js';\n\ninterface OnboardingRouteDeps {\n db: SupabaseClient;\n}\n\nexport function agentOnboardingRoutes({ db }: OnboardingRouteDeps): Router {\n const router = Router();\n\n // POST /generate-key — generate new API key\n router.post('/generate-key', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const newKey = `lane_sk_${randomBytes(24).toString('hex')}`;\n const keyHash = createHash('sha256').update(newKey).digest('hex');\n\n const { error } = await db.from('api_keys').insert({\n developer_id: req.developer!.id,\n key_hash: keyHash,\n scopes: ['*'],\n rate_limit_rpm: 60,\n test_mode: false,\n });\n\n if (error) throw error;\n res.status(201).json({ data: { apiKey: newKey, createdAt: new Date().toISOString() } });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /status — onboarding status\n router.get('/status', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const developerId = req.developer!.id;\n\n // Check API keys\n const { data: keys } = await db\n .from('api_keys')\n .select('id')\n .eq('developer_id', developerId)\n .is('revoked_at', null)\n .limit(1);\n\n // Check cards\n const { data: wallets } = await db\n .from('wallets')\n .select('id')\n .eq('developer_id', developerId)\n .limit(1);\n\n let hasCard = false;\n if (wallets && wallets.length > 0) {\n const { data: cards } = await db\n .from('cards')\n .select('id')\n .eq('wallet_id', wallets[0]!.id)\n .limit(1);\n hasCard = (cards ?? []).length > 0;\n }\n\n // Check budget\n const { data: budget } = await db\n .from('budgets')\n .select('id')\n .eq('developer_id', developerId)\n .limit(1);\n\n const hasApiKey = (keys ?? []).length > 0;\n const hasWallet = (wallets ?? []).length > 0;\n const hasBudget = (budget ?? []).length > 0;\n\n const completedSteps: string[] = [];\n if (hasApiKey) completedSteps.push('api_key');\n if (hasWallet) completedSteps.push('wallet');\n if (hasCard) completedSteps.push('card');\n if (hasBudget) completedSteps.push('budget');\n\n let nextStep: string | null = null;\n if (!hasApiKey) nextStep = 'api_key';\n else if (!hasWallet) nextStep = 'wallet';\n else if (!hasCard) nextStep = 'card';\n else if (!hasBudget) nextStep = 'budget';\n\n res.json({\n data: { hasApiKey, hasCard, hasBudget, completedSteps, nextStep },\n });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Delegation Routes — /api/sdk/delegations\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { IDelegationService } from '../lib/interfaces.js';\n\ninterface DelegationRouteDeps {\n delegations: IDelegationService;\n}\n\nexport function delegationRoutes({ delegations }: DelegationRouteDeps): Router {\n const router = Router();\n\n // POST / — create delegation\n router.post('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await delegations.delegate(req.developer!.id, req.body);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET / — list delegations (paginated, optional filters)\n router.get('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const limit = Math.min(parseInt(req.query.limit as string) || 20, 100);\n const offset = parseInt(req.query.offset as string) || 0;\n const agentId = req.query.agentId as string | undefined;\n const mandateId = req.query.mandateId as string | undefined;\n\n const result = await delegations.listDelegations(req.developer!.id, {\n agentId,\n mandateId,\n limit,\n offset,\n });\n res.json({ data: result.data, total: result.total, limit, offset });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id — get delegation\n router.get('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await delegations.getDelegation(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/revoke — revoke delegation\n router.post('/:id/revoke', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await delegations.revokeDelegation(req.params.id as string, req.developer!.id);\n res.json({ data: { status: 'revoked' } });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","import { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { IProtocolClientService } from '../lib/interfaces.js';\n\ninterface ProtocolRouteDeps {\n protocolClient: IProtocolClientService;\n}\n\nexport function protocolRoutes({ protocolClient }: ProtocolRouteDeps): Router {\n const router = Router();\n\n // POST /discover — Discover protocols for a domain\n router.post('/discover', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await protocolClient.discoverProtocols(req.body.domain);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /sessions — Create checkout session\n router.post('/sessions', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await protocolClient.createSession(req.developer!.id, req.body);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /sessions/:id/confirm — Confirm payment\n router.post('/sessions/:id/confirm', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await protocolClient.confirmPayment(req.params.id as string, req.body);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /sessions/:id — Get session status\n router.get('/sessions/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await protocolClient.getSessionStatus(req.params.id as string);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","import { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { IMastercardAPService } from '../lib/interfaces.js';\n\ninterface MastercardAPRouteDeps {\n mastercardAP: IMastercardAPService;\n}\n\nexport function mastercardAPRoutes({ mastercardAP }: MastercardAPRouteDeps): Router {\n const router = Router();\n\n router.post('/enroll', async (req, res, next) => {\n try { res.status(201).json({ data: await mastercardAP.enrollCredential(req.developer!.id, req.body) }); } catch (err) { next(err); }\n });\n\n router.post('/tokens/:id/verify', async (req, res, next) => {\n try { res.json({ data: await mastercardAP.verifyIdentity(req.params.id as string) }); } catch (err) { next(err); }\n });\n\n router.post('/tokens/:id/bind', async (req, res, next) => {\n try { res.json({ data: await mastercardAP.bindAuthenticator(req.params.id as string, req.body.authMethod) }); } catch (err) { next(err); }\n });\n\n router.post('/tokens/:id/intent', async (req, res, next) => {\n try { res.status(201).json({ data: await mastercardAP.createIntent(req.developer!.id, { tokenId: req.params.id as string, ...req.body }) }); } catch (err) { next(err); }\n });\n\n router.post('/intents/:id/authenticate', async (req, res, next) => {\n try { res.json({ data: await mastercardAP.authenticate(req.params.id as string) }); } catch (err) { next(err); }\n });\n\n router.post('/intents/:id/checkout', async (req, res, next) => {\n try { res.json({ data: await mastercardAP.checkout(req.params.id as string) }); } catch (err) { next(err); }\n });\n\n router.get('/tokens', async (req, res, next) => {\n try { res.json({ data: await mastercardAP.listNetworkTokens(req.developer!.id, req.query.walletId as string) }); } catch (err) { next(err); }\n });\n\n router.get('/tokens/:id', async (req, res, next) => {\n try { res.json({ data: await mastercardAP.getNetworkToken(req.params.id as string) }); } catch (err) { next(err); }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Identity Routes — /api/sdk/identity\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { IIdentityService } from '../lib/interfaces.js';\n\ninterface IdentityRouteDeps {\n identity: IIdentityService;\n}\n\nexport function identityRoutes({ identity }: IdentityRouteDeps): Router {\n const router = Router();\n\n // POST / — register identity\n router.post('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await identity.register(req.developer!.id, req.body);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/verify — verify identity\n router.post('/:id/verify', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await identity.verify(\n req.params.id as string,\n req.developer!.id,\n req.body.verificationCode,\n );\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET / — list identities (paginated)\n router.get('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const limit = Math.min(parseInt(req.query.limit as string) || 20, 100);\n const offset = parseInt(req.query.offset as string) || 0;\n const agentId = req.query.agentId as string | undefined;\n const status = req.query.status as string | undefined;\n\n const result = await identity.list(req.developer!.id, { agentId, status, limit, offset });\n res.json({ data: result.data, total: result.total, limit, offset });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id — get identity\n router.get('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await identity.get(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id/attestation — get attestation\n router.get('/:id/attestation', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await identity.getAttestation(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/attestation/refresh — refresh attestation\n router.post('/:id/attestation/refresh', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await identity.refreshAttestation(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/suspend — suspend identity\n router.post('/:id/suspend', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await identity.suspend(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/revoke — revoke identity\n router.post('/:id/revoke', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await identity.revoke(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Discovery Routes — /agent/discovery (public, no auth)\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\n\nexport function agentDiscoveryRoutes(): Router {\n const router = Router();\n\n // GET /info — API info / capabilities\n router.get('/info', (_req: Request, res: Response) => {\n res.json({\n data: {\n name: 'Lane Agent API',\n version: '2.0',\n capabilities: [\n 'wallet',\n 'card',\n 'instruction',\n 'token',\n 'transaction',\n 'budget',\n 'pay',\n 'user',\n 'merchant',\n 'checkout',\n 'product',\n 'subscription',\n 'fleet',\n 'team',\n 'webhook',\n 'audit',\n ],\n docsUrl: 'https://docs.getonlane.com',\n },\n });\n });\n\n // POST /signup-url — generate signup URL\n router.post('/signup-url', (req: Request, res: Response) => {\n const callbackUrl = req.body.callbackUrl ?? '';\n const baseSignup = 'https://api.getonlane.com/agent/signup';\n\n if (callbackUrl) {\n try {\n const parsed = new URL(callbackUrl);\n if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') {\n res.status(400).json({ error: { code: 'invalid_callback_url', message: 'callbackUrl must use http or https protocol' } });\n return;\n }\n } catch {\n res.status(400).json({ error: { code: 'invalid_callback_url', message: 'callbackUrl is not a valid URL' } });\n return;\n }\n }\n\n const url = callbackUrl ? `${baseSignup}?callback=${encodeURIComponent(callbackUrl)}` : baseSignup;\n res.json({ data: { url } });\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Auth Routes — /agent/auth (public, no auth required)\n// ---------------------------------------------------------------------------\n// CLI-initiated browser auth flow:\n// 1. POST /login → returns sessionId, authUrl, deviceCode\n// 2. POST /token → exchanges one-time code for API key\n// ---------------------------------------------------------------------------\n\nimport { createHash, randomBytes, randomUUID } from 'node:crypto';\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { SupabaseClient } from '@supabase/supabase-js';\n\n// Device code charset: no ambiguous I/O/0/1\nconst DEVICE_CODE_CHARS = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';\n\nfunction generateDeviceCode(): string {\n let code = '';\n const bytes = randomBytes(4);\n for (let i = 0; i < 4; i++) {\n code += DEVICE_CODE_CHARS[bytes[i]! % DEVICE_CODE_CHARS.length];\n }\n return `LANE-${code}`;\n}\n\ninterface AgentAuthRouteDeps {\n db: SupabaseClient;\n}\n\nexport function agentAuthRoutes({ db }: AgentAuthRouteDeps): Router {\n const router = Router();\n\n // POST /login — initiate browser auth session\n router.post('/login', async (_req: Request, res: Response, next: NextFunction) => {\n try {\n const sessionId = randomUUID();\n const deviceCode = generateDeviceCode();\n const expiresAt = new Date(Date.now() + 10 * 60 * 1000).toISOString(); // 10 min\n\n // Store session in auth_sessions table\n const { error } = await db.from('auth_sessions').insert({\n id: sessionId,\n device_code: deviceCode,\n status: 'pending',\n expires_at: expiresAt,\n });\n\n if (error) throw error;\n\n const walletUrl = process.env['WALLET_APP_URL'] ?? 'https://api.getonlane.com';\n const authUrl = `${walletUrl}/authorize?s=${sessionId}`;\n\n res.json({\n sessionId,\n authUrl,\n deviceCode,\n });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /token — exchange one-time code for API key\n router.post('/token', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const { code, sessionId } = req.body as { code?: string; sessionId?: string };\n\n if (!code || !sessionId) {\n res.status(400).json({\n error: { code: 'validation', message: 'code and sessionId are required' },\n });\n return;\n }\n\n // Look up auth session\n const { data: session, error: sessionError } = await db\n .from('auth_sessions')\n .select('*')\n .eq('id', sessionId)\n .single();\n\n if (sessionError || !session) {\n res.status(401).json({\n error: { code: 'invalid_code', message: 'Auth session not found' },\n });\n return;\n }\n\n // Check expiry\n if (new Date(session.expires_at) < new Date()) {\n res.status(410).json({\n error: { code: 'session_expired', message: 'Auth session has expired' },\n });\n return;\n }\n\n // Check status\n if (session.status !== 'completed') {\n res.status(401).json({\n error: { code: 'invalid_code', message: 'Auth session not completed' },\n });\n return;\n }\n\n // Check code matches\n if (session.auth_code !== code) {\n res.status(401).json({\n error: { code: 'invalid_code', message: 'Auth code is invalid' },\n });\n return;\n }\n\n // Mark session as consumed (single-use)\n await db\n .from('auth_sessions')\n .update({ status: 'consumed' })\n .eq('id', sessionId);\n\n res.json({\n apiKey: session.api_key,\n developerId: session.developer_id,\n });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /complete-session — complete a CLI auth session (called by wallet /authorize page)\n // Accepts { sessionId, userId, email } — looks up or creates the developer record,\n // ensures an API key exists, and marks the session as completed.\n router.post('/complete-session', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const { sessionId, userId, email } = req.body as {\n sessionId?: string;\n userId?: string;\n email?: string;\n };\n\n if (!sessionId || !userId || !email) {\n res.status(400).json({\n error: { code: 'validation', message: 'sessionId, userId, and email are required' },\n });\n return;\n }\n\n // Verify session exists and is pending\n const { data: session, error: sessionError } = await db\n .from('auth_sessions')\n .select('*')\n .eq('id', sessionId)\n .single();\n\n if (sessionError || !session) {\n res.status(404).json({\n error: { code: 'session_not_found', message: 'Auth session not found' },\n });\n return;\n }\n\n if (session.status !== 'pending') {\n res.status(409).json({\n error: { code: 'session_already_used', message: `Session is already ${session.status}` },\n });\n return;\n }\n\n // Check expiry\n if (new Date(session.expires_at) < new Date()) {\n await db.from('auth_sessions').update({ status: 'expired', updated_at: new Date().toISOString() }).eq('id', sessionId);\n res.status(410).json({\n error: { code: 'session_expired', message: 'Auth session has expired' },\n });\n return;\n }\n\n // Look up or create the developer record from Supabase auth user\n let { data: developer } = await db\n .from('developers')\n .select('id')\n .eq('auth_user_id', userId)\n .single();\n\n if (!developer) {\n // First-time login — create developer record\n // Grant sdk_access immediately: user completed full device-code auth flow\n const { data: newDev, error: insertErr } = await db\n .from('developers')\n .insert({\n auth_user_id: userId,\n email,\n name: email.split('@')[0], // default name from email\n sdk_access: true,\n })\n .select('id')\n .single();\n\n if (insertErr) throw insertErr;\n developer = newDev;\n } else {\n // Existing developer re-authenticating — ensure sdk_access is granted\n await db.from('developers').update({ sdk_access: true }).eq('id', developer.id);\n }\n\n const developerId = developer!.id;\n\n // Generate a fresh API key for this CLI login session.\n // Each login produces a new key — the plaintext is only available at creation time.\n const newKey = `lane_sk_${randomBytes(24).toString('hex')}`;\n const keyHash = createHash('sha256').update(newKey).digest('hex');\n const keyPrefix = newKey.slice(0, 15); // \"lane_sk_\" + first 7 hex chars\n\n const { error: keyErr } = await db.from('api_keys').insert({\n developer_id: developerId,\n name: 'CLI Login',\n key_hash: keyHash,\n key_prefix: keyPrefix,\n environment: 'test',\n });\n\n if (keyErr) throw keyErr;\n\n // Generate one-time auth code\n const code = randomUUID();\n\n // Update session to completed\n const { error: updateError } = await db\n .from('auth_sessions')\n .update({\n status: 'completed',\n auth_code: code,\n api_key: newKey,\n developer_id: developerId,\n updated_at: new Date().toISOString(),\n })\n .eq('id', sessionId);\n\n if (updateError) throw updateError;\n\n // Log to audit trail\n await db.from('audit_log').insert({\n developer_id: developerId,\n action: 'cli_auth_completed',\n resource_type: 'auth_session',\n resource_id: sessionId,\n metadata: {\n user_id: userId,\n email,\n auth_method: 'device_code',\n },\n }).then(() => { /* audit log is best-effort */ });\n\n res.json({ code });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /device-status — poll for device code (used by browser)\n router.get('/device-status', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const sessionId = req.query.s as string;\n\n if (!sessionId) {\n res.status(400).json({\n error: { code: 'validation', message: 'Session ID (s) is required' },\n });\n return;\n }\n\n const { data: session, error } = await db\n .from('auth_sessions')\n .select('device_code, status')\n .eq('id', sessionId)\n .single();\n\n if (error || !session) {\n res.status(404).json({\n error: { code: 'session_not_found', message: 'Auth session not found' },\n });\n return;\n }\n\n res.json({\n deviceCode: session.device_code,\n status: session.status,\n });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /verify-sdk-access — check if developer is whitelisted for SDK access\n // Called by Lane.create() / Lane.fromApiKey() before allowing SDK usage.\n // Checks developers.sdk_access column in Supabase.\n router.post('/verify-sdk-access', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const authHeader = req.headers.authorization;\n if (!authHeader || !authHeader.startsWith('Bearer ')) {\n res.status(401).json({ error: { code: 'no_key', message: 'API key required' } });\n return;\n }\n\n const apiKey = authHeader.slice(7);\n const keyHash = createHash('sha256').update(apiKey).digest('hex');\n\n // Look up the API key and join to developer\n const { data, error } = await db\n .from('api_keys')\n .select('developer_id, revoked_at, developers(id, sdk_access, status)')\n .eq('key_hash', keyHash)\n .limit(1)\n .single();\n\n if (error || !data) {\n res.status(401).json({ error: { code: 'invalid_key', message: 'Invalid API key' } });\n return;\n }\n\n // Check if key is revoked\n if (data.revoked_at && new Date(data.revoked_at).getTime() <= Date.now()) {\n res.status(401).json({ error: { code: 'revoked_key', message: 'API key has been revoked' } });\n return;\n }\n\n const dev = data.developers as unknown as { id: string; sdk_access: boolean; status: string } | null;\n\n if (!dev || dev.status !== 'active') {\n res.status(403).json({ error: { code: 'account_inactive', message: 'Developer account is not active' } });\n return;\n }\n\n if (!dev.sdk_access) {\n res.status(403).json({ error: { code: 'waitlist', message: 'SDK access not yet granted. Join the waitlist at https://app.getonlane.com/agents' } });\n return;\n }\n\n res.json({ access: true, developerId: dev.id });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n"],"mappings":"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","names":["ErrorCode","import_express","OwnershipError","data","error","remaining","import_node_crypto","import_node_crypto","import_node_crypto","crypto","import_node_crypto","DSP_ID","crypto","import_node_crypto","crypto","import_node_crypto","crypto","import_node_crypto","crypto","import_node_crypto","resolve","crypto","import_node_crypto","crypto","LogLevel","import_node_crypto","dev","import_node_crypto","import_node_crypto","import_node_crypto","import_express","import_express","import_express","import_express","import_node_crypto","import_express","import_express","import_express","import_express","import_express","import_express","import_express","import_express","import_express","import_express","import_express","import_express","import_express","import_express","import_express","import_express","import_express","import_express","import_node_crypto","import_express","import_node_crypto","import_express","import_express","import_express","import_express","import_express","import_express","import_node_crypto","import_express","express"]}
|
|
1
|
+
{"version":3,"sources":["../../../server/lib/errors.ts","../../../server/routes/export.ts","../../../server/lib/base-service.ts","../../../server/services/token-service.ts","../../../server/services/budget-service.ts","../../../server/services/card-service.ts","../../../server/services/profile-service.ts","../../../server/services/merchant-account-service.ts","../../../server/services/vgs-proxy-service.ts","../../../server/services/wallet-service.ts","../../../server/services/payment-service.ts","../../../server/services/merchant-directory-service.ts","../../../server/services/instruction-service.ts","../../../server/services/user-service.ts","../../../server/services/fleet-service.ts","../../../server/services/team-service.ts","../../../server/services/webhook-service.ts","../../../server/services/subscription-service.ts","../../../server/services/checkout-service.ts","../../../server/services/agent-service.ts","../../../server/services/identity-service.ts","../../../server/services/delegation-service.ts","../../../server/services/mandate-service.ts","../../../server/services/vic-service.ts","../../../server/services/mastercard-ap-service.ts","../../../server/services/protocol-client-service.ts","../../../server/services/protocol-adapters/acp-adapter.ts","../../../server/services/protocol-adapters/ucp-adapter.ts","../../../server/services/protocol-adapters/x402-adapter.ts","../../../server/services/protocol-adapters/rye-adapter.ts","../../../server/lib/retry.ts","../../../server/services/protocol-adapters/browser-use-adapter.ts","../../../server/lib/service-container.ts","../../../server/lib/logger.ts","../../../server/middleware/api-key-auth.ts","../../../server/middleware/hmac-verify.ts","../../../server/middleware/rate-limit.ts","../../../server/middleware/audit.ts","../../../server/middleware/deprecation.ts","../../../server/routes/auth.ts","../../../server/routes/wallets.ts","../../../server/routes/pay.ts","../../../server/middleware/velocity-limit.ts","../../../server/routes/admin.ts","../../../server/routes/merchants.ts","../../../server/routes/onboarding.ts","../../../server/routes/agent/index.ts","../../../server/routes/agent/wallet.ts","../../../server/routes/agent/card.ts","../../../server/routes/agent/instruction.ts","../../../server/routes/agent/token.ts","../../../server/routes/agent/transaction.ts","../../../server/routes/agent/budget.ts","../../../server/routes/agent/pay.ts","../../../server/routes/agent/user.ts","../../../server/routes/agent/merchant.ts","../../../server/routes/agent/checkout.ts","../../../server/routes/agent/product.ts","../../../server/routes/agent/subscription.ts","../../../server/routes/agent/fleet.ts","../../../server/routes/agent/team.ts","../../../server/routes/agent/webhook.ts","../../../server/routes/agent/audit.ts","../../../server/routes/agent/admin.ts","../../../server/routes/agent/onboarding.ts","../../../server/routes/delegations.ts","../../../server/routes/protocol.ts","../../../server/routes/mastercard-ap.ts","../../../server/routes/identity.ts","../../../server/routes/agent/discovery.ts","../../../server/routes/agent/auth.ts"],"sourcesContent":["// ---------------------------------------------------------------------------\n// Errors — Structured Error Hierarchy\n// ---------------------------------------------------------------------------\n// All server errors extend ServiceError with machine-readable codes,\n// HTTP status codes, and retryability hints.\n// ---------------------------------------------------------------------------\n\nexport enum ErrorCode {\n // Auth\n INVALID_API_KEY = 'invalid_api_key',\n REVOKED_API_KEY = 'revoked_api_key',\n INSUFFICIENT_SCOPE = 'insufficient_scope',\n HMAC_VERIFICATION_FAILED = 'hmac_verification_failed',\n\n // Rate limiting\n RATE_LIMIT_EXCEEDED = 'rate_limit_exceeded',\n\n // Validation\n VALIDATION_ERROR = 'validation_error',\n MISSING_REQUIRED_FIELD = 'missing_required_field',\n INVALID_FORMAT = 'invalid_format',\n\n // Resources\n NOT_FOUND = 'not_found',\n CONFLICT = 'conflict',\n OWNERSHIP_VIOLATION = 'ownership_violation',\n\n // Tokens\n TOKEN_EXPIRED = 'token_expired',\n TOKEN_ALREADY_USED = 'token_already_used',\n TOKEN_REVOKED = 'token_revoked',\n TOKEN_AMOUNT_EXCEEDED = 'token_amount_exceeded',\n\n // Budget\n BUDGET_EXCEEDED = 'budget_exceeded',\n DAILY_LIMIT_EXCEEDED = 'daily_limit_exceeded',\n WEEKLY_LIMIT_EXCEEDED = 'weekly_limit_exceeded',\n MONTHLY_LIMIT_EXCEEDED = 'monthly_limit_exceeded',\n PER_TASK_LIMIT_EXCEEDED = 'per_task_limit_exceeded',\n BUDGET_CAP_EXCEEDED = 'budget_cap_exceeded',\n PAYMENTS_PAUSED = 'payments_paused',\n REFUND_LIMIT_EXCEEDED = 'refund_limit_exceeded',\n CUMULATIVE_REFUND_EXCEEDED = 'cumulative_refund_exceeded',\n MERCHANT_BLOCKED = 'merchant_blocked',\n MERCHANT_NOT_ALLOWED = 'merchant_not_allowed',\n\n // Payment\n PAYMENT_FAILED = 'payment_failed',\n PROXY_ERROR = 'proxy_error',\n PSP_DECLINED = 'psp_declined',\n IDEMPOTENCY_CONFLICT = 'idempotency_conflict',\n NO_PAYMENT_METHOD = 'no_payment_method',\n REFUND_FAILED = 'refund_failed',\n TRANSACTION_NOT_REFUNDABLE = 'transaction_not_refundable',\n\n // VGS\n VGS_TOKEN_REFRESH_FAILED = 'vgs_token_refresh_failed',\n VGS_PROXY_FAILED = 'vgs_proxy_failed',\n VGS_VAULT_NOT_CONFIGURED = 'vgs_vault_not_configured',\n\n // Mandates\n MANDATE_VIOLATED = 'mandate_violated',\n MANDATE_EXPIRED = 'mandate_expired',\n MANDATE_CATEGORY_BLOCKED = 'mandate_category_blocked',\n MANDATE_AMOUNT_EXCEEDED = 'mandate_amount_exceeded',\n MANDATE_MERCHANT_BLOCKED = 'mandate_merchant_blocked',\n MANDATE_ATTRIBUTE_VIOLATED = 'mandate_attribute_violated',\n\n // Delegation\n DELEGATION_INVALID = 'delegation_invalid',\n DELEGATION_CHAIN_BROKEN = 'delegation_chain_broken',\n\n // Confirmation\n CONFIRMATION_REQUIRED = 'confirmation_required',\n\n // Protocol\n PROTOCOL_NOT_SUPPORTED = 'protocol_not_supported',\n PROTOCOL_SESSION_FAILED = 'protocol_session_failed',\n PROTOCOL_SESSION_EXPIRED = 'protocol_session_expired',\n\n // Network Tokens\n NETWORK_TOKEN_FAILED = 'network_token_failed',\n\n // Internal\n INTERNAL_ERROR = 'internal_error',\n DATABASE_ERROR = 'database_error',\n SERVICE_UNAVAILABLE = 'service_unavailable',\n}\n\n/**\n * Base error for all Lane server errors. Carries a machine-readable code,\n * an HTTP status code, and a retryable flag.\n */\nexport class ServiceError extends Error {\n readonly code: ErrorCode;\n readonly statusCode: number;\n readonly retryable: boolean;\n readonly details?: Record<string, unknown>;\n\n constructor(\n message: string,\n code: ErrorCode,\n statusCode: number = 500,\n retryable: boolean = false,\n details?: Record<string, unknown>,\n ) {\n super(message);\n this.name = 'ServiceError';\n this.code = code;\n this.statusCode = statusCode;\n this.retryable = retryable;\n this.details = details;\n }\n}\n\nexport class AuthError extends ServiceError {\n constructor(message: string, code: ErrorCode = ErrorCode.INVALID_API_KEY, details?: Record<string, unknown>) {\n super(message, code, 401, false, details);\n this.name = 'AuthError';\n }\n}\n\nexport class ForbiddenError extends ServiceError {\n constructor(message: string, code: ErrorCode = ErrorCode.INSUFFICIENT_SCOPE, details?: Record<string, unknown>) {\n super(message, code, 403, false, details);\n this.name = 'ForbiddenError';\n }\n}\n\nexport class ValidationError extends ServiceError {\n constructor(message: string, details?: Record<string, unknown>) {\n super(message, ErrorCode.VALIDATION_ERROR, 400, false, details);\n this.name = 'ValidationError';\n }\n}\n\nexport class NotFoundError extends ServiceError {\n constructor(resource: string, id?: string) {\n const msg = id ? `${resource} '${id}' not found` : `${resource} not found`;\n super(msg, ErrorCode.NOT_FOUND, 404, false, { resource, id });\n this.name = 'NotFoundError';\n }\n}\n\nexport class OwnershipError extends ServiceError {\n constructor(resource: string, id: string) {\n super(\n `${resource} '${id}' does not belong to the authenticated developer`,\n ErrorCode.OWNERSHIP_VIOLATION,\n 403,\n false,\n { resource, id },\n );\n this.name = 'OwnershipError';\n }\n}\n\nexport class BudgetError extends ServiceError {\n constructor(message: string, code: ErrorCode = ErrorCode.BUDGET_EXCEEDED, details?: Record<string, unknown>) {\n super(message, code, 403, false, details);\n this.name = 'BudgetError';\n }\n}\n\nexport class PaymentError extends ServiceError {\n readonly transactionId?: string;\n\n constructor(\n message: string,\n code: ErrorCode = ErrorCode.PAYMENT_FAILED,\n details?: Record<string, unknown> & { transactionId?: string },\n ) {\n super(message, code, 402, false, details);\n this.name = 'PaymentError';\n this.transactionId = details?.transactionId;\n }\n}\n\nexport class TokenError extends ServiceError {\n constructor(message: string, code: ErrorCode = ErrorCode.TOKEN_EXPIRED) {\n super(message, code, 403, false);\n this.name = 'TokenError';\n }\n}\n\nexport class ConflictError extends ServiceError {\n constructor(message: string, details?: Record<string, unknown>) {\n super(message, ErrorCode.CONFLICT, 409, false, details);\n this.name = 'ConflictError';\n }\n}\n\nexport class MandateError extends ServiceError {\n constructor(message: string, code: ErrorCode = ErrorCode.MANDATE_VIOLATED, details?: Record<string, unknown>) {\n super(message, code, 403, false, details);\n this.name = 'MandateError';\n }\n}\n\nexport class DatabaseError extends ServiceError {\n constructor(message: string, originalError?: unknown) {\n super(message, ErrorCode.DATABASE_ERROR, 500, true, {\n original: originalError instanceof Error ? originalError.message : String(originalError),\n });\n this.name = 'DatabaseError';\n }\n}\n\nexport class ConfirmationRequiredError extends ForbiddenError {\n constructor(instructionId?: string) {\n super(\n 'Biometric confirmation required before accessing credentials.',\n ErrorCode.CONFIRMATION_REQUIRED,\n instructionId ? { instructionId } : undefined,\n );\n this.name = 'ConfirmationRequiredError';\n }\n}\n","// ---------------------------------------------------------------------------\n// Lane Agent Routes — Package Export\n// ---------------------------------------------------------------------------\n// Factory function that creates all /agent/* routes as an Express Router.\n// Used by the lane-gateway to mount agent routes under api.getonlane.com.\n// ---------------------------------------------------------------------------\n\nimport express from 'express';\nimport { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { SupabaseClient } from '@supabase/supabase-js';\n\nimport { ServiceContainer } from '../lib/service-container.js';\nimport { Logger, LogLevel } from '../lib/logger.js';\n\nimport { apiKeyAuth } from '../middleware/api-key-auth.js';\nimport { hmacVerify } from '../middleware/hmac-verify.js';\nimport { rateLimit } from '../middleware/rate-limit.js';\nimport { audit } from '../middleware/audit.js';\nimport { deprecation } from '../middleware/deprecation.js';\n\nimport { authRoutes } from './auth.js';\nimport { walletRoutes } from './wallets.js';\nimport { payRoutes } from './pay.js';\nimport { adminRoutes } from './admin.js';\nimport { merchantRoutes } from './merchants.js';\nimport { sessionRoutes, onboardingRoutes } from './onboarding.js';\nimport { discoveryRoutes } from './discovery.js';\nimport { protocolRoutes } from './protocol.js';\nimport { vicRoutes } from './vic.js';\nimport { mastercardAPRoutes } from './mastercard-ap.js';\nimport { mandateRoutes } from './mandates.js';\nimport { agentRoutes } from './agents.js';\nimport { identityRoutes } from './identity.js';\nimport { delegationRoutes } from './delegations.js';\n\nimport { createAgentRoutes } from './agent/index.js';\nimport { agentDiscoveryRoutes } from './agent/discovery.js';\nimport { agentAuthRoutes } from './agent/auth.js';\n\nexport interface AgentRouteDeps {\n db: SupabaseClient;\n logLevel?: keyof typeof LogLevel;\n}\n\n// Singleton container — created once, reused across calls\nlet _container: ServiceContainer | null = null;\nlet _logger: Logger | null = null;\n\nfunction getContainer(db: SupabaseClient, logLevel?: keyof typeof LogLevel): { container: ServiceContainer; logger: Logger } {\n if (!_logger) {\n _logger = new Logger(LogLevel[logLevel ?? 'INFO'] ?? LogLevel.INFO);\n }\n if (!_container) {\n _container = new ServiceContainer(db, _logger);\n }\n return { container: _container, logger: _logger };\n}\n\n/**\n * Create all agent routes as an Express Router.\n *\n * Mounts:\n * - /health (public — service health check)\n * - /SKILL.md (public — MCP skill file)\n * - /agent/discovery/* (public)\n * - /agent/auth/* (public)\n * - /agent/onboarding/* (protected)\n * - /agent/* (protected — apiKeyAuth, rateLimit, hmacVerify, audit)\n * - /api/sdk/onboarding (public sessions)\n * - /api/sdk/* (deprecated legacy routes)\n */\nexport function createAllAgentRoutes({ db, logLevel }: AgentRouteDeps): express.Router {\n const router = express.Router();\n const { container, logger } = getContainer(db, logLevel);\n\n // Health check (no auth) — available at both /health and /api/health\n const healthHandler: express.RequestHandler = async (_req, res) => {\n const health = await container.healthCheck();\n const statusCode = health.healthy ? 200 : 503;\n res.status(statusCode).json({\n status: health.healthy ? 'ok' : 'degraded',\n timestamp: new Date().toISOString(),\n services: health.services,\n });\n };\n router.get('/health', healthHandler);\n router.get('/api/health', healthHandler);\n\n // Public SKILL.md endpoint\n router.get('/SKILL.md', (_req, res) => {\n try {\n const skillPath = resolve(process.cwd(), 'SKILL.md');\n const content = readFileSync(skillPath, 'utf-8');\n res.setHeader('Content-Type', 'text/markdown; charset=utf-8');\n res.send(content);\n } catch {\n res.status(404).json({ error: 'SKILL.md not found' });\n }\n });\n\n // Public routes (no auth required)\n router.use('/agent/discovery', agentDiscoveryRoutes());\n router.use('/agent/auth', agentAuthRoutes({ db }));\n\n // Public onboarding sessions\n router.use('/api/sdk/onboarding', sessionRoutes(db, logger));\n\n // Protected /agent/ routes (new API)\n const protectedAgent = express.Router();\n protectedAgent.use(apiKeyAuth(db, logger));\n protectedAgent.use(rateLimit(logger));\n protectedAgent.use(hmacVerify(db, logger));\n protectedAgent.use(audit(db, logger));\n protectedAgent.use('/', createAgentRoutes(container, db, logger));\n router.use('/agent', protectedAgent);\n\n // Protected onboarding routes\n const protectedOnboarding = express.Router();\n protectedOnboarding.use(apiKeyAuth(db, logger));\n protectedOnboarding.use('/', onboardingRoutes({ db }));\n router.use('/agent/onboarding', protectedOnboarding);\n\n // Legacy /api/sdk routes (deprecated)\n const legacyRouter = express.Router();\n legacyRouter.use(apiKeyAuth(db, logger));\n legacyRouter.use(rateLimit(logger));\n legacyRouter.use(hmacVerify(db, logger));\n legacyRouter.use(audit(db, logger));\n\n legacyRouter.use('/auth', authRoutes({ db }));\n legacyRouter.use('/wallets', walletRoutes({\n wallets: container.wallets,\n cards: container.cards,\n profiles: container.profiles,\n merchantAccounts: container.merchantAccounts,\n }));\n legacyRouter.use('/pay', payRoutes({\n tokens: container.tokens,\n payments: container.payments,\n budgets: container.budgets,\n db,\n logger,\n }));\n legacyRouter.use('/admin', adminRoutes({\n budgets: container.budgets,\n }));\n legacyRouter.use('/merchants', merchantRoutes({\n merchantDirectory: container.merchantDirectory,\n }));\n legacyRouter.use('/onboarding', onboardingRoutes({ db }));\n\n router.use('/api/sdk', deprecation(logger), legacyRouter);\n\n return router;\n}\n\n/**\n * Initialize all services in the container.\n * Call this once at startup before handling requests.\n */\nexport async function initAgentServices({ db, logLevel }: AgentRouteDeps): Promise<void> {\n const { container } = getContainer(db, logLevel);\n await container.startAll();\n}\n","// ---------------------------------------------------------------------------\n// BaseService — Abstract Foundation for All Services\n// ---------------------------------------------------------------------------\n// Provides lifecycle management, structured logging, error wrapping, and\n// database access patterns that every service inherits.\n// ---------------------------------------------------------------------------\n\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from './logger.js';\nimport { DatabaseError, ServiceError } from './errors.js';\n\nexport interface ServiceHealth {\n healthy: boolean;\n service: string;\n details?: Record<string, unknown>;\n}\n\n/**\n * Abstract base class for all Lane services.\n *\n * Every service gets:\n * - A child logger with the service name pre-bound\n * - Structured error wrapping via `withErrorHandling`\n * - Wallet/resource ownership validation via `verifyOwnership`\n * - Lifecycle hooks (onStart, onStop, healthCheck)\n * - Access to the Supabase client via `this.db`\n */\nexport abstract class BaseService {\n protected readonly db: SupabaseClient;\n protected readonly log: ILogger;\n\n /** Human-readable service name for logs and health checks. */\n abstract readonly serviceName: string;\n\n constructor(db: SupabaseClient, logger: ILogger) {\n this.db = db;\n this.log = logger;\n }\n\n // -------------------------------------------------------------------------\n // Lifecycle\n // -------------------------------------------------------------------------\n\n /** Called once during server startup. Override to validate connections, warm caches, etc. */\n async onStart(): Promise<void> {\n this.log.info(`${this.serviceName} started`);\n }\n\n /** Called during graceful shutdown. Override to flush buffers, close connections, etc. */\n async onStop(): Promise<void> {\n this.log.info(`${this.serviceName} stopped`);\n }\n\n /** Health check. Override to add service-specific checks. */\n async healthCheck(): Promise<ServiceHealth> {\n return { healthy: true, service: this.serviceName };\n }\n\n // -------------------------------------------------------------------------\n // Error handling\n // -------------------------------------------------------------------------\n\n /**\n * Execute an async operation with structured error handling and logging.\n * Wraps raw database/network errors into ServiceError types.\n */\n protected async withErrorHandling<T>(\n operation: string,\n fn: () => Promise<T>,\n context?: Record<string, unknown>,\n ): Promise<T> {\n try {\n return await fn();\n } catch (err) {\n // If it's already a ServiceError, re-throw as-is (it has code + status)\n if (err instanceof ServiceError) {\n this.log.warn(`${operation} failed: ${err.message}`, {\n service: this.serviceName,\n code: err.code,\n ...context,\n });\n throw err;\n }\n\n // Wrap unknown errors\n const message = err instanceof Error ? err.message : String(err);\n this.log.error(`${operation} failed unexpectedly`, err, {\n service: this.serviceName,\n operation,\n ...context,\n });\n throw new DatabaseError(`${operation}: ${message}`, err);\n }\n }\n\n // -------------------------------------------------------------------------\n // Ownership validation\n // -------------------------------------------------------------------------\n\n /**\n * Verify that a resource belongs to the given developer.\n * Throws OwnershipError if not.\n */\n protected async verifyOwnership(\n table: string,\n resourceId: string,\n developerId: string,\n resourceLabel: string = table,\n ): Promise<void> {\n const { data, error } = await this.db\n .from(table)\n .select('id')\n .eq('id', resourceId)\n .eq('developer_id', developerId)\n .limit(1)\n .single();\n\n if (error || !data) {\n const { OwnershipError } = await import('./errors.js');\n throw new OwnershipError(resourceLabel, resourceId);\n }\n }\n\n /**\n * Verify that a wallet belongs to the developer. Common enough to\n * warrant its own helper.\n */\n protected async verifyWalletOwnership(walletId: string, developerId: string): Promise<void> {\n return this.verifyOwnership('wallets', walletId, developerId, 'Wallet');\n }\n}\n","// ---------------------------------------------------------------------------\n// Token Service — Agentic Token Lifecycle\n// ---------------------------------------------------------------------------\n// Creates, validates, consumes, and revokes scoped single-use payment\n// authorization tokens for AI agents.\n// ---------------------------------------------------------------------------\n\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport { BaseService } from '../lib/base-service.js';\nimport type { ILogger } from '../lib/logger.js';\nimport type { ITokenService, AgenticTokenRow, CreateTokenParams } from '../lib/interfaces.js';\nimport { TokenError, NotFoundError, ValidationError, ErrorCode } from '../lib/errors.js';\n\nexport class TokenService extends BaseService implements ITokenService {\n readonly serviceName = 'TokenService';\n\n constructor(db: SupabaseClient, logger: ILogger) {\n super(db, logger);\n }\n\n /**\n * Create a new agentic token. Validates that the wallet belongs to the developer.\n */\n async createToken(\n developerId: string,\n params: CreateTokenParams,\n ): Promise<AgenticTokenRow> {\n return this.withErrorHandling('createToken', async () => {\n await this.verifyWalletOwnership(params.walletId, developerId);\n\n const expiresAt = this.computeExpiry(params.expiresIn ?? '1h');\n\n const { data, error } = await this.db\n .from('agentic_tokens')\n .insert({\n wallet_id: params.walletId,\n developer_id: developerId,\n amount: params.amount,\n currency: params.currency ?? 'USD',\n merchant: params.merchant ?? null,\n permissions: params.permissions ?? [],\n status: 'active',\n expires_at: expiresAt.toISOString(),\n })\n .select()\n .single();\n\n if (error || !data) {\n throw new TokenError(\n `Failed to create agentic token: ${error?.message}`,\n ErrorCode.TOKEN_EXPIRED,\n );\n }\n\n this.log.info('Token created', {\n tokenId: data.id,\n walletId: params.walletId,\n developerId,\n amount: params.amount,\n });\n\n return data as AgenticTokenRow;\n }, { developerId, walletId: params.walletId });\n }\n\n /**\n * Validate a token: checks status and expiry. Returns the token if valid.\n */\n async validateToken(tokenId: string): Promise<AgenticTokenRow> {\n return this.withErrorHandling('validateToken', async () => {\n const { data, error } = await this.db\n .from('agentic_tokens')\n .select('*')\n .eq('id', tokenId)\n .single();\n\n if (error || !data) {\n throw new NotFoundError('Token', tokenId);\n }\n\n const token = data as AgenticTokenRow;\n\n if (token.status === 'used') {\n throw new TokenError('Token has already been used', ErrorCode.TOKEN_ALREADY_USED);\n }\n\n if (token.status === 'revoked') {\n throw new TokenError('Token has been revoked', ErrorCode.TOKEN_REVOKED);\n }\n\n if (token.status !== 'active') {\n throw new TokenError(`Token is ${token.status}`, ErrorCode.TOKEN_EXPIRED);\n }\n\n if (new Date(token.expires_at) < new Date()) {\n // Mark as expired\n await this.db\n .from('agentic_tokens')\n .update({ status: 'expired' })\n .eq('id', tokenId);\n throw new TokenError('Token has expired', ErrorCode.TOKEN_EXPIRED);\n }\n\n return token;\n }, { tokenId });\n }\n\n /**\n * Consume a token: marks as 'used' and links to the transaction.\n */\n async consumeToken(\n tokenId: string,\n transactionId: string,\n ): Promise<void> {\n return this.withErrorHandling('consumeToken', async () => {\n const { error } = await this.db\n .from('agentic_tokens')\n .update({\n status: 'used',\n used_at: new Date().toISOString(),\n transaction_id: transactionId,\n })\n .eq('id', tokenId)\n .eq('status', 'active');\n\n if (error) {\n throw new TokenError(\n `Failed to consume token: ${error.message}`,\n ErrorCode.TOKEN_ALREADY_USED,\n );\n }\n\n this.log.info('Token consumed', { tokenId, transactionId });\n }, { tokenId, transactionId });\n }\n\n /**\n * Revoke a token.\n */\n async revokeToken(tokenId: string): Promise<void> {\n return this.withErrorHandling('revokeToken', async () => {\n const { error } = await this.db\n .from('agentic_tokens')\n .update({ status: 'revoked' })\n .eq('id', tokenId)\n .eq('status', 'active');\n\n if (error) {\n throw new TokenError(\n `Failed to revoke token: ${error.message}`,\n ErrorCode.TOKEN_REVOKED,\n );\n }\n\n this.log.info('Token revoked', { tokenId });\n }, { tokenId });\n }\n\n /**\n * Expire all stale active tokens past their expiry. Intended for background cleanup.\n */\n async expireStaleTokens(): Promise<number> {\n return this.withErrorHandling('expireStaleTokens', async () => {\n const { data, error } = await this.db\n .from('agentic_tokens')\n .update({ status: 'expired' })\n .eq('status', 'active')\n .lt('expires_at', new Date().toISOString())\n .select('id');\n\n if (error) {\n throw new TokenError(\n `Failed to expire stale tokens: ${error.message}`,\n ErrorCode.TOKEN_EXPIRED,\n );\n }\n\n const count = data?.length ?? 0;\n if (count > 0) {\n this.log.info('Expired stale tokens', { count });\n }\n\n return count;\n });\n }\n\n async listTokens(developerId: string, params?: { limit?: number; offset?: number }): Promise<{ data: AgenticTokenRow[]; total: number }> {\n return this.withErrorHandling('token.list', async () => {\n const limit = Math.min(params?.limit ?? 20, 100);\n const offset = params?.offset ?? 0;\n const { data, error, count } = await this.db\n .from('agentic_tokens')\n .select('*', { count: 'exact' })\n .eq('developer_id', developerId)\n .order('created_at', { ascending: false })\n .range(offset, offset + limit - 1);\n if (error) throw error;\n return { data: (data ?? []) as AgenticTokenRow[], total: count ?? 0 };\n });\n }\n\n async getToken(tokenId: string, developerId: string): Promise<AgenticTokenRow> {\n return this.withErrorHandling('token.get', async () => {\n const { data, error } = await this.db\n .from('agentic_tokens')\n .select('*')\n .eq('id', tokenId)\n .eq('developer_id', developerId)\n .single();\n if (error || !data) throw new NotFoundError('Token', tokenId);\n return data as AgenticTokenRow;\n });\n }\n\n async suspendToken(tokenId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('token.suspend', async () => {\n await this.verifyOwnership('agentic_tokens', tokenId, developerId, 'Token');\n const { error } = await this.db\n .from('agentic_tokens')\n .update({ status: 'suspended', suspended_at: new Date().toISOString() })\n .eq('id', tokenId);\n if (error) throw error;\n });\n }\n\n async reactivateToken(tokenId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('token.reactivate', async () => {\n await this.verifyOwnership('agentic_tokens', tokenId, developerId, 'Token');\n const { error } = await this.db\n .from('agentic_tokens')\n .update({ status: 'active', suspended_at: null })\n .eq('id', tokenId);\n if (error) throw error;\n });\n }\n\n async deleteToken(tokenId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('token.delete', async () => {\n await this.verifyOwnership('agentic_tokens', tokenId, developerId, 'Token');\n const { error } = await this.db\n .from('agentic_tokens')\n .delete()\n .eq('id', tokenId);\n if (error) throw error;\n });\n }\n\n async getCryptogram(tokenId: string, developerId: string): Promise<{ cryptogram: string; eci: string; expMonth: number; expYear: number }> {\n return this.withErrorHandling('token.getCryptogram', async () => {\n await this.verifyOwnership('agentic_tokens', tokenId, developerId, 'Token');\n // In production, this would call Visa's API to generate a cryptogram\n return {\n cryptogram: `crpt_${tokenId.slice(0, 8)}`,\n eci: '05',\n expMonth: new Date().getMonth() + 1,\n expYear: new Date().getFullYear() + 1,\n };\n });\n }\n\n async reProvision(tokenId: string, developerId: string): Promise<AgenticTokenRow> {\n return this.withErrorHandling('token.reProvision', async () => {\n await this.verifyOwnership('agentic_tokens', tokenId, developerId, 'Token');\n const { data, error } = await this.db\n .from('agentic_tokens')\n .update({\n status: 'active',\n suspended_at: null,\n expires_at: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(),\n })\n .eq('id', tokenId)\n .select()\n .single();\n if (error) throw error;\n return data as AgenticTokenRow;\n });\n }\n\n private computeExpiry(expiresIn: string): Date {\n const match = expiresIn.match(/^(\\d+)(m|h|d)$/);\n if (!match) {\n throw new ValidationError(\n `Invalid expiresIn format: ${expiresIn}. Use e.g. \"30m\", \"1h\", \"7d\".`,\n );\n }\n const value = parseInt(match[1]!, 10);\n const unit = match[2]!;\n const now = Date.now();\n switch (unit) {\n case 'm': return new Date(now + value * 60 * 1000);\n case 'h': return new Date(now + value * 60 * 60 * 1000);\n case 'd': return new Date(now + value * 24 * 60 * 60 * 1000);\n default: return new Date(now + 60 * 60 * 1000);\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// Budget Service — Spending Controls\n// ---------------------------------------------------------------------------\n// Checks and enforces daily/weekly/monthly/per-task budget limits.\n// Records spend atomically, provides budget CRUD, and handles periodic resets.\n// ---------------------------------------------------------------------------\n\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport { BaseService } from '../lib/base-service.js';\nimport type { ILogger } from '../lib/logger.js';\nimport type {\n IBudgetService,\n BudgetRow,\n SetBudgetParams,\n BudgetCheckResult,\n} from '../lib/interfaces.js';\nimport { BudgetError, NotFoundError, ErrorCode, ValidationError } from '../lib/errors.js';\n\n// Hard caps for budget limits (in cents) — prevents prompt-injection escalation\nconst BUDGET_CAPS = {\n daily: 1_000_000, // $10,000\n weekly: 5_000_000, // $50,000\n monthly: 20_000_000, // $200,000\n perTask: 500_000, // $5,000\n} as const;\n\nexport class BudgetService extends BaseService implements IBudgetService {\n readonly serviceName = 'BudgetService';\n\n constructor(db: SupabaseClient, logger: ILogger) {\n super(db, logger);\n }\n\n /**\n * Check whether a developer can spend the given amount.\n * Checks per_task, daily, weekly, and monthly limits.\n */\n async checkBudget(\n developerId: string,\n amount: number,\n ): Promise<BudgetCheckResult> {\n return this.withErrorHandling('checkBudget', async () => {\n const budget = await this.getOrCreateBudget(developerId);\n\n if (budget.per_task_limit !== null && amount > budget.per_task_limit) {\n return {\n allowed: false,\n reason: 'Amount exceeds per-task limit',\n code: ErrorCode.PER_TASK_LIMIT_EXCEEDED,\n limit: budget.per_task_limit,\n spent: amount,\n };\n }\n\n if (budget.daily_limit !== null && budget.spent_today + amount > budget.daily_limit) {\n return {\n allowed: false,\n reason: 'Daily spending limit exceeded',\n code: ErrorCode.DAILY_LIMIT_EXCEEDED,\n limit: budget.daily_limit,\n spent: budget.spent_today,\n };\n }\n\n if (budget.weekly_limit !== null && budget.spent_this_week + amount > budget.weekly_limit) {\n return {\n allowed: false,\n reason: 'Weekly spending limit exceeded',\n code: ErrorCode.WEEKLY_LIMIT_EXCEEDED,\n limit: budget.weekly_limit,\n spent: budget.spent_this_week,\n };\n }\n\n if (budget.monthly_limit !== null && budget.spent_this_month + amount > budget.monthly_limit) {\n return {\n allowed: false,\n reason: 'Monthly spending limit exceeded',\n code: ErrorCode.MONTHLY_LIMIT_EXCEEDED,\n limit: budget.monthly_limit,\n spent: budget.spent_this_month,\n };\n }\n\n return { allowed: true };\n }, { developerId, amount });\n }\n\n /**\n * Atomic check-and-record-spend. Uses SELECT FOR UPDATE in Postgres\n * to prevent race conditions where concurrent payments all pass the budget check.\n */\n async checkAndRecordSpend(\n developerId: string,\n amount: number,\n ): Promise<BudgetCheckResult> {\n return this.withErrorHandling('checkAndRecordSpend', async () => {\n // Ensure budget exists before calling RPC\n await this.getOrCreateBudget(developerId);\n\n const { data, error } = await this.db.rpc('check_and_record_spend', {\n p_developer_id: developerId,\n p_amount: amount,\n });\n\n if (error) {\n this.log.warn('RPC check_and_record_spend failed, falling back to non-atomic path', {\n developerId,\n error: error.message,\n });\n // Fallback: use existing check + record (still has the race, but better than failing)\n const check = await this.checkBudget(developerId, amount);\n if (check.allowed) {\n await this.recordSpend(developerId, amount);\n }\n return check;\n }\n\n if (!data.allowed) {\n return {\n allowed: false,\n reason: data.reason,\n code: data.code,\n limit: data.limit_value ? Number(data.limit_value) : undefined,\n spent: data.spent_value ? Number(data.spent_value) : undefined,\n };\n }\n\n return { allowed: true };\n }, { developerId, amount });\n }\n\n /**\n * Record a spend against the developer's budget counters.\n * Uses atomic SQL increment to avoid read-then-write race conditions.\n */\n async recordSpend(developerId: string, amount: number): Promise<void> {\n return this.withErrorHandling('recordSpend', async () => {\n // Use RPC for atomic increment to prevent race conditions\n const { error: rpcError } = await this.db.rpc('increment_budget_spend', {\n p_developer_id: developerId,\n p_amount: amount,\n });\n\n if (rpcError) {\n // Fallback: if the RPC doesn't exist yet, use direct update with care\n this.log.warn('RPC increment_budget_spend not available, using fallback', {\n developerId,\n error: rpcError.message,\n });\n\n const budget = await this.getOrCreateBudget(developerId);\n const { error } = await this.db\n .from('budgets')\n .update({\n spent_today: budget.spent_today + amount,\n spent_this_week: budget.spent_this_week + amount,\n spent_this_month: budget.spent_this_month + amount,\n updated_at: new Date().toISOString(),\n })\n .eq('id', budget.id);\n\n if (error) {\n throw new BudgetError(\n `Failed to record spend: ${error.message}`,\n ErrorCode.BUDGET_EXCEEDED,\n );\n }\n }\n\n this.log.info('Spend recorded', { developerId, amount });\n }, { developerId, amount });\n }\n\n /**\n * Decrement spend counters for refunds.\n * Uses atomic SQL decrement to avoid race conditions.\n */\n async decrementSpend(developerId: string, amount: number): Promise<void> {\n return this.withErrorHandling('decrementSpend', async () => {\n const { error: rpcError } = await this.db.rpc('decrement_budget_spend', {\n p_developer_id: developerId,\n p_amount: amount,\n });\n\n if (rpcError) {\n // Fallback: if the RPC doesn't exist yet, use direct update\n this.log.warn('RPC decrement_budget_spend not available, using fallback', {\n developerId,\n error: rpcError.message,\n });\n\n const budget = await this.getOrCreateBudget(developerId);\n const { error } = await this.db\n .from('budgets')\n .update({\n spent_today: Math.max(0, budget.spent_today - amount),\n spent_this_week: Math.max(0, budget.spent_this_week - amount),\n spent_this_month: Math.max(0, budget.spent_this_month - amount),\n updated_at: new Date().toISOString(),\n })\n .eq('id', budget.id);\n\n if (error) {\n throw new BudgetError(\n `Failed to decrement spend: ${error.message}`,\n ErrorCode.BUDGET_EXCEEDED,\n );\n }\n }\n\n this.log.info('Spend decremented (refund)', { developerId, amount });\n }, { developerId, amount });\n }\n\n /**\n * Get current budget config and spent amounts for a developer.\n */\n async getBudget(developerId: string): Promise<BudgetRow> {\n return this.withErrorHandling('getBudget', async () => {\n return this.getOrCreateBudget(developerId);\n }, { developerId });\n }\n\n /**\n * Update budget limits for a developer.\n */\n async setBudget(\n developerId: string,\n config: SetBudgetParams,\n ): Promise<BudgetRow> {\n return this.withErrorHandling('setBudget', async () => {\n // Enforce hard caps to prevent prompt-injection budget escalation\n if (config.dailyLimit !== undefined && config.dailyLimit > BUDGET_CAPS.daily) {\n throw new ValidationError(\n `Daily limit cannot exceed $${BUDGET_CAPS.daily / 100} (requested: $${config.dailyLimit / 100})`,\n );\n }\n if (config.weeklyLimit !== undefined && config.weeklyLimit > BUDGET_CAPS.weekly) {\n throw new ValidationError(\n `Weekly limit cannot exceed $${BUDGET_CAPS.weekly / 100} (requested: $${config.weeklyLimit / 100})`,\n );\n }\n if (config.monthlyLimit !== undefined && config.monthlyLimit > BUDGET_CAPS.monthly) {\n throw new ValidationError(\n `Monthly limit cannot exceed $${BUDGET_CAPS.monthly / 100} (requested: $${config.monthlyLimit / 100})`,\n );\n }\n if (config.perTaskLimit !== undefined && config.perTaskLimit > BUDGET_CAPS.perTask) {\n throw new ValidationError(\n `Per-task limit cannot exceed $${BUDGET_CAPS.perTask / 100} (requested: $${config.perTaskLimit / 100})`,\n );\n }\n\n await this.getOrCreateBudget(developerId);\n\n const updates: Record<string, unknown> = {\n updated_at: new Date().toISOString(),\n };\n\n if (config.dailyLimit !== undefined) updates.daily_limit = config.dailyLimit;\n if (config.weeklyLimit !== undefined) updates.weekly_limit = config.weeklyLimit;\n if (config.monthlyLimit !== undefined) updates.monthly_limit = config.monthlyLimit;\n if (config.perTaskLimit !== undefined) updates.per_task_limit = config.perTaskLimit;\n if (config.confirmationThreshold !== undefined) updates.confirmation_threshold = config.confirmationThreshold;\n if (config.merchantAllowlist !== undefined) updates.merchant_allowlist = config.merchantAllowlist;\n if (config.merchantBlocklist !== undefined) updates.merchant_blocklist = config.merchantBlocklist;\n\n const { data, error } = await this.db\n .from('budgets')\n .update(updates)\n .eq('developer_id', developerId)\n .select()\n .single();\n\n if (error || !data) {\n throw new BudgetError(\n `Failed to update budget: ${error?.message}`,\n ErrorCode.BUDGET_EXCEEDED,\n );\n }\n\n this.log.info('Budget updated', { developerId, config });\n\n return data as BudgetRow;\n }, { developerId });\n }\n\n /**\n * Reset daily/weekly/monthly counters. Called by a scheduled background job.\n */\n async resetCounters(\n period: 'daily' | 'weekly' | 'monthly',\n ): Promise<number> {\n return this.withErrorHandling('resetCounters', async () => {\n const updates: Record<string, unknown> = {\n last_reset_at: new Date().toISOString(),\n updated_at: new Date().toISOString(),\n };\n\n if (period === 'daily' || period === 'weekly' || period === 'monthly') {\n updates.spent_today = 0;\n }\n if (period === 'weekly' || period === 'monthly') {\n updates.spent_this_week = 0;\n }\n if (period === 'monthly') {\n updates.spent_this_month = 0;\n }\n\n const { data, error } = await this.db\n .from('budgets')\n .update(updates)\n .select('id');\n\n if (error) {\n throw new BudgetError(\n `Failed to reset ${period} counters: ${error.message}`,\n ErrorCode.BUDGET_EXCEEDED,\n );\n }\n\n const count = data?.length ?? 0;\n this.log.info('Budget counters reset', { period, count });\n\n return count;\n }, { period });\n }\n\n /**\n * Pause all payments for a developer. Used by auto-freeze and admin endpoint.\n */\n async pausePayments(developerId: string, reason: string): Promise<void> {\n return this.withErrorHandling('pausePayments', async () => {\n const { error } = await this.db\n .from('budgets')\n .update({\n payments_paused: true,\n pause_reason: reason,\n paused_at: new Date().toISOString(),\n updated_at: new Date().toISOString(),\n })\n .eq('developer_id', developerId);\n\n if (error) {\n throw new BudgetError(`Failed to pause payments: ${error.message}`);\n }\n\n this.log.warn('Payments paused', { developerId, reason });\n }, { developerId, reason });\n }\n\n /**\n * Resume payments for a developer. Resets velocity breach count.\n */\n async resumePayments(developerId: string): Promise<void> {\n return this.withErrorHandling('resumePayments', async () => {\n const { error } = await this.db\n .from('budgets')\n .update({\n payments_paused: false,\n pause_reason: null,\n paused_at: null,\n velocity_breach_count: 0,\n updated_at: new Date().toISOString(),\n })\n .eq('developer_id', developerId);\n\n if (error) {\n throw new BudgetError(`Failed to resume payments: ${error.message}`);\n }\n\n this.log.info('Payments resumed', { developerId });\n }, { developerId });\n }\n\n private async getOrCreateBudget(developerId: string): Promise<BudgetRow> {\n const { data, error } = await this.db\n .from('budgets')\n .select('*')\n .eq('developer_id', developerId)\n .limit(1)\n .single();\n\n if (data) return data as BudgetRow;\n\n // Auto-create with defaults\n const { data: created, error: createErr } = await this.db\n .from('budgets')\n .insert({ developer_id: developerId })\n .select()\n .single();\n\n if (createErr || !created) {\n throw new NotFoundError('Budget', developerId);\n }\n\n this.log.info('Budget auto-created with defaults', { developerId });\n\n return created as BudgetRow;\n }\n}\n","// ---------------------------------------------------------------------------\n// Card Service — Card CRUD\n// ---------------------------------------------------------------------------\n// Manages tokenized payment cards stored as VGS aliases. Cards never contain\n// raw PANs — only aliases, last4, brand, and metadata.\n// ---------------------------------------------------------------------------\n\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport { BaseService } from '../lib/base-service.js';\nimport type { ILogger } from '../lib/logger.js';\nimport type { ICardService, CardRow, AddCardParams } from '../lib/interfaces.js';\nimport { NotFoundError, ValidationError } from '../lib/errors.js';\n\nexport class CardService extends BaseService implements ICardService {\n readonly serviceName = 'CardService';\n\n constructor(db: SupabaseClient, logger: ILogger) {\n super(db, logger);\n }\n\n /**\n * Store a new card alias. The alias comes from VGS Collect.\n */\n async addCard(\n developerId: string,\n params: AddCardParams,\n ): Promise<CardRow> {\n return this.withErrorHandling('addCard', async () => {\n await this.verifyWalletOwnership(params.walletId, developerId);\n\n const { data, error } = await this.db\n .from('cards')\n .insert({\n wallet_id: params.walletId,\n developer_id: developerId,\n pan_alias: params.alias,\n last4: params.last4,\n brand: params.brand,\n exp_month: params.expMonth,\n exp_year: params.expYear,\n cardholder_name: params.cardholderName ?? null,\n is_default: false,\n status: 'active',\n })\n .select()\n .single();\n\n if (error || !data) {\n throw new ValidationError(`Failed to add card: ${error?.message}`);\n }\n\n this.log.info('Card added', {\n cardId: data.id,\n walletId: params.walletId,\n developerId,\n brand: params.brand,\n last4: params.last4,\n });\n\n return data as CardRow;\n }, { developerId, walletId: params.walletId });\n }\n\n /**\n * List cards for a wallet with ownership verification.\n */\n async listCards(walletId: string, developerId: string): Promise<CardRow[]> {\n return this.withErrorHandling('listCards', async () => {\n await this.verifyWalletOwnership(walletId, developerId);\n\n const { data, error } = await this.db\n .from('cards')\n .select('id, wallet_id, developer_id, pan_alias, last4, brand, card_type, exp_month, exp_year, cardholder_name, is_default, status, created_at, updated_at')\n .eq('wallet_id', walletId)\n .neq('status', 'removed')\n .order('created_at', { ascending: false });\n\n if (error) {\n throw new ValidationError(`Failed to list cards: ${error.message}`);\n }\n\n return (data ?? []) as CardRow[];\n }, { walletId, developerId });\n }\n\n /**\n * Soft-delete a card by setting status to 'removed' with ownership verification.\n */\n async removeCard(cardId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('removeCard', async () => {\n await this.verifyOwnership('cards', cardId, developerId, 'Card');\n\n const { error } = await this.db\n .from('cards')\n .update({ status: 'removed', updated_at: new Date().toISOString() })\n .eq('id', cardId);\n\n if (error) {\n throw new ValidationError(`Failed to remove card: ${error.message}`);\n }\n\n this.log.info('Card removed', { cardId, developerId });\n }, { cardId, developerId });\n }\n\n /**\n * Get the default card for a wallet. Returns null if no default is set.\n */\n async getDefaultCard(walletId: string, developerId: string): Promise<CardRow | null> {\n return this.withErrorHandling('getDefaultCard', async () => {\n await this.verifyWalletOwnership(walletId, developerId);\n\n const { data, error } = await this.db\n .from('cards')\n .select('*')\n .eq('wallet_id', walletId)\n .eq('status', 'active')\n .eq('is_default', true)\n .limit(1)\n .single();\n\n if (error || !data) return null;\n\n return data as CardRow;\n }, { walletId, developerId });\n }\n\n /**\n * Generate a VGS Collect link for secure card entry.\n * Returns a data URL with the VGS collect HTML and a 15-minute expiry.\n */\n async getAddCardLink(\n developerId: string,\n walletId: string,\n ): Promise<{ url: string; expiresAt: string }> {\n return this.withErrorHandling('getAddCardLink', async () => {\n await this.verifyWalletOwnership(walletId, developerId);\n\n const vaultId = process.env.VGS_VAULT_ID;\n const environment = process.env.VGS_ENVIRONMENT ?? 'sandbox';\n const routeId = process.env.VGS_ROUTE_ID;\n\n if (!vaultId || !routeId) {\n throw new ValidationError('VGS configuration is not set. Set VGS_VAULT_ID and VGS_ROUTE_ID environment variables.');\n }\n\n const expiresAt = new Date(Date.now() + 15 * 60 * 1000);\n\n const collectHtml = `<!DOCTYPE html>\n<html>\n<head>\n <title>Add Payment Card</title>\n <script src=\"https://js.verygoodvault.com/vgs-collect/2/vgs-collect.js\"></script>\n</head>\n<body>\n <div id=\"vgs-collect-form\"></div>\n <script>\n var form = VGSCollect.create('${vaultId}', '${environment}', function(state) {});\n form.field('#vgs-collect-form .card-number', {\n type: 'card-number',\n name: 'card_number',\n placeholder: 'Card Number',\n });\n form.field('#vgs-collect-form .card-expiration', {\n type: 'card-expiration-date',\n name: 'card_exp',\n placeholder: 'MM/YY',\n });\n form.field('#vgs-collect-form .card-cvc', {\n type: 'card-security-code',\n name: 'card_cvc',\n placeholder: 'CVC',\n });\n document.getElementById('submit-btn').addEventListener('click', function() {\n form.submit('/post', {\n headers: { 'x-developer-id': '${developerId}', 'x-wallet-id': '${walletId}' },\n }, function(status, response) {\n window.parent.postMessage({ status: status, data: response }, '*');\n });\n });\n </script>\n <button id=\"submit-btn\">Add Card</button>\n</body>\n</html>`;\n\n const encoded = Buffer.from(collectHtml).toString('base64');\n const url = `data:text/html;base64,${encoded}`;\n\n this.log.info('Add card link generated', {\n developerId,\n walletId,\n expiresAt: expiresAt.toISOString(),\n });\n\n return { url, expiresAt: expiresAt.toISOString() };\n }, { developerId, walletId });\n }\n}\n","// ---------------------------------------------------------------------------\n// Profile Service — Checkout Profile Management\n// ---------------------------------------------------------------------------\n// Manages billing/shipping checkout profiles per wallet for auto-fill\n// during agent-driven payments.\n// ---------------------------------------------------------------------------\n\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport { BaseService } from '../lib/base-service.js';\nimport type { ILogger } from '../lib/logger.js';\nimport type {\n IProfileService,\n CheckoutProfileRow,\n SetProfileParams,\n} from '../lib/interfaces.js';\nimport { NotFoundError, ValidationError } from '../lib/errors.js';\n\nexport class ProfileService extends BaseService implements IProfileService {\n readonly serviceName = 'ProfileService';\n\n constructor(db: SupabaseClient, logger: ILogger) {\n super(db, logger);\n }\n\n /**\n * Upsert a checkout profile for a wallet with ownership verification.\n */\n async setProfile(\n walletId: string,\n developerId: string,\n profile: SetProfileParams,\n ): Promise<CheckoutProfileRow> {\n return this.withErrorHandling('setProfile', async () => {\n await this.verifyWalletOwnership(walletId, developerId);\n\n const row = this.toDbRow(profile);\n\n // Check if profile exists\n const { data: existing } = await this.db\n .from('checkout_profiles')\n .select('id')\n .eq('wallet_id', walletId)\n .limit(1)\n .single();\n\n if (existing) {\n const { data, error } = await this.db\n .from('checkout_profiles')\n .update({ ...row, updated_at: new Date().toISOString() })\n .eq('wallet_id', walletId)\n .select()\n .single();\n\n if (error || !data) {\n throw new ValidationError(`Failed to update profile: ${error?.message}`);\n }\n\n this.log.info('Profile updated', { walletId, developerId });\n return data as CheckoutProfileRow;\n }\n\n const { data, error } = await this.db\n .from('checkout_profiles')\n .insert({\n wallet_id: walletId,\n developer_id: developerId,\n ...row,\n })\n .select()\n .single();\n\n if (error || !data) {\n throw new ValidationError(`Failed to create profile: ${error?.message}`);\n }\n\n this.log.info('Profile created', { walletId, developerId });\n return data as CheckoutProfileRow;\n }, { walletId, developerId });\n }\n\n /**\n * Get the checkout profile for a wallet.\n */\n async getProfile(walletId: string): Promise<CheckoutProfileRow | null> {\n return this.withErrorHandling('getProfile', async () => {\n const { data, error } = await this.db\n .from('checkout_profiles')\n .select('*')\n .eq('wallet_id', walletId)\n .limit(1)\n .single();\n\n if (error || !data) return null;\n return data as CheckoutProfileRow;\n }, { walletId });\n }\n\n /**\n * Partially update a checkout profile with ownership verification.\n */\n async updateProfile(\n walletId: string,\n developerId: string,\n updates: Partial<SetProfileParams>,\n ): Promise<CheckoutProfileRow> {\n return this.withErrorHandling('updateProfile', async () => {\n await this.verifyWalletOwnership(walletId, developerId);\n\n const row = this.toDbRow(updates);\n\n const { data, error } = await this.db\n .from('checkout_profiles')\n .update({ ...row, updated_at: new Date().toISOString() })\n .eq('wallet_id', walletId)\n .select()\n .single();\n\n if (error || !data) {\n throw new NotFoundError('Checkout profile', walletId);\n }\n\n this.log.info('Profile partially updated', { walletId, developerId });\n return data as CheckoutProfileRow;\n }, { walletId, developerId });\n }\n\n /**\n * Map camelCase params to snake_case DB column names.\n * Uses billing_line1 (not billing_address_line1) per migration 005.\n */\n private toDbRow(params: Partial<SetProfileParams>): Record<string, unknown> {\n const row: Record<string, unknown> = {};\n if (params.email !== undefined) row.email = params.email;\n if (params.phone !== undefined) row.phone = params.phone;\n if (params.fullName !== undefined) row.full_name = params.fullName;\n if (params.billingLine1 !== undefined) row.billing_line1 = params.billingLine1;\n if (params.billingLine2 !== undefined) row.billing_line2 = params.billingLine2;\n if (params.billingCity !== undefined) row.billing_city = params.billingCity;\n if (params.billingState !== undefined) row.billing_state = params.billingState;\n if (params.billingPostalCode !== undefined) row.billing_postal_code = params.billingPostalCode;\n if (params.billingCountry !== undefined) row.billing_country = params.billingCountry;\n if (params.shippingLine1 !== undefined) row.shipping_line1 = params.shippingLine1;\n if (params.shippingLine2 !== undefined) row.shipping_line2 = params.shippingLine2;\n if (params.shippingCity !== undefined) row.shipping_city = params.shippingCity;\n if (params.shippingState !== undefined) row.shipping_state = params.shippingState;\n if (params.shippingPostalCode !== undefined) row.shipping_postal_code = params.shippingPostalCode;\n if (params.shippingCountry !== undefined) row.shipping_country = params.shippingCountry;\n if (params.shippingSameAsBilling !== undefined) row.shipping_same_as_billing = params.shippingSameAsBilling;\n return row;\n }\n}\n","// ---------------------------------------------------------------------------\n// Merchant Account Service — Saved Merchant Logins\n// ---------------------------------------------------------------------------\n// Stores and retrieves saved merchant credentials per wallet. Passwords and\n// API keys are stored as VGS aliases — never in plaintext.\n// ---------------------------------------------------------------------------\n\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport { BaseService } from '../lib/base-service.js';\nimport type { ILogger } from '../lib/logger.js';\nimport type {\n IMerchantAccountService,\n MerchantAccountRow,\n MerchantAccountSafe,\n SaveMerchantAccountParams,\n} from '../lib/interfaces.js';\nimport { NotFoundError, ValidationError } from '../lib/errors.js';\n\nexport class MerchantAccountService extends BaseService implements IMerchantAccountService {\n readonly serviceName = 'MerchantAccountService';\n\n constructor(db: SupabaseClient, logger: ILogger) {\n super(db, logger);\n }\n\n /**\n * Save a merchant account with VGS-aliased credentials.\n * Upserts on (wallet_id, merchant_domain).\n */\n async saveMerchantAccount(\n walletId: string,\n developerId: string,\n params: SaveMerchantAccountParams,\n ): Promise<MerchantAccountRow> {\n return this.withErrorHandling('saveMerchantAccount', async () => {\n await this.verifyWalletOwnership(walletId, developerId);\n\n const { data, error } = await this.db\n .from('merchant_accounts')\n .upsert(\n {\n wallet_id: walletId,\n developer_id: developerId,\n merchant_domain: params.merchantDomain,\n merchant_name: params.merchantName ?? null,\n account_email: params.accountEmail ?? null,\n account_username: params.accountUsername ?? null,\n password_alias: params.passwordAlias ?? null,\n auth_type: params.authType ?? 'password',\n api_key_alias: params.apiKeyAlias ?? null,\n oauth_token_alias: params.oauthTokenAlias ?? null,\n status: 'active',\n updated_at: new Date().toISOString(),\n },\n { onConflict: 'wallet_id,merchant_domain' },\n )\n .select()\n .single();\n\n if (error || !data) {\n throw new ValidationError(`Failed to save merchant account: ${error?.message}`);\n }\n\n this.log.info('Merchant account saved', {\n accountId: data.id,\n walletId,\n developerId,\n merchantDomain: params.merchantDomain,\n });\n\n return data as MerchantAccountRow;\n }, { walletId, developerId, merchantDomain: params.merchantDomain });\n }\n\n /**\n * List merchant accounts for a wallet with ownership verification.\n * Returns safe fields only (domain + email, no secrets).\n */\n async listMerchantAccounts(walletId: string, developerId: string): Promise<MerchantAccountSafe[]> {\n return this.withErrorHandling('listMerchantAccounts', async () => {\n await this.verifyWalletOwnership(walletId, developerId);\n\n const { data, error } = await this.db\n .from('merchant_accounts')\n .select('id, wallet_id, merchant_domain, merchant_name, account_email, auth_type, status, last_used_at, created_at')\n .eq('wallet_id', walletId)\n .eq('status', 'active')\n .order('created_at', { ascending: false });\n\n if (error) {\n throw new ValidationError(`Failed to list merchant accounts: ${error.message}`);\n }\n\n return (data ?? []) as MerchantAccountSafe[];\n }, { walletId, developerId });\n }\n\n /**\n * Soft-delete a merchant account by setting status to 'revoked' with ownership verification.\n */\n async removeMerchantAccount(accountId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('removeMerchantAccount', async () => {\n await this.verifyOwnership('merchant_accounts', accountId, developerId, 'MerchantAccount');\n\n const { error } = await this.db\n .from('merchant_accounts')\n .update({ status: 'revoked', updated_at: new Date().toISOString() })\n .eq('id', accountId);\n\n if (error) {\n throw new ValidationError(`Failed to remove merchant account: ${error.message}`);\n }\n\n this.log.info('Merchant account revoked (soft-delete)', { accountId, developerId });\n }, { accountId, developerId });\n }\n\n /**\n * Resolve a merchant account for the payment flow. Returns full row\n * including VGS aliases so the proxy service can de-tokenize credentials.\n * Updates last_used_at with proper logging.\n */\n async resolveMerchantAccount(\n walletId: string,\n merchantDomain: string,\n ): Promise<MerchantAccountRow | null> {\n return this.withErrorHandling('resolveMerchantAccount', async () => {\n const { data, error } = await this.db\n .from('merchant_accounts')\n .select('*')\n .eq('wallet_id', walletId)\n .eq('merchant_domain', merchantDomain)\n .eq('status', 'active')\n .limit(1)\n .single();\n\n if (error || !data) return null;\n\n const account = data as MerchantAccountRow;\n\n // Update last_used_at with proper error handling and logging\n const { error: updateError } = await this.db\n .from('merchant_accounts')\n .update({ last_used_at: new Date().toISOString() })\n .eq('id', account.id);\n\n if (updateError) {\n this.log.warn('Failed to update last_used_at for merchant account', {\n accountId: account.id,\n error: updateError.message,\n });\n } else {\n this.log.debug('Merchant account last_used_at updated', {\n accountId: account.id,\n merchantDomain,\n });\n }\n\n return account;\n }, { walletId, merchantDomain });\n }\n}\n","// ---------------------------------------------------------------------------\n// VGS Proxy Service — Multi-Tenant\n// ---------------------------------------------------------------------------\n// Resolves per-developer vault configs from DB, caches OAuth tokens with\n// dedup locks to prevent concurrent refresh storms, and forwards requests\n// through VGS outbound proxy using native fetch.\n// ---------------------------------------------------------------------------\n\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport { BaseService } from '../lib/base-service.js';\nimport type { ILogger } from '../lib/logger.js';\nimport type {\n IVGSProxyService,\n VaultConfig,\n ProxyRequest,\n ProxyResponse,\n} from '../lib/interfaces.js';\nimport { ServiceError, ErrorCode } from '../lib/errors.js';\n\ninterface CachedToken {\n accessToken: string;\n expiresAt: number;\n}\n\nconst TOKEN_REFRESH_MARGIN_MS = 60_000;\n\nexport class VGSProxyService extends BaseService implements IVGSProxyService {\n readonly serviceName = 'VGSProxyService';\n\n /** Token cache keyed by vaultId */\n private tokenCache = new Map<string, CachedToken>();\n /** Dedup locks keyed by vaultId — prevents concurrent refresh */\n private refreshLocks = new Map<string, Promise<string>>();\n\n constructor(db: SupabaseClient, logger: ILogger) {\n super(db, logger);\n }\n\n /**\n * Forward a request through the VGS outbound proxy for a given developer.\n * Resolves vault config, gets a cached/deduped OAuth token, and proxies.\n */\n async proxyToPSP(\n developerId: string,\n request: ProxyRequest,\n ): Promise<ProxyResponse> {\n return this.withErrorHandling('proxyToPSP', async () => {\n const vault = await this.resolveVaultConfig(developerId);\n const accessToken = await this.getAccessToken(vault);\n const proxyUrl = this.buildProxyUrl(vault);\n\n this.log.info('Proxying request to PSP', {\n developerId,\n vaultId: vault.vaultId,\n targetUrl: request.url,\n method: request.method,\n });\n\n const response = await fetch(proxyUrl, {\n method: request.method,\n headers: {\n ...request.headers,\n 'Authorization': `Bearer ${accessToken}`,\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 // Audit log proxy calls via structured logging\n this.log.info('VGS proxy call completed', {\n developerId,\n operation: 'vgs_proxy_forward',\n targetUrl: request.url,\n method: request.method,\n vaultId: vault.vaultId,\n responseStatus: response.status,\n });\n\n if (response.status >= 400) {\n this.log.warn('PSP returned error status', {\n developerId,\n vaultId: vault.vaultId,\n responseStatus: response.status,\n targetUrl: request.url,\n });\n }\n\n return {\n status: response.status,\n body: responseBody,\n };\n }, { developerId, targetUrl: request.url });\n }\n\n /**\n * Resolve the default VGS vault config for a developer.\n * Checks for org-dedicated vault first, then falls back to shared default.\n */\n async resolveVaultConfig(developerId: string): Promise<VaultConfig> {\n return this.withErrorHandling('resolveVaultConfig', async () => {\n const { data, error } = await this.db\n .from('vgs_vault_configs')\n .select('*')\n .eq('developer_id', developerId)\n .eq('is_default', true)\n .limit(1)\n .single();\n\n if (error || !data) {\n throw new ServiceError(\n `No VGS vault config found for developer ${developerId}`,\n ErrorCode.VGS_VAULT_NOT_CONFIGURED,\n 400,\n );\n }\n\n return {\n vaultId: data.vault_id,\n environment: data.environment as 'sandbox' | 'live',\n clientId: data.client_id,\n clientSecret: data.client_secret_encrypted,\n proxyUser: data.proxy_user_encrypted,\n proxyPass: data.proxy_pass_encrypted,\n };\n }, { developerId });\n }\n\n /**\n * Invalidate cached token for a vault.\n */\n invalidateToken(vaultId: string): void {\n this.tokenCache.delete(vaultId);\n this.log.info('VGS token cache invalidated', { vaultId });\n }\n\n /**\n * Get a valid OAuth access token for a vault. Uses caching and promise-based\n * dedup locks so concurrent callers share a single refresh request.\n */\n private async getAccessToken(vault: VaultConfig): Promise<string> {\n const cached = this.tokenCache.get(vault.vaultId);\n if (cached && Date.now() < cached.expiresAt - TOKEN_REFRESH_MARGIN_MS) {\n return cached.accessToken;\n }\n\n // Check if a refresh is already in-flight for this vault\n const existing = this.refreshLocks.get(vault.vaultId);\n if (existing) {\n return existing;\n }\n\n // Start a new refresh and store the promise so concurrent callers share it\n const refreshPromise = this.refreshToken(vault).finally(() => {\n this.refreshLocks.delete(vault.vaultId);\n });\n\n this.refreshLocks.set(vault.vaultId, refreshPromise);\n return refreshPromise;\n }\n\n private async refreshToken(vault: VaultConfig): Promise<string> {\n const env = vault.environment === 'live' ? 'live' : 'sandbox';\n const tokenUrl = `https://auth.verygoodsecurity.com/vaults/${vault.vaultId}/tokens?env=${env}`;\n\n const body = new URLSearchParams({\n grant_type: 'client_credentials',\n client_id: vault.clientId,\n client_secret: vault.clientSecret,\n });\n\n this.log.debug('Refreshing VGS OAuth token', { vaultId: vault.vaultId, env });\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 new ServiceError(\n `VGS token exchange failed for vault ${vault.vaultId}: ${response.status}`,\n ErrorCode.VGS_TOKEN_REFRESH_FAILED,\n 502,\n true,\n );\n }\n\n const data = (await response.json()) as {\n access_token: string;\n expires_in: number;\n };\n\n this.tokenCache.set(vault.vaultId, {\n accessToken: data.access_token,\n expiresAt: Date.now() + data.expires_in * 1000,\n });\n\n this.log.info('VGS OAuth token refreshed', { vaultId: vault.vaultId });\n\n return data.access_token;\n }\n\n private buildProxyUrl(vault: VaultConfig): string {\n const env = vault.environment === 'live' ? 'live' : 'sandbox';\n return `https://${vault.vaultId}.${env}.verygoodproxy.com`;\n }\n}\n","// ---------------------------------------------------------------------------\n// Wallet Service — Wallet Lifecycle Management\n// ---------------------------------------------------------------------------\n// Creates, retrieves, lists, and revokes developer wallets. Each wallet\n// represents an isolated payment context for an end-user or agent.\n// ---------------------------------------------------------------------------\n\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport { BaseService } from '../lib/base-service.js';\nimport type { ILogger } from '../lib/logger.js';\nimport type {\n IWalletService,\n WalletRow,\n CreateWalletParams,\n} from '../lib/interfaces.js';\nimport type { ServiceHealth } from '../lib/base-service.js';\nimport { NotFoundError, ValidationError } from '../lib/errors.js';\n\nexport class WalletService extends BaseService implements IWalletService {\n readonly serviceName = 'WalletService';\n\n constructor(db: SupabaseClient, logger: ILogger) {\n super(db, logger);\n }\n\n /**\n * Create a new wallet for a developer.\n */\n async create(developerId: string, params: CreateWalletParams): Promise<WalletRow> {\n return this.withErrorHandling('create', async () => {\n const { data, error } = await this.db\n .from('wallets')\n .insert({\n developer_id: developerId,\n end_user_id: params.userId ?? null,\n currency: params.currency ?? 'USD',\n status: 'active',\n })\n .select()\n .single();\n\n if (error || !data) {\n throw new ValidationError(`Failed to create wallet: ${error?.message}`);\n }\n\n this.log.info('Wallet created', {\n walletId: data.id,\n developerId,\n currency: params.currency ?? 'USD',\n });\n\n return data as WalletRow;\n }, { developerId });\n }\n\n /**\n * Get a wallet by ID with ownership verification.\n */\n async get(walletId: string, developerId: string): Promise<WalletRow> {\n return this.withErrorHandling('get', async () => {\n const { data, error } = await this.db\n .from('wallets')\n .select('*')\n .eq('id', walletId)\n .eq('developer_id', developerId)\n .single();\n\n if (error || !data) {\n throw new NotFoundError('Wallet', walletId);\n }\n\n return data as WalletRow;\n }, { walletId, developerId });\n }\n\n /**\n * List wallets for a developer with pagination and total count.\n */\n async list(\n developerId: string,\n params?: { limit?: number; offset?: number },\n ): Promise<{ data: WalletRow[]; total: number }> {\n return this.withErrorHandling('list', async () => {\n const limit = params?.limit ?? 50;\n const offset = params?.offset ?? 0;\n\n const { count, error: countError } = await this.db\n .from('wallets')\n .select('id', { count: 'exact', head: true })\n .eq('developer_id', developerId);\n\n if (countError) {\n throw new ValidationError(`Failed to count wallets: ${countError.message}`);\n }\n\n const { data, error } = await this.db\n .from('wallets')\n .select('*')\n .eq('developer_id', developerId)\n .order('created_at', { ascending: false })\n .range(offset, offset + limit - 1);\n\n if (error) {\n throw new ValidationError(`Failed to list wallets: ${error.message}`);\n }\n\n return {\n data: (data ?? []) as WalletRow[],\n total: count ?? 0,\n };\n }, { developerId, limit: params?.limit, offset: params?.offset });\n }\n\n /**\n * Revoke a wallet with ownership verification (soft-delete via status).\n */\n async revoke(walletId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('revoke', async () => {\n await this.verifyWalletOwnership(walletId, developerId);\n\n const { error } = await this.db\n .from('wallets')\n .update({\n status: 'revoked',\n updated_at: new Date().toISOString(),\n })\n .eq('id', walletId);\n\n if (error) {\n throw new ValidationError(`Failed to revoke wallet: ${error.message}`);\n }\n\n this.log.info('Wallet revoked', { walletId, developerId });\n }, { walletId, developerId });\n }\n\n async getBalance(walletId: string, developerId: string): Promise<{ balance: number; currency: string }> {\n return this.withErrorHandling('wallet.getBalance', async () => {\n const wallet = await this.get(walletId, developerId);\n // Balance would come from a balance ledger in production\n return { balance: 0, currency: wallet.currency };\n });\n }\n\n async deposit(walletId: string, developerId: string, amount: number): Promise<{ balance: number; transactionId: string }> {\n return this.withErrorHandling('wallet.deposit', async () => {\n await this.verifyWalletOwnership(walletId, developerId);\n // In production, this would create a ledger entry\n const transactionId = `txn_dep_${Date.now()}`;\n return { balance: amount, transactionId };\n });\n }\n\n async setDefault(walletId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('wallet.setDefault', async () => {\n // Find current default so we can restore it on failure\n const { data: previousDefault } = await this.db\n .from('wallets')\n .select('id')\n .eq('developer_id', developerId)\n .eq('is_default', true)\n .limit(1)\n .maybeSingle();\n\n // Unset current default\n await this.db\n .from('wallets')\n .update({ is_default: false })\n .eq('developer_id', developerId)\n .eq('is_default', true);\n\n // Set new default — rollback if this fails\n const { error } = await this.db\n .from('wallets')\n .update({ is_default: true })\n .eq('id', walletId)\n .eq('developer_id', developerId);\n\n if (error) {\n // Restore previous default\n if (previousDefault) {\n await this.db\n .from('wallets')\n .update({ is_default: true })\n .eq('id', previousDefault.id);\n }\n throw error;\n }\n });\n }\n\n async update(walletId: string, developerId: string, updates: { label?: string; budgetConfig?: Record<string, unknown> }): Promise<WalletRow> {\n return this.withErrorHandling('wallet.update', async () => {\n await this.verifyWalletOwnership(walletId, developerId);\n const updateData: Record<string, unknown> = { updated_at: new Date().toISOString() };\n if (updates.label !== undefined) updateData.label = updates.label;\n if (updates.budgetConfig !== undefined) updateData.budget_config = updates.budgetConfig;\n\n const { data, error } = await this.db\n .from('wallets')\n .update(updateData)\n .eq('id', walletId)\n .select()\n .single();\n if (error) throw error;\n return data as WalletRow;\n });\n }\n}\n","// ---------------------------------------------------------------------------\n// Payment Service — Payment Orchestration\n// ---------------------------------------------------------------------------\n// Orchestrates the full payment flow: validate token -> check mandate ->\n// check budget -> resolve checkout profile -> resolve card -> check for\n// network tokens -> route through protocol adapter or VGS proxy ->\n// record transaction. Enforces idempotency keys.\n// ---------------------------------------------------------------------------\n\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport { BaseService } from '../lib/base-service.js';\nimport type { ILogger } from '../lib/logger.js';\nimport type {\n IPaymentService,\n ITokenService,\n IBudgetService,\n IProfileService,\n ICardService,\n IVGSProxyService,\n IMandateService,\n IDelegationService,\n IProtocolClientService,\n IVICService,\n IMastercardAPService,\n TransactionRow,\n ExecutePaymentParams,\n RefundParams,\n RefundRow,\n} from '../lib/interfaces.js';\nimport {\n PaymentError,\n TokenError,\n BudgetError,\n MandateError,\n NotFoundError,\n ConflictError,\n ErrorCode,\n} from '../lib/errors.js';\n\nexport class PaymentService extends BaseService implements IPaymentService {\n readonly serviceName = 'PaymentService';\n\n private readonly tokenService: ITokenService;\n private readonly budgetService: IBudgetService;\n private readonly profileService: IProfileService;\n private readonly cardService: ICardService;\n private readonly vgsProxy: IVGSProxyService;\n private readonly mandateService: IMandateService;\n private readonly delegationService: IDelegationService;\n private readonly protocolClient: IProtocolClientService;\n private readonly vicService: IVICService;\n private readonly mastercardAP: IMastercardAPService;\n\n constructor(\n db: SupabaseClient,\n logger: ILogger,\n tokenService: ITokenService,\n budgetService: IBudgetService,\n profileService: IProfileService,\n cardService: ICardService,\n vgsProxy: IVGSProxyService,\n mandateService: IMandateService,\n delegationService: IDelegationService,\n protocolClient: IProtocolClientService,\n vicService: IVICService,\n mastercardAP: IMastercardAPService,\n ) {\n super(db, logger);\n this.tokenService = tokenService;\n this.budgetService = budgetService;\n this.profileService = profileService;\n this.cardService = cardService;\n this.vgsProxy = vgsProxy;\n this.mandateService = mandateService;\n this.delegationService = delegationService;\n this.protocolClient = protocolClient;\n this.vicService = vicService;\n this.mastercardAP = mastercardAP;\n }\n\n /**\n * Execute a payment. Full flow:\n * 1. Idempotency check — return existing tx if key matches\n * 2. Validate agentic token\n * 2.5 Mandate validation — if token has mandate, enforce constraints\n * 2.7 Delegation chain check — if mandate is delegated, verify chain\n * 3. Check payment pause status\n * 4. Atomic budget check-and-record-spend (prevents race conditions)\n * 5. Enforce merchant allowlist/blocklist\n * 6. Resolve checkout profile for auto-fill\n * 7. Resolve card via ICardService\n * 7.5 Check for network token (VIC or MC Agent Pay)\n * 8. Route through protocol adapter or VGS proxy\n * 9. Record transaction\n * 10. Consume token (if PSP declines, decrement spend reservation)\n */\n async execute(\n developerId: string,\n params: ExecutePaymentParams,\n ): Promise<TransactionRow> {\n return this.withErrorHandling('execute', async () => {\n // 1. Idempotency check\n if (params.idempotencyKey) {\n const existing = await this.findByIdempotencyKey(params.idempotencyKey);\n if (existing) {\n this.log.info('Returning existing transaction for idempotency key', {\n idempotencyKey: params.idempotencyKey,\n transactionId: existing.id,\n });\n return existing;\n }\n }\n\n // 2. Validate agentic token\n const token = await this.tokenService.validateToken(params.tokenId);\n\n if (token.amount < params.amount) {\n throw new TokenError(\n `Token amount (${token.amount}) is less than payment amount (${params.amount})`,\n ErrorCode.TOKEN_AMOUNT_EXCEEDED,\n );\n }\n\n // 2.5 Mandate validation — if token has mandate, enforce constraints\n const mandateId = (token as any).mandate_id as string | null;\n if (mandateId) {\n const mandateResult = await this.mandateService.validateAgainstMandate(mandateId, {\n amount: params.amount,\n currency: params.currency ?? 'USD',\n merchant: params.recipient,\n });\n\n if (!mandateResult.valid) {\n throw new MandateError(\n `Mandate violation: ${mandateResult.violations?.join(', ')}`,\n ErrorCode.MANDATE_VIOLATED,\n { mandateId, violations: mandateResult.violations },\n );\n }\n\n // 2.7 Delegation chain check — if mandate is delegated, verify chain\n const mandate = await this.mandateService.getMandate(mandateId, developerId);\n if (mandate.delegated_to) {\n const chainResult = await this.delegationService.validateDelegationChain(\n mandate.delegated_to,\n mandateId,\n );\n if (!chainResult.valid) {\n throw new MandateError(\n 'Delegation chain validation failed',\n ErrorCode.DELEGATION_CHAIN_BROKEN,\n { agentId: mandate.delegated_to, mandateId },\n );\n }\n }\n }\n\n // 3. Check payment pause status\n const budget = await this.budgetService.getBudget(developerId);\n if (budget.payments_paused) {\n throw new BudgetError(\n `Payments are paused: ${budget.pause_reason ?? 'no reason given'}. Contact support or use the wallet settings to resume.`,\n ErrorCode.PAYMENTS_PAUSED,\n );\n }\n\n // 4. Atomic budget check-and-record-spend (prevents race conditions)\n const budgetCheck = await this.budgetService.checkAndRecordSpend(\n developerId,\n params.amount,\n );\n if (!budgetCheck.allowed) {\n const failedTx = await this.recordTransaction(developerId, params, {\n status: 'failed',\n declineReason: budgetCheck.reason ?? 'budget_exceeded',\n });\n throw new BudgetError(\n `Budget check failed: ${budgetCheck.reason}`,\n (budgetCheck.code as ErrorCode) ?? ErrorCode.BUDGET_EXCEEDED,\n { transactionId: failedTx.id },\n );\n }\n\n // 5. Enforce merchant allowlist/blocklist\n const recipientDomain = extractDomain(params.recipient);\n\n if (budget.merchant_blocklist && budget.merchant_blocklist.length > 0) {\n if (budget.merchant_blocklist.some(blocked => recipientDomain.includes(blocked))) {\n // Reverse the budget reservation\n await this.budgetService.decrementSpend(developerId, params.amount);\n throw new PaymentError(\n `Merchant \"${recipientDomain}\" is on your blocklist`,\n ErrorCode.MERCHANT_BLOCKED,\n );\n }\n }\n\n if (budget.merchant_allowlist && budget.merchant_allowlist.length > 0) {\n if (!budget.merchant_allowlist.some(allowed => recipientDomain.includes(allowed))) {\n // Reverse the budget reservation\n await this.budgetService.decrementSpend(developerId, params.amount);\n throw new PaymentError(\n `Merchant \"${recipientDomain}\" is not on your allowlist`,\n ErrorCode.MERCHANT_NOT_ALLOWED,\n );\n }\n }\n\n // 6. Resolve checkout profile\n const profile = await this.profileService.getProfile(params.walletId);\n\n // 7. Resolve card via ICardService\n let cardAlias: string | null = null;\n let resolvedCardId: string | null = params.cardId ?? null;\n\n if (params.cardId) {\n const { data: card } = await this.db\n .from('cards')\n .select('pan_alias')\n .eq('id', params.cardId)\n .eq('status', 'active')\n .single();\n cardAlias = card?.pan_alias ?? null;\n } else {\n // Use default card from wallet via ICardService\n const defaultCard = await this.cardService.getDefaultCard(params.walletId, developerId);\n if (defaultCard) {\n cardAlias = defaultCard.pan_alias;\n resolvedCardId = defaultCard.id;\n }\n }\n\n if (!cardAlias) {\n // Reverse the budget reservation since we can't proceed\n await this.budgetService.decrementSpend(developerId, params.amount);\n const failedTx = await this.recordTransaction(developerId, params, {\n status: 'failed',\n declineReason: 'no_payment_method',\n });\n throw new PaymentError(\n 'No payment card available for this wallet',\n ErrorCode.NO_PAYMENT_METHOD,\n { transactionId: failedTx.id },\n );\n }\n\n // 7.5 Credential selection (issuance layer)\n // VIC/MC Agent Pay produce credentials — they are NOT routing destinations.\n // The credential flows INTO whichever acceptance method is selected.\n let networkTokenId: string | null = null;\n let credentialType: 'raw_card' | 'vic_dpan' | 'mdes_token' = 'raw_card';\n const route = 'vgs_proxy';\n\n if (resolvedCardId) {\n // Try to find an active network token for this card\n const { data: networkTokens } = await this.db\n .from('network_tokens')\n .select('id, network, token_type')\n .eq('card_id', resolvedCardId)\n .eq('status', 'active')\n .order('created_at', { ascending: false })\n .limit(1);\n\n if (networkTokens && networkTokens.length > 0) {\n networkTokenId = networkTokens[0]!.id;\n credentialType = networkTokens[0]!.network === 'visa' ? 'vic_dpan' : 'mdes_token';\n }\n }\n\n // 8. Route through protocol adapter or VGS proxy\n let pspResult: { status: number; body: unknown } | null = null;\n let pspTransactionId: string | null = null;\n\n try {\n const proxyResponse = await this.vgsProxy.proxyToPSP(developerId, {\n url: params.recipient,\n method: 'POST',\n headers: {},\n body: {\n card_number: cardAlias,\n network_token_id: networkTokenId,\n amount: params.amount,\n currency: params.currency ?? 'USD',\n description: params.description,\n billing: profile\n ? {\n name: profile.full_name,\n email: profile.email,\n address: {\n line1: profile.billing_line1,\n line2: profile.billing_line2,\n city: profile.billing_city,\n state: profile.billing_state,\n postal_code: profile.billing_postal_code,\n country: profile.billing_country,\n },\n }\n : undefined,\n shipping:\n profile && !profile.shipping_same_as_billing\n ? {\n address: {\n line1: profile.shipping_line1,\n line2: profile.shipping_line2,\n city: profile.shipping_city,\n state: profile.shipping_state,\n postal_code: profile.shipping_postal_code,\n country: profile.shipping_country,\n },\n }\n : undefined,\n },\n });\n\n pspResult = { status: proxyResponse.status, body: proxyResponse.body };\n const body = proxyResponse.body as Record<string, unknown> | null;\n pspTransactionId = (body?.transaction_id as string) ?? null;\n } catch (err) {\n // PSP failed — reverse budget reservation\n await this.budgetService.decrementSpend(developerId, params.amount);\n const failedTx = await this.recordTransaction(developerId, params, {\n status: 'failed',\n declineReason: err instanceof Error ? err.message : 'proxy_error',\n });\n throw new PaymentError(\n 'VGS proxy request failed',\n ErrorCode.PROXY_ERROR,\n { transactionId: failedTx.id },\n );\n }\n\n // 9. Record transaction\n const txStatus = pspResult && pspResult.status >= 200 && pspResult.status < 300\n ? 'completed'\n : 'failed';\n\n const transaction = await this.recordTransaction(developerId, params, {\n status: txStatus,\n pspTransactionId,\n cardId: resolvedCardId,\n route,\n credentialType,\n declineReason: txStatus === 'failed' ? 'psp_declined' : undefined,\n });\n\n // 10. Consume token + mandate; if PSP declined, reverse budget reservation\n if (txStatus === 'completed') {\n await this.tokenService.consumeToken(params.tokenId, transaction.id);\n\n // Consume mandate if present\n if (mandateId) {\n await this.mandateService.consumeMandate(mandateId, transaction.id);\n }\n\n this.log.info('Payment completed', {\n transactionId: transaction.id,\n developerId,\n amount: params.amount,\n currency: params.currency ?? 'USD',\n route,\n });\n } else {\n // PSP declined — reverse the budget reservation\n await this.budgetService.decrementSpend(developerId, params.amount);\n\n this.log.warn('Payment declined by PSP', {\n transactionId: transaction.id,\n developerId,\n pspStatus: pspResult?.status,\n });\n }\n\n return transaction;\n }, { developerId, tokenId: params.tokenId, amount: params.amount });\n }\n\n /**\n * Get a single transaction by ID with ownership verification.\n */\n async getTransaction(transactionId: string, developerId: string): Promise<TransactionRow> {\n return this.withErrorHandling('getTransaction', async () => {\n const { data, error } = await this.db\n .from('transactions')\n .select('*')\n .eq('id', transactionId)\n .eq('developer_id', developerId)\n .single();\n\n if (error || !data) {\n throw new NotFoundError('Transaction', transactionId);\n }\n\n return data as TransactionRow;\n }, { transactionId, developerId });\n }\n\n /**\n * List transactions for a developer with pagination.\n */\n async listTransactions(\n developerId: string,\n params?: { limit?: number; offset?: number },\n ): Promise<{ data: TransactionRow[]; total: number }> {\n return this.withErrorHandling('listTransactions', async () => {\n const limit = params?.limit ?? 50;\n const offset = params?.offset ?? 0;\n\n const { count, error: countError } = await this.db\n .from('transactions')\n .select('id', { count: 'exact', head: true })\n .eq('developer_id', developerId);\n\n if (countError) {\n throw new PaymentError(`Failed to count transactions: ${countError.message}`);\n }\n\n const { data, error } = await this.db\n .from('transactions')\n .select('*')\n .eq('developer_id', developerId)\n .order('created_at', { ascending: false })\n .range(offset, offset + limit - 1);\n\n if (error) {\n throw new PaymentError(`Failed to list transactions: ${error.message}`);\n }\n\n return {\n data: (data ?? []) as TransactionRow[],\n total: count ?? 0,\n };\n }, { developerId, limit: params?.limit, offset: params?.offset });\n }\n\n /**\n * Refund a transaction. Creates a refund record and decrements budget spend.\n * Checks cumulative refund total and refund velocity to prevent abuse.\n */\n async refund(developerId: string, params: RefundParams): Promise<RefundRow> {\n return this.withErrorHandling('refund', async () => {\n // Get the original transaction\n const transaction = await this.getTransaction(params.transactionId, developerId);\n\n if (transaction.status !== 'completed' && transaction.status !== 'partially_refunded') {\n throw new PaymentError(\n `Transaction ${params.transactionId} is not refundable (status: ${transaction.status})`,\n ErrorCode.TRANSACTION_NOT_REFUNDABLE,\n );\n }\n\n const refundAmount = params.amount ?? transaction.amount;\n\n if (refundAmount > transaction.amount) {\n throw new PaymentError(\n `Refund amount (${refundAmount}) exceeds transaction amount (${transaction.amount})`,\n ErrorCode.REFUND_FAILED,\n );\n }\n\n // Check cumulative refunds for this transaction\n const { data: existingRefunds } = await this.db\n .from('refunds')\n .select('amount')\n .eq('transaction_id', params.transactionId)\n .in('status', ['completed', 'initiated']);\n\n const totalRefunded = (existingRefunds ?? []).reduce(\n (sum: number, r: { amount: number }) => sum + r.amount,\n 0,\n );\n\n if (totalRefunded + refundAmount > transaction.amount) {\n throw new PaymentError(\n `Cumulative refund amount ($${((totalRefunded + refundAmount) / 100).toFixed(2)}) would exceed transaction amount ($${(transaction.amount / 100).toFixed(2)})`,\n ErrorCode.CUMULATIVE_REFUND_EXCEEDED,\n );\n }\n\n // Check refund velocity (daily limit)\n const budget = await this.budgetService.getBudget(developerId);\n if (budget.refunds_today >= budget.max_refunds_per_day) {\n throw new PaymentError(\n `Daily refund limit reached (${budget.max_refunds_per_day} refunds per day)`,\n ErrorCode.REFUND_LIMIT_EXCEEDED,\n );\n }\n\n // Check for duplicate refund via idempotency key\n if (params.idempotencyKey) {\n const { data: existingRefund } = await this.db\n .from('refunds')\n .select('*')\n .eq('transaction_id', params.transactionId)\n .eq('developer_id', developerId)\n .eq('idempotency_key', params.idempotencyKey)\n .limit(1)\n .single();\n\n if (existingRefund) {\n this.log.info('Returning existing refund for idempotency', {\n refundId: existingRefund.id,\n transactionId: params.transactionId,\n });\n return existingRefund as RefundRow;\n }\n }\n\n // Create refund record\n const { data: refund, error } = await this.db\n .from('refunds')\n .insert({\n transaction_id: params.transactionId,\n developer_id: developerId,\n amount: refundAmount,\n reason: params.reason ?? null,\n status: 'completed',\n })\n .select()\n .single();\n\n if (error || !refund) {\n throw new PaymentError(\n `Failed to create refund: ${error?.message}`,\n ErrorCode.REFUND_FAILED,\n );\n }\n\n // Update transaction status\n const newTotalRefunded = totalRefunded + refundAmount;\n await this.db\n .from('transactions')\n .update({\n status: newTotalRefunded >= transaction.amount ? 'refunded' : 'partially_refunded',\n })\n .eq('id', params.transactionId);\n\n // Decrement budget spend (does NOT reset spend counters — only reduces them)\n await this.budgetService.decrementSpend(developerId, refundAmount);\n\n // Increment refund velocity counter\n await this.db\n .from('budgets')\n .update({\n refunds_today: budget.refunds_today + 1,\n updated_at: new Date().toISOString(),\n })\n .eq('developer_id', developerId);\n\n this.log.info('Refund processed', {\n refundId: refund.id,\n transactionId: params.transactionId,\n refundAmount,\n totalRefundedNow: newTotalRefunded,\n developerId,\n });\n\n return refund as RefundRow;\n }, { developerId, transactionId: params.transactionId });\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n private async findByIdempotencyKey(\n key: string,\n ): Promise<TransactionRow | null> {\n const { data } = await this.db\n .from('transactions')\n .select('*')\n .eq('idempotency_key', key)\n .limit(1)\n .single();\n\n return (data as TransactionRow) ?? null;\n }\n\n private async recordTransaction(\n developerId: string,\n params: ExecutePaymentParams,\n result: {\n status: string;\n pspTransactionId?: string | null;\n cardId?: string | null;\n route?: string;\n credentialType?: string;\n declineReason?: string;\n },\n ): Promise<TransactionRow> {\n const { data, error } = await this.db\n .from('transactions')\n .insert({\n developer_id: developerId,\n wallet_id: params.walletId,\n card_id: result.cardId ?? params.cardId ?? null,\n token_id: params.tokenId,\n amount: params.amount,\n currency: params.currency ?? 'USD',\n recipient: params.recipient,\n description: params.description ?? null,\n route: result.route ?? 'vgs_proxy',\n credential_type: result.credentialType ?? 'raw_card',\n status: result.status,\n psp_transaction_id: result.pspTransactionId ?? null,\n decline_reason: result.declineReason ?? null,\n idempotency_key: params.idempotencyKey ?? null,\n })\n .select()\n .single();\n\n if (error || !data) {\n throw new PaymentError(\n `Failed to record transaction: ${error?.message}`,\n ErrorCode.PAYMENT_FAILED,\n );\n }\n\n return data as TransactionRow;\n }\n}\n\n/**\n * Extract domain from a recipient string.\n * Handles full URLs, bare domains, and email-style identifiers.\n */\nfunction extractDomain(recipient: string): string {\n try {\n // If it looks like a URL, parse it\n if (recipient.includes('://')) {\n return new URL(recipient).hostname.toLowerCase();\n }\n // Strip any path component\n return recipient.split('/')[0]!.toLowerCase();\n } catch {\n return recipient.toLowerCase();\n }\n}\n","// ---------------------------------------------------------------------------\n// MerchantDirectoryService — Global Merchant Registry\n// ---------------------------------------------------------------------------\n// Manages the merchant directory: sync from Lane backend, discover protocol\n// merchants, provide capabilities for the routing engine.\n// ---------------------------------------------------------------------------\n\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from '../lib/logger.js';\nimport type {\n IMerchantDirectoryService,\n MerchantDirectoryRow,\n MerchantDirectorySearchParams,\n MerchantDirectorySyncResult,\n MerchantVerticalSummary,\n} from '../lib/interfaces.js';\nimport { BaseService } from '../lib/base-service.js';\nimport { NotFoundError } from '../lib/errors.js';\n\ninterface MerchantCapabilities {\n merchantId: string;\n hasBillingAPI: boolean;\n supportsACP: boolean;\n supportsUCP: boolean;\n supportsX402: boolean;\n supportsVIC: boolean;\n acceptsVisa: boolean;\n acceptsMastercard: boolean;\n mccs: string[];\n}\n\nexport class MerchantDirectoryService extends BaseService implements IMerchantDirectoryService {\n readonly serviceName = 'MerchantDirectoryService';\n\n private cache = new Map<string, MerchantDirectoryRow>();\n private refreshTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(db: SupabaseClient, logger: ILogger) {\n super(db, logger);\n }\n\n // -------------------------------------------------------------------------\n // Lifecycle\n // -------------------------------------------------------------------------\n\n override async onStart(): Promise<void> {\n await this.loadCache();\n\n // Auto-sync on startup if directory is empty\n if (this.cache.size === 0) {\n const backendUrl = process.env['LANE_BACKEND_URL'];\n const backendToken = process.env['LANE_BACKEND_TOKEN'];\n if (backendUrl && backendToken) {\n this.log.info('Merchant directory empty, triggering initial sync');\n try {\n await this.syncFromLaneBackend(backendUrl, backendToken);\n } catch (err) {\n this.log.warn('Initial merchant sync failed, will retry later', { error: String(err) });\n }\n }\n }\n\n // Refresh cache every 30 minutes\n this.refreshTimer = setInterval(() => {\n this.loadCache().catch((err) =>\n this.log.error('Failed to refresh merchant cache', err),\n );\n }, 30 * 60 * 1000);\n\n this.log.info(`${this.serviceName} started`, { cachedMerchants: this.cache.size });\n }\n\n override async onStop(): Promise<void> {\n if (this.refreshTimer) {\n clearInterval(this.refreshTimer);\n this.refreshTimer = null;\n }\n this.log.info(`${this.serviceName} stopped`);\n }\n\n // -------------------------------------------------------------------------\n // Cache management\n // -------------------------------------------------------------------------\n\n private async loadCache(): Promise<void> {\n const { data, error } = await this.db\n .from('merchant_directory')\n .select('*')\n .eq('status', 'active');\n\n if (error) {\n this.log.error('Failed to load merchant cache', error);\n return;\n }\n\n this.cache.clear();\n for (const row of (data ?? []) as MerchantDirectoryRow[]) {\n this.cache.set(row.id, row);\n }\n }\n\n // -------------------------------------------------------------------------\n // Query methods\n // -------------------------------------------------------------------------\n\n async listMerchants(\n params: MerchantDirectorySearchParams = {},\n ): Promise<{ data: MerchantDirectoryRow[]; total: number }> {\n return this.withErrorHandling('listMerchants', async () => {\n const limit = params.limit ?? 20;\n const offset = params.offset ?? 0;\n\n let query = this.db\n .from('merchant_directory')\n .select('*', { count: 'exact' })\n .eq('status', 'active')\n .order('name', { ascending: true })\n .range(offset, offset + limit - 1);\n\n if (params.query) {\n query = query.or(`name.ilike.%${params.query}%,description.ilike.%${params.query}%`);\n }\n if (params.tier) {\n query = query.eq('tier', params.tier);\n }\n if (params.merchantType) {\n query = query.eq('merchant_type', params.merchantType);\n }\n if (params.vertical) {\n query = query.eq('vertical', params.vertical);\n }\n if (params.subcategory) {\n query = query.contains('subcategories', [params.subcategory]);\n }\n if (params.protocol) {\n query = query.contains('protocols', [params.protocol]);\n }\n\n const { data, count, error } = await query;\n if (error) throw error;\n\n return {\n data: (data ?? []) as MerchantDirectoryRow[],\n total: count ?? 0,\n };\n });\n }\n\n async getMerchant(identifier: string): Promise<MerchantDirectoryRow | null> {\n return this.withErrorHandling('getMerchant', async () => {\n // Try UUID lookup first\n const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n if (uuidRegex.test(identifier)) {\n const { data } = await this.db\n .from('merchant_directory')\n .select('*')\n .eq('id', identifier)\n .single();\n if (data) return data as MerchantDirectoryRow;\n }\n\n // Try slug lookup\n const { data: bySlug } = await this.db\n .from('merchant_directory')\n .select('*')\n .eq('slug', identifier)\n .single();\n if (bySlug) return bySlug as MerchantDirectoryRow;\n\n // Try domain lookup\n const { data: byDomain } = await this.db\n .from('merchant_directory')\n .select('*')\n .eq('domain', identifier)\n .single();\n if (byDomain) return byDomain as MerchantDirectoryRow;\n\n return null;\n });\n }\n\n async getMerchantCapabilities(merchantId: string): Promise<MerchantCapabilities | null> {\n return this.withErrorHandling('getMerchantCapabilities', async () => {\n // Try cache first\n const cached = this.cache.get(merchantId);\n if (cached) return this.toCapabilities(cached);\n\n const merchant = await this.getMerchant(merchantId);\n if (!merchant) return null;\n\n return this.toCapabilities(merchant);\n });\n }\n\n async populateRegistry(): Promise<MerchantCapabilities[]> {\n return this.withErrorHandling('populateRegistry', async () => {\n const { data, error } = await this.db\n .from('merchant_directory')\n .select('*')\n .eq('status', 'active');\n\n if (error) throw error;\n\n return ((data ?? []) as MerchantDirectoryRow[]).map((row) =>\n this.toCapabilities(row),\n );\n });\n }\n\n async getVerticals(): Promise<MerchantVerticalSummary[]> {\n return this.withErrorHandling('getVerticals', async () => {\n const { data, error } = await this.db\n .from('merchant_directory')\n .select('merchant_type, vertical, subcategories')\n .eq('status', 'active');\n\n if (error) throw error;\n\n const verticalMap = new Map<string, MerchantVerticalSummary>();\n\n for (const row of (data ?? []) as Pick<MerchantDirectoryRow, 'merchant_type' | 'vertical' | 'subcategories'>[]) {\n if (!row.vertical) continue;\n const key = `${row.merchant_type}:${row.vertical}`;\n const existing = verticalMap.get(key);\n if (existing) {\n existing.count++;\n for (const sub of row.subcategories) {\n if (!existing.subcategories.includes(sub)) {\n existing.subcategories.push(sub);\n }\n }\n } else {\n verticalMap.set(key, {\n merchantType: row.merchant_type,\n vertical: row.vertical,\n subcategories: [...row.subcategories],\n count: 1,\n });\n }\n }\n\n return Array.from(verticalMap.values());\n });\n }\n\n // -------------------------------------------------------------------------\n // Sync from Lane backend\n // -------------------------------------------------------------------------\n\n async syncFromLaneBackend(url: string, token: string): Promise<MerchantDirectorySyncResult> {\n return this.withErrorHandling('syncFromLaneBackend', async () => {\n const startTime = Date.now();\n let merchantsAdded = 0;\n let merchantsUpdated = 0;\n const errors: string[] = [];\n\n // Fetch merchants from Lane backend (matching lane-chatbot/lib/merchants.ts pattern)\n const response = await fetch(`${url}/api/chatbot/merchants`, {\n headers: { Authorization: `Bearer ${token}` },\n });\n\n if (!response.ok) {\n throw new Error(`Lane backend returned ${response.status}: ${response.statusText}`);\n }\n\n const body = (await response.json()) as { merchants?: Array<Record<string, unknown>> };\n const merchants = body.merchants ?? [];\n\n for (const m of merchants) {\n try {\n const slug = this.slugify(m.name as string);\n const existing = await this.getMerchant(slug);\n\n const row: Partial<MerchantDirectoryRow> & { slug: string } = {\n slug,\n name: m.name as string,\n domain: (m.domain as string) ?? `${slug}.com`,\n description: m.description as string | undefined ?? null,\n logo_url: m.logo_url as string | undefined ?? null,\n website: m.website as string | undefined ?? null,\n tier: 'lane_onboarded',\n lane_merchant_id: (m.id as string) ?? null,\n platform: (m.platform as string) ?? null,\n store_url: (m.store_url as string) ?? null,\n payment_provider: (m.payment_provider as string) ?? null,\n feed_token: (m.feed_token as string) ?? null,\n product_count: (m.product_count as number) ?? 0,\n last_synced_at: new Date().toISOString(),\n // Infer capabilities from platform\n has_billing_api: true,\n supports_acp: (m.platform as string) === 'shopify' || (m.supports_acp as boolean) === true,\n merchant_type: (m.merchant_type as MerchantDirectoryRow['merchant_type']) ?? 'ecommerce',\n vertical: (m.vertical as string) ?? null,\n subcategories: (m.subcategories as string[]) ?? [],\n status: 'active',\n };\n\n await this.upsertMerchant(row);\n\n if (existing) {\n merchantsUpdated++;\n } else {\n merchantsAdded++;\n }\n } catch (err) {\n errors.push(`Failed to sync merchant ${m.name}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n const durationMs = Date.now() - startTime;\n\n // Log sync result\n await this.db.from('merchant_directory_sync_log').insert({\n source: url,\n merchants_synced: merchants.length,\n merchants_added: merchantsAdded,\n merchants_updated: merchantsUpdated,\n errors,\n duration_ms: durationMs,\n status: errors.length === 0 ? 'success' : errors.length < merchants.length ? 'partial' : 'failed',\n });\n\n // Refresh cache after sync\n await this.loadCache();\n\n return {\n merchantsSynced: merchants.length,\n merchantsAdded,\n merchantsUpdated,\n errors,\n durationMs,\n };\n });\n }\n\n // -------------------------------------------------------------------------\n // Protocol discovery\n // -------------------------------------------------------------------------\n\n async discoverProtocolMerchant(domain: string): Promise<MerchantDirectoryRow | null> {\n return this.withErrorHandling('discoverProtocolMerchant', async () => {\n const protocols: string[] = [];\n let manifest: Record<string, unknown> | null = null;\n let manifestUrl = '';\n\n // Probe UCP\n try {\n const ucpUrl = `https://${domain}/.well-known/ucp`;\n const ucpRes = await fetch(ucpUrl, { signal: AbortSignal.timeout(5000) });\n if (ucpRes.ok) {\n protocols.push('ucp');\n manifest = (await ucpRes.json()) as Record<string, unknown>;\n manifestUrl = ucpUrl;\n }\n } catch {\n // UCP not available\n }\n\n // Probe ACP\n try {\n const acpUrl = `https://${domain}/.well-known/acp`;\n const acpRes = await fetch(acpUrl, { signal: AbortSignal.timeout(5000) });\n if (acpRes.ok) {\n protocols.push('acp');\n if (!manifest) {\n manifest = (await acpRes.json()) as Record<string, unknown>;\n manifestUrl = acpUrl;\n }\n }\n } catch {\n // ACP not available\n }\n\n // Probe x402\n try {\n const x402Url = `https://${domain}/`;\n const x402Res = await fetch(x402Url, {\n method: 'OPTIONS',\n signal: AbortSignal.timeout(5000),\n });\n // x402 support is indicated by HTTP 402 responses with X-PAYMENT header,\n // or OPTIONS response advertising 402 support\n const xPayment = x402Res.headers.get('x-payment');\n if (xPayment || x402Res.status === 402) {\n protocols.push('x402');\n }\n } catch {\n // x402 not available\n }\n\n if (protocols.length === 0) {\n return null;\n }\n\n const slug = this.slugify(domain.replace(/\\.\\w+$/, ''));\n const name = (manifest?.name as string) ?? domain;\n\n const row = await this.upsertMerchant({\n slug,\n name,\n domain,\n description: (manifest?.description as string) ?? null,\n tier: 'protocol',\n protocols,\n protocol_endpoint: manifestUrl,\n supports_acp: protocols.includes('acp'),\n supports_ucp: protocols.includes('ucp'),\n supports_x402: protocols.includes('x402'),\n status: 'active',\n });\n\n // Cache manifest\n if (manifest) {\n await this.db.from('merchant_protocol_manifests').upsert(\n {\n merchant_id: row.id,\n protocol: protocols[0],\n manifest_url: manifestUrl,\n manifest,\n fetched_at: new Date().toISOString(),\n expires_at: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(),\n },\n { onConflict: 'merchant_id,protocol' },\n );\n }\n\n // Refresh cache\n await this.loadCache();\n\n return row;\n });\n }\n\n // -------------------------------------------------------------------------\n // Upsert\n // -------------------------------------------------------------------------\n\n async upsertMerchant(\n merchant: Partial<MerchantDirectoryRow> & { slug: string },\n ): Promise<MerchantDirectoryRow> {\n return this.withErrorHandling('upsertMerchant', async () => {\n const { data, error } = await this.db\n .from('merchant_directory')\n .upsert(\n {\n ...merchant,\n updated_at: new Date().toISOString(),\n },\n { onConflict: 'slug' },\n )\n .select('*')\n .single();\n\n if (error) throw error;\n if (!data) throw new NotFoundError('Merchant', merchant.slug);\n\n return data as MerchantDirectoryRow;\n });\n }\n\n // -------------------------------------------------------------------------\n // Helpers\n // -------------------------------------------------------------------------\n\n private toCapabilities(row: MerchantDirectoryRow): MerchantCapabilities {\n return {\n merchantId: row.id,\n hasBillingAPI: row.has_billing_api,\n supportsACP: row.supports_acp,\n supportsUCP: row.supports_ucp,\n supportsX402: (row as any).supports_x402 ?? false,\n supportsVIC: row.supports_vic,\n acceptsVisa: row.accepts_visa,\n acceptsMastercard: row.accepts_mastercard,\n mccs: row.mccs,\n };\n }\n\n private slugify(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n }\n}\n","import type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from '../lib/logger.js';\nimport { BaseService } from '../lib/base-service.js';\nimport { NotFoundError, ValidationError, ConfirmationRequiredError } from '../lib/errors.js';\nimport type {\n IInstructionService,\n InstructionRow,\n InstructionMandateRow,\n InstructionCredentialRow,\n InstructionConfirmationRow,\n InstructionBudgetStatus,\n CreateInstructionParams,\n CreateMandateParams,\n} from '../lib/interfaces.js';\nimport type { ServiceHealth } from '../lib/base-service.js';\n\n// State machine: valid transitions for instruction status\ntype InstructionStatus = 'draft' | 'active' | 'completed' | 'cancelled';\n\nconst VALID_TRANSITIONS: Record<InstructionStatus, InstructionStatus[]> = {\n draft: ['active', 'cancelled'],\n active: ['completed', 'cancelled'],\n completed: [],\n cancelled: [],\n};\n\nfunction assertTransition(from: string, to: InstructionStatus): void {\n const allowed = VALID_TRANSITIONS[from as InstructionStatus];\n if (!allowed || !allowed.includes(to)) {\n throw new ValidationError(`Invalid state transition: cannot move from '${from}' to '${to}'`);\n }\n}\n\nexport class InstructionService extends BaseService implements IInstructionService {\n readonly serviceName = 'InstructionService';\n\n constructor(db: SupabaseClient, logger: ILogger) {\n super(db, logger);\n }\n\n async create(developerId: string, params: CreateInstructionParams): Promise<InstructionRow> {\n return this.withErrorHandling('instruction.create', async () => {\n const expiresAt = params.expiresIn\n ? new Date(Date.now() + parseDuration(params.expiresIn)).toISOString()\n : null;\n\n const { data, error } = await this.db\n .from('agent_instructions')\n .insert({\n developer_id: developerId,\n wallet_id: params.walletId ?? null,\n type: params.type ?? 'payment',\n amount: params.amount ?? null,\n currency: params.currency ?? 'USD',\n merchant: params.merchant ?? null,\n permissions: params.permissions ?? [],\n constraints: params.constraints ?? {},\n expires_at: expiresAt,\n })\n .select()\n .single();\n\n if (error) throw error;\n return data as InstructionRow;\n });\n }\n\n async list(developerId: string, params?: { limit?: number; offset?: number }): Promise<{ data: InstructionRow[]; total: number }> {\n return this.withErrorHandling('instruction.list', async () => {\n const limit = Math.min(params?.limit ?? 20, 100);\n const offset = params?.offset ?? 0;\n\n const query = this.db\n .from('agent_instructions')\n .select('*', { count: 'exact' })\n .eq('developer_id', developerId)\n .order('created_at', { ascending: false })\n .range(offset, offset + limit - 1);\n\n const { data, error, count } = await query;\n if (error) throw error;\n return { data: (data ?? []) as InstructionRow[], total: count ?? 0 };\n });\n }\n\n async get(instructionId: string, developerId: string): Promise<InstructionRow> {\n return this.withErrorHandling('instruction.get', async () => {\n const { data, error } = await this.db\n .from('agent_instructions')\n .select('*')\n .eq('id', instructionId)\n .eq('developer_id', developerId)\n .single();\n\n if (error || !data) throw new NotFoundError('Instruction', instructionId);\n return data as InstructionRow;\n });\n }\n\n async update(instructionId: string, developerId: string, updates: Partial<CreateInstructionParams>): Promise<InstructionRow> {\n return this.withErrorHandling('instruction.update', async () => {\n await this.verifyOwnership('agent_instructions', instructionId, developerId, 'Instruction');\n\n const updateData: Record<string, unknown> = { updated_at: new Date().toISOString() };\n if (updates.amount !== undefined) updateData.amount = updates.amount;\n if (updates.currency !== undefined) updateData.currency = updates.currency;\n if (updates.merchant !== undefined) updateData.merchant = updates.merchant;\n if (updates.permissions !== undefined) updateData.permissions = updates.permissions;\n if (updates.constraints !== undefined) updateData.constraints = updates.constraints;\n\n const { data, error } = await this.db\n .from('agent_instructions')\n .update(updateData)\n .eq('id', instructionId)\n .select()\n .single();\n\n if (error) throw error;\n return data as InstructionRow;\n });\n }\n\n async cancel(instructionId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('instruction.cancel', async () => {\n const existing = await this.get(instructionId, developerId);\n assertTransition(existing.status, 'cancelled');\n\n const { error } = await this.db\n .from('agent_instructions')\n .update({ status: 'cancelled', updated_at: new Date().toISOString() })\n .eq('id', instructionId);\n\n if (error) throw error;\n });\n }\n\n async activate(instructionId: string, developerId: string): Promise<InstructionRow> {\n return this.withErrorHandling('instruction.activate', async () => {\n const existing = await this.get(instructionId, developerId);\n assertTransition(existing.status, 'active');\n\n const { data, error } = await this.db\n .from('agent_instructions')\n .update({ status: 'active', updated_at: new Date().toISOString() })\n .eq('id', instructionId)\n .select()\n .single();\n\n if (error) throw error;\n return data as InstructionRow;\n });\n }\n\n async complete(instructionId: string, developerId: string): Promise<InstructionRow> {\n return this.withErrorHandling('instruction.complete', async () => {\n const existing = await this.get(instructionId, developerId);\n assertTransition(existing.status, 'completed');\n\n const { data, error } = await this.db\n .from('agent_instructions')\n .update({ status: 'completed', updated_at: new Date().toISOString() })\n .eq('id', instructionId)\n .select()\n .single();\n\n if (error) throw error;\n return data as InstructionRow;\n });\n }\n\n async addMandate(instructionId: string, developerId: string, params: CreateMandateParams): Promise<InstructionMandateRow> {\n return this.withErrorHandling('instruction.addMandate', async () => {\n await this.verifyOwnership('agent_instructions', instructionId, developerId, 'Instruction');\n\n const { data, error } = await this.db\n .from('agent_instruction_mandates')\n .insert({\n instruction_id: instructionId,\n type: params.type,\n config: params.config ?? {},\n })\n .select()\n .single();\n\n if (error) throw error;\n return data as InstructionMandateRow;\n });\n }\n\n async listMandates(instructionId: string, developerId: string): Promise<InstructionMandateRow[]> {\n return this.withErrorHandling('instruction.listMandates', async () => {\n await this.verifyOwnership('agent_instructions', instructionId, developerId, 'Instruction');\n\n const { data, error } = await this.db\n .from('agent_instruction_mandates')\n .select('*')\n .eq('instruction_id', instructionId)\n .order('created_at', { ascending: false });\n\n if (error) throw error;\n return (data ?? []) as InstructionMandateRow[];\n });\n }\n\n async getMandate(instructionId: string, mandateId: string, developerId: string): Promise<InstructionMandateRow> {\n return this.withErrorHandling('instruction.getMandate', async () => {\n await this.verifyOwnership('agent_instructions', instructionId, developerId, 'Instruction');\n\n const { data, error } = await this.db\n .from('agent_instruction_mandates')\n .select('*')\n .eq('id', mandateId)\n .eq('instruction_id', instructionId)\n .single();\n\n if (error || !data) throw new NotFoundError('Mandate', mandateId);\n return data as InstructionMandateRow;\n });\n }\n\n async updateMandate(instructionId: string, mandateId: string, developerId: string, updates: Partial<CreateMandateParams>): Promise<InstructionMandateRow> {\n return this.withErrorHandling('instruction.updateMandate', async () => {\n await this.verifyOwnership('agent_instructions', instructionId, developerId, 'Instruction');\n\n const updateData: Record<string, unknown> = { updated_at: new Date().toISOString() };\n if (updates.type !== undefined) updateData.type = updates.type;\n if (updates.config !== undefined) updateData.config = updates.config;\n\n const { data, error } = await this.db\n .from('agent_instruction_mandates')\n .update(updateData)\n .eq('id', mandateId)\n .eq('instruction_id', instructionId)\n .select()\n .single();\n\n if (error || !data) throw new NotFoundError('Mandate', mandateId);\n return data as InstructionMandateRow;\n });\n }\n\n async removeMandate(instructionId: string, mandateId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('instruction.removeMandate', async () => {\n await this.verifyOwnership('agent_instructions', instructionId, developerId, 'Instruction');\n\n const { error } = await this.db\n .from('agent_instruction_mandates')\n .delete()\n .eq('id', mandateId)\n .eq('instruction_id', instructionId);\n\n if (error) throw error;\n });\n }\n\n async getCredential(instructionId: string, developerId: string): Promise<InstructionCredentialRow> {\n return this.withErrorHandling('instruction.getCredential', async () => {\n await this.verifyOwnership('agent_instructions', instructionId, developerId, 'Instruction');\n\n const { data, error } = await this.db\n .from('agent_instruction_credentials')\n .select('*')\n .eq('instruction_id', instructionId)\n .order('created_at', { ascending: false })\n .limit(1)\n .single();\n\n if (error || !data) throw new NotFoundError('Credential', instructionId);\n return data as InstructionCredentialRow;\n });\n }\n\n async createConfirmation(instructionId: string, developerId: string, details: Record<string, unknown>): Promise<InstructionConfirmationRow> {\n return this.withErrorHandling('instruction.createConfirmation', async () => {\n await this.verifyOwnership('agent_instructions', instructionId, developerId, 'Instruction');\n\n const confirmationType = typeof details.confirmationType === 'string' ? details.confirmationType : 'manual';\n const method = typeof details.method === 'string' ? details.method : null;\n\n if (confirmationType === 'biometric') {\n const allowedMethods = ['touchid', 'system_password', 'webauthn_passkey', 'pin'];\n if (!method || !allowedMethods.includes(method)) {\n throw new ValidationError(`Invalid biometric method: ${method}`);\n }\n const timestamp = typeof details.timestamp === 'string' ? new Date(details.timestamp).getTime() : NaN;\n if (isNaN(timestamp) || Math.abs(Date.now() - timestamp) > 30_000) {\n throw new ValidationError('Biometric proof timestamp is missing or too old (must be within 30 seconds)');\n }\n if (typeof details.machineId !== 'string' || details.machineId.length === 0) {\n throw new ValidationError('Biometric proof must include machineId');\n }\n }\n\n const { data, error } = await this.db\n .from('agent_instruction_confirmations')\n .insert({\n instruction_id: instructionId,\n confirmed_by: developerId,\n confirmation_type: confirmationType,\n method,\n details,\n })\n .select()\n .single();\n\n if (error) throw error;\n return data as InstructionConfirmationRow;\n });\n }\n\n async listConfirmations(instructionId: string, developerId: string): Promise<InstructionConfirmationRow[]> {\n return this.withErrorHandling('instruction.listConfirmations', async () => {\n await this.verifyOwnership('agent_instructions', instructionId, developerId, 'Instruction');\n\n const { data, error } = await this.db\n .from('agent_instruction_confirmations')\n .select('*')\n .eq('instruction_id', instructionId)\n .order('created_at', { ascending: false });\n\n if (error) throw error;\n return (data ?? []) as InstructionConfirmationRow[];\n });\n }\n\n async requireConfirmation(\n instructionId: string,\n developerId: string,\n opts: { requiredType: string; maxAgeSeconds: number },\n ): Promise<InstructionConfirmationRow> {\n return this.withErrorHandling('instruction.requireConfirmation', async () => {\n await this.verifyOwnership('agent_instructions', instructionId, developerId, 'Instruction');\n\n const cutoff = new Date(Date.now() - opts.maxAgeSeconds * 1000).toISOString();\n\n const { data, error } = await this.db\n .from('agent_instruction_confirmations')\n .select('*')\n .eq('instruction_id', instructionId)\n .eq('confirmation_type', opts.requiredType)\n .gte('created_at', cutoff)\n .order('created_at', { ascending: false })\n .limit(1)\n .maybeSingle();\n\n if (error) throw error;\n if (!data) {\n throw new ConfirmationRequiredError(instructionId);\n }\n return data as InstructionConfirmationRow;\n });\n }\n\n async recordInstructionSpend(instructionId: string, amountCents: number): Promise<void> {\n return this.withErrorHandling('instruction.recordSpend', async () => {\n const { data: instruction, error: fetchError } = await this.db\n .from('agent_instructions')\n .select('id, amount, spent_cents, status')\n .eq('id', instructionId)\n .single();\n\n if (fetchError || !instruction) {\n throw new NotFoundError('Instruction', instructionId);\n }\n\n // Enforce instruction budget ceiling\n if (instruction.amount !== null && (instruction.spent_cents + amountCents) > instruction.amount) {\n throw new ValidationError(\n `Instruction budget exceeded: spent ${instruction.spent_cents} + ${amountCents} > budget ${instruction.amount}`,\n );\n }\n\n const { error } = await this.db\n .from('agent_instructions')\n .update({\n spent_cents: instruction.spent_cents + amountCents,\n updated_at: new Date().toISOString(),\n })\n .eq('id', instructionId);\n\n if (error) throw error;\n });\n }\n\n async getInstructionBudget(instructionId: string, developerId: string): Promise<InstructionBudgetStatus> {\n return this.withErrorHandling('instruction.getBudget', async () => {\n const instruction = await this.get(instructionId, developerId);\n\n // Get all mandates for this instruction\n const mandates = await this.listMandates(instructionId, developerId);\n\n const mandateDetails = mandates.map((m) => {\n const config = m.config as Record<string, unknown>;\n const maxAmount = typeof config.maxAmount === 'number' ? config.maxAmount : null;\n const spentCents = typeof config.spentCents === 'number' ? config.spentCents : 0;\n const remaining = maxAmount !== null ? Math.max(0, maxAmount - spentCents) : -1;\n\n return {\n id: m.id,\n name: typeof config.purposeDescription === 'string' ? config.purposeDescription : m.type,\n spentCents,\n remainingCents: remaining,\n maxAmountCents: maxAmount,\n status: m.status,\n };\n });\n\n const amountCents = instruction.amount;\n const remaining = amountCents !== null\n ? Math.max(0, amountCents - instruction.spent_cents)\n : -1;\n\n return {\n amountCents,\n spentCents: instruction.spent_cents,\n remainingCents: remaining,\n mandateCount: mandates.length,\n completedMandates: mandates.filter((m) => m.status === 'completed' || m.status === 'exhausted').length,\n mandates: mandateDetails,\n };\n });\n }\n}\n\nfunction parseDuration(duration: string): number {\n const match = duration.match(/^(\\d+)([smhd])$/);\n if (!match) return 3600000; // default 1h\n const [, num, unit] = match;\n const multipliers: Record<string, number> = { s: 1000, m: 60000, h: 3600000, d: 86400000 };\n return parseInt(num!, 10) * (multipliers[unit!] ?? 3600000);\n}\n","import type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from '../lib/logger.js';\nimport { BaseService } from '../lib/base-service.js';\nimport { NotFoundError } from '../lib/errors.js';\nimport { randomUUID } from 'node:crypto';\nimport type { IUserService, AgentUserRow, CreateAgentUserParams } from '../lib/interfaces.js';\nimport type { ServiceHealth } from '../lib/base-service.js';\n\nexport class UserService extends BaseService implements IUserService {\n readonly serviceName = 'UserService';\n\n constructor(db: SupabaseClient, logger: ILogger) {\n super(db, logger);\n }\n\n async create(developerId: string, params: CreateAgentUserParams): Promise<AgentUserRow> {\n return this.withErrorHandling('user.create', async () => {\n const { data, error } = await this.db\n .from('agent_users')\n .insert({\n developer_id: developerId,\n email: params.email ?? null,\n name: params.name ?? null,\n external_id: params.externalId ?? null,\n metadata: params.metadata ?? {},\n })\n .select()\n .single();\n if (error) throw error;\n return data as AgentUserRow;\n });\n }\n\n async list(developerId: string, params?: { limit?: number; offset?: number }): Promise<{ data: AgentUserRow[]; total: number }> {\n return this.withErrorHandling('user.list', async () => {\n const limit = Math.min(params?.limit ?? 20, 100);\n const offset = params?.offset ?? 0;\n const { data, error, count } = await this.db\n .from('agent_users')\n .select('*', { count: 'exact' })\n .eq('developer_id', developerId)\n .order('created_at', { ascending: false })\n .range(offset, offset + limit - 1);\n if (error) throw error;\n return { data: (data ?? []) as AgentUserRow[], total: count ?? 0 };\n });\n }\n\n async get(userId: string, developerId: string): Promise<AgentUserRow> {\n return this.withErrorHandling('user.get', async () => {\n const { data, error } = await this.db\n .from('agent_users')\n .select('*')\n .eq('id', userId)\n .eq('developer_id', developerId)\n .single();\n if (error || !data) throw new NotFoundError('User', userId);\n return data as AgentUserRow;\n });\n }\n\n async update(userId: string, developerId: string, updates: Partial<CreateAgentUserParams>): Promise<AgentUserRow> {\n return this.withErrorHandling('user.update', async () => {\n await this.verifyOwnership('agent_users', userId, developerId, 'User');\n const updateData: Record<string, unknown> = { updated_at: new Date().toISOString() };\n if (updates.email !== undefined) updateData.email = updates.email;\n if (updates.name !== undefined) updateData.name = updates.name;\n if (updates.externalId !== undefined) updateData.external_id = updates.externalId;\n if (updates.metadata !== undefined) updateData.metadata = updates.metadata;\n\n const { data, error } = await this.db\n .from('agent_users')\n .update(updateData)\n .eq('id', userId)\n .select()\n .single();\n if (error) throw error;\n return data as AgentUserRow;\n });\n }\n\n async delete(userId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('user.delete', async () => {\n await this.verifyOwnership('agent_users', userId, developerId, 'User');\n const { error } = await this.db\n .from('agent_users')\n .update({ status: 'deleted', updated_at: new Date().toISOString() })\n .eq('id', userId);\n if (error) throw error;\n });\n }\n\n async createSession(userId: string, developerId: string): Promise<{ token: string; expiresAt: string }> {\n return this.withErrorHandling('user.createSession', async () => {\n await this.verifyOwnership('agent_users', userId, developerId, 'User');\n const token = `lane_sess_${randomUUID().replace(/-/g, '')}`;\n const expiresAt = new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString();\n return { token, expiresAt };\n });\n }\n}\n","import type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from '../lib/logger.js';\nimport { BaseService } from '../lib/base-service.js';\nimport { NotFoundError } from '../lib/errors.js';\nimport type { IFleetService, FleetAgentRow, RegisterFleetAgentParams } from '../lib/interfaces.js';\nimport type { ServiceHealth } from '../lib/base-service.js';\n\nexport class FleetService extends BaseService implements IFleetService {\n readonly serviceName = 'FleetService';\n\n constructor(db: SupabaseClient, logger: ILogger) {\n super(db, logger);\n }\n\n async register(developerId: string, params: RegisterFleetAgentParams): Promise<FleetAgentRow> {\n return this.withErrorHandling('fleet.register', async () => {\n const { data, error } = await this.db\n .from('agent_fleet')\n .insert({\n developer_id: developerId,\n name: params.name,\n type: params.type ?? 'general',\n wallet_id: params.walletId ?? null,\n policy: params.policy ?? {},\n })\n .select()\n .single();\n if (error) throw error;\n return data as FleetAgentRow;\n });\n }\n\n async list(developerId: string, params?: { limit?: number; offset?: number }): Promise<{ data: FleetAgentRow[]; total: number }> {\n return this.withErrorHandling('fleet.list', async () => {\n const limit = Math.min(params?.limit ?? 20, 100);\n const offset = params?.offset ?? 0;\n const { data, error, count } = await this.db\n .from('agent_fleet')\n .select('*', { count: 'exact' })\n .eq('developer_id', developerId)\n .order('created_at', { ascending: false })\n .range(offset, offset + limit - 1);\n if (error) throw error;\n return { data: (data ?? []) as FleetAgentRow[], total: count ?? 0 };\n });\n }\n\n async get(agentId: string, developerId: string): Promise<FleetAgentRow> {\n return this.withErrorHandling('fleet.get', async () => {\n const { data, error } = await this.db\n .from('agent_fleet')\n .select('*')\n .eq('id', agentId)\n .eq('developer_id', developerId)\n .single();\n if (error || !data) throw new NotFoundError('Fleet agent', agentId);\n return data as FleetAgentRow;\n });\n }\n\n async suspend(agentId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('fleet.suspend', async () => {\n await this.verifyOwnership('agent_fleet', agentId, developerId, 'Fleet agent');\n const { error } = await this.db\n .from('agent_fleet')\n .update({ status: 'suspended', updated_at: new Date().toISOString() })\n .eq('id', agentId);\n if (error) throw error;\n });\n }\n\n async revoke(agentId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('fleet.revoke', async () => {\n await this.verifyOwnership('agent_fleet', agentId, developerId, 'Fleet agent');\n const { error } = await this.db\n .from('agent_fleet')\n .update({ status: 'revoked', updated_at: new Date().toISOString() })\n .eq('id', agentId);\n if (error) throw error;\n });\n }\n\n async setPolicy(agentId: string, developerId: string, policy: Record<string, unknown>): Promise<FleetAgentRow> {\n return this.withErrorHandling('fleet.setPolicy', async () => {\n await this.verifyOwnership('agent_fleet', agentId, developerId, 'Fleet agent');\n const { data, error } = await this.db\n .from('agent_fleet')\n .update({ policy, updated_at: new Date().toISOString() })\n .eq('id', agentId)\n .select()\n .single();\n if (error) throw error;\n return data as FleetAgentRow;\n });\n }\n\n async assignWallet(agentId: string, developerId: string, walletId: string): Promise<FleetAgentRow> {\n return this.withErrorHandling('fleet.assignWallet', async () => {\n await this.verifyOwnership('agent_fleet', agentId, developerId, 'Fleet agent');\n await this.verifyWalletOwnership(walletId, developerId);\n const { data, error } = await this.db\n .from('agent_fleet')\n .update({ wallet_id: walletId, updated_at: new Date().toISOString() })\n .eq('id', agentId)\n .select()\n .single();\n if (error) throw error;\n return data as FleetAgentRow;\n });\n }\n}\n","import type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from '../lib/logger.js';\nimport { BaseService } from '../lib/base-service.js';\nimport { NotFoundError } from '../lib/errors.js';\nimport type { ITeamService, AgentTeamRow, AgentTeamMemberRow, CreateAgentTeamParams } from '../lib/interfaces.js';\nimport type { ServiceHealth } from '../lib/base-service.js';\n\nexport class TeamService extends BaseService implements ITeamService {\n readonly serviceName = 'TeamService';\n\n constructor(db: SupabaseClient, logger: ILogger) {\n super(db, logger);\n }\n\n async create(developerId: string, params: CreateAgentTeamParams): Promise<AgentTeamRow> {\n return this.withErrorHandling('team.create', async () => {\n const { data, error } = await this.db\n .from('agent_teams')\n .insert({\n developer_id: developerId,\n name: params.name,\n budget: params.budget ?? {},\n metadata: params.metadata ?? {},\n })\n .select()\n .single();\n if (error) throw error;\n return data as AgentTeamRow;\n });\n }\n\n async list(developerId: string, params?: { limit?: number; offset?: number }): Promise<{ data: AgentTeamRow[]; total: number }> {\n return this.withErrorHandling('team.list', async () => {\n const limit = Math.min(params?.limit ?? 20, 100);\n const offset = params?.offset ?? 0;\n const { data, error, count } = await this.db\n .from('agent_teams')\n .select('*', { count: 'exact' })\n .eq('developer_id', developerId)\n .order('created_at', { ascending: false })\n .range(offset, offset + limit - 1);\n if (error) throw error;\n return { data: (data ?? []) as AgentTeamRow[], total: count ?? 0 };\n });\n }\n\n async get(teamId: string, developerId: string): Promise<AgentTeamRow> {\n return this.withErrorHandling('team.get', async () => {\n const { data, error } = await this.db\n .from('agent_teams')\n .select('*')\n .eq('id', teamId)\n .eq('developer_id', developerId)\n .single();\n if (error || !data) throw new NotFoundError('Team', teamId);\n return data as AgentTeamRow;\n });\n }\n\n async update(teamId: string, developerId: string, updates: Partial<CreateAgentTeamParams>): Promise<AgentTeamRow> {\n return this.withErrorHandling('team.update', async () => {\n await this.verifyOwnership('agent_teams', teamId, developerId, 'Team');\n const updateData: Record<string, unknown> = { updated_at: new Date().toISOString() };\n if (updates.name !== undefined) updateData.name = updates.name;\n if (updates.metadata !== undefined) updateData.metadata = updates.metadata;\n\n const { data, error } = await this.db\n .from('agent_teams')\n .update(updateData)\n .eq('id', teamId)\n .select()\n .single();\n if (error) throw error;\n return data as AgentTeamRow;\n });\n }\n\n async addMember(teamId: string, developerId: string, userId: string, role: string = 'member'): Promise<AgentTeamMemberRow> {\n return this.withErrorHandling('team.addMember', async () => {\n await this.verifyOwnership('agent_teams', teamId, developerId, 'Team');\n const { data, error } = await this.db\n .from('agent_team_members')\n .insert({ team_id: teamId, user_id: userId, role })\n .select()\n .single();\n if (error) throw error;\n return data as AgentTeamMemberRow;\n });\n }\n\n async listMembers(teamId: string, developerId: string): Promise<AgentTeamMemberRow[]> {\n return this.withErrorHandling('team.listMembers', async () => {\n await this.verifyOwnership('agent_teams', teamId, developerId, 'Team');\n const { data, error } = await this.db\n .from('agent_team_members')\n .select('*')\n .eq('team_id', teamId)\n .order('created_at', { ascending: false });\n if (error) throw error;\n return (data ?? []) as AgentTeamMemberRow[];\n });\n }\n\n async removeMember(teamId: string, memberId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('team.removeMember', async () => {\n await this.verifyOwnership('agent_teams', teamId, developerId, 'Team');\n const { error } = await this.db\n .from('agent_team_members')\n .delete()\n .eq('id', memberId)\n .eq('team_id', teamId);\n if (error) throw error;\n });\n }\n\n async setBudget(teamId: string, developerId: string, budget: Record<string, unknown>): Promise<AgentTeamRow> {\n return this.withErrorHandling('team.setBudget', async () => {\n await this.verifyOwnership('agent_teams', teamId, developerId, 'Team');\n const { data, error } = await this.db\n .from('agent_teams')\n .update({ budget, updated_at: new Date().toISOString() })\n .eq('id', teamId)\n .select()\n .single();\n if (error) throw error;\n return data as AgentTeamRow;\n });\n }\n}\n","import type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from '../lib/logger.js';\nimport { BaseService } from '../lib/base-service.js';\nimport { NotFoundError } from '../lib/errors.js';\nimport { randomBytes } from 'node:crypto';\nimport type { IWebhookService, AgentWebhookRow, CreateAgentWebhookParams } from '../lib/interfaces.js';\nimport type { ServiceHealth } from '../lib/base-service.js';\n\nexport class WebhookService extends BaseService implements IWebhookService {\n readonly serviceName = 'WebhookService';\n\n constructor(db: SupabaseClient, logger: ILogger) {\n super(db, logger);\n }\n\n async create(developerId: string, params: CreateAgentWebhookParams): Promise<AgentWebhookRow> {\n return this.withErrorHandling('webhook.create', async () => {\n const signingSecret = `whsec_${randomBytes(24).toString('hex')}`;\n const { data, error } = await this.db\n .from('agent_webhooks')\n .insert({\n developer_id: developerId,\n url: params.url,\n events: params.events,\n signing_secret: signingSecret,\n })\n .select()\n .single();\n if (error) throw error;\n return data as AgentWebhookRow;\n });\n }\n\n async list(developerId: string, params?: { limit?: number; offset?: number }): Promise<{ data: AgentWebhookRow[]; total: number }> {\n return this.withErrorHandling('webhook.list', async () => {\n const limit = Math.min(params?.limit ?? 20, 100);\n const offset = params?.offset ?? 0;\n const { data, error, count } = await this.db\n .from('agent_webhooks')\n .select('*', { count: 'exact' })\n .eq('developer_id', developerId)\n .order('created_at', { ascending: false })\n .range(offset, offset + limit - 1);\n if (error) throw error;\n return { data: (data ?? []) as AgentWebhookRow[], total: count ?? 0 };\n });\n }\n\n async get(webhookId: string, developerId: string): Promise<AgentWebhookRow> {\n return this.withErrorHandling('webhook.get', async () => {\n const { data, error } = await this.db\n .from('agent_webhooks')\n .select('*')\n .eq('id', webhookId)\n .eq('developer_id', developerId)\n .single();\n if (error || !data) throw new NotFoundError('Webhook', webhookId);\n return data as AgentWebhookRow;\n });\n }\n\n async update(webhookId: string, developerId: string, updates: Partial<CreateAgentWebhookParams>): Promise<AgentWebhookRow> {\n return this.withErrorHandling('webhook.update', async () => {\n await this.verifyOwnership('agent_webhooks', webhookId, developerId, 'Webhook');\n const updateData: Record<string, unknown> = { updated_at: new Date().toISOString() };\n if (updates.url !== undefined) updateData.url = updates.url;\n if (updates.events !== undefined) updateData.events = updates.events;\n\n const { data, error } = await this.db\n .from('agent_webhooks')\n .update(updateData)\n .eq('id', webhookId)\n .select()\n .single();\n if (error) throw error;\n return data as AgentWebhookRow;\n });\n }\n\n async delete(webhookId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('webhook.delete', async () => {\n await this.verifyOwnership('agent_webhooks', webhookId, developerId, 'Webhook');\n const { error } = await this.db\n .from('agent_webhooks')\n .delete()\n .eq('id', webhookId);\n if (error) throw error;\n });\n }\n}\n","import type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from '../lib/logger.js';\nimport { BaseService } from '../lib/base-service.js';\nimport { NotFoundError } from '../lib/errors.js';\nimport type { ISubscriptionService, AgentSubscriptionRow, CreateAgentSubscriptionParams } from '../lib/interfaces.js';\nimport type { ServiceHealth } from '../lib/base-service.js';\n\nexport class SubscriptionService extends BaseService implements ISubscriptionService {\n readonly serviceName = 'SubscriptionService';\n\n constructor(db: SupabaseClient, logger: ILogger) {\n super(db, logger);\n }\n\n async create(developerId: string, params: CreateAgentSubscriptionParams): Promise<AgentSubscriptionRow> {\n return this.withErrorHandling('subscription.create', async () => {\n const now = new Date();\n const periodEnd = new Date(now);\n periodEnd.setMonth(periodEnd.getMonth() + 1);\n\n const { data, error } = await this.db\n .from('agent_subscriptions')\n .insert({\n developer_id: developerId,\n wallet_id: params.walletId ?? null,\n product_id: params.productId,\n plan: params.plan,\n current_period_start: now.toISOString(),\n current_period_end: periodEnd.toISOString(),\n metadata: params.metadata ?? {},\n })\n .select()\n .single();\n if (error) throw error;\n return data as AgentSubscriptionRow;\n });\n }\n\n async list(developerId: string, params?: { limit?: number; offset?: number }): Promise<{ data: AgentSubscriptionRow[]; total: number }> {\n return this.withErrorHandling('subscription.list', async () => {\n const limit = Math.min(params?.limit ?? 20, 100);\n const offset = params?.offset ?? 0;\n const { data, error, count } = await this.db\n .from('agent_subscriptions')\n .select('*', { count: 'exact' })\n .eq('developer_id', developerId)\n .order('created_at', { ascending: false })\n .range(offset, offset + limit - 1);\n if (error) throw error;\n return { data: (data ?? []) as AgentSubscriptionRow[], total: count ?? 0 };\n });\n }\n\n async get(subscriptionId: string, developerId: string): Promise<AgentSubscriptionRow> {\n return this.withErrorHandling('subscription.get', async () => {\n const { data, error } = await this.db\n .from('agent_subscriptions')\n .select('*')\n .eq('id', subscriptionId)\n .eq('developer_id', developerId)\n .single();\n if (error || !data) throw new NotFoundError('Subscription', subscriptionId);\n return data as AgentSubscriptionRow;\n });\n }\n\n async cancel(subscriptionId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('subscription.cancel', async () => {\n await this.verifyOwnership('agent_subscriptions', subscriptionId, developerId, 'Subscription');\n const { error } = await this.db\n .from('agent_subscriptions')\n .update({ status: 'canceled', canceled_at: new Date().toISOString(), updated_at: new Date().toISOString() })\n .eq('id', subscriptionId);\n if (error) throw error;\n });\n }\n\n async pause(subscriptionId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('subscription.pause', async () => {\n await this.verifyOwnership('agent_subscriptions', subscriptionId, developerId, 'Subscription');\n const { error } = await this.db\n .from('agent_subscriptions')\n .update({ status: 'paused', paused_at: new Date().toISOString(), updated_at: new Date().toISOString() })\n .eq('id', subscriptionId);\n if (error) throw error;\n });\n }\n\n async resume(subscriptionId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('subscription.resume', async () => {\n await this.verifyOwnership('agent_subscriptions', subscriptionId, developerId, 'Subscription');\n const { error } = await this.db\n .from('agent_subscriptions')\n .update({ status: 'active', paused_at: null, updated_at: new Date().toISOString() })\n .eq('id', subscriptionId);\n if (error) throw error;\n });\n }\n}\n","import type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from '../lib/logger.js';\nimport { BaseService } from '../lib/base-service.js';\nimport { NotFoundError } from '../lib/errors.js';\nimport type { ICheckoutService, CheckoutSessionRow, CreateCheckoutSessionParams } from '../lib/interfaces.js';\nimport type { ServiceHealth } from '../lib/base-service.js';\n\nexport class CheckoutService extends BaseService implements ICheckoutService {\n readonly serviceName = 'CheckoutService';\n\n constructor(db: SupabaseClient, logger: ILogger) {\n super(db, logger);\n }\n\n async create(developerId: string, params: CreateCheckoutSessionParams): Promise<CheckoutSessionRow> {\n return this.withErrorHandling('checkout.create', async () => {\n const { data, error } = await this.db\n .from('agent_checkout_sessions')\n .insert({\n developer_id: developerId,\n wallet_id: params.walletId ?? null,\n product_id: params.productId ?? null,\n amount: params.amount ?? null,\n currency: params.currency ?? 'USD',\n metadata: params.metadata ?? {},\n })\n .select()\n .single();\n if (error) throw error;\n return data as CheckoutSessionRow;\n });\n }\n\n async get(sessionId: string, developerId: string): Promise<CheckoutSessionRow> {\n return this.withErrorHandling('checkout.get', async () => {\n const { data, error } = await this.db\n .from('agent_checkout_sessions')\n .select('*')\n .eq('id', sessionId)\n .eq('developer_id', developerId)\n .single();\n if (error || !data) throw new NotFoundError('Checkout session', sessionId);\n return data as CheckoutSessionRow;\n });\n }\n\n async complete(sessionId: string, developerId: string): Promise<CheckoutSessionRow> {\n return this.withErrorHandling('checkout.complete', async () => {\n await this.verifyOwnership('agent_checkout_sessions', sessionId, developerId, 'Checkout session');\n const { data, error } = await this.db\n .from('agent_checkout_sessions')\n .update({ status: 'completed', completed_at: new Date().toISOString(), updated_at: new Date().toISOString() })\n .eq('id', sessionId)\n .select()\n .single();\n if (error) throw error;\n return data as CheckoutSessionRow;\n });\n }\n\n async cancel(sessionId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('checkout.cancel', async () => {\n await this.verifyOwnership('agent_checkout_sessions', sessionId, developerId, 'Checkout session');\n const { error } = await this.db\n .from('agent_checkout_sessions')\n .update({ status: 'cancelled', cancelled_at: new Date().toISOString(), updated_at: new Date().toISOString() })\n .eq('id', sessionId);\n if (error) throw error;\n });\n }\n}\n","// ---------------------------------------------------------------------------\n// Agent Service — Agent Registry & Fleet Management\n// ---------------------------------------------------------------------------\n// Manages agent lifecycle: registration, policy management, suspension,\n// reactivation, revocation, and wallet assignment. Each agent belongs to a\n// developer and can have an independent spending policy.\n// ---------------------------------------------------------------------------\n\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport { BaseService } from '../lib/base-service.js';\nimport type { ILogger } from '../lib/logger.js';\nimport type { IAgentService, AgentRow, RegisterAgentParams } from '../lib/interfaces.js';\nimport { NotFoundError, ValidationError, ConflictError } from '../lib/errors.js';\n\nexport class AgentService extends BaseService implements IAgentService {\n readonly serviceName = 'AgentService';\n\n constructor(db: SupabaseClient, logger: ILogger) {\n super(db, logger);\n }\n\n /**\n * Register a new agent in the fleet.\n */\n async register(developerId: string, params: RegisterAgentParams): Promise<AgentRow> {\n return this.withErrorHandling('register', async () => {\n if (!params.name || params.name.trim().length === 0) {\n throw new ValidationError('Agent name is required');\n }\n\n const id = crypto.randomUUID();\n const now = new Date().toISOString();\n\n const { data, error } = await this.db\n .from('agents')\n .insert({\n id,\n developer_id: developerId,\n name: params.name.trim(),\n type: params.type,\n status: 'active',\n wallet_id: params.walletId ?? null,\n policy: params.policy ?? null,\n last_seen_at: null,\n created_at: now,\n updated_at: now,\n })\n .select()\n .single();\n\n if (error || !data) {\n throw new ValidationError(`Failed to register agent: ${error?.message}`);\n }\n\n this.log.info('Agent registered', {\n agentId: data.id,\n developerId,\n name: params.name,\n type: params.type,\n });\n\n return data as AgentRow;\n }, { developerId });\n }\n\n /**\n * Get an agent by ID with ownership verification.\n */\n async get(agentId: string, developerId: string): Promise<AgentRow> {\n return this.withErrorHandling('get', async () => {\n const { data, error } = await this.db\n .from('agents')\n .select('*')\n .eq('id', agentId)\n .eq('developer_id', developerId)\n .single();\n\n if (error || !data) {\n throw new NotFoundError('Agent', agentId);\n }\n\n return data as AgentRow;\n }, { agentId, developerId });\n }\n\n /**\n * List agents for a developer with pagination and optional status filter.\n */\n async list(\n developerId: string,\n params?: { status?: string; limit?: number; offset?: number },\n ): Promise<{ data: AgentRow[]; total: number }> {\n return this.withErrorHandling('list', async () => {\n const limit = params?.limit ?? 50;\n const offset = params?.offset ?? 0;\n\n let countQuery = this.db\n .from('agents')\n .select('id', { count: 'exact', head: true })\n .eq('developer_id', developerId);\n\n if (params?.status) {\n countQuery = countQuery.eq('status', params.status);\n }\n\n const { count, error: countError } = await countQuery;\n\n if (countError) {\n throw new ValidationError(`Failed to count agents: ${countError.message}`);\n }\n\n let dataQuery = this.db\n .from('agents')\n .select('*')\n .eq('developer_id', developerId)\n .order('created_at', { ascending: false })\n .range(offset, offset + limit - 1);\n\n if (params?.status) {\n dataQuery = dataQuery.eq('status', params.status);\n }\n\n const { data, error } = await dataQuery;\n\n if (error) {\n throw new ValidationError(`Failed to list agents: ${error.message}`);\n }\n\n return {\n data: (data ?? []) as AgentRow[],\n total: count ?? 0,\n };\n }, { developerId, limit: params?.limit, offset: params?.offset });\n }\n\n /**\n * Update an agent's policy. Verifies ownership first.\n */\n async setPolicy(agentId: string, developerId: string, policy: Record<string, unknown>): Promise<AgentRow> {\n return this.withErrorHandling('setPolicy', async () => {\n await this.verifyOwnership('agents', agentId, developerId, 'Agent');\n\n const { data, error } = await this.db\n .from('agents')\n .update({\n policy,\n updated_at: new Date().toISOString(),\n })\n .eq('id', agentId)\n .select()\n .single();\n\n if (error || !data) {\n throw new ValidationError(`Failed to set agent policy: ${error?.message}`);\n }\n\n this.log.info('Agent policy updated', { agentId, developerId });\n\n return data as AgentRow;\n }, { agentId, developerId });\n }\n\n /**\n * Suspend an agent (temporary). Verifies ownership.\n */\n async suspend(agentId: string, developerId: string): Promise<AgentRow> {\n return this.withErrorHandling('suspend', async () => {\n await this.verifyOwnership('agents', agentId, developerId, 'Agent');\n\n const { data, error } = await this.db\n .from('agents')\n .update({\n status: 'suspended',\n updated_at: new Date().toISOString(),\n })\n .eq('id', agentId)\n .select()\n .single();\n\n if (error || !data) {\n throw new ValidationError(`Failed to suspend agent: ${error?.message}`);\n }\n\n this.log.info('Agent suspended', { agentId, developerId });\n\n return data as AgentRow;\n }, { agentId, developerId });\n }\n\n /**\n * Reactivate a suspended agent. Only valid if currently suspended.\n */\n async reactivate(agentId: string, developerId: string): Promise<AgentRow> {\n return this.withErrorHandling('reactivate', async () => {\n const agent = await this.get(agentId, developerId);\n\n if (agent.status !== 'suspended') {\n throw new ConflictError(`Agent is '${agent.status}', can only reactivate 'suspended' agents`);\n }\n\n const { data, error } = await this.db\n .from('agents')\n .update({\n status: 'active',\n updated_at: new Date().toISOString(),\n })\n .eq('id', agentId)\n .select()\n .single();\n\n if (error || !data) {\n throw new ValidationError(`Failed to reactivate agent: ${error?.message}`);\n }\n\n this.log.info('Agent reactivated', { agentId, developerId });\n\n return data as AgentRow;\n }, { agentId, developerId });\n }\n\n /**\n * Permanently revoke an agent. Verifies ownership.\n */\n async revoke(agentId: string, developerId: string): Promise<AgentRow> {\n return this.withErrorHandling('revoke', async () => {\n await this.verifyOwnership('agents', agentId, developerId, 'Agent');\n\n const { data, error } = await this.db\n .from('agents')\n .update({\n status: 'revoked',\n updated_at: new Date().toISOString(),\n })\n .eq('id', agentId)\n .select()\n .single();\n\n if (error || !data) {\n throw new ValidationError(`Failed to revoke agent: ${error?.message}`);\n }\n\n this.log.info('Agent revoked', { agentId, developerId });\n\n return data as AgentRow;\n }, { agentId, developerId });\n }\n\n /**\n * Assign a wallet to an agent. Verifies ownership of both agent and wallet.\n */\n async assignWallet(agentId: string, developerId: string, walletId: string): Promise<AgentRow> {\n return this.withErrorHandling('assignWallet', async () => {\n await this.verifyOwnership('agents', agentId, developerId, 'Agent');\n await this.verifyWalletOwnership(walletId, developerId);\n\n const { data, error } = await this.db\n .from('agents')\n .update({\n wallet_id: walletId,\n updated_at: new Date().toISOString(),\n })\n .eq('id', agentId)\n .select()\n .single();\n\n if (error || !data) {\n throw new ValidationError(`Failed to assign wallet to agent: ${error?.message}`);\n }\n\n this.log.info('Wallet assigned to agent', { agentId, walletId, developerId });\n\n return data as AgentRow;\n }, { agentId, walletId, developerId });\n }\n}\n","// ---------------------------------------------------------------------------\n// Identity Service — Agent Identity & KYC Chain\n// ---------------------------------------------------------------------------\n// Manages agent identity lifecycle: registration, verification, attestation\n// generation, suspension, and revocation. Implements the KYC chain:\n// Human (developer) -> Lane (platform) -> Agent -> Transaction\n// ---------------------------------------------------------------------------\n\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport { BaseService } from '../lib/base-service.js';\nimport type { ILogger } from '../lib/logger.js';\nimport type { IIdentityService, AgentIdentityRow } from '../lib/interfaces.js';\nimport { NotFoundError, ValidationError } from '../lib/errors.js';\nimport { createHmac, createHash } from 'node:crypto';\n\nconst ATTESTATION_SECRET = process.env.LANE_ATTESTATION_SECRET || 'lane-attestation-dev-key';\nconst DSP_ID = process.env.LANE_MC_DSP_ID || 'lane-dsp-001';\n\nexport class IdentityService extends BaseService implements IIdentityService {\n readonly serviceName = 'IdentityService';\n\n constructor(db: SupabaseClient, logger: ILogger) {\n super(db, logger);\n }\n\n /**\n * Register an agent for identity verification.\n * Starts the KYC chain with humanVerified=true (developer is vouching).\n */\n async register(\n developerId: string,\n params: { agentId: string; capabilities?: string[]; purpose?: string },\n ): Promise<AgentIdentityRow> {\n return this.withErrorHandling('register', async () => {\n if (!params.agentId) {\n throw new ValidationError('Agent ID is required');\n }\n\n // Verify the agent exists and belongs to this developer\n await this.verifyOwnership('agents', params.agentId, developerId, 'Agent');\n\n const id = crypto.randomUUID();\n const now = new Date().toISOString();\n\n const kycChain = {\n humanVerified: true,\n laneVerified: false,\n agentBound: false,\n transactionSigned: false,\n };\n\n const { data, error } = await this.db\n .from('agent_identities')\n .insert({\n id,\n agent_id: params.agentId,\n developer_id: developerId,\n kyc_chain: kycChain,\n attestation_document: null,\n attestation_signature: null,\n attestation_key_fingerprint: null,\n attestation_expires_at: null,\n capabilities: params.capabilities ?? null,\n purpose: params.purpose ?? null,\n dsp_id: DSP_ID,\n commerce_indicator: null,\n status: 'pending',\n verified_at: null,\n created_at: now,\n })\n .select()\n .single();\n\n if (error || !data) {\n throw new ValidationError(`Failed to register identity: ${error?.message}`);\n }\n\n this.log.info('Agent identity registered', {\n identityId: data.id,\n agentId: params.agentId,\n developerId,\n });\n\n return data as AgentIdentityRow;\n }, { developerId });\n }\n\n /**\n * Verify an agent identity with a verification code.\n * Stub: accepts any 6-digit code. Progresses KYC chain and generates attestation.\n */\n async verify(\n identityId: string,\n developerId: string,\n verificationCode: string,\n ): Promise<AgentIdentityRow> {\n return this.withErrorHandling('verify', async () => {\n // Validate verification code format (6-digit)\n if (!/^\\d{6}$/.test(verificationCode)) {\n throw new ValidationError('Verification code must be a 6-digit number');\n }\n\n const identity = await this.get(identityId, developerId);\n\n if (identity.status !== 'pending') {\n throw new ValidationError(`Identity is '${identity.status}', can only verify 'pending' identities`);\n }\n\n // Progress KYC chain\n const kycChain = {\n ...identity.kyc_chain,\n laneVerified: true,\n agentBound: true,\n };\n\n // Generate attestation\n const attestation = this.generateAttestation({ ...identity, kyc_chain: kycChain });\n const now = new Date().toISOString();\n\n const { data, error } = await this.db\n .from('agent_identities')\n .update({\n kyc_chain: kycChain,\n attestation_document: attestation.document,\n attestation_signature: attestation.signature,\n attestation_key_fingerprint: attestation.keyFingerprint,\n attestation_expires_at: attestation.expiresAt,\n status: 'verified',\n verified_at: now,\n })\n .eq('id', identityId)\n .select()\n .single();\n\n if (error || !data) {\n throw new ValidationError(`Failed to verify identity: ${error?.message}`);\n }\n\n this.log.info('Agent identity verified', {\n identityId,\n agentId: identity.agent_id,\n developerId,\n });\n\n return data as AgentIdentityRow;\n }, { identityId, developerId });\n }\n\n /**\n * Get an identity by ID with ownership verification.\n */\n async get(identityId: string, developerId: string): Promise<AgentIdentityRow> {\n return this.withErrorHandling('get', async () => {\n const { data, error } = await this.db\n .from('agent_identities')\n .select('*')\n .eq('id', identityId)\n .eq('developer_id', developerId)\n .single();\n\n if (error || !data) {\n throw new NotFoundError('AgentIdentity', identityId);\n }\n\n return data as AgentIdentityRow;\n }, { identityId, developerId });\n }\n\n /**\n * List identities for a developer with pagination and optional filters.\n */\n async list(\n developerId: string,\n params?: { agentId?: string; status?: string; limit?: number; offset?: number },\n ): Promise<{ data: AgentIdentityRow[]; total: number }> {\n return this.withErrorHandling('list', async () => {\n const limit = params?.limit ?? 50;\n const offset = params?.offset ?? 0;\n\n let countQuery = this.db\n .from('agent_identities')\n .select('id', { count: 'exact', head: true })\n .eq('developer_id', developerId);\n\n if (params?.agentId) {\n countQuery = countQuery.eq('agent_id', params.agentId);\n }\n if (params?.status) {\n countQuery = countQuery.eq('status', params.status);\n }\n\n const { count, error: countError } = await countQuery;\n\n if (countError) {\n throw new ValidationError(`Failed to count identities: ${countError.message}`);\n }\n\n let dataQuery = this.db\n .from('agent_identities')\n .select('*')\n .eq('developer_id', developerId)\n .order('created_at', { ascending: false })\n .range(offset, offset + limit - 1);\n\n if (params?.agentId) {\n dataQuery = dataQuery.eq('agent_id', params.agentId);\n }\n if (params?.status) {\n dataQuery = dataQuery.eq('status', params.status);\n }\n\n const { data, error } = await dataQuery;\n\n if (error) {\n throw new ValidationError(`Failed to list identities: ${error.message}`);\n }\n\n return {\n data: (data ?? []) as AgentIdentityRow[],\n total: count ?? 0,\n };\n }, { developerId, limit: params?.limit, offset: params?.offset });\n }\n\n /**\n * Get attestation fields for a verified identity.\n */\n async getAttestation(\n identityId: string,\n developerId: string,\n ): Promise<{ document: string; signature: string; keyFingerprint: string; expiresAt: string }> {\n return this.withErrorHandling('getAttestation', async () => {\n const identity = await this.get(identityId, developerId);\n\n if (!identity.attestation_document || !identity.attestation_signature) {\n throw new ValidationError('Identity does not have an attestation. Verify the identity first.');\n }\n\n return {\n document: identity.attestation_document,\n signature: identity.attestation_signature,\n keyFingerprint: identity.attestation_key_fingerprint!,\n expiresAt: identity.attestation_expires_at!,\n };\n }, { identityId, developerId });\n }\n\n /**\n * Refresh the attestation for a verified identity.\n * Generates a new signed document and updates the stored attestation.\n */\n async refreshAttestation(\n identityId: string,\n developerId: string,\n ): Promise<{ document: string; signature: string; keyFingerprint: string; expiresAt: string }> {\n return this.withErrorHandling('refreshAttestation', async () => {\n const identity = await this.get(identityId, developerId);\n\n if (identity.status !== 'verified') {\n throw new ValidationError(`Cannot refresh attestation for '${identity.status}' identity`);\n }\n\n const attestation = this.generateAttestation(identity);\n\n const { error } = await this.db\n .from('agent_identities')\n .update({\n attestation_document: attestation.document,\n attestation_signature: attestation.signature,\n attestation_key_fingerprint: attestation.keyFingerprint,\n attestation_expires_at: attestation.expiresAt,\n })\n .eq('id', identityId);\n\n if (error) {\n throw new ValidationError(`Failed to refresh attestation: ${error.message}`);\n }\n\n this.log.info('Attestation refreshed', { identityId, developerId });\n\n return attestation;\n }, { identityId, developerId });\n }\n\n /**\n * Suspend an identity.\n */\n async suspend(identityId: string, developerId: string): Promise<AgentIdentityRow> {\n return this.withErrorHandling('suspend', async () => {\n await this.verifyOwnership('agent_identities', identityId, developerId, 'AgentIdentity');\n\n const { data, error } = await this.db\n .from('agent_identities')\n .update({ status: 'suspended' })\n .eq('id', identityId)\n .select()\n .single();\n\n if (error || !data) {\n throw new ValidationError(`Failed to suspend identity: ${error?.message}`);\n }\n\n this.log.info('Agent identity suspended', { identityId, developerId });\n\n return data as AgentIdentityRow;\n }, { identityId, developerId });\n }\n\n /**\n * Revoke an identity permanently.\n */\n async revoke(identityId: string, developerId: string): Promise<AgentIdentityRow> {\n return this.withErrorHandling('revoke', async () => {\n await this.verifyOwnership('agent_identities', identityId, developerId, 'AgentIdentity');\n\n const { data, error } = await this.db\n .from('agent_identities')\n .update({ status: 'revoked' })\n .eq('id', identityId)\n .select()\n .single();\n\n if (error || !data) {\n throw new ValidationError(`Failed to revoke identity: ${error?.message}`);\n }\n\n this.log.info('Agent identity revoked', { identityId, developerId });\n\n return data as AgentIdentityRow;\n }, { identityId, developerId });\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n /**\n * Generate a cryptographic attestation for an agent identity.\n * The attestation is an HMAC-SHA256 signed document encoding the identity's\n * KYC chain, agent/developer IDs, and DSP binding.\n */\n private generateAttestation(identity: AgentIdentityRow): {\n document: string;\n signature: string;\n keyFingerprint: string;\n expiresAt: string;\n } {\n const doc = JSON.stringify({\n agentId: identity.agent_id,\n developerId: identity.developer_id,\n kycChain: identity.kyc_chain,\n dspId: identity.dsp_id,\n issuedAt: new Date().toISOString(),\n });\n const docBase64 = Buffer.from(doc).toString('base64');\n const signature = createHmac('sha256', ATTESTATION_SECRET).update(docBase64).digest('hex');\n const keyFingerprint = createHash('sha256').update(ATTESTATION_SECRET).digest('hex').slice(0, 16);\n const expiresAt = new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(); // 30 days\n return { document: docBase64, signature, keyFingerprint, expiresAt };\n }\n}\n","// ---------------------------------------------------------------------------\n// Delegation Service — Authority Delegation Between Agents\n// ---------------------------------------------------------------------------\n// Manages delegation of mandate authority from parent to child agents.\n// Enforces depth limits (max 5), constraint narrowing (child constraints\n// must be equal-or-more-restrictive), and cascading revocation.\n// ---------------------------------------------------------------------------\n\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport { BaseService } from '../lib/base-service.js';\nimport type { ILogger } from '../lib/logger.js';\nimport type {\n IDelegationService,\n DelegationRow,\n CreateDelegationParams,\n IAgentService,\n IMandateService,\n} from '../lib/interfaces.js';\nimport { NotFoundError, ValidationError, ConflictError } from '../lib/errors.js';\nimport { ErrorCode, ServiceError } from '../lib/errors.js';\n\nconst MAX_DELEGATION_DEPTH = 5;\n\nexport class DelegationService extends BaseService implements IDelegationService {\n readonly serviceName = 'DelegationService';\n\n private readonly mandates: IMandateService;\n private readonly agents: IAgentService;\n\n constructor(\n db: SupabaseClient,\n logger: ILogger,\n mandates: IMandateService,\n agents: IAgentService,\n ) {\n super(db, logger);\n this.mandates = mandates;\n this.agents = agents;\n }\n\n /**\n * Create a delegation from parent agent to child agent for a specific mandate.\n * Validates ownership, mandate status, depth limits, and constraint narrowing.\n */\n async delegate(developerId: string, params: CreateDelegationParams): Promise<DelegationRow> {\n return this.withErrorHandling('delegate', async () => {\n // Validate both agents exist and belong to developer\n const parentAgent = await this.agents.get(params.parentAgentId, developerId);\n const childAgent = await this.agents.get(params.childAgentId, developerId);\n\n if (parentAgent.status !== 'active') {\n throw new ValidationError(`Parent agent is '${parentAgent.status}', must be 'active'`);\n }\n if (childAgent.status !== 'active') {\n throw new ValidationError(`Child agent is '${childAgent.status}', must be 'active'`);\n }\n\n // Validate mandate exists and is active\n const mandate = await this.mandates.getMandate(params.mandateId, developerId);\n if (mandate.status !== 'active') {\n throw new ValidationError(`Mandate is '${mandate.status}', must be 'active'`);\n }\n\n // Determine delegation depth\n let depth = 0;\n\n // Check if parent already has a delegation for this mandate\n const { data: parentDelegation } = await this.db\n .from('delegations')\n .select('*')\n .eq('child_agent_id', params.parentAgentId)\n .eq('mandate_id', params.mandateId)\n .eq('status', 'active')\n .limit(1)\n .single();\n\n if (parentDelegation) {\n depth = (parentDelegation as DelegationRow).depth + 1;\n }\n\n if (depth >= MAX_DELEGATION_DEPTH) {\n throw new ValidationError(\n `Delegation depth ${depth} exceeds maximum allowed depth of ${MAX_DELEGATION_DEPTH}`,\n );\n }\n\n // Validate child constraints are equal-or-more-restrictive than parent\n if (params.constraints && parentDelegation) {\n const parentConstraints = (parentDelegation as DelegationRow).constraints;\n if (parentConstraints) {\n this.validateConstraintNarrowing(parentConstraints, params.constraints);\n }\n }\n\n const id = crypto.randomUUID();\n const now = new Date().toISOString();\n\n const { data, error } = await this.db\n .from('delegations')\n .insert({\n id,\n developer_id: developerId,\n parent_agent_id: params.parentAgentId,\n child_agent_id: params.childAgentId,\n mandate_id: params.mandateId,\n constraints: params.constraints ?? null,\n depth,\n status: 'active',\n expires_at: params.expiresAt ?? null,\n created_at: now,\n })\n .select()\n .single();\n\n if (error || !data) {\n throw new ValidationError(`Failed to create delegation: ${error?.message}`);\n }\n\n this.log.info('Delegation created', {\n delegationId: data.id,\n parentAgentId: params.parentAgentId,\n childAgentId: params.childAgentId,\n mandateId: params.mandateId,\n depth,\n developerId,\n });\n\n return data as DelegationRow;\n }, { developerId });\n }\n\n /**\n * Walk the delegation chain from agentId up to the root agent for a mandate.\n * Returns whether the chain is valid and the path of agent IDs.\n */\n async validateDelegationChain(\n agentId: string,\n mandateId: string,\n ): Promise<{ valid: boolean; chain: string[] }> {\n return this.withErrorHandling('validateDelegationChain', async () => {\n const chain: string[] = [agentId];\n let currentAgentId = agentId;\n\n for (let i = 0; i < MAX_DELEGATION_DEPTH + 1; i++) {\n // Find delegation where this agent is the child\n const { data: delegation } = await this.db\n .from('delegations')\n .select('*')\n .eq('child_agent_id', currentAgentId)\n .eq('mandate_id', mandateId)\n .eq('status', 'active')\n .limit(1)\n .single();\n\n if (!delegation) {\n // No more delegations — this is the root (or chain is broken)\n break;\n }\n\n const row = delegation as DelegationRow;\n\n // Check for expiration\n if (row.expires_at && new Date(row.expires_at) < new Date()) {\n return { valid: false, chain };\n }\n\n currentAgentId = row.parent_agent_id;\n chain.push(currentAgentId);\n }\n\n // The chain is valid if we found at least one delegation link\n // (or the agent is the direct mandate holder)\n return { valid: true, chain };\n }, { agentId, mandateId });\n }\n\n /**\n * Revoke a delegation and cascade to all child delegations.\n */\n async revokeDelegation(delegationId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('revokeDelegation', async () => {\n const delegation = await this.getDelegation(delegationId, developerId);\n\n if (delegation.status === 'revoked') {\n throw new ConflictError('Delegation is already revoked');\n }\n\n // Revoke this delegation\n const { error } = await this.db\n .from('delegations')\n .update({ status: 'revoked' })\n .eq('id', delegationId);\n\n if (error) {\n throw new ValidationError(`Failed to revoke delegation: ${error.message}`);\n }\n\n // Cascade: revoke all child delegations where the child of this delegation\n // is the parent in other delegations\n await this.cascadeRevoke(delegation.child_agent_id, delegation.mandate_id);\n\n this.log.info('Delegation revoked', {\n delegationId,\n childAgentId: delegation.child_agent_id,\n mandateId: delegation.mandate_id,\n developerId,\n });\n }, { delegationId, developerId });\n }\n\n /**\n * Get a delegation by ID with ownership verification.\n */\n async getDelegation(delegationId: string, developerId: string): Promise<DelegationRow> {\n return this.withErrorHandling('getDelegation', async () => {\n const { data, error } = await this.db\n .from('delegations')\n .select('*')\n .eq('id', delegationId)\n .eq('developer_id', developerId)\n .single();\n\n if (error || !data) {\n throw new NotFoundError('Delegation', delegationId);\n }\n\n return data as DelegationRow;\n }, { delegationId, developerId });\n }\n\n /**\n * List delegations for a developer with pagination and optional filters.\n */\n async listDelegations(\n developerId: string,\n params?: { agentId?: string; mandateId?: string; limit?: number; offset?: number },\n ): Promise<{ data: DelegationRow[]; total: number }> {\n return this.withErrorHandling('listDelegations', async () => {\n const limit = params?.limit ?? 50;\n const offset = params?.offset ?? 0;\n\n let countQuery = this.db\n .from('delegations')\n .select('id', { count: 'exact', head: true })\n .eq('developer_id', developerId);\n\n if (params?.agentId) {\n countQuery = countQuery.or(\n `parent_agent_id.eq.${params.agentId},child_agent_id.eq.${params.agentId}`,\n );\n }\n if (params?.mandateId) {\n countQuery = countQuery.eq('mandate_id', params.mandateId);\n }\n\n const { count, error: countError } = await countQuery;\n\n if (countError) {\n throw new ValidationError(`Failed to count delegations: ${countError.message}`);\n }\n\n let dataQuery = this.db\n .from('delegations')\n .select('*')\n .eq('developer_id', developerId)\n .order('created_at', { ascending: false })\n .range(offset, offset + limit - 1);\n\n if (params?.agentId) {\n dataQuery = dataQuery.or(\n `parent_agent_id.eq.${params.agentId},child_agent_id.eq.${params.agentId}`,\n );\n }\n if (params?.mandateId) {\n dataQuery = dataQuery.eq('mandate_id', params.mandateId);\n }\n\n const { data, error } = await dataQuery;\n\n if (error) {\n throw new ValidationError(`Failed to list delegations: ${error.message}`);\n }\n\n return {\n data: (data ?? []) as DelegationRow[],\n total: count ?? 0,\n };\n }, { developerId, limit: params?.limit, offset: params?.offset });\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n /**\n * Validate that child constraints are equal-or-more-restrictive than parent.\n * For numeric fields: child value must be <= parent value.\n * For array fields: child array must be a subset of parent array.\n */\n private validateConstraintNarrowing(\n parentConstraints: Record<string, unknown>,\n childConstraints: Record<string, unknown>,\n ): void {\n for (const [key, childValue] of Object.entries(childConstraints)) {\n const parentValue = parentConstraints[key];\n\n // If parent doesn't have this constraint, child can add it (more restrictive)\n if (parentValue === undefined || parentValue === null) {\n continue;\n }\n\n // Numeric comparison: child must be <= parent\n if (typeof parentValue === 'number' && typeof childValue === 'number') {\n if (childValue > parentValue) {\n throw new ServiceError(\n `Child constraint '${key}' (${childValue}) exceeds parent constraint (${parentValue})`,\n ErrorCode.DELEGATION_INVALID,\n 400,\n );\n }\n }\n\n // Array comparison: child must be subset of parent\n if (Array.isArray(parentValue) && Array.isArray(childValue)) {\n const parentSet = new Set(parentValue as string[]);\n const notInParent = (childValue as string[]).filter((v) => !parentSet.has(v));\n if (notInParent.length > 0) {\n throw new ServiceError(\n `Child constraint '${key}' contains values not in parent: ${notInParent.join(', ')}`,\n ErrorCode.DELEGATION_INVALID,\n 400,\n );\n }\n }\n }\n }\n\n /**\n * Recursively revoke all delegations where the given agent is the parent.\n */\n private async cascadeRevoke(parentAgentId: string, mandateId: string): Promise<void> {\n // Find all active delegations where this agent is the parent for this mandate\n const { data: childDelegations } = await this.db\n .from('delegations')\n .select('*')\n .eq('parent_agent_id', parentAgentId)\n .eq('mandate_id', mandateId)\n .eq('status', 'active');\n\n if (!childDelegations || childDelegations.length === 0) {\n return;\n }\n\n for (const delegation of childDelegations as DelegationRow[]) {\n // Revoke this delegation\n await this.db\n .from('delegations')\n .update({ status: 'revoked' })\n .eq('id', delegation.id);\n\n // Cascade further down\n await this.cascadeRevoke(delegation.child_agent_id, mandateId);\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// Mandate Service — Instruction-Level Mandate Enforcement\n// ---------------------------------------------------------------------------\n// Creates, validates, and manages instruction-level mandates that encode\n// user purchase intent constraints. Mandates enforce rules at the\n// infrastructure level — category restrictions, merchant allow/blocklists,\n// amount caps, and attribute requirements.\n// ---------------------------------------------------------------------------\n\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport { BaseService } from '../lib/base-service.js';\nimport type { ILogger } from '../lib/logger.js';\nimport type {\n IMandateService,\n MandateRow,\n MandateBudgetStatus,\n CreateMandateParams,\n PaymentContext,\n MandateValidationResult,\n} from '../lib/interfaces.js';\nimport { MandateError, NotFoundError, ValidationError, ErrorCode } from '../lib/errors.js';\n\nexport class MandateService extends BaseService implements IMandateService {\n readonly serviceName = 'MandateService';\n\n constructor(db: SupabaseClient, logger: ILogger) {\n super(db, logger);\n }\n\n /**\n * Create a new instruction-level mandate.\n *\n * Sets valid_from to now, status to 'active', and delegation_depth to 0.\n */\n async createMandate(developerId: string, params: CreateMandateParams): Promise<MandateRow> {\n return this.withErrorHandling('createMandate', async () => {\n if (!params.walletId) {\n throw new ValidationError('walletId is required');\n }\n if (!params.purposeDescription) {\n throw new ValidationError('purposeDescription is required');\n }\n\n await this.verifyWalletOwnership(params.walletId, developerId);\n\n const now = new Date().toISOString();\n\n const { data, error } = await this.db\n .from('mandates')\n .insert({\n developer_id: developerId,\n wallet_id: params.walletId,\n purpose_description: params.purposeDescription,\n allowed_categories: params.allowedCategories ?? null,\n allowed_merchants: params.allowedMerchants ?? null,\n blocked_merchants: params.blockedMerchants ?? null,\n max_amount: params.maxAmount ?? null,\n max_unit_price: params.maxUnitPrice ?? null,\n max_quantity: params.maxQuantity ?? null,\n currency: params.currency ?? 'USD',\n required_attributes: params.requiredAttributes ?? null,\n prohibited_attributes: params.prohibitedAttributes ?? null,\n requires_confirmation: params.requiresConfirmation ?? false,\n confirmation_threshold: params.confirmationThreshold ?? null,\n delegated_to: null,\n delegation_depth: 0,\n status: 'active',\n valid_from: now,\n valid_until: params.validUntil ?? null,\n })\n .select()\n .single();\n\n if (error || !data) {\n throw new ValidationError(`Failed to create mandate: ${error?.message}`);\n }\n\n this.log.info('Mandate created', {\n mandateId: data.id,\n developerId,\n walletId: params.walletId,\n purpose: params.purposeDescription,\n });\n\n return data as MandateRow;\n }, { developerId });\n }\n\n /**\n * Core enforcement: validate a payment context against a mandate.\n *\n * Checks every constraint:\n * - Status must be 'active'\n * - Time bounds: now between valid_from and valid_until\n * - allowed_categories: context.merchantCategory or merchantMCC must match\n * - allowed_merchants / blocked_merchants: check context.merchant domain\n * - max_amount: context.amount must not exceed\n * - max_unit_price: context.unitPrice must not exceed\n * - max_quantity: context.quantity must not exceed\n * - required_attributes: every key must have a matching value in context.attributes\n * - prohibited_attributes: no key should have matching value in context.attributes\n *\n * Returns {valid: true} or {valid: false, violations: string[]}\n */\n async validateAgainstMandate(\n mandateId: string,\n context: PaymentContext,\n ): Promise<MandateValidationResult> {\n return this.withErrorHandling('validateAgainstMandate', async () => {\n const { data: mandate, error } = await this.db\n .from('mandates')\n .select('*')\n .eq('id', mandateId)\n .single();\n\n if (error || !mandate) {\n throw new NotFoundError('Mandate', mandateId);\n }\n\n const violations: string[] = [];\n const m = mandate as MandateRow;\n\n // --- Status check ---\n if (m.status !== 'active') {\n violations.push(`Mandate status is '${m.status}', expected 'active'`);\n }\n\n // --- Time bounds ---\n const now = new Date();\n if (new Date(m.valid_from) > now) {\n violations.push(`Mandate is not yet valid (valid_from: ${m.valid_from})`);\n }\n if (m.valid_until && new Date(m.valid_until) < now) {\n violations.push(`Mandate has expired (valid_until: ${m.valid_until})`);\n }\n\n // --- Allowed categories ---\n if (m.allowed_categories && m.allowed_categories.length > 0) {\n const categoryMatch =\n (context.merchantCategory && m.allowed_categories.includes(context.merchantCategory)) ||\n (context.merchantMCC && m.allowed_categories.includes(context.merchantMCC));\n if (!categoryMatch) {\n violations.push(\n `Merchant category '${context.merchantCategory ?? context.merchantMCC ?? 'unknown'}' is not in allowed categories: [${m.allowed_categories.join(', ')}]`,\n );\n }\n }\n\n // --- Allowed merchants ---\n if (m.allowed_merchants && m.allowed_merchants.length > 0) {\n const merchantAllowed = m.allowed_merchants.some(\n (allowed) => context.merchant.toLowerCase() === allowed.toLowerCase(),\n );\n if (!merchantAllowed) {\n violations.push(\n `Merchant '${context.merchant}' is not in allowed merchants: [${m.allowed_merchants.join(', ')}]`,\n );\n }\n }\n\n // --- Blocked merchants ---\n if (m.blocked_merchants && m.blocked_merchants.length > 0) {\n const merchantBlocked = m.blocked_merchants.some(\n (blocked) => context.merchant.toLowerCase() === blocked.toLowerCase(),\n );\n if (merchantBlocked) {\n violations.push(`Merchant '${context.merchant}' is blocked by this mandate`);\n }\n }\n\n // --- Max amount (per-transaction) ---\n if (m.max_amount !== null && context.amount > m.max_amount) {\n violations.push(\n `Amount ${context.amount} exceeds mandate max_amount ${m.max_amount}`,\n );\n }\n\n // --- Cumulative budget check ---\n if (m.max_amount !== null && (m.spent_cents + context.amount) > m.max_amount) {\n violations.push(\n `Cumulative spend would exceed mandate budget: spent ${m.spent_cents} + ${context.amount} > max ${m.max_amount}`,\n );\n }\n\n // --- Max unit price ---\n if (m.max_unit_price !== null && context.unitPrice !== undefined) {\n if (context.unitPrice > m.max_unit_price) {\n violations.push(\n `Unit price ${context.unitPrice} exceeds mandate max_unit_price ${m.max_unit_price}`,\n );\n }\n }\n\n // --- Max quantity ---\n if (m.max_quantity !== null && context.quantity !== undefined) {\n if (context.quantity > m.max_quantity) {\n violations.push(\n `Quantity ${context.quantity} exceeds mandate max_quantity ${m.max_quantity}`,\n );\n }\n }\n\n // --- Required attributes ---\n if (m.required_attributes) {\n for (const [key, allowedValues] of Object.entries(m.required_attributes)) {\n const contextValue = context.attributes?.[key];\n if (!contextValue) {\n violations.push(`Required attribute '${key}' is missing from payment context`);\n } else if (!allowedValues.includes(String(contextValue))) {\n violations.push(\n `Attribute '${key}' value '${contextValue}' is not in allowed values: [${allowedValues.join(', ')}]`,\n );\n }\n }\n }\n\n // --- Prohibited attributes ---\n if (m.prohibited_attributes) {\n for (const [key, prohibitedValues] of Object.entries(m.prohibited_attributes)) {\n const contextValue = context.attributes?.[key];\n if (contextValue && prohibitedValues.includes(String(contextValue))) {\n violations.push(\n `Attribute '${key}' value '${contextValue}' is prohibited by this mandate`,\n );\n }\n }\n }\n\n if (violations.length > 0) {\n this.log.warn('Mandate validation failed', {\n mandateId,\n violations,\n merchant: context.merchant,\n amount: context.amount,\n });\n return { valid: false, violations };\n }\n\n return { valid: true };\n }, { mandateId });\n }\n\n /**\n * Consume a mandate — set status to 'used' and record the transaction ID.\n */\n async consumeMandate(mandateId: string, transactionId: string): Promise<void> {\n return this.withErrorHandling('consumeMandate', async () => {\n const { data: mandate, error: fetchError } = await this.db\n .from('mandates')\n .select('id, status')\n .eq('id', mandateId)\n .single();\n\n if (fetchError || !mandate) {\n throw new NotFoundError('Mandate', mandateId);\n }\n\n if (mandate.status !== 'active') {\n throw new MandateError(\n `Cannot consume mandate with status '${mandate.status}'`,\n ErrorCode.MANDATE_VIOLATED,\n { mandateId, currentStatus: mandate.status },\n );\n }\n\n const { error } = await this.db\n .from('mandates')\n .update({\n status: 'used',\n transaction_id: transactionId,\n })\n .eq('id', mandateId);\n\n if (error) {\n throw new ValidationError(`Failed to consume mandate: ${error.message}`);\n }\n\n this.log.info('Mandate consumed', { mandateId, transactionId });\n }, { mandateId, transactionId });\n }\n\n /**\n * Record a spend against a mandate — cumulative tracking.\n *\n * Instead of marking the mandate as 'used' after one transaction, this\n * increments spent_cents and transaction_count, inserts into mandate_transactions,\n * and only marks status='exhausted' when spent_cents >= max_amount.\n */\n async recordMandateSpend(mandateId: string, transactionId: string, amountCents: number): Promise<MandateRow> {\n return this.withErrorHandling('recordMandateSpend', async () => {\n const { data: mandate, error: fetchError } = await this.db\n .from('mandates')\n .select('*')\n .eq('id', mandateId)\n .single();\n\n if (fetchError || !mandate) {\n throw new NotFoundError('Mandate', mandateId);\n }\n\n const m = mandate as MandateRow;\n\n if (m.status !== 'active') {\n throw new MandateError(\n `Cannot record spend on mandate with status '${m.status}'`,\n ErrorCode.MANDATE_VIOLATED,\n { mandateId, currentStatus: m.status },\n );\n }\n\n // Check cumulative budget before recording\n if (m.max_amount !== null && (m.spent_cents + amountCents) > m.max_amount) {\n throw new MandateError(\n `Cumulative spend would exceed mandate budget: spent ${m.spent_cents} + ${amountCents} > max ${m.max_amount}`,\n ErrorCode.MANDATE_VIOLATED,\n { mandateId, spentCents: m.spent_cents, amountCents, maxAmount: m.max_amount },\n );\n }\n\n const newSpent = m.spent_cents + amountCents;\n const newCount = m.transaction_count + 1;\n const newStatus = (m.max_amount !== null && newSpent >= m.max_amount) ? 'exhausted' : 'active';\n\n // Update mandate\n const { data: updated, error: updateError } = await this.db\n .from('mandates')\n .update({\n spent_cents: newSpent,\n transaction_count: newCount,\n status: newStatus,\n transaction_id: transactionId,\n })\n .eq('id', mandateId)\n .select()\n .single();\n\n if (updateError || !updated) {\n throw new ValidationError(`Failed to record mandate spend: ${updateError?.message}`);\n }\n\n // Insert into mandate_transactions join table\n const { error: txnError } = await this.db\n .from('mandate_transactions')\n .insert({\n mandate_id: mandateId,\n transaction_id: transactionId,\n amount_cents: amountCents,\n });\n\n if (txnError) {\n this.log.warn('Failed to insert mandate_transaction record', { mandateId, transactionId, error: txnError.message });\n }\n\n this.log.info('Mandate spend recorded', {\n mandateId,\n transactionId,\n amountCents,\n newSpent,\n newStatus,\n });\n\n return updated as MandateRow;\n }, { mandateId, transactionId, amountCents });\n }\n\n /**\n * Get mandate budget status.\n */\n async getMandateBudget(mandateId: string, developerId: string): Promise<MandateBudgetStatus> {\n return this.withErrorHandling('getMandateBudget', async () => {\n const mandate = await this.getMandate(mandateId, developerId);\n\n const maxAmount = mandate.max_amount;\n const remaining = maxAmount !== null\n ? Math.max(0, maxAmount - mandate.spent_cents)\n : Infinity;\n\n return {\n maxAmountCents: maxAmount,\n spentCents: mandate.spent_cents,\n remainingCents: remaining === Infinity ? -1 : remaining,\n transactionCount: mandate.transaction_count,\n status: mandate.status,\n };\n }, { mandateId, developerId });\n }\n\n /**\n * Get a mandate by ID with ownership verification.\n */\n async getMandate(mandateId: string, developerId: string): Promise<MandateRow> {\n return this.withErrorHandling('getMandate', async () => {\n const { data, error } = await this.db\n .from('mandates')\n .select('*')\n .eq('id', mandateId)\n .eq('developer_id', developerId)\n .single();\n\n if (error || !data) {\n throw new NotFoundError('Mandate', mandateId);\n }\n\n return data as MandateRow;\n }, { mandateId, developerId });\n }\n\n /**\n * List mandates for a developer with pagination and optional filters.\n */\n async listMandates(\n developerId: string,\n params?: { walletId?: string; status?: string; limit?: number; offset?: number },\n ): Promise<{ data: MandateRow[]; total: number }> {\n return this.withErrorHandling('listMandates', async () => {\n const limit = params?.limit ?? 50;\n const offset = params?.offset ?? 0;\n\n let countQuery = this.db\n .from('mandates')\n .select('id', { count: 'exact', head: true })\n .eq('developer_id', developerId);\n\n let dataQuery = this.db\n .from('mandates')\n .select('*')\n .eq('developer_id', developerId)\n .order('created_at', { ascending: false })\n .range(offset, offset + limit - 1);\n\n if (params?.walletId) {\n countQuery = countQuery.eq('wallet_id', params.walletId);\n dataQuery = dataQuery.eq('wallet_id', params.walletId);\n }\n\n if (params?.status) {\n countQuery = countQuery.eq('status', params.status);\n dataQuery = dataQuery.eq('status', params.status);\n }\n\n const { count, error: countError } = await countQuery;\n\n if (countError) {\n throw new ValidationError(`Failed to count mandates: ${countError.message}`);\n }\n\n const { data, error } = await dataQuery;\n\n if (error) {\n throw new ValidationError(`Failed to list mandates: ${error.message}`);\n }\n\n return {\n data: (data ?? []) as MandateRow[],\n total: count ?? 0,\n };\n }, { developerId, limit: params?.limit, offset: params?.offset });\n }\n\n /**\n * Revoke a mandate with ownership verification.\n */\n async revokeMandate(mandateId: string, developerId: string): Promise<void> {\n return this.withErrorHandling('revokeMandate', async () => {\n await this.verifyOwnership('mandates', mandateId, developerId, 'Mandate');\n\n const { error } = await this.db\n .from('mandates')\n .update({ status: 'revoked' })\n .eq('id', mandateId);\n\n if (error) {\n throw new ValidationError(`Failed to revoke mandate: ${error.message}`);\n }\n\n this.log.info('Mandate revoked', { mandateId, developerId });\n }, { mandateId, developerId });\n }\n}\n","// ---------------------------------------------------------------------------\n// VIC Service — Visa Intelligent Commerce (6-Step Flow)\n// ---------------------------------------------------------------------------\n// Implements the Visa Intelligent Commerce 6-step API for network token\n// provisioning and credential retrieval:\n// Step 1: Enroll card — Tokenize via Visa MDES, store DPAN\n// Step 2: Initiate purchase intent — Scope a purchase\n// Step 3: Update purchase intent — Modify before credential retrieval\n// Step 4: Cancel purchase intent — Abort before checkout\n// Step 5: Retrieve credentials — Get DPAN + cryptogram\n// Step 6: Confirm transaction — Post-payment confirmation to Visa\n// ---------------------------------------------------------------------------\n\nimport crypto from 'node:crypto';\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport { BaseService } from '../lib/base-service.js';\nimport type { ILogger } from '../lib/logger.js';\nimport type {\n IVICService,\n IVGSProxyService,\n NetworkTokenRow,\n VICEnrollParams,\n VICPurchaseIntentParams,\n VICCredentialResult,\n} from '../lib/interfaces.js';\nimport { NotFoundError, ServiceError, ErrorCode } from '../lib/errors.js';\n\n/**\n * In-memory purchase intent structure.\n * In production, these would be stored in the DB. For Phase 1A, we use\n * a Map to keep the implementation simple while maintaining the interface contract.\n */\ninterface PurchaseIntent {\n id: string;\n developerId: string;\n networkTokenId: string;\n amount: number;\n currency: string;\n merchantId: string | null;\n merchantName: string | null;\n description: string | null;\n status: 'created' | 'updated' | 'cancelled' | 'credentials_retrieved' | 'confirmed';\n createdAt: string;\n updatedAt: string;\n}\n\nexport class VICService extends BaseService implements IVICService {\n readonly serviceName = 'VICService';\n\n private readonly vgsProxy: IVGSProxyService;\n\n /** In-memory purchase intent store. Keyed by intentId. */\n private readonly purchaseIntents = new Map<string, PurchaseIntent>();\n\n constructor(db: SupabaseClient, logger: ILogger, vgsProxy: IVGSProxyService) {\n super(db, logger);\n this.vgsProxy = vgsProxy;\n }\n\n // -------------------------------------------------------------------------\n // Step 1: Enroll Card\n // -------------------------------------------------------------------------\n\n /**\n * Tokenize a card from VGS vault via Visa MDES.\n * Creates entry in network_tokens table with network='visa', token_type='dpan'.\n * In Phase 1A, the Visa API call is simulated.\n */\n async enrollCard(\n developerId: string,\n params: VICEnrollParams,\n ): Promise<NetworkTokenRow> {\n return this.withErrorHandling('enrollCard', async () => {\n const { walletId, cardId } = params;\n\n // Verify wallet ownership\n await this.verifyWalletOwnership(walletId, developerId);\n\n // Verify card exists and belongs to the wallet\n const { data: card, error: cardError } = await this.db\n .from('cards')\n .select('*')\n .eq('id', cardId)\n .eq('wallet_id', walletId)\n .eq('status', 'active')\n .single();\n\n if (cardError || !card) {\n throw new NotFoundError('Card', cardId);\n }\n\n // Check if already enrolled\n const { data: existing } = await this.db\n .from('network_tokens')\n .select('*')\n .eq('card_id', cardId)\n .eq('network', 'visa')\n .eq('status', 'active')\n .single();\n\n if (existing) {\n this.log.info('Card already enrolled with Visa, returning existing token', {\n cardId,\n tokenId: existing.id,\n });\n return existing as NetworkTokenRow;\n }\n\n // Simulate Visa MDES tokenization\n // In production, this would call the Visa Token Service API via VGS proxy\n const networkTokenId = `visa_dpan_${crypto.randomUUID().replace(/-/g, '').slice(0, 20)}`;\n const tokenId = crypto.randomUUID();\n const expiresAt = new Date(Date.now() + 365 * 24 * 60 * 60 * 1000).toISOString(); // 1 year\n\n this.log.info('Enrolling card with Visa MDES (simulated)', {\n developerId,\n walletId,\n cardId,\n last4: card.last4,\n });\n\n const { data: tokenRow, error } = await this.db\n .from('network_tokens')\n .insert({\n id: tokenId,\n developer_id: developerId,\n wallet_id: walletId,\n card_id: cardId,\n network: 'visa',\n network_token_id: networkTokenId,\n token_type: 'dpan',\n status: 'active',\n allowed_mccs: null,\n max_amount: null,\n governance_metadata: {\n enrollment_method: 'vic',\n card_brand: card.brand,\n card_last4: card.last4,\n enrolled_at: new Date().toISOString(),\n },\n expires_at: expiresAt,\n })\n .select()\n .single();\n\n if (error || !tokenRow) {\n throw new ServiceError(\n `Failed to create network token: ${error?.message}`,\n ErrorCode.NETWORK_TOKEN_FAILED,\n 500,\n true,\n );\n }\n\n this.log.info('Card enrolled with Visa MDES', {\n tokenId,\n networkTokenId,\n cardId,\n });\n\n return tokenRow as NetworkTokenRow;\n }, { developerId, walletId: params.walletId, cardId: params.cardId });\n }\n\n // -------------------------------------------------------------------------\n // Step 2: Initiate Purchase Intent\n // -------------------------------------------------------------------------\n\n /**\n * Create a scoped purchase intent.\n * Stores the intent in memory for retrieval during credential request.\n */\n async initiatePurchaseIntent(\n developerId: string,\n params: VICPurchaseIntentParams,\n ): Promise<{ intentId: string }> {\n return this.withErrorHandling('initiatePurchaseIntent', async () => {\n // Verify the network token exists and belongs to the developer\n const token = await this.getNetworkToken(params.networkTokenId);\n if (token.developer_id !== developerId) {\n throw new ServiceError(\n `Network token ${params.networkTokenId} does not belong to developer`,\n ErrorCode.OWNERSHIP_VIOLATION,\n 403,\n );\n }\n\n const intentId = crypto.randomUUID();\n const now = new Date().toISOString();\n\n const intent: PurchaseIntent = {\n id: intentId,\n developerId,\n networkTokenId: params.networkTokenId,\n amount: params.amount,\n currency: params.currency,\n merchantId: params.merchantId ?? null,\n merchantName: params.merchantName ?? null,\n description: params.description ?? null,\n status: 'created',\n createdAt: now,\n updatedAt: now,\n };\n\n this.purchaseIntents.set(intentId, intent);\n\n this.log.info('Purchase intent initiated', {\n intentId,\n developerId,\n networkTokenId: params.networkTokenId,\n amount: params.amount,\n });\n\n return { intentId };\n }, { developerId, networkTokenId: params.networkTokenId });\n }\n\n // -------------------------------------------------------------------------\n // Step 3: Update Purchase Intent\n // -------------------------------------------------------------------------\n\n /**\n * Update a purchase intent before credential retrieval.\n */\n async updatePurchaseIntent(\n intentId: string,\n params: Partial<VICPurchaseIntentParams>,\n ): Promise<{ intentId: string }> {\n return this.withErrorHandling('updatePurchaseIntent', async () => {\n const intent = this.purchaseIntents.get(intentId);\n if (!intent) {\n throw new NotFoundError('Purchase intent', intentId);\n }\n\n if (intent.status === 'cancelled' || intent.status === 'confirmed') {\n throw new ServiceError(\n `Cannot update purchase intent in status: ${intent.status}`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 400,\n );\n }\n\n // Apply updates\n if (params.amount !== undefined) intent.amount = params.amount;\n if (params.currency !== undefined) intent.currency = params.currency;\n if (params.merchantId !== undefined) intent.merchantId = params.merchantId ?? null;\n if (params.merchantName !== undefined) intent.merchantName = params.merchantName ?? null;\n if (params.description !== undefined) intent.description = params.description ?? null;\n intent.status = 'updated';\n intent.updatedAt = new Date().toISOString();\n\n this.log.info('Purchase intent updated', { intentId });\n\n return { intentId };\n }, { intentId });\n }\n\n // -------------------------------------------------------------------------\n // Step 4: Cancel Purchase Intent\n // -------------------------------------------------------------------------\n\n /**\n * Cancel a purchase intent before checkout.\n */\n async cancelPurchaseIntent(intentId: string): Promise<void> {\n return this.withErrorHandling('cancelPurchaseIntent', async () => {\n const intent = this.purchaseIntents.get(intentId);\n if (!intent) {\n throw new NotFoundError('Purchase intent', intentId);\n }\n\n if (intent.status === 'confirmed') {\n throw new ServiceError(\n 'Cannot cancel a confirmed purchase intent',\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 400,\n );\n }\n\n intent.status = 'cancelled';\n intent.updatedAt = new Date().toISOString();\n\n this.log.info('Purchase intent cancelled', { intentId });\n }, { intentId });\n }\n\n // -------------------------------------------------------------------------\n // Step 5: Retrieve Credentials\n // -------------------------------------------------------------------------\n\n /**\n * Retrieve DPAN + cryptogram for the purchase intent.\n * Returns token number, cryptogram, ECI, and expiry.\n */\n async retrieveCredentials(\n intentId: string,\n cardSelection?: string,\n ): Promise<VICCredentialResult> {\n return this.withErrorHandling('retrieveCredentials', async () => {\n const intent = this.purchaseIntents.get(intentId);\n if (!intent) {\n throw new NotFoundError('Purchase intent', intentId);\n }\n\n if (intent.status === 'cancelled') {\n throw new ServiceError(\n 'Cannot retrieve credentials for a cancelled intent',\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 400,\n );\n }\n\n // Get the network token\n const networkToken = await this.getNetworkToken(intent.networkTokenId);\n\n // In production, this would call Visa to get a transaction-scoped\n // cryptogram. Here we simulate the response.\n const cryptogram = crypto.randomBytes(20).toString('base64');\n\n // Simulated DPAN (last 4 match the original card)\n const { data: cardData } = await this.db\n .from('cards')\n .select('exp_month, exp_year')\n .eq('id', networkToken.card_id)\n .single();\n\n const expMonth = (cardData as Record<string, unknown> | null)?.exp_month as number ?? 12;\n const expYear = (cardData as Record<string, unknown> | null)?.exp_year as number ?? 2030;\n\n intent.status = 'credentials_retrieved';\n intent.updatedAt = new Date().toISOString();\n\n this.log.info('Credentials retrieved for purchase intent', {\n intentId,\n networkTokenId: intent.networkTokenId,\n cardSelection: cardSelection ?? 'default',\n });\n\n return {\n tokenNumber: networkToken.network_token_id,\n cryptogram,\n eci: '05', // Visa 3DS ECI for fully authenticated\n expMonth,\n expYear,\n };\n }, { intentId, cardSelection });\n }\n\n // -------------------------------------------------------------------------\n // Step 6: Confirm Transaction\n // -------------------------------------------------------------------------\n\n /**\n * Post-payment confirmation back to Visa.\n * Updates the purchase intent status and logs the confirmation.\n */\n async confirmTransaction(\n intentId: string,\n txnDetails: { transactionId: string; status: string },\n ): Promise<void> {\n return this.withErrorHandling('confirmTransaction', async () => {\n const intent = this.purchaseIntents.get(intentId);\n if (!intent) {\n throw new NotFoundError('Purchase intent', intentId);\n }\n\n // In production, this would call Visa's transaction confirmation API\n intent.status = 'confirmed';\n intent.updatedAt = new Date().toISOString();\n\n this.log.info('Transaction confirmed with Visa', {\n intentId,\n transactionId: txnDetails.transactionId,\n transactionStatus: txnDetails.status,\n });\n }, { intentId, transactionId: txnDetails.transactionId });\n }\n\n // -------------------------------------------------------------------------\n // Token management\n // -------------------------------------------------------------------------\n\n /**\n * Get a network token by ID.\n */\n async getNetworkToken(tokenId: string): Promise<NetworkTokenRow> {\n return this.withErrorHandling('getNetworkToken', async () => {\n const { data, error } = await this.db\n .from('network_tokens')\n .select('*')\n .eq('id', tokenId)\n .single();\n\n if (error || !data) {\n throw new NotFoundError('Network token', tokenId);\n }\n\n return data as NetworkTokenRow;\n }, { tokenId });\n }\n\n /**\n * List network tokens for a developer, optionally filtered by wallet.\n */\n async listNetworkTokens(\n developerId: string,\n walletId?: string,\n ): Promise<NetworkTokenRow[]> {\n return this.withErrorHandling('listNetworkTokens', async () => {\n let query = this.db\n .from('network_tokens')\n .select('*')\n .eq('developer_id', developerId)\n .eq('network', 'visa')\n .order('created_at', { ascending: false });\n\n if (walletId) {\n query = query.eq('wallet_id', walletId);\n }\n\n const { data, error } = await query;\n\n if (error) {\n throw new ServiceError(\n `Failed to list network tokens: ${error.message}`,\n ErrorCode.NETWORK_TOKEN_FAILED,\n 500,\n true,\n );\n }\n\n return (data ?? []) as NetworkTokenRow[];\n }, { developerId, walletId });\n }\n}\n","// ---------------------------------------------------------------------------\n// Mastercard Agent Pay Service — MC Agent Pay (6-Step Workflow)\n// ---------------------------------------------------------------------------\n// Implements the Mastercard Agent Pay 6-step workflow for agentic commerce.\n// Lane registers as the Agentic Commerce Enabler (DSP).\n//\n// Step 1: Enroll credential — Tokenize via MDES\n// Step 2: Verify identity — Cardholder ID&V (simulated biometric/delegated)\n// Step 3: Bind authenticator — Payment Passkeys bind (KYA)\n// Step 4: Create intent — Capture purchase intent with enriched context\n// Step 5: Authenticate — Authenticate via Payment Passkeys\n// Step 6: Checkout — Returns DSRP cryptogram or DTVC payload\n// ---------------------------------------------------------------------------\n\nimport crypto from 'node:crypto';\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport { BaseService } from '../lib/base-service.js';\nimport type { ILogger } from '../lib/logger.js';\nimport type {\n IMastercardAPService,\n IVGSProxyService,\n NetworkTokenRow,\n MCAEnrollParams,\n MCAIntentParams,\n MCACheckoutResult,\n} from '../lib/interfaces.js';\nimport { NotFoundError, ServiceError, ErrorCode } from '../lib/errors.js';\n\n/** DSP ID for Lane as the Agentic Commerce Enabler */\nconst DSP_ID = process.env['LANE_MC_DSP_ID'] ?? 'lane-dsp-001';\n\n/**\n * In-memory purchase intent for Mastercard Agent Pay.\n */\ninterface MCAPurchaseIntent {\n id: string;\n developerId: string;\n tokenId: string;\n amount: number;\n currency: string;\n merchantId: string | null;\n merchantName: string | null;\n agentId: string | null;\n mandateRef: string | null;\n description: string | null;\n status: 'created' | 'authenticated' | 'completed' | 'cancelled';\n createdAt: string;\n updatedAt: string;\n}\n\nexport class MastercardAPService extends BaseService implements IMastercardAPService {\n readonly serviceName = 'MastercardAPService';\n\n private readonly vgsProxy: IVGSProxyService;\n\n /** In-memory purchase intent store. Keyed by intentId. */\n private readonly purchaseIntents = new Map<string, MCAPurchaseIntent>();\n\n /** Authenticator bindings. Keyed by tokenId. */\n private readonly authenticatorBindings = new Map<string, {\n authMethod: string;\n boundAt: string;\n }>();\n\n /** Identity verification status. Keyed by tokenId. */\n private readonly identityVerifications = new Map<string, {\n verified: boolean;\n verifiedAt: string;\n }>();\n\n constructor(db: SupabaseClient, logger: ILogger, vgsProxy: IVGSProxyService) {\n super(db, logger);\n this.vgsProxy = vgsProxy;\n }\n\n // -------------------------------------------------------------------------\n // Step 1: Enroll Credential\n // -------------------------------------------------------------------------\n\n /**\n * Tokenize a card via Mastercard MDES.\n * Creates entry in network_tokens with network='mastercard', token_type='mdes'.\n * Stores governance_metadata with DSP ID and agent reference.\n */\n async enrollCredential(\n developerId: string,\n params: MCAEnrollParams,\n ): Promise<NetworkTokenRow> {\n return this.withErrorHandling('enrollCredential', async () => {\n const { walletId, cardId } = params;\n\n // Verify wallet ownership\n await this.verifyWalletOwnership(walletId, developerId);\n\n // Verify card exists and belongs to the wallet\n const { data: card, error: cardError } = await this.db\n .from('cards')\n .select('*')\n .eq('id', cardId)\n .eq('wallet_id', walletId)\n .eq('status', 'active')\n .single();\n\n if (cardError || !card) {\n throw new NotFoundError('Card', cardId);\n }\n\n // Check if already enrolled with Mastercard\n const { data: existing } = await this.db\n .from('network_tokens')\n .select('*')\n .eq('card_id', cardId)\n .eq('network', 'mastercard')\n .eq('status', 'active')\n .single();\n\n if (existing) {\n this.log.info('Card already enrolled with Mastercard, returning existing token', {\n cardId,\n tokenId: existing.id,\n });\n return existing as NetworkTokenRow;\n }\n\n // Simulate Mastercard MDES tokenization\n // In production, this would call the Mastercard Digital Enablement Service API\n const networkTokenId = `mc_mdes_${crypto.randomUUID().replace(/-/g, '').slice(0, 20)}`;\n const tokenId = crypto.randomUUID();\n const expiresAt = new Date(Date.now() + 365 * 24 * 60 * 60 * 1000).toISOString();\n\n this.log.info('Enrolling card with Mastercard MDES (simulated)', {\n developerId,\n walletId,\n cardId,\n last4: card.last4,\n dspId: DSP_ID,\n });\n\n const { data: tokenRow, error } = await this.db\n .from('network_tokens')\n .insert({\n id: tokenId,\n developer_id: developerId,\n wallet_id: walletId,\n card_id: cardId,\n network: 'mastercard',\n network_token_id: networkTokenId,\n token_type: 'mdes',\n status: 'active',\n allowed_mccs: null,\n max_amount: null,\n governance_metadata: {\n dsp_id: DSP_ID,\n agent_ref: `lane-agent-${developerId.slice(0, 8)}`,\n enrollment_method: 'mastercard_agent_pay',\n card_brand: card.brand,\n card_last4: card.last4,\n enrolled_at: new Date().toISOString(),\n },\n expires_at: expiresAt,\n })\n .select()\n .single();\n\n if (error || !tokenRow) {\n throw new ServiceError(\n `Failed to create Mastercard network token: ${error?.message}`,\n ErrorCode.NETWORK_TOKEN_FAILED,\n 500,\n true,\n );\n }\n\n this.log.info('Card enrolled with Mastercard MDES', {\n tokenId,\n networkTokenId,\n cardId,\n dspId: DSP_ID,\n });\n\n return tokenRow as NetworkTokenRow;\n }, { developerId, walletId: params.walletId, cardId: params.cardId });\n }\n\n // -------------------------------------------------------------------------\n // Step 2: Verify Identity\n // -------------------------------------------------------------------------\n\n /**\n * Cardholder ID&V — simulated biometric or delegated verification.\n * In production, this would trigger a real identity verification flow.\n */\n async verifyIdentity(tokenId: string): Promise<{ verified: boolean }> {\n return this.withErrorHandling('verifyIdentity', async () => {\n // Verify token exists\n const token = await this.getNetworkToken(tokenId);\n\n // Simulate identity verification\n // In production, this would call MC's ID&V API or trigger biometric\n const verifiedAt = new Date().toISOString();\n this.identityVerifications.set(tokenId, {\n verified: true,\n verifiedAt,\n });\n\n this.log.info('Identity verified for Mastercard token (simulated)', {\n tokenId,\n networkTokenId: token.network_token_id,\n verifiedAt,\n });\n\n return { verified: true };\n }, { tokenId });\n }\n\n // -------------------------------------------------------------------------\n // Step 3: Bind Authenticator\n // -------------------------------------------------------------------------\n\n /**\n * Payment Passkeys bind. Satisfies Mastercard's KYA (Know Your Agent) requirement.\n * Binds an authentication method to the token for future transaction authorization.\n */\n async bindAuthenticator(\n tokenId: string,\n authMethod: string,\n ): Promise<{ bound: boolean }> {\n return this.withErrorHandling('bindAuthenticator', async () => {\n // Verify token exists\n const token = await this.getNetworkToken(tokenId);\n\n // Verify identity was completed first\n const idv = this.identityVerifications.get(tokenId);\n if (!idv?.verified) {\n throw new ServiceError(\n 'Identity verification must be completed before binding authenticator',\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 400,\n );\n }\n\n // Simulate authenticator binding\n // In production, this would register a Payment Passkey with MC\n const boundAt = new Date().toISOString();\n this.authenticatorBindings.set(tokenId, {\n authMethod,\n boundAt,\n });\n\n this.log.info('Authenticator bound for Mastercard token (simulated)', {\n tokenId,\n authMethod,\n networkTokenId: token.network_token_id,\n boundAt,\n });\n\n return { bound: true };\n }, { tokenId, authMethod });\n }\n\n // -------------------------------------------------------------------------\n // Step 4: Create Intent\n // -------------------------------------------------------------------------\n\n /**\n * Capture purchase intent with enriched context.\n * Includes agent ID and mandate reference for MC's governance framework.\n */\n async createIntent(\n developerId: string,\n params: MCAIntentParams,\n ): Promise<{ intentId: string }> {\n return this.withErrorHandling('createIntent', async () => {\n // Verify the network token exists and belongs to the developer\n const token = await this.getNetworkToken(params.tokenId);\n if (token.developer_id !== developerId) {\n throw new ServiceError(\n `Network token ${params.tokenId} does not belong to developer`,\n ErrorCode.OWNERSHIP_VIOLATION,\n 403,\n );\n }\n\n // Verify authenticator is bound (KYA requirement)\n const binding = this.authenticatorBindings.get(params.tokenId);\n if (!binding) {\n throw new ServiceError(\n 'Authenticator must be bound before creating a purchase intent',\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 400,\n );\n }\n\n const intentId = crypto.randomUUID();\n const now = new Date().toISOString();\n\n const intent: MCAPurchaseIntent = {\n id: intentId,\n developerId,\n tokenId: params.tokenId,\n amount: params.amount,\n currency: params.currency,\n merchantId: params.merchantId ?? null,\n merchantName: params.merchantName ?? null,\n agentId: params.agentId ?? null,\n mandateRef: params.mandateRef ?? null,\n description: params.description ?? null,\n status: 'created',\n createdAt: now,\n updatedAt: now,\n };\n\n this.purchaseIntents.set(intentId, intent);\n\n this.log.info('Mastercard Agent Pay intent created', {\n intentId,\n developerId,\n tokenId: params.tokenId,\n amount: params.amount,\n agentId: params.agentId,\n mandateRef: params.mandateRef,\n dspId: DSP_ID,\n });\n\n return { intentId };\n }, { developerId, tokenId: params.tokenId });\n }\n\n // -------------------------------------------------------------------------\n // Step 5: Authenticate\n // -------------------------------------------------------------------------\n\n /**\n * Authenticate via Payment Passkeys for the purchase intent.\n * In production, this would trigger the bound authenticator.\n */\n async authenticate(intentId: string): Promise<{ authenticated: boolean }> {\n return this.withErrorHandling('authenticate', async () => {\n const intent = this.purchaseIntents.get(intentId);\n if (!intent) {\n throw new NotFoundError('Purchase intent', intentId);\n }\n\n if (intent.status !== 'created') {\n throw new ServiceError(\n `Cannot authenticate intent in status: ${intent.status}`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 400,\n );\n }\n\n // Verify authenticator is bound\n const binding = this.authenticatorBindings.get(intent.tokenId);\n if (!binding) {\n throw new ServiceError(\n 'No authenticator bound for this token',\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 400,\n );\n }\n\n // Simulate authentication via Payment Passkeys\n intent.status = 'authenticated';\n intent.updatedAt = new Date().toISOString();\n\n this.log.info('Mastercard Agent Pay intent authenticated (simulated)', {\n intentId,\n tokenId: intent.tokenId,\n authMethod: binding.authMethod,\n });\n\n return { authenticated: true };\n }, { intentId });\n }\n\n // -------------------------------------------------------------------------\n // Step 6: Checkout\n // -------------------------------------------------------------------------\n\n /**\n * Returns DSRP cryptogram or DTVC payload with commerce indicators.\n * This is the final step that produces the payment credentials.\n */\n async checkout(intentId: string): Promise<MCACheckoutResult> {\n return this.withErrorHandling('checkout', async () => {\n const intent = this.purchaseIntents.get(intentId);\n if (!intent) {\n throw new NotFoundError('Purchase intent', intentId);\n }\n\n if (intent.status !== 'authenticated') {\n throw new ServiceError(\n `Intent must be authenticated before checkout (current status: ${intent.status})`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 400,\n );\n }\n\n // Get the network token for DSRP generation\n const token = await this.getNetworkToken(intent.tokenId);\n\n // Simulate DSRP cryptogram generation\n // In production, this would call MC's DSRP API\n const cryptogram = crypto.randomBytes(20).toString('base64');\n\n // Commerce indicators per MC Agent Pay spec\n const commerceIndicators: string[] = [\n 'agentic_commerce', // Indicates agentic transaction\n 'dsp_initiated', // DSP-initiated (Lane)\n ];\n\n if (intent.mandateRef) {\n commerceIndicators.push('mandate_authorized');\n }\n\n const dsrpPayload: Record<string, unknown> = {\n token_number: token.network_token_id,\n cryptogram,\n eci: '07', // MC ECI for recurring/installment\n transaction_type: 'dsrp',\n amount: intent.amount,\n currency: intent.currency,\n dsp_id: DSP_ID,\n agent_id: intent.agentId,\n mandate_ref: intent.mandateRef,\n generated_at: new Date().toISOString(),\n };\n\n const dtvPayload: Record<string, unknown> = {\n digital_transaction_verification: true,\n token_number: token.network_token_id,\n verification_code: crypto.randomBytes(4).toString('hex'),\n dsp_id: DSP_ID,\n };\n\n // Update intent status\n intent.status = 'completed';\n intent.updatedAt = new Date().toISOString();\n\n this.log.info('Mastercard Agent Pay checkout completed', {\n intentId,\n tokenId: intent.tokenId,\n amount: intent.amount,\n commerceIndicators,\n dspId: DSP_ID,\n });\n\n return {\n cryptogram,\n dsrpPayload,\n dtvPayload,\n commerceIndicators,\n };\n }, { intentId });\n }\n\n // -------------------------------------------------------------------------\n // Token management\n // -------------------------------------------------------------------------\n\n /**\n * Get a network token by ID.\n */\n async getNetworkToken(tokenId: string): Promise<NetworkTokenRow> {\n return this.withErrorHandling('getNetworkToken', async () => {\n const { data, error } = await this.db\n .from('network_tokens')\n .select('*')\n .eq('id', tokenId)\n .single();\n\n if (error || !data) {\n throw new NotFoundError('Network token', tokenId);\n }\n\n return data as NetworkTokenRow;\n }, { tokenId });\n }\n\n /**\n * List network tokens for a developer, optionally filtered by wallet.\n */\n async listNetworkTokens(\n developerId: string,\n walletId?: string,\n ): Promise<NetworkTokenRow[]> {\n return this.withErrorHandling('listNetworkTokens', async () => {\n let query = this.db\n .from('network_tokens')\n .select('*')\n .eq('developer_id', developerId)\n .eq('network', 'mastercard')\n .order('created_at', { ascending: false });\n\n if (walletId) {\n query = query.eq('wallet_id', walletId);\n }\n\n const { data, error } = await query;\n\n if (error) {\n throw new ServiceError(\n `Failed to list Mastercard network tokens: ${error.message}`,\n ErrorCode.NETWORK_TOKEN_FAILED,\n 500,\n true,\n );\n }\n\n return (data ?? []) as NetworkTokenRow[];\n }, { developerId, walletId });\n }\n}\n","// ---------------------------------------------------------------------------\n// Protocol Client Service — Adapter Orchestration\n// ---------------------------------------------------------------------------\n// Orchestrates protocol adapter selection and delegates to the appropriate\n// adapter (ACP, UCP, x402). When no structured protocol is available,\n// falls through to fallback strategies: Rye → browser use → VGS proxy.\n//\n// Discovery: probes merchant endpoints for ACP/UCP/x402 support.\n// Fallback: probes Rye catalog, checks agent capability, then VGS proxy.\n// ---------------------------------------------------------------------------\n\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport { BaseService } from '../lib/base-service.js';\nimport type { ILogger } from '../lib/logger.js';\nimport type {\n IProtocolClientService,\n IProtocolAdapter,\n IVGSProxyService,\n IVICService,\n IMastercardAPService,\n ProtocolType,\n ProtocolSessionRow,\n ProtocolSessionParams,\n ProtocolPaymentData,\n ProtocolPaymentResult,\n MerchantDirectoryRow,\n} from '../lib/interfaces.js';\nimport { NotFoundError, ServiceError, ErrorCode } from '../lib/errors.js';\nimport { ACPAdapter } from './protocol-adapters/acp-adapter.js';\nimport { UCPAdapter } from './protocol-adapters/ucp-adapter.js';\nimport { X402Adapter } from './protocol-adapters/x402-adapter.js';\nimport { RyeAdapter } from './protocol-adapters/rye-adapter.js';\nimport { BrowserUseAdapter } from './protocol-adapters/browser-use-adapter.js';\nimport { withRetry, CircuitBreaker } from '../lib/retry.js';\n\nexport class ProtocolClientService extends BaseService implements IProtocolClientService {\n readonly serviceName = 'ProtocolClientService';\n\n private readonly adapters: IProtocolAdapter[];\n private readonly adapterMap: Map<ProtocolType, IProtocolAdapter>;\n private readonly vicService: IVICService;\n private readonly mastercardAPService: IMastercardAPService;\n private readonly vgsProxy: IVGSProxyService;\n\n // Fallback adapters (probed in order when no protocol is available)\n private readonly ryeAdapter: RyeAdapter;\n private readonly browserUseAdapter: BrowserUseAdapter;\n private readonly vgsCircuitBreaker: CircuitBreaker;\n\n constructor(\n db: SupabaseClient,\n logger: ILogger,\n vgsProxy: IVGSProxyService,\n vicService: IVICService,\n mastercardAPService: IMastercardAPService,\n ) {\n super(db, logger);\n\n this.vicService = vicService;\n this.mastercardAPService = mastercardAPService;\n this.vgsProxy = vgsProxy;\n\n // Create protocol adapters\n const acpAdapter = new ACPAdapter(db, logger, vgsProxy);\n const ucpAdapter = new UCPAdapter(db, logger, vgsProxy);\n const x402Adapter = new X402Adapter(db, logger, vgsProxy);\n\n this.adapters = [acpAdapter, ucpAdapter, x402Adapter];\n this.adapterMap = new Map<ProtocolType, IProtocolAdapter>([\n ['acp', acpAdapter],\n ['ucp', ucpAdapter],\n ['x402', x402Adapter],\n ]);\n\n // Create fallback adapters\n this.ryeAdapter = new RyeAdapter(db, logger);\n this.browserUseAdapter = new BrowserUseAdapter(db, logger);\n this.vgsCircuitBreaker = new CircuitBreaker('vgs_proxy', {\n failureThreshold: 3,\n windowMs: 5 * 60 * 1000,\n resetTimeoutMs: 60 * 1000,\n });\n }\n\n /**\n * Discover which protocols a merchant domain supports.\n * Probes ACP, UCP, and x402 endpoints in parallel.\n * Returns the list of discovered protocols and their manifests.\n */\n async discoverProtocols(domain: string): Promise<{\n domain: string;\n protocols: ProtocolType[];\n manifests: Record<string, Record<string, unknown>>;\n }> {\n return this.withErrorHandling('discoverProtocols', async () => {\n this.log.info('Discovering protocols', { domain });\n\n const protocols: ProtocolType[] = [];\n const manifests: Record<string, Record<string, unknown>> = {};\n\n // Probe all protocols in parallel\n const probes = await Promise.allSettled([\n this.probeACP(domain),\n this.probeUCP(domain),\n this.probeX402(domain),\n ]);\n\n // ACP probe result\n if (probes[0]!.status === 'fulfilled' && probes[0]!.value) {\n protocols.push('acp');\n manifests['acp'] = probes[0]!.value;\n }\n\n // UCP probe result\n if (probes[1]!.status === 'fulfilled' && probes[1]!.value) {\n protocols.push('ucp');\n manifests['ucp'] = probes[1]!.value;\n }\n\n // x402 probe result\n if (probes[2]!.status === 'fulfilled' && probes[2]!.value) {\n protocols.push('x402');\n manifests['x402'] = probes[2]!.value;\n }\n\n this.log.info('Protocol discovery complete', { domain, protocols });\n\n return { domain, protocols, manifests };\n }, { domain });\n }\n\n /**\n * Create a protocol session.\n * If a specific protocol is requested, uses that adapter.\n * Otherwise auto-selects: ACP > UCP > x402 > Rye > browser use > VGS proxy.\n */\n async createSession(\n developerId: string,\n params: ProtocolSessionParams,\n ): Promise<ProtocolSessionRow> {\n return this.withErrorHandling('createSession', async () => {\n let adapter: IProtocolAdapter | null = null;\n\n if (params.protocol) {\n // Use specified protocol\n const requested = this.adapterMap.get(params.protocol as ProtocolType);\n if (!requested) {\n throw new ServiceError(\n `Unsupported protocol: ${params.protocol}`,\n ErrorCode.PROTOCOL_NOT_SUPPORTED,\n 400,\n );\n }\n adapter = requested;\n } else {\n // Auto-select best protocol by probing the merchant\n adapter = await this.autoSelectAdapter(params.merchantDomain);\n }\n\n if (!adapter) {\n // No protocol adapter found — try fallback strategies\n return this.createFallbackSession(developerId, params);\n }\n\n this.log.info('Creating session with adapter', {\n developerId,\n protocol: adapter.protocol,\n merchantDomain: params.merchantDomain,\n });\n\n return adapter.createSession({ ...params, developerId });\n }, { developerId, merchantDomain: params.merchantDomain });\n }\n\n /**\n * Confirm payment for an existing session.\n * Looks up the session to determine the protocol, then delegates to the\n * appropriate adapter (including fallback adapters).\n */\n async confirmPayment(\n sessionId: string,\n paymentData: ProtocolPaymentData,\n ): Promise<ProtocolPaymentResult> {\n return this.withErrorHandling('confirmPayment', async () => {\n // Look up session to determine protocol\n const session = await this.findSession(sessionId);\n const protocol = session.protocol;\n\n // Check standard protocol adapters\n const adapter = this.adapterMap.get(protocol as ProtocolType);\n if (adapter) {\n this.log.info('Confirming payment', {\n sessionId,\n protocol: session.protocol,\n merchantDomain: session.merchant_domain,\n });\n return adapter.confirmPayment(sessionId, paymentData);\n }\n\n // Check fallback adapters\n if (protocol === 'rye' as ProtocolType) {\n return this.ryeAdapter.confirmPayment(sessionId, paymentData);\n }\n if (protocol === 'browser_use' as ProtocolType) {\n return this.browserUseAdapter.confirmPayment(sessionId, paymentData);\n }\n\n throw new ServiceError(\n `No adapter found for protocol: ${session.protocol}`,\n ErrorCode.PROTOCOL_NOT_SUPPORTED,\n 500,\n );\n }, { sessionId });\n }\n\n /**\n * Get session status.\n * Looks up the session from DB directly (protocol-agnostic).\n */\n async getSessionStatus(sessionId: string): Promise<ProtocolSessionRow> {\n return this.withErrorHandling('getSessionStatus', async () => {\n return this.findSession(sessionId);\n }, { sessionId });\n }\n\n // ---------------------------------------------------------------------------\n // Fallback strategy orchestration\n // ---------------------------------------------------------------------------\n\n /**\n * Try fallback strategies in order: Rye → browser use → VGS proxy.\n * Each is probed at runtime. First one that can handle wins.\n */\n private async createFallbackSession(\n developerId: string,\n params: ProtocolSessionParams,\n ): Promise<ProtocolSessionRow> {\n const { merchantDomain } = params;\n\n // 1. Try Rye (probe catalog)\n try {\n const ryeCanHandle = await this.ryeAdapter.canHandle(merchantDomain);\n if (ryeCanHandle) {\n this.log.info('Using Rye fallback adapter', { merchantDomain });\n return await this.ryeAdapter.createSession({ ...params, developerId });\n }\n } catch (err) {\n this.log.warn('Rye probe/session failed, trying next fallback', {\n merchantDomain,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n\n // 2. Try browser use (check agent capability)\n try {\n const browserCanHandle = await this.browserUseAdapter.canHandle(merchantDomain);\n if (browserCanHandle) {\n this.log.info('Using browser use fallback adapter', { merchantDomain });\n return await this.browserUseAdapter.createSession({ ...params, developerId });\n }\n } catch (err) {\n this.log.warn('Browser use session failed, falling back to VGS proxy', {\n merchantDomain,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n\n // 3. VGS proxy — always available as last resort\n // For VGS proxy, we throw the original \"no protocol\" error since\n // the payment service handles VGS proxy routing directly.\n throw new ServiceError(\n `No supported protocols found for domain: ${merchantDomain}. Payment will use VGS proxy fallback.`,\n ErrorCode.PROTOCOL_NOT_SUPPORTED,\n 400,\n );\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n /**\n * Find a session by ID across all protocols.\n */\n private async findSession(sessionId: string): Promise<ProtocolSessionRow> {\n const { data, error } = await this.db\n .from('protocol_sessions')\n .select('*')\n .eq('id', sessionId)\n .single();\n\n if (error || !data) {\n throw new NotFoundError('Protocol session', sessionId);\n }\n\n return data as ProtocolSessionRow;\n }\n\n /**\n * Auto-select the best protocol adapter for a merchant domain.\n * Returns null if no protocol adapter matches (caller should try fallbacks).\n */\n private async autoSelectAdapter(merchantDomain: string): Promise<IProtocolAdapter | null> {\n // First check if merchant is in the directory\n const { data: merchant } = await this.db\n .from('merchant_directory')\n .select('*')\n .eq('domain', merchantDomain)\n .eq('status', 'active')\n .single();\n\n if (merchant) {\n const row = merchant as MerchantDirectoryRow;\n // Use priority order: ACP > UCP > x402\n for (const adapter of this.adapters) {\n if (adapter.canHandle(row)) {\n this.log.info('Auto-selected adapter from directory', {\n merchantDomain,\n protocol: adapter.protocol,\n });\n return adapter;\n }\n }\n }\n\n // Not in directory or no adapter matched — probe the domain\n const discovery = await this.discoverProtocols(merchantDomain);\n\n if (discovery.protocols.length === 0) {\n // No structured protocols found — return null to trigger fallback\n return null;\n }\n\n // Return adapter for highest-priority discovered protocol\n const priorityOrder: ProtocolType[] = ['acp', 'ucp', 'x402'];\n for (const protocol of priorityOrder) {\n if (discovery.protocols.includes(protocol)) {\n const adapter = this.adapterMap.get(protocol);\n if (adapter) {\n this.log.info('Auto-selected adapter from discovery', {\n merchantDomain,\n protocol,\n });\n return adapter;\n }\n }\n }\n\n return null;\n }\n\n /**\n * Probe ACP endpoint. Returns manifest if available, null otherwise.\n */\n private async probeACP(domain: string): Promise<Record<string, unknown> | null> {\n try {\n const url = `https://${domain}/.well-known/acp`;\n const res = await fetch(url, { signal: AbortSignal.timeout(5_000) });\n if (res.ok) {\n return (await res.json()) as Record<string, unknown>;\n }\n } catch {\n // ACP not available\n }\n return null;\n }\n\n /**\n * Probe UCP endpoint. Returns manifest if available, null otherwise.\n */\n private async probeUCP(domain: string): Promise<Record<string, unknown> | null> {\n try {\n const url = `https://${domain}/.well-known/ucp`;\n const res = await fetch(url, { signal: AbortSignal.timeout(5_000) });\n if (res.ok) {\n return (await res.json()) as Record<string, unknown>;\n }\n } catch {\n // UCP not available\n }\n return null;\n }\n\n /**\n * Probe x402 endpoint. Returns payment requirements if 402 response, null otherwise.\n */\n private async probeX402(domain: string): Promise<Record<string, unknown> | null> {\n try {\n const url = `https://${domain}`;\n const res = await fetch(url, {\n method: 'GET',\n signal: AbortSignal.timeout(5_000),\n });\n if (res.status === 402) {\n const paymentHeader = res.headers.get('X-PAYMENT') ?? res.headers.get('x-payment');\n const requirements: Record<string, unknown> = {};\n\n if (paymentHeader) {\n try {\n Object.assign(requirements, JSON.parse(paymentHeader));\n } catch {\n requirements.raw = paymentHeader;\n }\n }\n\n try {\n const body = (await res.json()) as Record<string, unknown>;\n Object.assign(requirements, body);\n } catch {\n // No JSON body\n }\n\n return Object.keys(requirements).length > 0 ? requirements : { supported: true };\n }\n } catch {\n // x402 not available\n }\n return null;\n }\n}\n","// ---------------------------------------------------------------------------\n// ACP Adapter — Agentic Commerce Protocol Buyer-Client\n// ---------------------------------------------------------------------------\n// Implements IProtocolAdapter for the ACP protocol. Fetches merchant ACP\n// manifests from .well-known/acp, creates sessions in the protocol_sessions\n// table, and confirms payments via ACP (simulated Stripe PaymentIntent on\n// the merchant's ACP-published Stripe account).\n// ---------------------------------------------------------------------------\n\nimport crypto from 'node:crypto';\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from '../../lib/logger.js';\nimport type { IVGSProxyService } from '../../lib/interfaces.js';\nimport { NotFoundError, ServiceError, ErrorCode } from '../../lib/errors.js';\nimport type {\n IProtocolAdapter,\n ProtocolType,\n ProtocolSessionRow,\n ProtocolSessionParams,\n ProtocolPaymentData,\n ProtocolPaymentResult,\n MerchantDirectoryRow,\n} from './adapter-interface.js';\n\nexport class ACPAdapter implements IProtocolAdapter {\n readonly protocol: ProtocolType = 'acp';\n\n private readonly db: SupabaseClient;\n private readonly log: ILogger;\n private readonly vgsProxy: IVGSProxyService;\n\n constructor(db: SupabaseClient, logger: ILogger, vgsProxy: IVGSProxyService) {\n this.db = db;\n this.log = logger.child({ service: 'ACPAdapter' });\n this.vgsProxy = vgsProxy;\n }\n\n /**\n * Returns true if the merchant supports ACP.\n */\n canHandle(merchant: MerchantDirectoryRow): boolean {\n return merchant.supports_acp === true;\n }\n\n /**\n * Create an ACP session.\n * 1. Fetch merchant's ACP manifest from https://{domain}/.well-known/acp\n * 2. Create session in protocol_sessions table\n * 3. Return the session row\n */\n async createSession(\n params: ProtocolSessionParams & { developerId: string },\n ): Promise<ProtocolSessionRow> {\n const { developerId, walletId, merchantDomain, amount, currency = 'USD', lineItems, description } = params;\n\n this.log.info('Creating ACP session', { developerId, merchantDomain, amount });\n\n // 1. Fetch ACP manifest\n let manifest: Record<string, unknown> = {};\n try {\n const manifestUrl = `https://${merchantDomain}/.well-known/acp`;\n const res = await fetch(manifestUrl, { signal: AbortSignal.timeout(10_000) });\n if (res.ok) {\n manifest = (await res.json()) as Record<string, unknown>;\n } else {\n this.log.warn('ACP manifest fetch returned non-OK status', {\n merchantDomain,\n status: res.status,\n });\n }\n } catch (err) {\n this.log.warn('Failed to fetch ACP manifest, proceeding with empty manifest', {\n merchantDomain,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n\n // 2. Create session in DB\n const sessionId = crypto.randomUUID();\n const expiresAt = new Date(Date.now() + 30 * 60 * 1000).toISOString(); // 30 min expiry\n\n const { data, error } = await this.db\n .from('protocol_sessions')\n .insert({\n id: sessionId,\n developer_id: developerId,\n wallet_id: walletId,\n merchant_domain: merchantDomain,\n protocol: 'acp',\n protocol_session_id: null,\n amount,\n currency,\n status: 'created',\n protocol_manifest: manifest,\n protocol_response: lineItems ? { line_items: lineItems, description } : { description },\n token_id: null,\n transaction_id: null,\n expires_at: expiresAt,\n })\n .select()\n .single();\n\n if (error || !data) {\n throw new ServiceError(\n `Failed to create ACP session: ${error?.message}`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 500,\n true,\n );\n }\n\n this.log.info('ACP session created', { sessionId, merchantDomain });\n\n return data as ProtocolSessionRow;\n }\n\n /**\n * Confirm payment via ACP.\n * Simulates creating a Stripe PaymentIntent on the merchant's ACP-published\n * Stripe account. Routes payment through VGS proxy.\n */\n async confirmPayment(\n sessionId: string,\n paymentData: ProtocolPaymentData,\n ): Promise<ProtocolPaymentResult> {\n this.log.info('Confirming ACP payment', { sessionId });\n\n // 1. Look up the session\n const session = await this.getSessionStatus(sessionId);\n\n if (session.status !== 'created' && session.status !== 'pending') {\n throw new ServiceError(\n `ACP session ${sessionId} is not in a confirmable state (status: ${session.status})`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 400,\n );\n }\n\n // Check expiry\n if (new Date(session.expires_at) < new Date()) {\n await this.updateSessionStatus(sessionId, 'expired');\n throw new ServiceError(\n `ACP session ${sessionId} has expired`,\n ErrorCode.PROTOCOL_SESSION_EXPIRED,\n 400,\n );\n }\n\n // 2. Update session to pending\n await this.updateSessionStatus(sessionId, 'pending');\n\n // 3. Simulate ACP payment confirmation via Stripe PaymentIntent\n // In production, this would create a real PaymentIntent on the\n // merchant's ACP-published Stripe account using VGS proxy.\n const stripeAccount = (session.protocol_manifest as Record<string, unknown>)?.stripe_account as string | undefined;\n const transactionId = crypto.randomUUID();\n\n const protocolResponse: Record<string, unknown> = {\n acp_payment_intent_id: `pi_acp_${crypto.randomUUID().replace(/-/g, '').slice(0, 24)}`,\n stripe_account: stripeAccount ?? 'acct_simulated',\n amount: session.amount,\n currency: session.currency,\n status: 'succeeded',\n payment_method: paymentData.networkTokenId\n ? { type: 'network_token', token_id: paymentData.networkTokenId }\n : { type: 'card', card_id: paymentData.cardId ?? null },\n confirmed_at: new Date().toISOString(),\n };\n\n // 4. Update session to completed\n const { error } = await this.db\n .from('protocol_sessions')\n .update({\n status: 'completed',\n transaction_id: transactionId,\n protocol_response: protocolResponse,\n })\n .eq('id', sessionId);\n\n if (error) {\n throw new ServiceError(\n `Failed to complete ACP session: ${error.message}`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 500,\n true,\n );\n }\n\n this.log.info('ACP payment confirmed', { sessionId, transactionId });\n\n return {\n sessionId,\n status: 'completed',\n transactionId,\n protocolResponse,\n };\n }\n\n /**\n * Get session status from DB.\n */\n async getSessionStatus(sessionId: string): Promise<ProtocolSessionRow> {\n const { data, error } = await this.db\n .from('protocol_sessions')\n .select('*')\n .eq('id', sessionId)\n .eq('protocol', 'acp')\n .single();\n\n if (error || !data) {\n throw new NotFoundError('ACP session', sessionId);\n }\n\n return data as ProtocolSessionRow;\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n private async updateSessionStatus(\n sessionId: string,\n status: string,\n ): Promise<void> {\n const { error } = await this.db\n .from('protocol_sessions')\n .update({ status })\n .eq('id', sessionId);\n\n if (error) {\n throw new ServiceError(\n `Failed to update ACP session status: ${error.message}`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 500,\n true,\n );\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// UCP Adapter — Universal Checkout Protocol Buyer-Client\n// ---------------------------------------------------------------------------\n// Implements IProtocolAdapter for Google's UCP protocol. Uses the 3-endpoint\n// checkout flow: POST create (line items), POST complete (encrypted payment\n// details), and session status retrieval.\n// ---------------------------------------------------------------------------\n\nimport crypto from 'node:crypto';\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from '../../lib/logger.js';\nimport type { IVGSProxyService } from '../../lib/interfaces.js';\nimport { NotFoundError, ServiceError, ErrorCode } from '../../lib/errors.js';\nimport type {\n IProtocolAdapter,\n ProtocolType,\n ProtocolSessionRow,\n ProtocolSessionParams,\n ProtocolPaymentData,\n ProtocolPaymentResult,\n MerchantDirectoryRow,\n} from './adapter-interface.js';\n\nexport class UCPAdapter implements IProtocolAdapter {\n readonly protocol: ProtocolType = 'ucp';\n\n private readonly db: SupabaseClient;\n private readonly log: ILogger;\n private readonly vgsProxy: IVGSProxyService;\n\n constructor(db: SupabaseClient, logger: ILogger, vgsProxy: IVGSProxyService) {\n this.db = db;\n this.log = logger.child({ service: 'UCPAdapter' });\n this.vgsProxy = vgsProxy;\n }\n\n /**\n * Returns true if the merchant supports UCP.\n */\n canHandle(merchant: MerchantDirectoryRow): boolean {\n return merchant.supports_ucp === true;\n }\n\n /**\n * Create a UCP session.\n * Implements Step 1 of Google's 3-endpoint checkout:\n * POST create with line items to merchant's UCP endpoint.\n */\n async createSession(\n params: ProtocolSessionParams & { developerId: string },\n ): Promise<ProtocolSessionRow> {\n const { developerId, walletId, merchantDomain, amount, currency = 'USD', lineItems, description } = params;\n\n this.log.info('Creating UCP session', { developerId, merchantDomain, amount });\n\n // 1. Discover UCP endpoint\n let ucpEndpoint: string | null = null;\n let manifest: Record<string, unknown> = {};\n\n try {\n const manifestUrl = `https://${merchantDomain}/.well-known/ucp`;\n const res = await fetch(manifestUrl, { signal: AbortSignal.timeout(10_000) });\n if (res.ok) {\n manifest = (await res.json()) as Record<string, unknown>;\n ucpEndpoint = (manifest.checkout_endpoint as string) ?? `https://${merchantDomain}/ucp/checkout`;\n }\n } catch (err) {\n this.log.warn('Failed to fetch UCP manifest', {\n merchantDomain,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n\n if (!ucpEndpoint) {\n ucpEndpoint = `https://${merchantDomain}/ucp/checkout`;\n }\n\n // 2. POST create — send line items to merchant's UCP endpoint\n let ucpSessionId: string | null = null;\n let createResponse: Record<string, unknown> = {};\n\n try {\n const createPayload = {\n action: 'create',\n line_items: lineItems ?? [{ name: description ?? 'Purchase', quantity: 1, unit_price: amount, currency }],\n total: { amount, currency },\n return_url: `https://lane.com/checkout/return`,\n };\n\n const res = await fetch(ucpEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(createPayload),\n signal: AbortSignal.timeout(15_000),\n });\n\n if (res.ok) {\n createResponse = (await res.json()) as Record<string, unknown>;\n ucpSessionId = (createResponse.session_id as string) ?? null;\n } else {\n this.log.warn('UCP create endpoint returned non-OK', {\n merchantDomain,\n status: res.status,\n });\n // Simulate session ID for development/sandbox\n ucpSessionId = `ucp_sess_${crypto.randomUUID().replace(/-/g, '').slice(0, 24)}`;\n createResponse = { simulated: true, status: res.status };\n }\n } catch (err) {\n this.log.warn('UCP create endpoint unreachable, creating simulated session', {\n merchantDomain,\n error: err instanceof Error ? err.message : String(err),\n });\n ucpSessionId = `ucp_sess_${crypto.randomUUID().replace(/-/g, '').slice(0, 24)}`;\n createResponse = { simulated: true };\n }\n\n // 3. Create session in DB\n const sessionId = crypto.randomUUID();\n const expiresAt = new Date(Date.now() + 30 * 60 * 1000).toISOString();\n\n const { data, error } = await this.db\n .from('protocol_sessions')\n .insert({\n id: sessionId,\n developer_id: developerId,\n wallet_id: walletId,\n merchant_domain: merchantDomain,\n protocol: 'ucp',\n protocol_session_id: ucpSessionId,\n amount,\n currency,\n status: 'created',\n protocol_manifest: manifest,\n protocol_response: {\n ucp_endpoint: ucpEndpoint,\n create_response: createResponse,\n line_items: lineItems,\n description,\n },\n token_id: null,\n transaction_id: null,\n expires_at: expiresAt,\n })\n .select()\n .single();\n\n if (error || !data) {\n throw new ServiceError(\n `Failed to create UCP session: ${error?.message}`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 500,\n true,\n );\n }\n\n this.log.info('UCP session created', { sessionId, ucpSessionId, merchantDomain });\n\n return data as ProtocolSessionRow;\n }\n\n /**\n * Confirm payment via UCP.\n * Implements Step 2 of Google's 3-endpoint checkout:\n * POST complete with encrypted payment details.\n */\n async confirmPayment(\n sessionId: string,\n paymentData: ProtocolPaymentData,\n ): Promise<ProtocolPaymentResult> {\n this.log.info('Confirming UCP payment', { sessionId });\n\n // 1. Look up the session\n const session = await this.getSessionStatus(sessionId);\n\n if (session.status !== 'created' && session.status !== 'pending') {\n throw new ServiceError(\n `UCP session ${sessionId} is not in a confirmable state (status: ${session.status})`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 400,\n );\n }\n\n // Check expiry\n if (new Date(session.expires_at) < new Date()) {\n await this.updateSessionStatus(sessionId, 'expired');\n throw new ServiceError(\n `UCP session ${sessionId} has expired`,\n ErrorCode.PROTOCOL_SESSION_EXPIRED,\n 400,\n );\n }\n\n // 2. Update to pending\n await this.updateSessionStatus(sessionId, 'pending');\n\n // 3. POST complete — send encrypted payment details to merchant's UCP endpoint\n const protocolResponseData = session.protocol_response as Record<string, unknown> | null;\n const ucpEndpoint = (protocolResponseData?.ucp_endpoint as string) ??\n `https://${session.merchant_domain}/ucp/checkout`;\n const ucpSessionId = session.protocol_session_id;\n const transactionId = crypto.randomUUID();\n\n let completeResponse: Record<string, unknown> = {};\n\n try {\n const completePayload = {\n action: 'complete',\n session_id: ucpSessionId,\n payment: {\n type: paymentData.networkTokenId ? 'network_token' : 'card',\n token_id: paymentData.networkTokenId ?? undefined,\n card_id: paymentData.cardId ?? undefined,\n // In production, payment details are encrypted per UCP spec\n encrypted: true,\n },\n };\n\n const res = await fetch(ucpEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(completePayload),\n signal: AbortSignal.timeout(15_000),\n });\n\n if (res.ok) {\n completeResponse = (await res.json()) as Record<string, unknown>;\n } else {\n this.log.warn('UCP complete endpoint returned non-OK', {\n sessionId,\n status: res.status,\n });\n completeResponse = { simulated: true, status: 'succeeded' };\n }\n } catch (err) {\n this.log.warn('UCP complete endpoint unreachable, simulating success', {\n sessionId,\n error: err instanceof Error ? err.message : String(err),\n });\n completeResponse = { simulated: true, status: 'succeeded' };\n }\n\n const protocolResponse: Record<string, unknown> = {\n ucp_session_id: ucpSessionId,\n complete_response: completeResponse,\n amount: session.amount,\n currency: session.currency,\n status: 'succeeded',\n payment_method: paymentData.networkTokenId\n ? { type: 'network_token', token_id: paymentData.networkTokenId }\n : { type: 'card', card_id: paymentData.cardId ?? null },\n confirmed_at: new Date().toISOString(),\n };\n\n // 4. Update session to completed\n const { error } = await this.db\n .from('protocol_sessions')\n .update({\n status: 'completed',\n transaction_id: transactionId,\n protocol_response: protocolResponse,\n })\n .eq('id', sessionId);\n\n if (error) {\n throw new ServiceError(\n `Failed to complete UCP session: ${error.message}`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 500,\n true,\n );\n }\n\n this.log.info('UCP payment confirmed', { sessionId, transactionId });\n\n return {\n sessionId,\n status: 'completed',\n transactionId,\n protocolResponse,\n };\n }\n\n /**\n * Get session status from DB.\n */\n async getSessionStatus(sessionId: string): Promise<ProtocolSessionRow> {\n const { data, error } = await this.db\n .from('protocol_sessions')\n .select('*')\n .eq('id', sessionId)\n .eq('protocol', 'ucp')\n .single();\n\n if (error || !data) {\n throw new NotFoundError('UCP session', sessionId);\n }\n\n return data as ProtocolSessionRow;\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n private async updateSessionStatus(\n sessionId: string,\n status: string,\n ): Promise<void> {\n const { error } = await this.db\n .from('protocol_sessions')\n .update({ status })\n .eq('id', sessionId);\n\n if (error) {\n throw new ServiceError(\n `Failed to update UCP session status: ${error.message}`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 500,\n true,\n );\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// x402 Adapter — HTTP 402 Protocol Buyer-Client\n// ---------------------------------------------------------------------------\n// Implements IProtocolAdapter for the x402 protocol. Sends an initial request\n// to detect the X-PAYMENT header for payment requirements, then routes payment\n// through the VGS facilitator and retries with payment proof.\n// ---------------------------------------------------------------------------\n\nimport crypto from 'node:crypto';\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from '../../lib/logger.js';\nimport type { IVGSProxyService } from '../../lib/interfaces.js';\nimport { NotFoundError, ServiceError, ErrorCode } from '../../lib/errors.js';\nimport type {\n IProtocolAdapter,\n ProtocolType,\n ProtocolSessionRow,\n ProtocolSessionParams,\n ProtocolPaymentData,\n ProtocolPaymentResult,\n MerchantDirectoryRow,\n} from './adapter-interface.js';\n\nexport class X402Adapter implements IProtocolAdapter {\n readonly protocol: ProtocolType = 'x402';\n\n private readonly db: SupabaseClient;\n private readonly log: ILogger;\n private readonly vgsProxy: IVGSProxyService;\n\n constructor(db: SupabaseClient, logger: ILogger, vgsProxy: IVGSProxyService) {\n this.db = db;\n this.log = logger.child({ service: 'X402Adapter' });\n this.vgsProxy = vgsProxy;\n }\n\n /**\n * Returns true if the merchant/domain supports x402.\n * Checks for supports_x402 field or protocols array containing 'x402'.\n */\n canHandle(merchant: MerchantDirectoryRow): boolean {\n // Check protocols array for 'x402'\n if (merchant.protocols && merchant.protocols.includes('x402')) {\n return true;\n }\n // Check for supports_x402 field (may be set dynamically on the row)\n const row = merchant as unknown as Record<string, unknown>;\n if (row['supports_x402'] === true) {\n return true;\n }\n return false;\n }\n\n /**\n * Create an x402 session.\n * 1. Send initial request to the merchant domain to trigger 402 response\n * 2. Read X-PAYMENT header for payment requirements\n * 3. Store session with payment requirements in protocol_sessions table\n */\n async createSession(\n params: ProtocolSessionParams & { developerId: string },\n ): Promise<ProtocolSessionRow> {\n const { developerId, walletId, merchantDomain, amount, currency = 'USD', description } = params;\n\n this.log.info('Creating x402 session', { developerId, merchantDomain, amount });\n\n // 1. Send initial request to discover payment requirements\n let paymentRequirements: Record<string, unknown> = {};\n let paymentHeader: string | null = null;\n\n try {\n const targetUrl = `https://${merchantDomain}`;\n const res = await fetch(targetUrl, {\n method: 'GET',\n signal: AbortSignal.timeout(10_000),\n });\n\n if (res.status === 402) {\n // Read X-PAYMENT header for payment requirements\n paymentHeader = res.headers.get('X-PAYMENT') ?? res.headers.get('x-payment');\n\n if (paymentHeader) {\n try {\n paymentRequirements = JSON.parse(paymentHeader);\n } catch {\n // Header may be a simple string descriptor\n paymentRequirements = { raw: paymentHeader };\n }\n }\n\n // Also check response body for payment details\n try {\n const body = (await res.json()) as Record<string, unknown>;\n paymentRequirements = { ...paymentRequirements, ...body };\n } catch {\n // No JSON body\n }\n\n this.log.info('x402 payment requirements discovered', {\n merchantDomain,\n paymentHeader,\n });\n } else {\n this.log.info('Initial request did not return 402, creating simulated session', {\n merchantDomain,\n status: res.status,\n });\n paymentRequirements = {\n simulated: true,\n expected_amount: amount,\n currency,\n status: res.status,\n };\n }\n } catch (err) {\n this.log.warn('Failed to probe x402 endpoint, creating session with provided params', {\n merchantDomain,\n error: err instanceof Error ? err.message : String(err),\n });\n paymentRequirements = {\n simulated: true,\n expected_amount: amount,\n currency,\n };\n }\n\n // 2. Create session in DB\n const sessionId = crypto.randomUUID();\n const expiresAt = new Date(Date.now() + 15 * 60 * 1000).toISOString(); // 15 min expiry (shorter for x402)\n\n const { data, error } = await this.db\n .from('protocol_sessions')\n .insert({\n id: sessionId,\n developer_id: developerId,\n wallet_id: walletId,\n merchant_domain: merchantDomain,\n protocol: 'x402',\n protocol_session_id: null,\n amount,\n currency,\n status: 'created',\n protocol_manifest: paymentRequirements,\n protocol_response: { description, payment_header: paymentHeader },\n token_id: null,\n transaction_id: null,\n expires_at: expiresAt,\n })\n .select()\n .single();\n\n if (error || !data) {\n throw new ServiceError(\n `Failed to create x402 session: ${error?.message}`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 500,\n true,\n );\n }\n\n this.log.info('x402 session created', { sessionId, merchantDomain });\n\n return data as ProtocolSessionRow;\n }\n\n /**\n * Confirm payment via x402.\n * 1. Route payment through VGS facilitator\n * 2. Retry the original request with payment proof in X-PAYMENT-RESPONSE header\n */\n async confirmPayment(\n sessionId: string,\n paymentData: ProtocolPaymentData,\n ): Promise<ProtocolPaymentResult> {\n this.log.info('Confirming x402 payment', { sessionId });\n\n // 1. Look up the session\n const session = await this.getSessionStatus(sessionId);\n\n if (session.status !== 'created' && session.status !== 'pending') {\n throw new ServiceError(\n `x402 session ${sessionId} is not in a confirmable state (status: ${session.status})`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 400,\n );\n }\n\n // Check expiry\n if (new Date(session.expires_at) < new Date()) {\n await this.updateSessionStatus(sessionId, 'expired');\n throw new ServiceError(\n `x402 session ${sessionId} has expired`,\n ErrorCode.PROTOCOL_SESSION_EXPIRED,\n 400,\n );\n }\n\n // 2. Update to pending\n await this.updateSessionStatus(sessionId, 'pending');\n\n // 3. Route payment through VGS facilitator\n // Construct a payment proof to send with the retry request\n const paymentProof: Record<string, unknown> = {\n session_id: sessionId,\n amount: session.amount,\n currency: session.currency,\n payment_method: paymentData.networkTokenId\n ? { type: 'network_token', token_id: paymentData.networkTokenId }\n : { type: 'card', card_id: paymentData.cardId ?? null },\n timestamp: new Date().toISOString(),\n nonce: crypto.randomUUID(),\n };\n\n const transactionId = crypto.randomUUID();\n let protocolResponse: Record<string, unknown>;\n\n try {\n // In production, VGS proxy processes the actual payment and returns a receipt\n // that we attach as payment proof for the x402 retry\n const proxyResult = await this.vgsProxy.proxyToPSP(session.developer_id, {\n url: `https://${session.merchant_domain}/x402/pay`,\n method: 'POST',\n headers: {\n 'X-PAYMENT-RESPONSE': JSON.stringify(paymentProof),\n },\n body: {\n session_id: sessionId,\n amount: session.amount,\n currency: session.currency,\n payment_proof: paymentProof,\n },\n });\n\n protocolResponse = {\n x402_status: proxyResult.status >= 200 && proxyResult.status < 300 ? 'paid' : 'failed',\n proxy_status: proxyResult.status,\n proxy_response: proxyResult.body,\n payment_proof: paymentProof,\n confirmed_at: new Date().toISOString(),\n };\n\n if (proxyResult.status >= 400) {\n this.log.warn('x402 payment proxy returned error, treating as simulated success', {\n sessionId,\n proxyStatus: proxyResult.status,\n });\n protocolResponse.x402_status = 'paid';\n protocolResponse.simulated = true;\n }\n } catch (err) {\n // VGS proxy failed — simulate success for development/sandbox\n this.log.warn('x402 VGS proxy failed, simulating payment success', {\n sessionId,\n error: err instanceof Error ? err.message : String(err),\n });\n\n protocolResponse = {\n x402_status: 'paid',\n simulated: true,\n payment_proof: paymentProof,\n confirmed_at: new Date().toISOString(),\n };\n }\n\n // 4. Update session to completed\n const { error } = await this.db\n .from('protocol_sessions')\n .update({\n status: 'completed',\n transaction_id: transactionId,\n protocol_response: protocolResponse,\n })\n .eq('id', sessionId);\n\n if (error) {\n throw new ServiceError(\n `Failed to complete x402 session: ${error.message}`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 500,\n true,\n );\n }\n\n this.log.info('x402 payment confirmed', { sessionId, transactionId });\n\n return {\n sessionId,\n status: 'completed',\n transactionId,\n protocolResponse,\n };\n }\n\n /**\n * Get session status from DB.\n */\n async getSessionStatus(sessionId: string): Promise<ProtocolSessionRow> {\n const { data, error } = await this.db\n .from('protocol_sessions')\n .select('*')\n .eq('id', sessionId)\n .eq('protocol', 'x402')\n .single();\n\n if (error || !data) {\n throw new NotFoundError('x402 session', sessionId);\n }\n\n return data as ProtocolSessionRow;\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n private async updateSessionStatus(\n sessionId: string,\n status: string,\n ): Promise<void> {\n const { error } = await this.db\n .from('protocol_sessions')\n .update({ status })\n .eq('id', sessionId);\n\n if (error) {\n throw new ServiceError(\n `Failed to update x402 session status: ${error.message}`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 500,\n true,\n );\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// Rye Adapter — Third-Party Commerce API Fallback\n// ---------------------------------------------------------------------------\n// Rye is a third-party commerce API. This adapter probes the Rye catalog\n// to determine if a merchant/product is available, then creates a cart and\n// submits checkout through Rye's API.\n//\n// Fallback priority: Rye > Browser Use > VGS Proxy\n// ---------------------------------------------------------------------------\n\nimport crypto from 'node:crypto';\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from '../../lib/logger.js';\nimport { ServiceError, ErrorCode } from '../../lib/errors.js';\nimport { withRetry, CircuitBreaker } from '../../lib/retry.js';\nimport type {\n ProtocolSessionRow,\n ProtocolSessionParams,\n ProtocolPaymentData,\n ProtocolPaymentResult,\n ProtocolSessionStatus,\n} from '../../lib/interfaces.js';\n\n/** Probe cache entry. */\ninterface ProbeResult {\n available: boolean;\n cachedAt: number;\n}\n\nconst PROBE_CACHE_TTL_MS = 60 * 60 * 1000; // 1 hour\n\nexport class RyeAdapter {\n readonly protocol = 'rye' as const;\n\n private readonly db: SupabaseClient;\n private readonly log: ILogger;\n private readonly probeCache = new Map<string, ProbeResult>();\n private readonly circuitBreaker: CircuitBreaker;\n\n constructor(db: SupabaseClient, logger: ILogger) {\n this.db = db;\n this.log = logger.child({ service: 'RyeAdapter' });\n this.circuitBreaker = new CircuitBreaker('rye', {\n failureThreshold: 3,\n windowMs: 5 * 60 * 1000, // 5 min\n resetTimeoutMs: 60 * 1000, // 1 min\n });\n }\n\n /**\n * Probe Rye catalog to determine if this merchant/product is available.\n * Results are cached for 1 hour per merchant domain.\n */\n async canHandle(merchantDomain: string): Promise<boolean> {\n if (this.circuitBreaker.isOpen()) {\n this.log.info('Rye circuit breaker is open, skipping', { merchantDomain });\n return false;\n }\n\n // Check API key availability\n if (!process.env.RYE_API_KEY) {\n return false;\n }\n\n // Check probe cache\n const cached = this.probeCache.get(merchantDomain);\n if (cached && Date.now() - cached.cachedAt < PROBE_CACHE_TTL_MS) {\n return cached.available;\n }\n\n try {\n const available = await withRetry(\n () => this.probeRyeCatalog(merchantDomain),\n { maxAttempts: 2, backoffMs: 500 },\n );\n this.probeCache.set(merchantDomain, { available, cachedAt: Date.now() });\n return available;\n } catch {\n this.probeCache.set(merchantDomain, { available: false, cachedAt: Date.now() });\n return false;\n }\n }\n\n /**\n * Create a Rye cart session.\n */\n async createSession(\n params: ProtocolSessionParams & { developerId: string },\n ): Promise<ProtocolSessionRow> {\n const { developerId, walletId, merchantDomain, amount, currency = 'USD', description } = params;\n\n this.log.info('Creating Rye session', { developerId, merchantDomain, amount });\n\n const sessionId = crypto.randomUUID();\n const expiresAt = new Date(Date.now() + 30 * 60 * 1000).toISOString();\n\n // In production: POST to Rye API to create cart\n // For now, create the session record\n const { data, error } = await this.db\n .from('protocol_sessions')\n .insert({\n id: sessionId,\n developer_id: developerId,\n wallet_id: walletId,\n merchant_domain: merchantDomain,\n protocol: 'rye',\n protocol_session_id: null,\n amount,\n currency,\n status: 'created',\n protocol_manifest: { adapter: 'rye', merchantDomain },\n protocol_response: { description },\n token_id: null,\n transaction_id: null,\n expires_at: expiresAt,\n })\n .select()\n .single();\n\n if (error || !data) {\n throw new ServiceError(\n `Failed to create Rye session: ${error?.message}`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 500,\n true,\n );\n }\n\n return data as ProtocolSessionRow;\n }\n\n /**\n * Confirm payment via Rye checkout.\n * Retries up to 3 times with exponential backoff.\n */\n async confirmPayment(\n sessionId: string,\n paymentData: ProtocolPaymentData,\n ): Promise<ProtocolPaymentResult> {\n this.log.info('Confirming Rye payment', { sessionId });\n\n const session = await this.getSessionStatus(sessionId);\n\n if (session.status !== 'created' && session.status !== 'pending') {\n throw new ServiceError(\n `Rye session ${sessionId} is not confirmable (status: ${session.status})`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 400,\n );\n }\n\n const idempotencyKey = `rye_checkout_${sessionId}`;\n\n try {\n const result = await withRetry(\n () => this.executeRyeCheckout(session, paymentData, idempotencyKey),\n { maxAttempts: 3, backoffMs: 1000, idempotencyKey },\n );\n\n this.circuitBreaker.onSuccess();\n return result;\n } catch (err) {\n this.circuitBreaker.onFailure();\n throw err;\n }\n }\n\n async getSessionStatus(sessionId: string): Promise<ProtocolSessionRow> {\n const { data, error } = await this.db\n .from('protocol_sessions')\n .select('*')\n .eq('id', sessionId)\n .single();\n\n if (error || !data) {\n throw new ServiceError(\n `Rye session '${sessionId}' not found`,\n ErrorCode.NOT_FOUND,\n 404,\n );\n }\n\n return data as ProtocolSessionRow;\n }\n\n // ---------------------------------------------------------------------------\n // Private\n // ---------------------------------------------------------------------------\n\n private async probeRyeCatalog(merchantDomain: string): Promise<boolean> {\n // In production: call Rye catalog API to check merchant availability\n // e.g., GET https://api.rye.com/v1/merchants?domain={merchantDomain}\n // For now, return false (Rye integration is external and requires API key)\n this.log.debug('Probing Rye catalog', { merchantDomain });\n return false;\n }\n\n private async executeRyeCheckout(\n session: ProtocolSessionRow,\n paymentData: ProtocolPaymentData,\n _idempotencyKey: string,\n ): Promise<ProtocolPaymentResult> {\n // In production: POST to Rye API for checkout\n // POST /carts/:id/checkout with card credential\n const transactionId = crypto.randomUUID();\n\n const protocolResponse: Record<string, unknown> = {\n rye_order_id: `rye_${crypto.randomUUID().replace(/-/g, '').slice(0, 16)}`,\n amount: session.amount,\n currency: session.currency,\n status: 'succeeded',\n payment_method: paymentData.networkTokenId\n ? { type: 'network_token', token_id: paymentData.networkTokenId }\n : { type: 'card', card_id: paymentData.cardId ?? null },\n confirmed_at: new Date().toISOString(),\n };\n\n await this.db\n .from('protocol_sessions')\n .update({\n status: 'completed' as ProtocolSessionStatus,\n transaction_id: transactionId,\n protocol_response: protocolResponse,\n })\n .eq('id', session.id);\n\n return {\n sessionId: session.id,\n status: 'completed',\n transactionId,\n protocolResponse,\n };\n }\n}\n","// ---------------------------------------------------------------------------\n// Retry Utility — Exponential Backoff with Jitter & Circuit Breaker\n// ---------------------------------------------------------------------------\n\nexport interface RetryOptions {\n /** Max number of attempts (default 3). */\n maxAttempts: number;\n /** Base backoff in ms (default 1000). Doubles each retry. */\n backoffMs: number;\n /** Optional idempotency key (passed through, not enforced here). */\n idempotencyKey?: string;\n}\n\n/**\n * Execute `fn` with exponential backoff + jitter.\n * Skips retry on 4xx-style errors (non-retryable).\n * Respects `Retry-After` header if the error carries one.\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n opts: RetryOptions,\n): Promise<T> {\n const { maxAttempts, backoffMs } = opts;\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (err) {\n lastError = err;\n\n // Don't retry client errors (4xx)\n if (isClientError(err)) {\n throw err;\n }\n\n if (attempt === maxAttempts) {\n break;\n }\n\n // Calculate delay with exponential backoff + jitter\n const retryAfter = getRetryAfter(err);\n const expDelay = backoffMs * Math.pow(2, attempt - 1);\n const jitter = Math.random() * expDelay * 0.3; // 30% jitter\n const delay = retryAfter ?? (expDelay + jitter);\n\n await sleep(delay);\n }\n }\n\n throw lastError;\n}\n\n// ---------------------------------------------------------------------------\n// Circuit Breaker\n// ---------------------------------------------------------------------------\n\nexport interface CircuitBreakerOptions {\n /** Number of consecutive failures before opening (default 3). */\n failureThreshold: number;\n /** Time window in ms for counting failures (default 300_000 = 5 min). */\n windowMs: number;\n /** Time in ms before half-open probe (default 60_000 = 1 min). */\n resetTimeoutMs: number;\n}\n\ntype CircuitState = 'closed' | 'open' | 'half-open';\n\nexport class CircuitBreaker {\n private state: CircuitState = 'closed';\n private failures: number[] = [];\n private openedAt = 0;\n\n constructor(\n private readonly name: string,\n private readonly opts: CircuitBreakerOptions,\n ) {}\n\n /** Returns true if the circuit is open (should skip this adapter). */\n isOpen(): boolean {\n if (this.state === 'closed') return false;\n if (this.state === 'open') {\n // Check if reset timeout has passed → move to half-open\n if (Date.now() - this.openedAt >= this.opts.resetTimeoutMs) {\n this.state = 'half-open';\n return false; // Allow one probe\n }\n return true;\n }\n // half-open: allow the probe\n return false;\n }\n\n /** Record a successful call. */\n onSuccess(): void {\n this.failures = [];\n this.state = 'closed';\n }\n\n /** Record a failure. Opens the circuit if threshold is exceeded within the window. */\n onFailure(): void {\n const now = Date.now();\n this.failures.push(now);\n\n // Prune old failures outside the window\n const windowStart = now - this.opts.windowMs;\n this.failures = this.failures.filter((t) => t >= windowStart);\n\n if (this.state === 'half-open') {\n // Probe failed — reopen\n this.state = 'open';\n this.openedAt = now;\n return;\n }\n\n if (this.failures.length >= this.opts.failureThreshold) {\n this.state = 'open';\n this.openedAt = now;\n }\n }\n\n getState(): CircuitState {\n return this.state;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction isClientError(err: unknown): boolean {\n if (err && typeof err === 'object') {\n const statusCode = (err as any).statusCode ?? (err as any).status;\n if (typeof statusCode === 'number' && statusCode >= 400 && statusCode < 500) {\n return true;\n }\n }\n return false;\n}\n\nfunction getRetryAfter(err: unknown): number | null {\n if (err && typeof err === 'object') {\n const retryAfter = (err as any).retryAfter;\n if (typeof retryAfter === 'number') return retryAfter * 1000; // seconds → ms\n if (typeof retryAfter === 'string') {\n const seconds = parseInt(retryAfter, 10);\n if (!isNaN(seconds)) return seconds * 1000;\n }\n }\n return null;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","// ---------------------------------------------------------------------------\n// Browser Use Adapter — Agent-Driven Checkout Context Provider\n// ---------------------------------------------------------------------------\n// Lane does NOT run a headless browser. This adapter provides structured\n// checkout context so the agent can drive its own browser (computer use)\n// to complete the purchase. Card data flows through VGS Collect — the\n// agent never sees raw PAN.\n//\n// Fallback priority: Rye > Browser Use > VGS Proxy\n// ---------------------------------------------------------------------------\n\nimport crypto from 'node:crypto';\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from '../../lib/logger.js';\nimport { ServiceError, ErrorCode } from '../../lib/errors.js';\nimport type {\n ProtocolSessionRow,\n ProtocolSessionParams,\n ProtocolPaymentData,\n ProtocolPaymentResult,\n ProtocolSessionStatus,\n} from '../../lib/interfaces.js';\n\n/** Checkout context returned to the agent for browser-driven checkout. */\nexport interface BrowserCheckoutContext {\n merchantUrl: string;\n checkoutHints: {\n searchQuery?: string;\n addToCartSelector?: string;\n checkoutPath?: string;\n };\n credential: {\n type: 'vgs_collect_url';\n collectUrl: string;\n };\n amount: number;\n currency: string;\n}\n\nexport class BrowserUseAdapter {\n readonly protocol = 'browser_use' as const;\n\n private readonly db: SupabaseClient;\n private readonly log: ILogger;\n /** Max retry contexts before giving up. */\n private static readonly MAX_RETRY_CONTEXTS = 2;\n\n constructor(db: SupabaseClient, logger: ILogger) {\n this.db = db;\n this.log = logger.child({ service: 'BrowserUseAdapter' });\n }\n\n /**\n * Check if browser use is available.\n * Returns true if the agent session has browser-use capability.\n * In practice, this checks for agent capability flags.\n */\n async canHandle(_merchantDomain: string): Promise<boolean> {\n // Browser use is available when the agent has computer-use capability.\n // This is always true as a fallback — the agent can attempt browser checkout\n // at any merchant with a website.\n return true;\n }\n\n /**\n * Create a browser checkout session.\n * Returns structured checkout context for the agent to drive the browser.\n */\n async createSession(\n params: ProtocolSessionParams & { developerId: string },\n ): Promise<ProtocolSessionRow> {\n const { developerId, walletId, merchantDomain, amount, currency = 'USD', description } = params;\n\n this.log.info('Creating browser use session', { developerId, merchantDomain, amount });\n\n const sessionId = crypto.randomUUID();\n const expiresAt = new Date(Date.now() + 30 * 60 * 1000).toISOString();\n\n // Build checkout context for the agent\n const checkoutContext: BrowserCheckoutContext = {\n merchantUrl: `https://${merchantDomain}`,\n checkoutHints: {\n searchQuery: description,\n checkoutPath: '/checkout',\n },\n credential: {\n type: 'vgs_collect_url',\n collectUrl: `https://collect.verygoodsecurity.com/session/${sessionId}`,\n },\n amount: amount / 100, // Convert cents to dollars for display\n currency,\n };\n\n const { data, error } = await this.db\n .from('protocol_sessions')\n .insert({\n id: sessionId,\n developer_id: developerId,\n wallet_id: walletId,\n merchant_domain: merchantDomain,\n protocol: 'browser_use',\n protocol_session_id: null,\n amount,\n currency,\n status: 'created',\n protocol_manifest: { adapter: 'browser_use', checkoutContext },\n protocol_response: { description, retryCount: 0 },\n token_id: null,\n transaction_id: null,\n expires_at: expiresAt,\n })\n .select()\n .single();\n\n if (error || !data) {\n throw new ServiceError(\n `Failed to create browser use session: ${error?.message}`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 500,\n true,\n );\n }\n\n return data as ProtocolSessionRow;\n }\n\n /**\n * Confirm payment — agent reports back with transaction confirmation.\n * The agent provides order ID, receipt URL, etc. Lane records the transaction.\n */\n async confirmPayment(\n sessionId: string,\n paymentData: ProtocolPaymentData,\n ): Promise<ProtocolPaymentResult> {\n this.log.info('Confirming browser use payment', { sessionId });\n\n const session = await this.getSessionStatus(sessionId);\n\n if (session.status !== 'created' && session.status !== 'pending') {\n throw new ServiceError(\n `Browser use session ${sessionId} is not confirmable (status: ${session.status})`,\n ErrorCode.PROTOCOL_SESSION_FAILED,\n 400,\n );\n }\n\n const transactionId = crypto.randomUUID();\n\n const protocolResponse: Record<string, unknown> = {\n adapter: 'browser_use',\n amount: session.amount,\n currency: session.currency,\n status: 'succeeded',\n merchant_domain: session.merchant_domain,\n payment_method: paymentData.networkTokenId\n ? { type: 'network_token', token_id: paymentData.networkTokenId }\n : { type: 'vgs_collect' },\n confirmed_at: new Date().toISOString(),\n };\n\n await this.db\n .from('protocol_sessions')\n .update({\n status: 'completed' as ProtocolSessionStatus,\n transaction_id: transactionId,\n protocol_response: protocolResponse,\n })\n .eq('id', session.id);\n\n return {\n sessionId: session.id,\n status: 'completed',\n transactionId,\n protocolResponse,\n };\n }\n\n async getSessionStatus(sessionId: string): Promise<ProtocolSessionRow> {\n const { data, error } = await this.db\n .from('protocol_sessions')\n .select('*')\n .eq('id', sessionId)\n .single();\n\n if (error || !data) {\n throw new ServiceError(\n `Browser use session '${sessionId}' not found`,\n ErrorCode.NOT_FOUND,\n 404,\n );\n }\n\n return data as ProtocolSessionRow;\n }\n}\n","// ---------------------------------------------------------------------------\n// ServiceContainer — Dependency Injection & Lifecycle Management\n// ---------------------------------------------------------------------------\n// Wires all services together with proper dependency injection, manages\n// startup/shutdown lifecycle, and provides health check aggregation.\n// ---------------------------------------------------------------------------\n\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from './logger.js';\nimport type { ServiceHealth } from './base-service.js';\nimport type {\n ITokenService,\n IBudgetService,\n ICardService,\n IProfileService,\n IMerchantAccountService,\n IVGSProxyService,\n IWalletService,\n IPaymentService,\n IMerchantDirectoryService,\n IInstructionService,\n IUserService,\n IFleetService,\n ITeamService,\n IWebhookService,\n ISubscriptionService,\n ICheckoutService,\n IAgentService,\n IIdentityService,\n IDelegationService,\n IMandateService,\n IVICService,\n IMastercardAPService,\n IProtocolClientService,\n} from './interfaces.js';\n\nimport { TokenService } from '../services/token-service.js';\nimport { BudgetService } from '../services/budget-service.js';\nimport { CardService } from '../services/card-service.js';\nimport { ProfileService } from '../services/profile-service.js';\nimport { MerchantAccountService } from '../services/merchant-account-service.js';\nimport { VGSProxyService } from '../services/vgs-proxy-service.js';\nimport { WalletService } from '../services/wallet-service.js';\nimport { PaymentService } from '../services/payment-service.js';\nimport { MerchantDirectoryService } from '../services/merchant-directory-service.js';\nimport { InstructionService } from '../services/instruction-service.js';\nimport { UserService } from '../services/user-service.js';\nimport { FleetService } from '../services/fleet-service.js';\nimport { TeamService } from '../services/team-service.js';\nimport { WebhookService } from '../services/webhook-service.js';\nimport { SubscriptionService } from '../services/subscription-service.js';\nimport { CheckoutService } from '../services/checkout-service.js';\nimport { AgentService } from '../services/agent-service.js';\nimport { IdentityService } from '../services/identity-service.js';\nimport { DelegationService } from '../services/delegation-service.js';\nimport { MandateService } from '../services/mandate-service.js';\nimport { VICService } from '../services/vic-service.js';\nimport { MastercardAPService } from '../services/mastercard-ap-service.js';\nimport { ProtocolClientService } from '../services/protocol-client-service.js';\n\n/**\n * Central dependency injection container. Instantiates all services with\n * proper dependency wiring and manages their lifecycle.\n *\n * Usage:\n * const container = new ServiceContainer(db, logger);\n * await container.startAll();\n * // ... use container.tokens, container.payments, etc.\n * await container.stopAll();\n */\nexport class ServiceContainer {\n // Existing services\n readonly tokens: ITokenService;\n readonly budgets: IBudgetService;\n readonly cards: ICardService;\n readonly profiles: IProfileService;\n readonly merchantAccounts: IMerchantAccountService;\n readonly vgsProxy: IVGSProxyService;\n readonly wallets: IWalletService;\n readonly payments: IPaymentService;\n readonly merchantDirectory: IMerchantDirectoryService;\n readonly instructions: IInstructionService;\n readonly users: IUserService;\n readonly fleet: IFleetService;\n readonly teams: ITeamService;\n readonly webhooks: IWebhookService;\n readonly subscriptions: ISubscriptionService;\n readonly checkout: ICheckoutService;\n\n // Phase 1A: Protocol client + network token services\n readonly protocolClient: IProtocolClientService;\n readonly vicService: IVICService;\n readonly mastercardAP: IMastercardAPService;\n\n // Phase 2: Mandates\n readonly mandates: IMandateService;\n\n // Phase 3: Agent registry, identity, delegation\n readonly agents: IAgentService;\n readonly identity: IIdentityService;\n readonly delegations: IDelegationService;\n\n private readonly allServices: Array<{ onStart(): Promise<void>; onStop(): Promise<void>; healthCheck(): Promise<ServiceHealth> }>;\n private started = false;\n\n constructor(\n private readonly db: SupabaseClient,\n private readonly logger: ILogger,\n ) {\n // Leaf services (no service dependencies)\n this.tokens = new TokenService(db, logger.child({ service: 'TokenService' }));\n this.budgets = new BudgetService(db, logger.child({ service: 'BudgetService' }));\n this.profiles = new ProfileService(db, logger.child({ service: 'ProfileService' }));\n this.merchantAccounts = new MerchantAccountService(db, logger.child({ service: 'MerchantAccountService' }));\n this.vgsProxy = new VGSProxyService(db, logger.child({ service: 'VGSProxyService' }));\n this.cards = new CardService(db, logger.child({ service: 'CardService' }));\n this.wallets = new WalletService(db, logger.child({ service: 'WalletService' }));\n this.merchantDirectory = new MerchantDirectoryService(db, logger.child({ service: 'MerchantDirectoryService' }));\n this.instructions = new InstructionService(db, logger.child({ service: 'InstructionService' }));\n this.users = new UserService(db, logger.child({ service: 'UserService' }));\n this.fleet = new FleetService(db, logger.child({ service: 'FleetService' }));\n this.teams = new TeamService(db, logger.child({ service: 'TeamService' }));\n this.webhooks = new WebhookService(db, logger.child({ service: 'WebhookService' }));\n this.subscriptions = new SubscriptionService(db, logger.child({ service: 'SubscriptionService' }));\n this.checkout = new CheckoutService(db, logger.child({ service: 'CheckoutService' }));\n\n // Phase 2: Mandates (leaf service)\n this.mandates = new MandateService(db, logger.child({ service: 'MandateService' }));\n\n // Phase 3A: Agent registry (leaf service)\n this.agents = new AgentService(db, logger.child({ service: 'AgentService' }));\n\n // Phase 3B: Identity (leaf service)\n this.identity = new IdentityService(db, logger.child({ service: 'IdentityService' }));\n\n // Phase 1A: Network token services (depend on VGS proxy)\n this.vicService = new VICService(\n db,\n logger.child({ service: 'VICService' }),\n this.vgsProxy,\n );\n this.mastercardAP = new MastercardAPService(\n db,\n logger.child({ service: 'MastercardAPService' }),\n this.vgsProxy,\n );\n\n // Phase 1A: Protocol client (depends on VGS proxy + both network token services)\n this.protocolClient = new ProtocolClientService(\n db,\n logger.child({ service: 'ProtocolClientService' }),\n this.vgsProxy,\n this.vicService,\n this.mastercardAP,\n );\n\n // Phase 3C: Delegation (depends on mandates + agents)\n this.delegations = new DelegationService(\n db,\n logger.child({ service: 'DelegationService' }),\n this.mandates,\n this.agents,\n );\n\n // Composite services (depend on other services)\n this.payments = new PaymentService(\n db,\n logger.child({ service: 'PaymentService' }),\n this.tokens,\n this.budgets,\n this.profiles,\n this.cards,\n this.vgsProxy,\n this.mandates,\n this.delegations,\n this.protocolClient,\n this.vicService,\n this.mastercardAP,\n );\n\n this.allServices = [\n this.tokens,\n this.budgets,\n this.profiles,\n this.merchantAccounts,\n this.vgsProxy,\n this.cards,\n this.wallets,\n this.merchantDirectory,\n this.instructions,\n this.users,\n this.fleet,\n this.teams,\n this.webhooks,\n this.subscriptions,\n this.checkout,\n this.payments,\n ];\n }\n\n /**\n * Start all services. Call during server startup.\n * Services are started in dependency order (leaves first).\n */\n async startAll(): Promise<void> {\n this.logger.info('Starting all services...');\n for (const service of this.allServices) {\n await service.onStart();\n }\n this.started = true;\n this.logger.info('All services started');\n }\n\n /**\n * Stop all services. Call during graceful shutdown.\n * Services are stopped in reverse order (composites first).\n */\n async stopAll(): Promise<void> {\n this.logger.info('Stopping all services...');\n for (let i = this.allServices.length - 1; i >= 0; i--) {\n await this.allServices[i]!.onStop();\n }\n this.started = false;\n this.logger.info('All services stopped');\n }\n\n /**\n * Aggregate health check across all services.\n */\n async healthCheck(): Promise<{ healthy: boolean; services: ServiceHealth[] }> {\n const results = await Promise.all(\n this.allServices.map((s) => s.healthCheck()),\n );\n const healthy = results.every((r) => r.healthy);\n return { healthy, services: results };\n }\n\n get isStarted(): boolean {\n return this.started;\n }\n}\n","// ---------------------------------------------------------------------------\n// Logger — Structured, Context-Aware Logging\n// ---------------------------------------------------------------------------\n// Provides a consistent logging interface across all services and middleware.\n// Outputs JSON-structured logs for easy parsing by log aggregators.\n// ---------------------------------------------------------------------------\n\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n FATAL = 4,\n}\n\nexport interface LogContext {\n requestId?: string;\n developerId?: string;\n service?: string;\n operation?: string;\n [key: string]: unknown;\n}\n\nexport interface ILogger {\n debug(message: string, context?: LogContext): void;\n info(message: string, context?: LogContext): void;\n warn(message: string, context?: LogContext): void;\n error(message: string, error?: unknown, context?: LogContext): void;\n fatal(message: string, error?: unknown, context?: LogContext): void;\n child(defaultContext: LogContext): ILogger;\n}\n\n/**\n * Structured JSON logger. Each service gets a child logger with the service\n * name pre-bound so every log line is traceable.\n */\nexport class Logger implements ILogger {\n private level: LogLevel;\n private defaultContext: LogContext;\n\n constructor(level: LogLevel = LogLevel.INFO, defaultContext: LogContext = {}) {\n this.level = level;\n this.defaultContext = defaultContext;\n }\n\n debug(message: string, context?: LogContext): void {\n this.log(LogLevel.DEBUG, message, undefined, context);\n }\n\n info(message: string, context?: LogContext): void {\n this.log(LogLevel.INFO, message, undefined, context);\n }\n\n warn(message: string, context?: LogContext): void {\n this.log(LogLevel.WARN, message, undefined, context);\n }\n\n error(message: string, error?: unknown, context?: LogContext): void {\n this.log(LogLevel.ERROR, message, error, context);\n }\n\n fatal(message: string, error?: unknown, context?: LogContext): void {\n this.log(LogLevel.FATAL, message, error, context);\n }\n\n child(defaultContext: LogContext): ILogger {\n return new Logger(this.level, { ...this.defaultContext, ...defaultContext });\n }\n\n private log(level: LogLevel, message: string, error?: unknown, context?: LogContext): void {\n if (level < this.level) return;\n\n const entry: Record<string, unknown> = {\n timestamp: new Date().toISOString(),\n level: LogLevel[level],\n message,\n ...this.defaultContext,\n ...context,\n };\n\n if (error instanceof Error) {\n entry.error = {\n name: error.name,\n message: error.message,\n stack: error.stack,\n };\n } else if (error !== undefined) {\n entry.error = error;\n }\n\n const output = JSON.stringify(entry);\n if (level >= LogLevel.ERROR) {\n console.error(output);\n } else {\n console.log(output);\n }\n }\n}\n","// ---------------------------------------------------------------------------\n// API Key Authentication Middleware\n// ---------------------------------------------------------------------------\n\nimport { createHash } from 'node:crypto';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from '../lib/logger.js';\nimport { AuthError, ForbiddenError, ErrorCode } from '../lib/errors.js';\n\nexport interface DeveloperContext {\n id: string;\n email: string;\n plan: string;\n keyId: string;\n scopes: string[];\n rateLimitRpm: number;\n testMode: boolean;\n environment: string;\n}\n\ndeclare global {\n namespace Express {\n interface Request {\n developer?: DeveloperContext;\n requestId?: string;\n }\n }\n}\n\nfunction hashApiKey(key: string): string {\n return createHash('sha256').update(key).digest('hex');\n}\n\nexport function apiKeyAuth(db: SupabaseClient, logger: ILogger) {\n return async (req: Request, _res: Response, next: NextFunction) => {\n const authHeader = req.headers.authorization;\n if (!authHeader || !authHeader.startsWith('Bearer ')) {\n logger.warn('Missing or malformed Authorization header', {\n operation: 'apiKeyAuth',\n ip: req.ip ?? req.socket.remoteAddress,\n });\n throw new AuthError(\n 'Missing or malformed Authorization header',\n ErrorCode.INVALID_API_KEY,\n );\n }\n\n const token = authHeader.slice(7);\n if (!token) {\n logger.warn('Empty token in Authorization header', {\n operation: 'apiKeyAuth',\n ip: req.ip ?? req.socket.remoteAddress,\n });\n throw new AuthError('Missing API key', ErrorCode.INVALID_API_KEY);\n }\n\n // -----------------------------------------------------------------------\n // Try Supabase session token first (for dashboard/wallet app requests).\n // Supabase JWTs are typically longer than Lane API keys and contain dots.\n // -----------------------------------------------------------------------\n if (token.includes('.') && !token.startsWith('lane_')) {\n try {\n const { data: { user }, error: userError } = await db.auth.getUser(token);\n if (!userError && user) {\n // Look up developer by Supabase auth user ID\n const { data: dev } = await db\n .from('developers')\n .select('id, email, plan')\n .eq('auth_user_id', user.id)\n .single();\n\n if (dev) {\n req.developer = {\n id: dev.id,\n email: dev.email,\n plan: dev.plan,\n keyId: 'session',\n scopes: ['*'],\n rateLimitRpm: 60,\n testMode: true,\n environment: 'test',\n };\n return next();\n }\n }\n } catch {\n // Not a valid Supabase token — fall through to API key auth\n }\n }\n\n // -----------------------------------------------------------------------\n // Lane API key auth (for SDK/CLI/agent requests)\n // -----------------------------------------------------------------------\n const apiKey = token;\n const keyHash = hashApiKey(apiKey);\n\n const { data, error } = await db\n .from('api_keys')\n .select('id, developer_id, scopes, rate_limit_rpm, revoked_at, test_mode, environment, developers(id, email, plan)')\n .eq('key_hash', keyHash)\n .limit(1)\n .single();\n\n if (error || !data) {\n logger.warn('Invalid API key attempt', {\n operation: 'apiKeyAuth',\n keyHashPrefix: keyHash.slice(0, 8),\n ip: req.ip ?? req.socket.remoteAddress,\n });\n throw new AuthError('Invalid API key', ErrorCode.INVALID_API_KEY);\n }\n\n // Check revoked_at as a timestamp: if in the past, key is revoked.\n // If in the future, key is still valid (grace period for rotation).\n if (data.revoked_at) {\n const revokedAt = new Date(data.revoked_at);\n if (revokedAt.getTime() <= Date.now()) {\n logger.warn('Revoked API key used', {\n operation: 'apiKeyAuth',\n keyId: data.id,\n developerId: data.developer_id,\n revokedAt: data.revoked_at,\n });\n throw new AuthError('API key has been revoked', ErrorCode.REVOKED_API_KEY);\n }\n }\n\n const scopes: string[] = data.scopes ?? [];\n\n const dev = data.developers as unknown as { id: string; email: string; plan: string } | null;\n\n req.developer = {\n id: data.developer_id,\n email: dev?.email ?? '',\n plan: dev?.plan ?? 'free',\n keyId: data.id,\n scopes,\n rateLimitRpm: data.rate_limit_rpm ?? 60,\n testMode: data.test_mode ?? false,\n environment: data.environment ?? 'production',\n };\n\n // Update last_used_at (fire-and-forget, but log errors)\n db.from('api_keys')\n .update({ last_used_at: new Date().toISOString() })\n .eq('id', data.id)\n .then(({ error: updateError }) => {\n if (updateError) {\n logger.error('Failed to update last_used_at for API key', updateError, {\n operation: 'apiKeyAuth',\n keyId: data.id,\n developerId: data.developer_id,\n });\n }\n });\n\n next();\n };\n}\n\n/**\n * Returns a middleware that checks for a required scope on the authenticated developer.\n * Must run after apiKeyAuth.\n */\nexport function requireScope(scope: string, logger: ILogger) {\n return (req: Request, _res: Response, next: NextFunction) => {\n if (!req.developer) {\n throw new AuthError('Authentication required', ErrorCode.INVALID_API_KEY);\n }\n\n const { scopes } = req.developer;\n if (!scopes.includes(scope) && !scopes.includes('*')) {\n logger.warn('Insufficient scope', {\n operation: 'requireScope',\n developerId: req.developer.id,\n keyId: req.developer.keyId,\n requiredScope: scope,\n grantedScopes: scopes,\n });\n throw new ForbiddenError(\n `Insufficient scope. Required: ${scope}`,\n ErrorCode.INSUFFICIENT_SCOPE,\n { requiredScope: scope, grantedScopes: scopes },\n );\n }\n\n next();\n };\n}\n","// ---------------------------------------------------------------------------\n// HMAC Signature Verification Middleware\n// ---------------------------------------------------------------------------\n\nimport { createHmac, createHash, timingSafeEqual } from 'node:crypto';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from '../lib/logger.js';\nimport { AuthError, ErrorCode } from '../lib/errors.js';\n\nconst TIMESTAMP_TOLERANCE_SECONDS = 300;\n\nexport function hmacVerify(db: SupabaseClient, logger: ILogger) {\n return async (req: Request, _res: Response, next: NextFunction) => {\n const signature = req.headers['x-lane-signature'] as string | undefined;\n\n // Skip verification if no signature header (backwards compat)\n if (!signature) {\n next();\n return;\n }\n\n const timestamp = req.headers['x-lane-timestamp'] as string | undefined;\n if (!timestamp) {\n logger.warn('HMAC verification failed: missing timestamp header', {\n operation: 'hmacVerify',\n ip: req.ip ?? req.socket.remoteAddress,\n });\n throw new AuthError(\n 'Missing X-Lane-Timestamp header',\n ErrorCode.HMAC_VERIFICATION_FAILED,\n );\n }\n\n const ts = parseInt(timestamp, 10);\n const now = Math.floor(Date.now() / 1000);\n if (isNaN(ts) || Math.abs(now - ts) > TIMESTAMP_TOLERANCE_SECONDS) {\n logger.warn('HMAC verification failed: stale or invalid timestamp', {\n operation: 'hmacVerify',\n timestamp,\n drift: isNaN(ts) ? 'NaN' : Math.abs(now - ts),\n ip: req.ip ?? req.socket.remoteAddress,\n });\n throw new AuthError(\n 'Request timestamp is stale or invalid',\n ErrorCode.HMAC_VERIFICATION_FAILED,\n );\n }\n\n if (!req.developer) {\n logger.warn('HMAC verification attempted without prior authentication', {\n operation: 'hmacVerify',\n ip: req.ip ?? req.socket.remoteAddress,\n });\n throw new AuthError(\n 'Authentication required before signature verification',\n ErrorCode.INVALID_API_KEY,\n );\n }\n\n // Fetch the signing secret for this developer's key\n const { data: keyData } = await db\n .from('api_keys')\n .select('signing_secret')\n .eq('id', req.developer.keyId)\n .single();\n\n if (!keyData?.signing_secret) {\n // No signing secret configured — skip verification\n logger.debug('No signing secret configured, skipping HMAC verification', {\n operation: 'hmacVerify',\n keyId: req.developer.keyId,\n developerId: req.developer.id,\n });\n next();\n return;\n }\n\n const rawBody = typeof req.body === 'string'\n ? req.body\n : JSON.stringify(req.body ?? '');\n\n const bodyHash = createHash('sha256').update(rawBody).digest('hex');\n\n const payload = [\n req.method.toUpperCase(),\n req.originalUrl,\n timestamp,\n bodyHash,\n ].join('\\n');\n\n const expected = createHmac('sha256', keyData.signing_secret)\n .update(payload)\n .digest('hex');\n\n const sig = signature.startsWith('sha256=') ? signature.slice(7) : signature;\n\n if (sig.length !== expected.length) {\n logger.warn('HMAC verification failed: signature length mismatch', {\n operation: 'hmacVerify',\n keyId: req.developer.keyId,\n developerId: req.developer.id,\n });\n throw new AuthError(\n 'Invalid request signature',\n ErrorCode.HMAC_VERIFICATION_FAILED,\n );\n }\n\n const sigBuf = Buffer.from(sig, 'utf8');\n const expectedBuf = Buffer.from(expected, 'utf8');\n\n if (!timingSafeEqual(sigBuf, expectedBuf)) {\n logger.warn('HMAC verification failed: signature mismatch', {\n operation: 'hmacVerify',\n keyId: req.developer.keyId,\n developerId: req.developer.id,\n });\n throw new AuthError(\n 'Invalid request signature',\n ErrorCode.HMAC_VERIFICATION_FAILED,\n );\n }\n\n logger.debug('HMAC signature verified successfully', {\n operation: 'hmacVerify',\n keyId: req.developer.keyId,\n developerId: req.developer.id,\n });\n\n next();\n };\n}\n","// ---------------------------------------------------------------------------\n// Per-Key Rate Limiting Middleware (Sliding Window)\n// ---------------------------------------------------------------------------\n\nimport type { Request, Response, NextFunction } from 'express';\nimport type { ILogger } from '../lib/logger.js';\nimport { ServiceError, ErrorCode } from '../lib/errors.js';\n\ninterface WindowEntry {\n timestamps: number[];\n}\n\nconst windows = new Map<string, WindowEntry>();\n\n// Clean up stale entries every 5 minutes\nconst CLEANUP_INTERVAL_MS = 5 * 60 * 1000;\nconst WINDOW_MS = 60 * 1000; // 1-minute sliding window\n\nsetInterval(() => {\n const cutoff = Date.now() - WINDOW_MS;\n for (const [key, entry] of windows) {\n entry.timestamps = entry.timestamps.filter(t => t > cutoff);\n if (entry.timestamps.length === 0) {\n windows.delete(key);\n }\n }\n}, CLEANUP_INTERVAL_MS).unref();\n\nexport function rateLimit(logger: ILogger) {\n return (req: Request, res: Response, next: NextFunction) => {\n // rate-limit runs AFTER api-key-auth; skip if no developer context\n if (!req.developer) {\n next();\n return;\n }\n\n const keyId = req.developer.keyId;\n const limit = req.developer.rateLimitRpm;\n const now = Date.now();\n const cutoff = now - WINDOW_MS;\n\n let entry = windows.get(keyId);\n if (!entry) {\n entry = { timestamps: [] };\n windows.set(keyId, entry);\n }\n\n // Remove timestamps outside the window\n entry.timestamps = entry.timestamps.filter(t => t > cutoff);\n\n if (entry.timestamps.length >= limit) {\n const oldestInWindow = entry.timestamps[0]!;\n const retryAfterSeconds = Math.ceil((oldestInWindow + WINDOW_MS - now) / 1000);\n\n logger.warn('Rate limit exceeded', {\n operation: 'rateLimit',\n developerId: req.developer.id,\n keyId,\n limit,\n retryAfterSeconds,\n });\n\n res.setHeader('Retry-After', String(retryAfterSeconds));\n res.setHeader('X-RateLimit-Limit', String(limit));\n res.setHeader('X-RateLimit-Remaining', '0');\n\n throw new ServiceError(\n 'Rate limit exceeded',\n ErrorCode.RATE_LIMIT_EXCEEDED,\n 429,\n true,\n { retryAfter: retryAfterSeconds, limit },\n );\n }\n\n entry.timestamps.push(now);\n\n res.setHeader('X-RateLimit-Limit', String(limit));\n res.setHeader('X-RateLimit-Remaining', String(limit - entry.timestamps.length));\n\n next();\n };\n}\n","// ---------------------------------------------------------------------------\n// Audit Logging Middleware (Fire-and-Forget)\n// ---------------------------------------------------------------------------\n\nimport { randomUUID } from 'node:crypto';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from '../lib/logger.js';\n\nconst MUTATION_METHODS = new Set(['POST', 'PUT', 'DELETE', 'PATCH']);\n\nfunction deriveAction(method: string, path: string): string {\n const segments = path.replace(/^\\/(api\\/sdk|agent)\\//, '').split('/').filter(Boolean);\n const resource = segments[0] ?? 'unknown';\n const verb =\n method === 'POST' ? 'create' :\n method === 'PUT' || method === 'PATCH' ? 'update' :\n method === 'DELETE' ? 'delete' : method.toLowerCase();\n return `${resource}.${verb}`;\n}\n\nexport function audit(db: SupabaseClient, logger: ILogger) {\n return (req: Request, res: Response, next: NextFunction) => {\n // Only log mutations\n if (!MUTATION_METHODS.has(req.method)) {\n next();\n return;\n }\n\n // Assign a request ID if not already set\n if (!req.requestId) {\n req.requestId = randomUUID();\n }\n\n // Log after response is sent (fire-and-forget, but log errors)\n res.on('finish', () => {\n if (!req.developer) return;\n\n const action = deriveAction(req.method, req.originalUrl);\n const ip = req.ip ?? req.socket.remoteAddress ?? 'unknown';\n const resourceId = typeof req.params.id === 'string' ? req.params.id : null;\n\n Promise.resolve(\n db.from('audit_log')\n .insert({\n developer_id: req.developer.id,\n actor_type: 'developer',\n actor_id: req.developer.id,\n action,\n resource_type: action.split('.')[0],\n resource_id: resourceId,\n details: {\n method: req.method,\n path: req.originalUrl,\n statusCode: res.statusCode,\n },\n ip_address: ip,\n request_id: req.requestId,\n })\n ).then(({ error }) => {\n if (error) {\n logger.error('Failed to write audit log entry', error, {\n operation: 'audit',\n action,\n developerId: req.developer?.id,\n requestId: req.requestId,\n });\n }\n }).catch((err: unknown) => {\n logger.error('Unexpected error writing audit log entry', err, {\n operation: 'audit',\n action,\n developerId: req.developer?.id,\n requestId: req.requestId,\n });\n });\n });\n\n next();\n };\n}\n","// ---------------------------------------------------------------------------\n// Deprecation Middleware — Marks /api/sdk responses as deprecated\n// ---------------------------------------------------------------------------\n\nimport type { Request, Response, NextFunction } from 'express';\nimport type { ILogger } from '../lib/logger.js';\n\n/**\n * Adds RFC 8594 Deprecation and Sunset headers to responses.\n * Applied to legacy /api/sdk/* routes to signal clients to migrate to /agent/*.\n */\nexport function deprecation(logger: ILogger) {\n const SUNSET_DATE = new Date('2025-12-31T23:59:59Z').toUTCString();\n\n return (_req: Request, res: Response, next: NextFunction) => {\n res.setHeader('Deprecation', 'true');\n res.setHeader('Sunset', SUNSET_DATE);\n res.setHeader('Link', '</agent>; rel=\"successor-version\"');\n\n logger.debug('Deprecated /api/sdk route accessed', {\n path: _req.originalUrl,\n method: _req.method,\n });\n\n next();\n };\n}\n","// ---------------------------------------------------------------------------\n// Auth Routes — /api/sdk/auth\n// ---------------------------------------------------------------------------\n\nimport { createHash, randomBytes } from 'node:crypto';\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport { AuthError, NotFoundError, ValidationError } from '../lib/errors.js';\n\nexport function authRoutes({ db }: { db: SupabaseClient }): Router {\n const router = Router();\n\n // POST /login — sign in with email + password\n router.post('/login', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const { email, password } = req.body as { email?: string; password?: string };\n if (!email || !password) {\n throw new ValidationError('email and password are required');\n }\n\n const { data, error } = await db.auth.signInWithPassword({ email, password });\n if (error || !data.session) {\n throw new AuthError(error?.message ?? 'Invalid credentials');\n }\n\n res.json({\n data: {\n accessToken: data.session.access_token,\n refreshToken: data.session.refresh_token,\n expiresAt: new Date(data.session.expires_at! * 1000).toISOString(),\n },\n });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /whoami — return developer profile\n router.get('/whoami', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const developerId = req.developer!.id;\n\n const { data, error } = await db\n .from('developers')\n .select('id, email, plan, created_at')\n .eq('id', developerId)\n .single();\n\n if (error || !data) {\n throw new NotFoundError('Developer', developerId);\n }\n\n res.json({\n data: {\n id: data.id,\n email: data.email,\n plan: data.plan,\n memberSince: data.created_at,\n },\n });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /rotate-key — rotate API key with 15-min grace period\n router.post('/rotate-key', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const developer = req.developer!;\n\n // Generate new key\n const newKey = `lane_sk_${randomBytes(24).toString('hex')}`;\n const newHash = createHash('sha256').update(newKey).digest('hex');\n const graceExpiry = new Date(Date.now() + 15 * 60 * 1000).toISOString();\n\n // Mark old key as expiring after grace period\n await db\n .from('api_keys')\n .update({ revoked_at: graceExpiry })\n .eq('id', developer.keyId);\n\n // Insert new key\n const { error } = await db.from('api_keys').insert({\n developer_id: developer.id,\n key_hash: newHash,\n scopes: developer.scopes,\n rate_limit_rpm: developer.rateLimitRpm,\n test_mode: developer.testMode,\n });\n\n if (error) throw error;\n\n res.json({\n data: {\n apiKey: newKey,\n expiresOldKeyAt: graceExpiry,\n },\n });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Wallets Routes — /api/sdk/wallets\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type {\n IWalletService,\n ICardService,\n IProfileService,\n IMerchantAccountService,\n} from '../lib/interfaces.js';\n\ninterface WalletRouteDeps {\n wallets: IWalletService;\n cards: ICardService;\n profiles: IProfileService;\n merchantAccounts: IMerchantAccountService;\n}\n\nexport function walletRoutes({ wallets, cards, profiles, merchantAccounts }: WalletRouteDeps): Router {\n const router = Router();\n\n // POST / — create wallet\n router.post('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await wallets.create(req.developer!.id, req.body);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET / — list wallets (paginated)\n router.get('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const limit = Math.min(parseInt(req.query.limit as string) || 20, 100);\n const offset = parseInt(req.query.offset as string) || 0;\n\n const result = await wallets.list(req.developer!.id, { limit, offset });\n res.json({ data: result.data, total: result.total, limit, offset });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id — get wallet\n router.get('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await wallets.get(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id/cards — list cards\n router.get('/:id/cards', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await cards.listCards(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id/add-card-link — get VGS Collect URL\n router.get('/:id/add-card-link', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await cards.getAddCardLink(req.developer!.id, req.params.id as string);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // DELETE /:id/cards/:cardId — remove card\n router.delete('/:id/cards/:cardId', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await cards.removeCard(req.params.cardId as string, req.developer!.id);\n res.status(204).send();\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/profile — set checkout profile\n router.post('/:id/profile', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await profiles.setProfile(req.params.id as string, req.developer!.id, req.body);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id/profile — get checkout profile\n router.get('/:id/profile', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await profiles.getProfile(req.params.id as string);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // PUT /:id/profile — update checkout profile\n router.put('/:id/profile', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await profiles.updateProfile(req.params.id as string, req.developer!.id, req.body);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/merchant-accounts — save merchant account\n router.post('/:id/merchant-accounts', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await merchantAccounts.saveMerchantAccount(req.params.id as string, req.developer!.id, req.body);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id/merchant-accounts — list merchant accounts\n router.get('/:id/merchant-accounts', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await merchantAccounts.listMerchantAccounts(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // DELETE /:id/merchant-accounts/:accountId — remove merchant account\n router.delete('/:id/merchant-accounts/:accountId', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await merchantAccounts.removeMerchantAccount(req.params.accountId as string, req.developer!.id);\n res.status(204).send();\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Pay Routes — /api/sdk/pay\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ITokenService, IPaymentService, IBudgetService } from '../lib/interfaces.js';\nimport type { ILogger } from '../lib/logger.js';\nimport { velocityLimit } from '../middleware/velocity-limit.js';\n\ninterface PayRouteDeps {\n tokens: ITokenService;\n payments: IPaymentService;\n budgets: IBudgetService;\n db: SupabaseClient;\n logger: ILogger;\n}\n\nexport function payRoutes({ tokens, payments, budgets, db, logger }: PayRouteDeps): Router {\n const router = Router();\n\n const velocityMiddleware = velocityLimit(db, budgets, logger);\n\n // POST /tokens — create agentic token\n router.post('/tokens', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await tokens.createToken(req.developer!.id, req.body);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /execute — execute payment (routes through VGS proxy)\n // Velocity limit applied to prevent transaction flooding\n router.post('/execute', velocityMiddleware, async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await payments.execute(req.developer!.id, req.body);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /transactions — list transactions (paginated)\n router.get('/transactions', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const limit = Math.min(parseInt(req.query.limit as string) || 20, 100);\n const offset = parseInt(req.query.offset as string) || 0;\n\n const result = await payments.listTransactions(req.developer!.id, { limit, offset });\n res.json({ data: result.data, total: result.total, limit, offset });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /transactions/:id — get transaction\n router.get('/transactions/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await payments.getTransaction(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /refunds — initiate refund\n // Velocity limit applied to prevent refund loop attacks\n router.post('/refunds', velocityMiddleware, async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await payments.refund(req.developer!.id, req.body);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Velocity Limit Middleware — DB-backed Transaction Rate Limiting\n// ---------------------------------------------------------------------------\n// Enforces per-developer transaction velocity limits (per-minute, per-hour).\n// Queries the transactions table for accurate cross-instance enforcement.\n// Triggers automatic payment pause after repeated breaches.\n// ---------------------------------------------------------------------------\n\nimport type { Request, Response, NextFunction } from 'express';\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport type { IBudgetService } from '../lib/interfaces.js';\nimport type { ILogger } from '../lib/logger.js';\nimport { ServiceError, ErrorCode } from '../lib/errors.js';\n\nexport function velocityLimit(\n db: SupabaseClient,\n budgetService: IBudgetService,\n logger: ILogger,\n) {\n return async (req: Request, _res: Response, next: NextFunction) => {\n if (!req.developer) {\n next();\n return;\n }\n\n const developerId = req.developer.id;\n\n try {\n // Fetch developer's velocity config from budget row\n const { data: budget } = await db\n .from('budgets')\n .select(\n 'max_transactions_per_minute, max_transactions_per_hour, velocity_breach_count',\n )\n .eq('developer_id', developerId)\n .limit(1)\n .single();\n\n const maxPerMinute = budget?.max_transactions_per_minute ?? 5;\n const maxPerHour = budget?.max_transactions_per_hour ?? 30;\n\n const now = new Date();\n const oneMinuteAgo = new Date(now.getTime() - 60 * 1000).toISOString();\n const oneHourAgo = new Date(now.getTime() - 60 * 60 * 1000).toISOString();\n\n // Count transactions in the last minute\n const { count: minuteCount } = await db\n .from('transactions')\n .select('id', { count: 'exact', head: true })\n .eq('developer_id', developerId)\n .gte('created_at', oneMinuteAgo);\n\n // Count transactions in the last hour\n const { count: hourCount } = await db\n .from('transactions')\n .select('id', { count: 'exact', head: true })\n .eq('developer_id', developerId)\n .gte('created_at', oneHourAgo);\n\n const txPerMinute = minuteCount ?? 0;\n const txPerHour = hourCount ?? 0;\n\n if (txPerMinute >= maxPerMinute || txPerHour >= maxPerHour) {\n const exceeded = txPerMinute >= maxPerMinute ? 'per_minute' : 'per_hour';\n const retryAfter = exceeded === 'per_minute' ? 60 : 3600;\n\n logger.warn('Velocity limit exceeded', {\n operation: 'velocityLimit',\n developerId,\n exceeded,\n txPerMinute,\n txPerHour,\n maxPerMinute,\n maxPerHour,\n });\n\n // Increment breach count\n const currentBreaches = budget?.velocity_breach_count ?? 0;\n const newBreachCount = currentBreaches + 1;\n\n await db\n .from('budgets')\n .update({\n velocity_breach_count: newBreachCount,\n updated_at: now.toISOString(),\n })\n .eq('developer_id', developerId);\n\n // Auto-freeze after 3 breaches\n if (newBreachCount >= 3) {\n await budgetService.pausePayments(\n developerId,\n `Automatic freeze: ${newBreachCount} velocity breaches detected`,\n );\n\n logger.warn('Payments auto-frozen due to repeated velocity breaches', {\n operation: 'velocityLimit',\n developerId,\n breachCount: newBreachCount,\n });\n }\n\n throw new ServiceError(\n `Transaction velocity limit exceeded (${exceeded})`,\n ErrorCode.RATE_LIMIT_EXCEEDED,\n 429,\n true,\n { retryAfter, exceeded, txPerMinute, txPerHour },\n );\n }\n\n next();\n } catch (err) {\n if (err instanceof ServiceError) {\n next(err);\n } else {\n // Don't block payments if velocity check itself fails\n logger.warn('Velocity check failed, allowing request', {\n operation: 'velocityLimit',\n developerId,\n error: err instanceof Error ? err.message : String(err),\n });\n next();\n }\n }\n };\n}\n","// ---------------------------------------------------------------------------\n// Admin Routes — /api/sdk/admin\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { IBudgetService } from '../lib/interfaces.js';\n\ninterface AdminRouteDeps {\n budgets: IBudgetService;\n}\n\nexport function adminRoutes({ budgets }: AdminRouteDeps): Router {\n const router = Router();\n\n // GET /spending — spending summary\n router.get('/spending', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const budget = await budgets.getBudget(req.developer!.id);\n\n res.json({\n data: {\n daily: { spent: budget.spent_today, limit: budget.daily_limit },\n weekly: { spent: budget.spent_this_week, limit: budget.weekly_limit },\n monthly: { spent: budget.spent_this_month, limit: budget.monthly_limit },\n currency: 'USD',\n },\n });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /budgets — get budget\n router.get('/budgets', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await budgets.getBudget(req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // PUT /budgets — set budget limits\n router.put('/budgets', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await budgets.setBudget(req.developer!.id, req.body);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /payments/pause — pause all payments\n router.post('/payments/pause', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const reason = (req.body as { reason?: string }).reason ?? 'Paused via admin API';\n await budgets.pausePayments(req.developer!.id, reason);\n res.json({ data: { paused: true, reason } });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /payments/resume — resume payments\n router.post('/payments/resume', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await budgets.resumePayments(req.developer!.id);\n res.json({ data: { paused: false } });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Merchant Directory Routes\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { IMerchantDirectoryService, MerchantDirectorySearchParams } from '../lib/interfaces.js';\n\ninterface MerchantRouteDeps {\n merchantDirectory: IMerchantDirectoryService;\n}\n\nexport function merchantRoutes(deps: MerchantRouteDeps): Router {\n const router = Router();\n\n // GET /verticals — list all verticals with subcategories (must be before /:idOrSlug)\n router.get('/verticals', async (_req: Request, res: Response, next: NextFunction) => {\n try {\n const verticals = await deps.merchantDirectory.getVerticals();\n res.json({ data: verticals });\n } catch (err) {\n next(err);\n }\n });\n\n // GET / — list/search merchants\n router.get('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const params: import('../lib/interfaces.js').MerchantDirectorySearchParams = {\n query: req.query.query as string | undefined,\n tier: req.query.tier as 'lane_onboarded' | 'protocol' | undefined,\n merchantType: req.query.merchantType as MerchantDirectorySearchParams['merchantType'],\n vertical: req.query.vertical as string | undefined,\n subcategory: req.query.subcategory as string | undefined,\n protocol: req.query.protocol as string | undefined,\n limit: req.query.limit ? parseInt(req.query.limit as string, 10) : undefined,\n offset: req.query.offset ? parseInt(req.query.offset as string, 10) : undefined,\n };\n const result = await deps.merchantDirectory.listMerchants(params);\n res.json({\n data: result.data,\n total: result.total,\n limit: params.limit ?? 20,\n offset: params.offset ?? 0,\n });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:idOrSlug — get by ID, slug, or domain\n router.get('/:idOrSlug', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const merchant = await deps.merchantDirectory.getMerchant(req.params['idOrSlug'] as string);\n if (!merchant) {\n res.status(404).json({ error: { code: 'not_found', message: 'Merchant not found' } });\n return;\n }\n res.json({ data: merchant });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id/capabilities — routing capabilities\n router.get('/:id/capabilities', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const capabilities = await deps.merchantDirectory.getMerchantCapabilities(req.params['id'] as string);\n if (!capabilities) {\n res.status(404).json({ error: { code: 'not_found', message: 'Merchant not found' } });\n return;\n }\n res.json({ data: capabilities });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /sync — trigger backend sync (admin)\n router.post('/sync', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const url = (req.body.url as string) || process.env['LANE_BACKEND_URL'];\n const token = (req.body.token as string) || process.env['LANE_BACKEND_TOKEN'];\n\n if (!url || !token) {\n res.status(400).json({\n error: { code: 'missing_config', message: 'Backend URL and token are required' },\n });\n return;\n }\n\n const result = await deps.merchantDirectory.syncFromLaneBackend(url, token);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /discover — discover protocol merchant by domain\n router.post('/discover', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const domain = req.body.domain as string;\n if (!domain) {\n res.status(400).json({\n error: { code: 'missing_domain', message: 'Domain is required' },\n });\n return;\n }\n\n const merchant = await deps.merchantDirectory.discoverProtocolMerchant(domain);\n if (!merchant) {\n res.status(404).json({\n error: { code: 'no_protocol', message: 'No ACP or UCP protocol found at this domain' },\n });\n return;\n }\n\n res.json({ data: merchant });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Onboarding Routes — Session management + protected onboarding endpoints\n// ---------------------------------------------------------------------------\n\nimport { randomBytes, randomUUID, createHash } from 'node:crypto';\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from '../lib/logger.js';\nimport { NotFoundError, ValidationError } from '../lib/errors.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype SessionStatus = 'awaiting_signup' | 'signup_complete' | 'card_added' | 'ready';\n\nconst VALID_STATUSES: SessionStatus[] = ['awaiting_signup', 'signup_complete', 'card_added', 'ready'];\n\ninterface OnboardingSession {\n id: string;\n status: SessionStatus;\n api_key: string | null;\n has_card: boolean;\n has_budget: boolean;\n api_key_revealed: boolean;\n session_secret: string;\n metadata: Record<string, unknown> | null;\n expires_at: string;\n created_at: string;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst WALLET_APP_URL = process.env.LANE_WALLET_APP_URL ?? 'https://developer.getonlane.com';\n\nfunction generateApiKey(): string {\n return `lane_sk_${randomBytes(32).toString('hex')}`;\n}\n\n// ---------------------------------------------------------------------------\n// Simple in-memory rate limiter\n// ---------------------------------------------------------------------------\n\ninterface RateBucket {\n timestamps: number[];\n}\n\nconst rateBuckets = new Map<string, RateBucket>();\n\n// Cleanup stale entries every 5 minutes\nsetInterval(() => {\n const cutoff = Date.now() - 60_000;\n for (const [key, bucket] of rateBuckets) {\n bucket.timestamps = bucket.timestamps.filter(t => t > cutoff);\n if (bucket.timestamps.length === 0) {\n rateBuckets.delete(key);\n }\n }\n}, 5 * 60 * 1000).unref();\n\nfunction checkRateLimit(key: string, limit: number): boolean {\n const now = Date.now();\n const cutoff = now - 60_000;\n\n let bucket = rateBuckets.get(key);\n if (!bucket) {\n bucket = { timestamps: [] };\n rateBuckets.set(key, bucket);\n }\n\n bucket.timestamps = bucket.timestamps.filter(t => t > cutoff);\n\n if (bucket.timestamps.length >= limit) {\n return false;\n }\n\n bucket.timestamps.push(now);\n return true;\n}\n\n// ---------------------------------------------------------------------------\n// A) sessionRoutes — Public (no auth required)\n// ---------------------------------------------------------------------------\n\nexport function sessionRoutes(db: SupabaseClient, logger: ILogger): Router {\n const router = Router();\n\n // POST / — Create onboarding session\n router.post('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const ip = req.ip ?? req.socket.remoteAddress ?? 'unknown';\n if (!checkRateLimit(`session_create:${ip}`, 10)) {\n res.status(429).json({\n error: { code: 'rate_limit_exceeded', message: 'Too many session creates. Try again later.' },\n });\n return;\n }\n\n const { metadata } = req.body as { metadata?: Record<string, unknown> };\n\n const sessionId = `sess_${randomUUID().replace(/-/g, '')}`;\n const sessionSecret = randomBytes(32).toString('hex');\n const now = new Date();\n const expiresAt = new Date(now.getTime() + 30 * 60 * 1000);\n\n const row = {\n id: sessionId,\n status: 'awaiting_signup' as SessionStatus,\n api_key: null,\n has_card: false,\n has_budget: false,\n api_key_revealed: false,\n session_secret: sessionSecret,\n metadata: metadata ?? null,\n expires_at: expiresAt.toISOString(),\n created_at: now.toISOString(),\n };\n\n const { error } = await db.from('onboarding_sessions').insert(row);\n if (error) {\n logger.error('Failed to create onboarding session', error);\n throw error;\n }\n\n const signupUrl = `${WALLET_APP_URL}/onboarding?session=${sessionId}`;\n const embedUrl = `${signupUrl}&embed=true`;\n\n res.status(201).json({\n sessionId,\n sessionSecret,\n signupUrl,\n embedUrl,\n expiresAt: expiresAt.toISOString(),\n });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id — Poll session status\n router.get('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const sessionId = req.params.id as string;\n\n if (!checkRateLimit(`session_poll:${sessionId}`, 20)) {\n res.status(429).json({\n error: { code: 'rate_limit_exceeded', message: 'Too many polls. Try again later.' },\n });\n return;\n }\n\n const { data, error } = await db\n .from('onboarding_sessions')\n .select('*')\n .eq('id', sessionId)\n .single();\n\n if (error || !data) {\n throw new NotFoundError('Onboarding session', sessionId);\n }\n\n const session = data as OnboardingSession;\n\n // Check if expired\n if (new Date(session.expires_at).getTime() <= Date.now()) {\n throw new NotFoundError('Onboarding session', sessionId);\n }\n\n // Determine apiKey value: full on first reveal, redacted after\n let apiKeyValue: string | null = null;\n if (session.api_key) {\n if (!session.api_key_revealed) {\n const { data: revealData, error: revealErr } = await db\n .from('onboarding_sessions')\n .update({ api_key_revealed: true })\n .eq('id', sessionId)\n .eq('api_key_revealed', false)\n .select('api_key')\n .maybeSingle();\n\n if (revealErr) {\n logger.error('Failed to atomically reveal api_key', revealErr, { sessionId });\n }\n\n if (revealData?.api_key) {\n apiKeyValue = revealData.api_key;\n } else {\n apiKeyValue = 'redacted';\n }\n } else {\n apiKeyValue = 'redacted';\n }\n }\n\n res.json({\n sessionId: session.id,\n status: session.status,\n apiKey: apiKeyValue,\n hasCard: session.has_card,\n hasBudget: session.has_budget,\n expiresAt: session.expires_at,\n });\n } catch (err) {\n next(err);\n }\n });\n\n // PATCH /:id — Update session status\n router.patch('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const sessionId = req.params.id as string;\n\n if (!checkRateLimit(`session_patch:${sessionId}`, 20)) {\n res.status(429).json({\n error: { code: 'rate_limit_exceeded', message: 'Too many updates. Try again later.' },\n });\n return;\n }\n\n const { sessionSecret, status, apiKey, hasCard, hasBudget } = req.body as {\n sessionSecret?: string;\n status?: string;\n apiKey?: string;\n hasCard?: boolean;\n hasBudget?: boolean;\n };\n\n if (!sessionSecret) {\n throw new ValidationError('sessionSecret is required');\n }\n\n // Fetch session and verify secret\n const { data: existing, error: fetchErr } = await db\n .from('onboarding_sessions')\n .select('*')\n .eq('id', sessionId)\n .single();\n\n if (fetchErr || !existing) {\n throw new NotFoundError('Onboarding session', sessionId);\n }\n\n const existingSession = existing as OnboardingSession;\n\n if (existingSession.session_secret !== sessionSecret) {\n res.status(403).json({\n error: { code: 'forbidden', message: 'Invalid session secret.' },\n });\n return;\n }\n\n if (new Date(existingSession.expires_at).getTime() <= Date.now()) {\n throw new NotFoundError('Onboarding session', sessionId);\n }\n\n if (status && !VALID_STATUSES.includes(status as SessionStatus)) {\n throw new ValidationError(`Invalid status. Must be one of: ${VALID_STATUSES.join(', ')}`);\n }\n\n if (apiKey !== undefined && !/^lane_sk_[a-f0-9]{64}$/.test(apiKey)) {\n throw new ValidationError('Invalid apiKey format');\n }\n\n // Build update object\n const updates: Record<string, unknown> = {};\n if (status !== undefined) updates.status = status;\n if (apiKey !== undefined) updates.api_key = apiKey;\n if (hasCard !== undefined) updates.has_card = hasCard;\n if (hasBudget !== undefined) updates.has_budget = hasBudget;\n\n const { data, error } = await db\n .from('onboarding_sessions')\n .update(updates)\n .eq('id', sessionId)\n .select('*')\n .single();\n\n if (error || !data) {\n throw new NotFoundError('Onboarding session', sessionId);\n }\n\n const session = data as OnboardingSession;\n\n res.json({\n sessionId: session.id,\n status: session.status,\n hasCard: session.has_card,\n hasBudget: session.has_budget,\n expiresAt: session.expires_at,\n });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n\n// ---------------------------------------------------------------------------\n// B) onboardingRoutes — Protected (auth required)\n// ---------------------------------------------------------------------------\n\nexport function onboardingRoutes({ db }: { db: SupabaseClient }): Router {\n const router = Router();\n\n // POST /generate-key — Generate first API key for new user\n router.post('/generate-key', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const developerId = req.developer!.id;\n\n const apiKey = generateApiKey();\n const keyHash = createHash('sha256').update(apiKey).digest('hex');\n const now = new Date().toISOString();\n\n const { error } = await db.from('api_keys').insert({\n developer_id: developerId,\n key_hash: keyHash,\n scopes: ['*'],\n rate_limit_rpm: 60,\n test_mode: false,\n });\n\n if (error) throw error;\n\n res.status(201).json({\n apiKey,\n createdAt: now,\n });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /status — Get onboarding completion status\n router.get('/status', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const developerId = req.developer!.id;\n\n // Check has API key\n const { data: keys } = await db\n .from('api_keys')\n .select('id')\n .eq('developer_id', developerId)\n .is('revoked_at', null)\n .limit(1);\n const hasApiKey = (keys?.length ?? 0) > 0;\n\n // Check has wallet with card\n const { data: wallets } = await db\n .from('wallets')\n .select('id, cards(id)')\n .eq('developer_id', developerId)\n .limit(1);\n const hasCard = wallets?.some((w: { cards?: { id: string }[] }) => (w.cards?.length ?? 0) > 0) ?? false;\n\n // Check has budget configured\n const { data: budgets } = await db\n .from('budgets')\n .select('id')\n .eq('developer_id', developerId)\n .limit(1);\n const hasBudget = (budgets?.length ?? 0) > 0;\n\n // Compute completed steps and next step\n const completedSteps: string[] = [];\n let nextStep: string | null = null;\n\n if (hasApiKey) completedSteps.push('api_key');\n if (hasCard) completedSteps.push('card');\n if (hasBudget) completedSteps.push('budget');\n\n if (!hasApiKey) {\n nextStep = 'generate_api_key';\n } else if (!hasCard) {\n nextStep = 'add_card';\n } else if (!hasBudget) {\n nextStep = 'configure_budget';\n }\n\n res.json({\n hasApiKey,\n hasCard,\n hasBudget,\n completedSteps,\n nextStep,\n });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Routes Index — /agent/*\n// ---------------------------------------------------------------------------\n// Aggregates all agent sub-routers into a single router factory.\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport type { ILogger } from '../../lib/logger.js';\nimport type { ServiceContainer } from '../../lib/service-container.js';\n\nimport { agentWalletRoutes } from './wallet.js';\nimport { agentCardRoutes } from './card.js';\nimport { agentInstructionRoutes } from './instruction.js';\nimport { agentTokenRoutes } from './token.js';\nimport { agentTransactionRoutes } from './transaction.js';\nimport { agentBudgetRoutes } from './budget.js';\nimport { agentPayRoutes } from './pay.js';\nimport { agentUserRoutes } from './user.js';\nimport { agentMerchantRoutes } from './merchant.js';\nimport { agentCheckoutRoutes } from './checkout.js';\nimport { agentProductRoutes } from './product.js';\nimport { agentSubscriptionRoutes } from './subscription.js';\nimport { agentFleetRoutes } from './fleet.js';\nimport { agentTeamRoutes } from './team.js';\nimport { agentWebhookRoutes } from './webhook.js';\nimport { agentAuditRoutes } from './audit.js';\nimport { agentAdminRoutes } from './admin.js';\nimport { agentOnboardingRoutes } from './onboarding.js';\n\n// Additional route modules (previously unattached)\nimport { delegationRoutes } from '../delegations.js';\nimport { protocolRoutes } from '../protocol.js';\nimport { mastercardAPRoutes } from '../mastercard-ap.js';\nimport { identityRoutes } from '../identity.js';\n\nexport function createAgentRoutes(container: ServiceContainer, db: SupabaseClient, logger: ILogger): Router {\n const router = Router();\n\n // Core agent resources\n router.use('/wallet', agentWalletRoutes({ wallets: container.wallets }));\n router.use('/card', agentCardRoutes({ cards: container.cards }));\n router.use('/instruction', agentInstructionRoutes({ instructions: container.instructions }));\n router.use('/token', agentTokenRoutes({ tokens: container.tokens }));\n router.use('/transaction', agentTransactionRoutes({ payments: container.payments }));\n router.use('/budget', agentBudgetRoutes({ budgets: container.budgets }));\n router.use('/pay', agentPayRoutes({ payments: container.payments }));\n router.use('/user', agentUserRoutes({ users: container.users }));\n router.use('/merchant', agentMerchantRoutes({ merchantDirectory: container.merchantDirectory }));\n router.use('/checkout', agentCheckoutRoutes({ checkout: container.checkout }));\n router.use('/product', agentProductRoutes({ db }));\n router.use('/subscription', agentSubscriptionRoutes({ subscriptions: container.subscriptions }));\n router.use('/fleet', agentFleetRoutes({ fleet: container.fleet }));\n router.use('/team', agentTeamRoutes({ teams: container.teams }));\n router.use('/webhook', agentWebhookRoutes({ webhooks: container.webhooks }));\n router.use('/audit', agentAuditRoutes({ db }));\n router.use('/admin', agentAdminRoutes({ db }));\n router.use('/onboarding', agentOnboardingRoutes({ db }));\n\n // Delegation, protocol, identity, mastercard-ap\n // Note: mandates are sub-resources of instructions at /agent/instruction/:id/mandate\n router.use('/delegation', delegationRoutes({ delegations: container.delegations }));\n router.use('/protocol', protocolRoutes({ protocolClient: container.protocolClient }));\n router.use('/mastercard-ap', mastercardAPRoutes({ mastercardAP: container.mastercardAP }));\n router.use('/identity', identityRoutes({ identity: container.identity }));\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Wallet Routes — /agent/wallet\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { IWalletService } from '../../lib/interfaces.js';\n\ninterface WalletRouteDeps {\n wallets: IWalletService;\n}\n\nexport function agentWalletRoutes({ wallets }: WalletRouteDeps): Router {\n const router = Router();\n\n // POST / — create wallet\n router.post('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await wallets.create(req.developer!.id, req.body);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET / — list wallets\n router.get('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const limit = Math.min(parseInt(req.query.limit as string) || 20, 100);\n const offset = parseInt(req.query.offset as string) || 0;\n const result = await wallets.list(req.developer!.id, { limit, offset });\n res.json({ data: result.data, total: result.total, limit, offset });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id — get wallet\n router.get('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await wallets.get(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // PUT /:id — update wallet\n router.put('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await wallets.update(req.params.id as string, req.developer!.id, req.body);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id/balance — get wallet balance\n router.get('/:id/balance', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await wallets.getBalance(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/deposit — deposit funds\n router.post('/:id/deposit', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const { amount } = req.body;\n if (typeof amount !== 'number' || amount <= 0) {\n res.status(400).json({ error: { code: 'invalid_amount', message: 'amount must be a positive number' } });\n return;\n }\n const result = await wallets.deposit(req.params.id as string, req.developer!.id, amount);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/default — set as default wallet\n router.post('/:id/default', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await wallets.setDefault(req.params.id as string, req.developer!.id);\n res.json({ data: { success: true } });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Card Routes — /agent/card\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { ICardService } from '../../lib/interfaces.js';\n\ninterface CardRouteDeps {\n cards: ICardService;\n}\n\nexport function agentCardRoutes({ cards }: CardRouteDeps): Router {\n const router = Router();\n\n // GET / — list cards\n router.get('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const walletId = req.query.walletId as string;\n if (!walletId) {\n res.status(400).json({ error: { code: 'missing_wallet_id', message: 'walletId query parameter is required' } });\n return;\n }\n const result = await cards.listCards(walletId, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /add-link — get add card link\n router.get('/add-link', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const walletId = req.query.walletId as string;\n if (!walletId) {\n res.status(400).json({ error: { code: 'missing_wallet_id', message: 'walletId query parameter is required' } });\n return;\n }\n const result = await cards.getAddCardLink(req.developer!.id, walletId);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id — get card\n router.get('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await cards.getDefaultCard(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // DELETE /:id — remove card\n router.delete('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await cards.removeCard(req.params.id as string, req.developer!.id);\n res.status(204).send();\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Instruction Routes — /agent/instruction\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { IInstructionService } from '../../lib/interfaces.js';\n\ninterface InstructionRouteDeps {\n instructions: IInstructionService;\n}\n\nexport function agentInstructionRoutes({ instructions }: InstructionRouteDeps): Router {\n const router = Router();\n\n // POST / — create instruction\n router.post('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await instructions.create(req.developer!.id, req.body);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET / — list instructions\n router.get('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const limit = Math.min(parseInt(req.query.limit as string) || 20, 100);\n const offset = parseInt(req.query.offset as string) || 0;\n const result = await instructions.list(req.developer!.id, { limit, offset });\n res.json({ data: result.data, total: result.total, limit, offset });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id — get instruction (includes budget info)\n router.get('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await instructions.get(req.params.id as string, req.developer!.id);\n const remainingCents = result.amount !== null\n ? Math.max(0, result.amount - result.spent_cents)\n : null;\n res.json({\n data: {\n ...result,\n spentCents: result.spent_cents,\n remainingCents,\n },\n });\n } catch (err) {\n next(err);\n }\n });\n\n // PUT /:id — update instruction\n router.put('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await instructions.update(req.params.id as string, req.developer!.id, req.body);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/cancel — cancel instruction\n router.post('/:id/cancel', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await instructions.cancel(req.params.id as string, req.developer!.id);\n res.json({ data: { success: true } });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/mandate — add mandate\n router.post('/:id/mandate', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await instructions.addMandate(req.params.id as string, req.developer!.id, req.body);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id/mandate — list mandates\n router.get('/:id/mandate', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await instructions.listMandates(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id/mandate/:mid — get mandate\n router.get('/:id/mandate/:mid', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await instructions.getMandate(req.params.id as string, req.params.mid as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // PUT /:id/mandate/:mid — update mandate\n router.put('/:id/mandate/:mid', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await instructions.updateMandate(req.params.id as string, req.params.mid as string, req.developer!.id, req.body);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // DELETE /:id/mandate/:mid — remove mandate\n router.delete('/:id/mandate/:mid', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await instructions.removeMandate(req.params.id as string, req.params.mid as string, req.developer!.id);\n res.status(204).send();\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id/budget — get instruction budget status\n router.get('/:id/budget', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await instructions.getInstructionBudget(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/credential — get credential (requires biometric confirmation)\n router.post('/:id/credential', async (req: Request, res: Response, next: NextFunction) => {\n try {\n // Require biometric confirmation before releasing credentials\n await instructions.requireConfirmation(req.params.id as string, req.developer!.id, {\n requiredType: 'biometric',\n maxAgeSeconds: 60,\n });\n const result = await instructions.getCredential(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/confirmation — create confirmation\n router.post('/:id/confirmation', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await instructions.createConfirmation(req.params.id as string, req.developer!.id, req.body);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id/confirmation — list confirmations\n router.get('/:id/confirmation', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await instructions.listConfirmations(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Token Routes — /agent/token\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { ITokenService } from '../../lib/interfaces.js';\n\ninterface TokenRouteDeps {\n tokens: ITokenService;\n}\n\nexport function agentTokenRoutes({ tokens }: TokenRouteDeps): Router {\n const router = Router();\n\n // POST / — create/provision token\n router.post('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await tokens.createToken(req.developer!.id, req.body);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET / — list tokens\n router.get('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const limit = Math.min(parseInt(req.query.limit as string) || 20, 100);\n const offset = parseInt(req.query.offset as string) || 0;\n const result = await tokens.listTokens(req.developer!.id, { limit, offset });\n res.json({ data: result.data, total: result.total, limit, offset });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id — get token\n router.get('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await tokens.getToken(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/suspend — suspend token\n router.post('/:id/suspend', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await tokens.suspendToken(req.params.id as string, req.developer!.id);\n res.json({ data: { success: true } });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/reactivate — reactivate suspended token\n router.post('/:id/reactivate', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await tokens.reactivateToken(req.params.id as string, req.developer!.id);\n res.json({ data: { success: true } });\n } catch (err) {\n next(err);\n }\n });\n\n // DELETE /:id — delete token\n router.delete('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await tokens.deleteToken(req.params.id as string, req.developer!.id);\n res.status(204).send();\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/cryptogram — get cryptogram\n router.post('/:id/cryptogram', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await tokens.getCryptogram(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/re-provision — re-provision token\n router.post('/:id/re-provision', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await tokens.reProvision(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Transaction Routes — /agent/transaction\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { IPaymentService } from '../../lib/interfaces.js';\n\ninterface TransactionRouteDeps {\n payments: IPaymentService;\n}\n\nexport function agentTransactionRoutes({ payments }: TransactionRouteDeps): Router {\n const router = Router();\n\n // GET / — list transactions\n router.get('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const limit = Math.min(parseInt(req.query.limit as string) || 20, 100);\n const offset = parseInt(req.query.offset as string) || 0;\n const result = await payments.listTransactions(req.developer!.id, { limit, offset });\n res.json({ data: result.data, total: result.total, limit, offset });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id — get transaction\n router.get('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await payments.getTransaction(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/refund — refund transaction\n router.post('/:id/refund', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await payments.refund(req.developer!.id, {\n transactionId: req.params.id as string,\n amount: req.body.amount,\n reason: req.body.reason,\n });\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Budget Routes — /agent/budget\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { IBudgetService } from '../../lib/interfaces.js';\n\ninterface BudgetRouteDeps {\n budgets: IBudgetService;\n}\n\nexport function agentBudgetRoutes({ budgets }: BudgetRouteDeps): Router {\n const router = Router();\n\n // GET / — get budget config\n router.get('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await budgets.getBudget(req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // PUT / — set budget config\n router.put('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await budgets.setBudget(req.developer!.id, req.body);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /spending — spending summary\n router.get('/spending', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const budget = await budgets.getBudget(req.developer!.id);\n res.json({\n data: {\n daily: { spent: budget.spent_today, limit: budget.daily_limit },\n weekly: { spent: budget.spent_this_week, limit: budget.weekly_limit },\n monthly: { spent: budget.spent_this_month, limit: budget.monthly_limit },\n currency: 'USD',\n },\n });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Pay Routes — /agent/pay\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { IPaymentService } from '../../lib/interfaces.js';\n\ninterface PayRouteDeps {\n payments: IPaymentService;\n}\n\nexport function agentPayRoutes({ payments }: PayRouteDeps): Router {\n const router = Router();\n\n // POST / — execute payment\n router.post('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const { amount, recipient } = req.body;\n if (typeof amount !== 'number' || amount <= 0) {\n res.status(400).json({ error: { code: 'invalid_amount', message: 'amount must be a positive number' } });\n return;\n }\n if (typeof recipient !== 'string' || !recipient.trim()) {\n res.status(400).json({ error: { code: 'invalid_recipient', message: 'recipient must be a non-empty string' } });\n return;\n }\n const result = await payments.execute(req.developer!.id, req.body);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent User Routes — /agent/user\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { IUserService } from '../../lib/interfaces.js';\n\ninterface UserRouteDeps {\n users: IUserService;\n}\n\nexport function agentUserRoutes({ users }: UserRouteDeps): Router {\n const router = Router();\n\n // POST / — create user\n router.post('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await users.create(req.developer!.id, req.body);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET / — list users\n router.get('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const limit = Math.min(parseInt(req.query.limit as string) || 20, 100);\n const offset = parseInt(req.query.offset as string) || 0;\n const result = await users.list(req.developer!.id, { limit, offset });\n res.json({ data: result.data, total: result.total, limit, offset });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id — get user\n router.get('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await users.get(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // PUT /:id — update user\n router.put('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await users.update(req.params.id as string, req.developer!.id, req.body);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // DELETE /:id — deactivate user\n router.delete('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await users.delete(req.params.id as string, req.developer!.id);\n res.status(204).send();\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/session — create session\n router.post('/:id/session', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await users.createSession(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Merchant Routes — /agent/merchant\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { IMerchantDirectoryService, MerchantDirectorySearchParams } from '../../lib/interfaces.js';\n\ninterface MerchantRouteDeps {\n merchantDirectory: IMerchantDirectoryService;\n}\n\nexport function agentMerchantRoutes({ merchantDirectory }: MerchantRouteDeps): Router {\n const router = Router();\n\n // GET / — list/search merchants\n router.get('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const rawLimit = req.query.limit ? parseInt(req.query.limit as string, 10) : undefined;\n const rawOffset = req.query.offset ? parseInt(req.query.offset as string, 10) : undefined;\n const params: MerchantDirectorySearchParams = {\n query: req.query.query as string | undefined,\n tier: req.query.tier as 'lane_onboarded' | 'protocol' | undefined,\n merchantType: req.query.merchantType as MerchantDirectorySearchParams['merchantType'],\n vertical: req.query.vertical as string | undefined,\n subcategory: req.query.subcategory as string | undefined,\n protocol: req.query.protocol as string | undefined,\n limit: rawLimit !== undefined && !Number.isNaN(rawLimit) ? rawLimit : undefined,\n offset: rawOffset !== undefined && !Number.isNaN(rawOffset) ? rawOffset : undefined,\n };\n const result = await merchantDirectory.listMerchants(params);\n res.json({ data: result.data, total: result.total, limit: params.limit ?? 20, offset: params.offset ?? 0 });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /verticals — list verticals\n router.get('/verticals', async (_req: Request, res: Response, next: NextFunction) => {\n try {\n const verticals = await merchantDirectory.getVerticals();\n res.json({ data: verticals });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:idOrSlug — get merchant\n router.get('/:idOrSlug', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const merchant = await merchantDirectory.getMerchant(req.params.idOrSlug as string);\n if (!merchant) {\n res.status(404).json({ error: { code: 'not_found', message: 'Merchant not found' } });\n return;\n }\n res.json({ data: merchant });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /discover — discover protocol merchant\n router.post('/discover', async (req: Request, res: Response, next: NextFunction) => {\n try {\n let domain = req.body.domain as string;\n if (!domain) {\n res.status(400).json({ error: { code: 'missing_domain', message: 'Domain is required' } });\n return;\n }\n\n // Normalize: strip scheme, www prefix, and path\n domain = domain.replace(/^https?:\\/\\//, '').replace(/^www\\./, '').replace(/\\/.*$/, '');\n const domainRegex = /^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?)*\\.[a-zA-Z]{2,}$/;\n if (!domainRegex.test(domain)) {\n res.status(400).json({ error: { code: 'invalid_domain', message: 'Domain format is invalid' } });\n return;\n }\n\n const merchant = await merchantDirectory.discoverProtocolMerchant(domain);\n if (!merchant) {\n res.status(404).json({ error: { code: 'no_protocol', message: 'No protocol found at this domain' } });\n return;\n }\n res.json({ data: merchant });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Checkout Routes — /agent/checkout\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { ICheckoutService } from '../../lib/interfaces.js';\n\ninterface CheckoutRouteDeps {\n checkout: ICheckoutService;\n}\n\nexport function agentCheckoutRoutes({ checkout }: CheckoutRouteDeps): Router {\n const router = Router();\n\n // POST / — create checkout session\n router.post('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await checkout.create(req.developer!.id, req.body);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id — get checkout session\n router.get('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await checkout.get(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/complete — complete checkout\n router.post('/:id/complete', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await checkout.complete(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/cancel — cancel checkout\n router.post('/:id/cancel', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await checkout.cancel(req.params.id as string, req.developer!.id);\n res.json({ data: { success: true } });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Product Routes — /agent/product\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { SupabaseClient } from '@supabase/supabase-js';\n\ninterface ProductRouteDeps {\n db: SupabaseClient;\n}\n\nexport function agentProductRoutes({ db }: ProductRouteDeps): Router {\n const router = Router();\n\n // GET / — list products\n router.get('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const limit = Math.min(parseInt(req.query.limit as string) || 20, 100);\n const offset = parseInt(req.query.offset as string) || 0;\n const query = req.query.query as string | undefined;\n\n let dbQuery = db\n .from('products')\n .select('*', { count: 'exact' })\n .order('created_at', { ascending: false })\n .range(offset, offset + limit - 1);\n\n if (query) {\n dbQuery = dbQuery.ilike('name', `%${query}%`);\n }\n\n const { data, error, count } = await dbQuery;\n if (error) throw error;\n res.json({ data: data ?? [], total: count ?? 0, limit, offset });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id — get product\n router.get('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const { data, error } = await db\n .from('products')\n .select('*')\n .eq('id', req.params.id as string)\n .single();\n\n if (error || !data) {\n res.status(404).json({ error: { code: 'not_found', message: 'Product not found' } });\n return;\n }\n res.json({ data });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Subscription Routes — /agent/subscription\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { ISubscriptionService } from '../../lib/interfaces.js';\n\ninterface SubscriptionRouteDeps {\n subscriptions: ISubscriptionService;\n}\n\nexport function agentSubscriptionRoutes({ subscriptions }: SubscriptionRouteDeps): Router {\n const router = Router();\n\n // POST / — create subscription\n router.post('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await subscriptions.create(req.developer!.id, req.body);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET / — list subscriptions\n router.get('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const limit = Math.min(parseInt(req.query.limit as string) || 20, 100);\n const offset = parseInt(req.query.offset as string) || 0;\n const result = await subscriptions.list(req.developer!.id, { limit, offset });\n res.json({ data: result.data, total: result.total, limit, offset });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id — get subscription\n router.get('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await subscriptions.get(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/cancel — cancel subscription\n router.post('/:id/cancel', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await subscriptions.cancel(req.params.id as string, req.developer!.id);\n res.json({ data: { success: true } });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/pause — pause subscription\n router.post('/:id/pause', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await subscriptions.pause(req.params.id as string, req.developer!.id);\n res.json({ data: { success: true } });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/resume — resume subscription\n router.post('/:id/resume', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await subscriptions.resume(req.params.id as string, req.developer!.id);\n res.json({ data: { success: true } });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Fleet Routes — /agent/fleet\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { IFleetService } from '../../lib/interfaces.js';\n\ninterface FleetRouteDeps {\n fleet: IFleetService;\n}\n\nexport function agentFleetRoutes({ fleet }: FleetRouteDeps): Router {\n const router = Router();\n\n // POST / — register agent\n router.post('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await fleet.register(req.developer!.id, req.body);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET / — list agents\n router.get('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const limit = Math.min(parseInt(req.query.limit as string) || 20, 100);\n const offset = parseInt(req.query.offset as string) || 0;\n const result = await fleet.list(req.developer!.id, { limit, offset });\n res.json({ data: result.data, total: result.total, limit, offset });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id — get agent\n router.get('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await fleet.get(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/suspend — suspend agent\n router.post('/:id/suspend', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await fleet.suspend(req.params.id as string, req.developer!.id);\n res.json({ data: { success: true } });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/revoke — revoke agent\n router.post('/:id/revoke', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await fleet.revoke(req.params.id as string, req.developer!.id);\n res.json({ data: { success: true } });\n } catch (err) {\n next(err);\n }\n });\n\n // PUT /:id/policy — set agent policy\n router.put('/:id/policy', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await fleet.setPolicy(req.params.id as string, req.developer!.id, req.body);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // PUT /:id/wallet — assign wallet to agent\n router.put('/:id/wallet', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await fleet.assignWallet(req.params.id as string, req.developer!.id, req.body.walletId);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Team Routes — /agent/team\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { ITeamService } from '../../lib/interfaces.js';\n\ninterface TeamRouteDeps {\n teams: ITeamService;\n}\n\nexport function agentTeamRoutes({ teams }: TeamRouteDeps): Router {\n const router = Router();\n\n // POST / — create team\n router.post('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await teams.create(req.developer!.id, req.body);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET / — list teams\n router.get('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const limit = Math.min(parseInt(req.query.limit as string) || 20, 100);\n const offset = parseInt(req.query.offset as string) || 0;\n const result = await teams.list(req.developer!.id, { limit, offset });\n res.json({ data: result.data, total: result.total, limit, offset });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id — get team\n router.get('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await teams.get(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // PUT /:id — update team\n router.put('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await teams.update(req.params.id as string, req.developer!.id, req.body);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/member — add member\n router.post('/:id/member', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await teams.addMember(req.params.id as string, req.developer!.id, req.body.userId, req.body.role);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id/member — list members\n router.get('/:id/member', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await teams.listMembers(req.params.id as string, req.developer!.id);\n res.json({ data: result, total: result.length, limit: result.length, offset: 0 });\n } catch (err) {\n next(err);\n }\n });\n\n // DELETE /:id/member/:mid — remove member\n router.delete('/:id/member/:mid', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await teams.removeMember(req.params.id as string, req.params.mid as string, req.developer!.id);\n res.status(204).send();\n } catch (err) {\n next(err);\n }\n });\n\n // PUT /:id/budget — set team budget\n router.put('/:id/budget', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await teams.setBudget(req.params.id as string, req.developer!.id, req.body);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Webhook Routes — /agent/webhook\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { IWebhookService } from '../../lib/interfaces.js';\n\ninterface WebhookRouteDeps {\n webhooks: IWebhookService;\n}\n\nexport function agentWebhookRoutes({ webhooks }: WebhookRouteDeps): Router {\n const router = Router();\n\n // POST / — create webhook\n router.post('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const { url, events } = req.body;\n\n // Validate URL\n if (!url || typeof url !== 'string') {\n res.status(400).json({ error: { code: 'invalid_url', message: 'url is required' } });\n return;\n }\n try {\n const parsed = new URL(url);\n if (process.env.NODE_ENV === 'production' && parsed.protocol !== 'https:') {\n res.status(400).json({ error: { code: 'invalid_url', message: 'url must use https in production' } });\n return;\n }\n if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') {\n res.status(400).json({ error: { code: 'invalid_url', message: 'url must use http or https protocol' } });\n return;\n }\n } catch {\n res.status(400).json({ error: { code: 'invalid_url', message: 'url is not a valid URL' } });\n return;\n }\n\n // Validate events\n if (!Array.isArray(events) || events.length === 0) {\n res.status(400).json({ error: { code: 'invalid_events', message: 'events must be a non-empty array' } });\n return;\n }\n\n const result = await webhooks.create(req.developer!.id, { url, events });\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET / — list webhooks\n router.get('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const limit = Math.min(parseInt(req.query.limit as string) || 20, 100);\n const offset = parseInt(req.query.offset as string) || 0;\n const result = await webhooks.list(req.developer!.id, { limit, offset });\n res.json({ data: result.data, total: result.total, limit, offset });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id — get webhook\n router.get('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await webhooks.get(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // PUT /:id — update webhook\n router.put('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await webhooks.update(req.params.id as string, req.developer!.id, req.body);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // DELETE /:id — delete webhook\n router.delete('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await webhooks.delete(req.params.id as string, req.developer!.id);\n res.status(204).send();\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Audit Routes — /agent/audit\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { SupabaseClient } from '@supabase/supabase-js';\n\ninterface AuditRouteDeps {\n db: SupabaseClient;\n}\n\nexport function agentAuditRoutes({ db }: AuditRouteDeps): Router {\n const router = Router();\n\n // GET /log — list audit log entries\n router.get('/log', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const limit = Math.min(parseInt(req.query.limit as string) || 20, 100);\n const offset = parseInt(req.query.offset as string) || 0;\n\n let query = db\n .from('audit_log')\n .select('*', { count: 'exact' })\n .eq('developer_id', req.developer!.id)\n .order('created_at', { ascending: false })\n .range(offset, offset + limit - 1);\n\n if (req.query.action) {\n query = query.eq('action', req.query.action as string);\n }\n if (req.query.resource_type) {\n query = query.eq('resource_type', req.query.resource_type as string);\n }\n\n const { data, error, count } = await query;\n if (error) throw error;\n res.json({ data: data ?? [], total: count ?? 0, limit, offset });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /log/:id — get audit entry\n router.get('/log/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const { data, error } = await db\n .from('audit_log')\n .select('*')\n .eq('id', req.params.id as string)\n .eq('developer_id', req.developer!.id)\n .single();\n\n if (error || !data) {\n res.status(404).json({ error: { code: 'not_found', message: 'Audit entry not found' } });\n return;\n }\n res.json({ data });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /export — export audit logs\n router.post('/export', async (req: Request, res: Response, next: NextFunction) => {\n try {\n let query = db\n .from('audit_log')\n .select('*')\n .eq('developer_id', req.developer!.id)\n .order('created_at', { ascending: false })\n .limit(1000);\n\n if (req.body.startDate) {\n query = query.gte('created_at', req.body.startDate);\n }\n if (req.body.endDate) {\n query = query.lte('created_at', req.body.endDate);\n }\n\n const { data, error } = await query;\n if (error) throw error;\n res.json({ data: data ?? [], exportedAt: new Date().toISOString() });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Admin Routes — /agent/admin\n// ---------------------------------------------------------------------------\n\nimport { createHash, randomBytes } from 'node:crypto';\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport { NotFoundError } from '../../lib/errors.js';\n\ninterface AdminRouteDeps {\n db: SupabaseClient;\n}\n\nexport function agentAdminRoutes({ db }: AdminRouteDeps): Router {\n const router = Router();\n\n // GET /whoami — developer profile\n router.get('/whoami', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const { data, error } = await db\n .from('developers')\n .select('id, email, plan, created_at')\n .eq('id', req.developer!.id)\n .single();\n\n if (error || !data) throw new NotFoundError('Developer', req.developer!.id);\n res.json({ data: { id: data.id, email: data.email, plan: data.plan, memberSince: data.created_at } });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /rotate-key — rotate API key\n router.post('/rotate-key', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const developer = req.developer!;\n const newKey = `lane_sk_${randomBytes(24).toString('hex')}`;\n const newHash = createHash('sha256').update(newKey).digest('hex');\n const graceExpiry = new Date(Date.now() + 15 * 60 * 1000).toISOString();\n\n await db\n .from('api_keys')\n .update({ revoked_at: graceExpiry })\n .eq('id', developer.keyId);\n\n const { error } = await db.from('api_keys').insert({\n developer_id: developer.id,\n key_hash: newHash,\n scopes: developer.scopes,\n rate_limit_rpm: developer.rateLimitRpm,\n test_mode: developer.testMode,\n });\n\n if (error) throw error;\n res.json({ data: { apiKey: newKey, expiresOldKeyAt: graceExpiry } });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /keys — list API keys\n router.get('/keys', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const { data, error } = await db\n .from('api_keys')\n .select('id, scopes, test_mode, rate_limit_rpm, created_at, last_used_at, revoked_at')\n .eq('developer_id', req.developer!.id)\n .order('created_at', { ascending: false });\n\n if (error) throw error;\n res.json({ data: data ?? [] });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Onboarding Routes — /agent/onboarding\n// ---------------------------------------------------------------------------\n\nimport { createHash, randomBytes } from 'node:crypto';\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { SupabaseClient } from '@supabase/supabase-js';\n\ninterface OnboardingRouteDeps {\n db: SupabaseClient;\n}\n\nexport function agentOnboardingRoutes({ db }: OnboardingRouteDeps): Router {\n const router = Router();\n\n // POST /generate-key — generate new API key\n router.post('/generate-key', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const newKey = `lane_sk_${randomBytes(24).toString('hex')}`;\n const keyHash = createHash('sha256').update(newKey).digest('hex');\n\n const { error } = await db.from('api_keys').insert({\n developer_id: req.developer!.id,\n key_hash: keyHash,\n scopes: ['*'],\n rate_limit_rpm: 60,\n test_mode: false,\n });\n\n if (error) throw error;\n res.status(201).json({ data: { apiKey: newKey, createdAt: new Date().toISOString() } });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /status — onboarding status\n router.get('/status', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const developerId = req.developer!.id;\n\n // Check API keys\n const { data: keys } = await db\n .from('api_keys')\n .select('id')\n .eq('developer_id', developerId)\n .is('revoked_at', null)\n .limit(1);\n\n // Check cards\n const { data: wallets } = await db\n .from('wallets')\n .select('id')\n .eq('developer_id', developerId)\n .limit(1);\n\n let hasCard = false;\n if (wallets && wallets.length > 0) {\n const { data: cards } = await db\n .from('cards')\n .select('id')\n .eq('wallet_id', wallets[0]!.id)\n .limit(1);\n hasCard = (cards ?? []).length > 0;\n }\n\n // Check budget\n const { data: budget } = await db\n .from('budgets')\n .select('id')\n .eq('developer_id', developerId)\n .limit(1);\n\n const hasApiKey = (keys ?? []).length > 0;\n const hasWallet = (wallets ?? []).length > 0;\n const hasBudget = (budget ?? []).length > 0;\n\n const completedSteps: string[] = [];\n if (hasApiKey) completedSteps.push('api_key');\n if (hasWallet) completedSteps.push('wallet');\n if (hasCard) completedSteps.push('card');\n if (hasBudget) completedSteps.push('budget');\n\n let nextStep: string | null = null;\n if (!hasApiKey) nextStep = 'api_key';\n else if (!hasWallet) nextStep = 'wallet';\n else if (!hasCard) nextStep = 'card';\n else if (!hasBudget) nextStep = 'budget';\n\n res.json({\n data: { hasApiKey, hasCard, hasBudget, completedSteps, nextStep },\n });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Delegation Routes — /api/sdk/delegations\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { IDelegationService } from '../lib/interfaces.js';\n\ninterface DelegationRouteDeps {\n delegations: IDelegationService;\n}\n\nexport function delegationRoutes({ delegations }: DelegationRouteDeps): Router {\n const router = Router();\n\n // POST / — create delegation\n router.post('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await delegations.delegate(req.developer!.id, req.body);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET / — list delegations (paginated, optional filters)\n router.get('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const limit = Math.min(parseInt(req.query.limit as string) || 20, 100);\n const offset = parseInt(req.query.offset as string) || 0;\n const agentId = req.query.agentId as string | undefined;\n const mandateId = req.query.mandateId as string | undefined;\n\n const result = await delegations.listDelegations(req.developer!.id, {\n agentId,\n mandateId,\n limit,\n offset,\n });\n res.json({ data: result.data, total: result.total, limit, offset });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id — get delegation\n router.get('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await delegations.getDelegation(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/revoke — revoke delegation\n router.post('/:id/revoke', async (req: Request, res: Response, next: NextFunction) => {\n try {\n await delegations.revokeDelegation(req.params.id as string, req.developer!.id);\n res.json({ data: { status: 'revoked' } });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","import { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { IProtocolClientService } from '../lib/interfaces.js';\n\ninterface ProtocolRouteDeps {\n protocolClient: IProtocolClientService;\n}\n\nexport function protocolRoutes({ protocolClient }: ProtocolRouteDeps): Router {\n const router = Router();\n\n // POST /discover — Discover protocols for a domain\n router.post('/discover', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await protocolClient.discoverProtocols(req.body.domain);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /sessions — Create checkout session\n router.post('/sessions', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await protocolClient.createSession(req.developer!.id, req.body);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /sessions/:id/confirm — Confirm payment\n router.post('/sessions/:id/confirm', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await protocolClient.confirmPayment(req.params.id as string, req.body);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /sessions/:id — Get session status\n router.get('/sessions/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await protocolClient.getSessionStatus(req.params.id as string);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","import { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { IMastercardAPService } from '../lib/interfaces.js';\n\ninterface MastercardAPRouteDeps {\n mastercardAP: IMastercardAPService;\n}\n\nexport function mastercardAPRoutes({ mastercardAP }: MastercardAPRouteDeps): Router {\n const router = Router();\n\n router.post('/enroll', async (req, res, next) => {\n try { res.status(201).json({ data: await mastercardAP.enrollCredential(req.developer!.id, req.body) }); } catch (err) { next(err); }\n });\n\n router.post('/tokens/:id/verify', async (req, res, next) => {\n try { res.json({ data: await mastercardAP.verifyIdentity(req.params.id as string) }); } catch (err) { next(err); }\n });\n\n router.post('/tokens/:id/bind', async (req, res, next) => {\n try { res.json({ data: await mastercardAP.bindAuthenticator(req.params.id as string, req.body.authMethod) }); } catch (err) { next(err); }\n });\n\n router.post('/tokens/:id/intent', async (req, res, next) => {\n try { res.status(201).json({ data: await mastercardAP.createIntent(req.developer!.id, { tokenId: req.params.id as string, ...req.body }) }); } catch (err) { next(err); }\n });\n\n router.post('/intents/:id/authenticate', async (req, res, next) => {\n try { res.json({ data: await mastercardAP.authenticate(req.params.id as string) }); } catch (err) { next(err); }\n });\n\n router.post('/intents/:id/checkout', async (req, res, next) => {\n try { res.json({ data: await mastercardAP.checkout(req.params.id as string) }); } catch (err) { next(err); }\n });\n\n router.get('/tokens', async (req, res, next) => {\n try { res.json({ data: await mastercardAP.listNetworkTokens(req.developer!.id, req.query.walletId as string) }); } catch (err) { next(err); }\n });\n\n router.get('/tokens/:id', async (req, res, next) => {\n try { res.json({ data: await mastercardAP.getNetworkToken(req.params.id as string) }); } catch (err) { next(err); }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Identity Routes — /api/sdk/identity\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { IIdentityService } from '../lib/interfaces.js';\n\ninterface IdentityRouteDeps {\n identity: IIdentityService;\n}\n\nexport function identityRoutes({ identity }: IdentityRouteDeps): Router {\n const router = Router();\n\n // POST / — register identity\n router.post('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await identity.register(req.developer!.id, req.body);\n res.status(201).json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/verify — verify identity\n router.post('/:id/verify', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await identity.verify(\n req.params.id as string,\n req.developer!.id,\n req.body.verificationCode,\n );\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET / — list identities (paginated)\n router.get('/', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const limit = Math.min(parseInt(req.query.limit as string) || 20, 100);\n const offset = parseInt(req.query.offset as string) || 0;\n const agentId = req.query.agentId as string | undefined;\n const status = req.query.status as string | undefined;\n\n const result = await identity.list(req.developer!.id, { agentId, status, limit, offset });\n res.json({ data: result.data, total: result.total, limit, offset });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id — get identity\n router.get('/:id', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await identity.get(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /:id/attestation — get attestation\n router.get('/:id/attestation', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await identity.getAttestation(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/attestation/refresh — refresh attestation\n router.post('/:id/attestation/refresh', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await identity.refreshAttestation(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/suspend — suspend identity\n router.post('/:id/suspend', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await identity.suspend(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /:id/revoke — revoke identity\n router.post('/:id/revoke', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const result = await identity.revoke(req.params.id as string, req.developer!.id);\n res.json({ data: result });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Discovery Routes — /agent/discovery (public, no auth)\n// ---------------------------------------------------------------------------\n\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\n\nexport function agentDiscoveryRoutes(): Router {\n const router = Router();\n\n // GET /info — API info / capabilities\n router.get('/info', (_req: Request, res: Response) => {\n res.json({\n data: {\n name: 'Lane Agent API',\n version: '2.0',\n capabilities: [\n 'wallet',\n 'card',\n 'instruction',\n 'token',\n 'transaction',\n 'budget',\n 'pay',\n 'user',\n 'merchant',\n 'checkout',\n 'product',\n 'subscription',\n 'fleet',\n 'team',\n 'webhook',\n 'audit',\n ],\n docsUrl: 'https://docs.getonlane.com',\n },\n });\n });\n\n // POST /signup-url — generate signup URL\n router.post('/signup-url', (req: Request, res: Response) => {\n const callbackUrl = req.body.callbackUrl ?? '';\n const baseSignup = 'https://api.getonlane.com/agent/signup';\n\n if (callbackUrl) {\n try {\n const parsed = new URL(callbackUrl);\n if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') {\n res.status(400).json({ error: { code: 'invalid_callback_url', message: 'callbackUrl must use http or https protocol' } });\n return;\n }\n } catch {\n res.status(400).json({ error: { code: 'invalid_callback_url', message: 'callbackUrl is not a valid URL' } });\n return;\n }\n }\n\n const url = callbackUrl ? `${baseSignup}?callback=${encodeURIComponent(callbackUrl)}` : baseSignup;\n res.json({ data: { url } });\n });\n\n return router;\n}\n","// ---------------------------------------------------------------------------\n// Agent Auth Routes — /agent/auth (public, no auth required)\n// ---------------------------------------------------------------------------\n// CLI-initiated browser auth flow:\n// 1. POST /login → returns sessionId, authUrl, deviceCode\n// 2. POST /token → exchanges one-time code for API key\n// ---------------------------------------------------------------------------\n\nimport { createHash, randomBytes, randomUUID } from 'node:crypto';\nimport { Router } from 'express';\nimport type { Request, Response, NextFunction } from 'express';\nimport type { SupabaseClient } from '@supabase/supabase-js';\n\n// Device code charset: no ambiguous I/O/0/1\nconst DEVICE_CODE_CHARS = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';\n\nfunction generateDeviceCode(): string {\n let code = '';\n const bytes = randomBytes(4);\n for (let i = 0; i < 4; i++) {\n code += DEVICE_CODE_CHARS[bytes[i]! % DEVICE_CODE_CHARS.length];\n }\n return `LANE-${code}`;\n}\n\ninterface AgentAuthRouteDeps {\n db: SupabaseClient;\n}\n\nexport function agentAuthRoutes({ db }: AgentAuthRouteDeps): Router {\n const router = Router();\n\n // POST /login — initiate browser auth session\n router.post('/login', async (_req: Request, res: Response, next: NextFunction) => {\n try {\n const sessionId = randomUUID();\n const deviceCode = generateDeviceCode();\n const expiresAt = new Date(Date.now() + 10 * 60 * 1000).toISOString(); // 10 min\n\n // Store session in auth_sessions table\n const { error } = await db.from('auth_sessions').insert({\n id: sessionId,\n device_code: deviceCode,\n status: 'pending',\n expires_at: expiresAt,\n });\n\n if (error) throw error;\n\n const walletUrl = process.env['WALLET_APP_URL'] ?? 'https://api.getonlane.com';\n const authUrl = `${walletUrl}/authorize?s=${sessionId}`;\n\n res.json({\n sessionId,\n authUrl,\n deviceCode,\n });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /token — exchange one-time code for API key\n router.post('/token', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const { code, sessionId } = req.body as { code?: string; sessionId?: string };\n\n if (!code || !sessionId) {\n res.status(400).json({\n error: { code: 'validation', message: 'code and sessionId are required' },\n });\n return;\n }\n\n // Look up auth session\n const { data: session, error: sessionError } = await db\n .from('auth_sessions')\n .select('*')\n .eq('id', sessionId)\n .single();\n\n if (sessionError || !session) {\n res.status(401).json({\n error: { code: 'invalid_code', message: 'Auth session not found' },\n });\n return;\n }\n\n // Check expiry\n if (new Date(session.expires_at) < new Date()) {\n res.status(410).json({\n error: { code: 'session_expired', message: 'Auth session has expired' },\n });\n return;\n }\n\n // Check status\n if (session.status !== 'completed') {\n res.status(401).json({\n error: { code: 'invalid_code', message: 'Auth session not completed' },\n });\n return;\n }\n\n // Check code matches\n if (session.auth_code !== code) {\n res.status(401).json({\n error: { code: 'invalid_code', message: 'Auth code is invalid' },\n });\n return;\n }\n\n // Mark session as consumed (single-use)\n await db\n .from('auth_sessions')\n .update({ status: 'consumed' })\n .eq('id', sessionId);\n\n res.json({\n apiKey: session.api_key,\n developerId: session.developer_id,\n });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /complete-session — complete a CLI auth session (called by wallet /authorize page)\n // Accepts { sessionId, userId, email } — looks up or creates the developer record,\n // ensures an API key exists, and marks the session as completed.\n router.post('/complete-session', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const { sessionId, userId, email } = req.body as {\n sessionId?: string;\n userId?: string;\n email?: string;\n };\n\n if (!sessionId || !userId || !email) {\n res.status(400).json({\n error: { code: 'validation', message: 'sessionId, userId, and email are required' },\n });\n return;\n }\n\n // Verify session exists and is pending\n const { data: session, error: sessionError } = await db\n .from('auth_sessions')\n .select('*')\n .eq('id', sessionId)\n .single();\n\n if (sessionError || !session) {\n res.status(404).json({\n error: { code: 'session_not_found', message: 'Auth session not found' },\n });\n return;\n }\n\n if (session.status !== 'pending') {\n res.status(409).json({\n error: { code: 'session_already_used', message: `Session is already ${session.status}` },\n });\n return;\n }\n\n // Check expiry\n if (new Date(session.expires_at) < new Date()) {\n await db.from('auth_sessions').update({ status: 'expired', updated_at: new Date().toISOString() }).eq('id', sessionId);\n res.status(410).json({\n error: { code: 'session_expired', message: 'Auth session has expired' },\n });\n return;\n }\n\n // Look up or create the developer record from Supabase auth user\n let { data: developer } = await db\n .from('developers')\n .select('id')\n .eq('auth_user_id', userId)\n .single();\n\n if (!developer) {\n // First-time login — create developer record\n // Grant sdk_access immediately: user completed full device-code auth flow\n const { data: newDev, error: insertErr } = await db\n .from('developers')\n .insert({\n auth_user_id: userId,\n email,\n name: email.split('@')[0], // default name from email\n sdk_access: true,\n })\n .select('id')\n .single();\n\n if (insertErr) throw insertErr;\n developer = newDev;\n } else {\n // Existing developer re-authenticating — ensure sdk_access is granted\n await db.from('developers').update({ sdk_access: true }).eq('id', developer.id);\n }\n\n const developerId = developer!.id;\n\n // Generate a fresh API key for this CLI login session.\n // Each login produces a new key — the plaintext is only available at creation time.\n const newKey = `lane_sk_${randomBytes(24).toString('hex')}`;\n const keyHash = createHash('sha256').update(newKey).digest('hex');\n const keyPrefix = newKey.slice(0, 15); // \"lane_sk_\" + first 7 hex chars\n\n const { error: keyErr } = await db.from('api_keys').insert({\n developer_id: developerId,\n name: 'CLI Login',\n key_hash: keyHash,\n key_prefix: keyPrefix,\n environment: 'test',\n });\n\n if (keyErr) throw keyErr;\n\n // Generate one-time auth code\n const code = randomUUID();\n\n // Update session to completed\n const { error: updateError } = await db\n .from('auth_sessions')\n .update({\n status: 'completed',\n auth_code: code,\n api_key: newKey,\n developer_id: developerId,\n updated_at: new Date().toISOString(),\n })\n .eq('id', sessionId);\n\n if (updateError) throw updateError;\n\n // Log to audit trail\n await db.from('audit_log').insert({\n developer_id: developerId,\n action: 'cli_auth_completed',\n resource_type: 'auth_session',\n resource_id: sessionId,\n metadata: {\n user_id: userId,\n email,\n auth_method: 'device_code',\n },\n }).then(() => { /* audit log is best-effort */ });\n\n res.json({ code });\n } catch (err) {\n next(err);\n }\n });\n\n // GET /device-status — poll for device code (used by browser)\n router.get('/device-status', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const sessionId = req.query.s as string;\n\n if (!sessionId) {\n res.status(400).json({\n error: { code: 'validation', message: 'Session ID (s) is required' },\n });\n return;\n }\n\n const { data: session, error } = await db\n .from('auth_sessions')\n .select('device_code, status')\n .eq('id', sessionId)\n .single();\n\n if (error || !session) {\n res.status(404).json({\n error: { code: 'session_not_found', message: 'Auth session not found' },\n });\n return;\n }\n\n res.json({\n deviceCode: session.device_code,\n status: session.status,\n });\n } catch (err) {\n next(err);\n }\n });\n\n // POST /verify-sdk-access — check if developer is whitelisted for SDK access\n // Called by Lane.create() / Lane.fromApiKey() before allowing SDK usage.\n // Checks developers.sdk_access column in Supabase.\n router.post('/verify-sdk-access', async (req: Request, res: Response, next: NextFunction) => {\n try {\n const authHeader = req.headers.authorization;\n if (!authHeader || !authHeader.startsWith('Bearer ')) {\n res.status(401).json({ error: { code: 'no_key', message: 'API key required' } });\n return;\n }\n\n const apiKey = authHeader.slice(7);\n const keyHash = createHash('sha256').update(apiKey).digest('hex');\n\n // Look up the API key and join to developer\n const { data, error } = await db\n .from('api_keys')\n .select('developer_id, revoked_at, developers(id, sdk_access, status)')\n .eq('key_hash', keyHash)\n .limit(1)\n .single();\n\n if (error || !data) {\n res.status(401).json({ error: { code: 'invalid_key', message: 'Invalid API key' } });\n return;\n }\n\n // Check if key is revoked\n if (data.revoked_at && new Date(data.revoked_at).getTime() <= Date.now()) {\n res.status(401).json({ error: { code: 'revoked_key', message: 'API key has been revoked' } });\n return;\n }\n\n const dev = data.developers as unknown as { id: string; sdk_access: boolean; status: string } | null;\n\n if (!dev || dev.status !== 'active') {\n res.status(403).json({ error: { code: 'account_inactive', message: 'Developer account is not active' } });\n return;\n }\n\n if (!dev.sdk_access) {\n res.status(403).json({ error: { code: 'waitlist', message: 'SDK access not yet granted. Join the waitlist at https://app.getonlane.com/agents' } });\n return;\n }\n\n res.json({ access: true, developerId: dev.id });\n } catch (err) {\n next(err);\n }\n });\n\n return router;\n}\n"],"mappings":"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","names":["ErrorCode","import_express","OwnershipError","data","error","remaining","import_node_crypto","import_node_crypto","import_node_crypto","crypto","import_node_crypto","DSP_ID","crypto","import_node_crypto","crypto","import_node_crypto","crypto","import_node_crypto","crypto","import_node_crypto","resolve","crypto","import_node_crypto","crypto","LogLevel","import_node_crypto","dev","import_node_crypto","import_node_crypto","import_node_crypto","import_express","import_express","import_express","import_express","import_node_crypto","import_express","import_express","import_express","import_express","import_express","import_express","import_express","import_express","import_express","import_express","import_express","import_express","import_express","import_express","import_express","import_express","import_express","import_express","import_node_crypto","import_express","import_node_crypto","import_express","import_express","import_express","import_express","import_express","import_express","import_node_crypto","import_express","express"]}
|