@openconductor/mcp-sdk 1.2.0 ā 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/payment/index.d.mts +138 -1
- package/dist/payment/index.d.ts +138 -1
- package/dist/payment/index.js +130 -0
- package/dist/payment/index.js.map +1 -1
- package/dist/payment/index.mjs +125 -1
- package/dist/payment/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors/codes.ts","../src/errors/index.ts","../src/validate/index.ts","../src/logger/index.ts","../src/telemetry/index.ts","../src/server/index.ts","../src/payment/index.ts"],"names":["z"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * JSON-RPC 2.0 Standard Error Codes\n * https://www.jsonrpc.org/specification#error_object\n */\nexport const ErrorCodes = {\n // JSON-RPC 2.0 Standard Errors\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603,\n\n // MCP-Specific Errors (-32000 to -32099 reserved for implementation)\n TOOL_NOT_FOUND: -32001,\n TOOL_EXECUTION_ERROR: -32002,\n RESOURCE_NOT_FOUND: -32003,\n AUTHENTICATION_ERROR: -32004,\n AUTHORIZATION_ERROR: -32005,\n RATE_LIMIT_ERROR: -32006,\n TIMEOUT_ERROR: -32007,\n VALIDATION_ERROR: -32008,\n DEPENDENCY_ERROR: -32009,\n CONFIGURATION_ERROR: -32010,\n PAYMENT_REQUIRED: -32011,\n INSUFFICIENT_CREDITS: -32012,\n SUBSCRIPTION_REQUIRED: -32013,\n} as const\n\nexport type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes]\n","import { ErrorCodes, type ErrorCode } from './codes'\n\nexport { ErrorCodes, type ErrorCode } from './codes'\n\n/**\n * Base error class for MCP servers\n * Formats errors according to JSON-RPC 2.0 specification\n */\nexport class MCPError extends Error {\n public readonly code: ErrorCode\n public readonly data?: Record<string, unknown>\n\n constructor(\n code: ErrorCode,\n message: string,\n data?: Record<string, unknown>\n ) {\n super(message)\n this.name = 'MCPError'\n this.code = code\n this.data = data\n\n // Maintains proper stack trace in V8 environments\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor)\n }\n }\n\n /**\n * Returns JSON-RPC 2.0 formatted error object\n */\n toJSON() {\n return {\n code: this.code,\n message: this.message,\n ...(this.data && { data: this.data }),\n }\n }\n\n /**\n * Create error response for JSON-RPC\n */\n toResponse(id: string | number | null = null) {\n return {\n jsonrpc: '2.0' as const,\n id,\n error: this.toJSON(),\n }\n }\n}\n\n/**\n * Thrown when tool input validation fails\n */\nexport class ValidationError extends MCPError {\n constructor(field: string, reason: string, value?: unknown) {\n super(ErrorCodes.INVALID_PARAMS, `Validation failed for '${field}': ${reason}`, {\n field,\n reason,\n ...(value !== undefined && { value }),\n })\n this.name = 'ValidationError'\n }\n}\n\n/**\n * Thrown when a requested tool doesn't exist\n */\nexport class ToolNotFoundError extends MCPError {\n constructor(toolName: string) {\n super(ErrorCodes.TOOL_NOT_FOUND, `Tool '${toolName}' not found`, {\n tool: toolName,\n })\n this.name = 'ToolNotFoundError'\n }\n}\n\n/**\n * Thrown when tool execution fails\n */\nexport class ToolExecutionError extends MCPError {\n constructor(toolName: string, reason: string, cause?: Error) {\n super(ErrorCodes.TOOL_EXECUTION_ERROR, `Tool '${toolName}' failed: ${reason}`, {\n tool: toolName,\n reason,\n ...(cause && { cause: cause.message }),\n })\n this.name = 'ToolExecutionError'\n }\n}\n\n/**\n * Thrown when a requested resource doesn't exist\n */\nexport class ResourceNotFoundError extends MCPError {\n constructor(resourceUri: string) {\n super(ErrorCodes.RESOURCE_NOT_FOUND, `Resource '${resourceUri}' not found`, {\n uri: resourceUri,\n })\n this.name = 'ResourceNotFoundError'\n }\n}\n\n/**\n * Thrown when authentication fails\n */\nexport class AuthenticationError extends MCPError {\n constructor(reason: string = 'Authentication required') {\n super(ErrorCodes.AUTHENTICATION_ERROR, reason)\n this.name = 'AuthenticationError'\n }\n}\n\n/**\n * Thrown when authorization fails (authenticated but not permitted)\n */\nexport class AuthorizationError extends MCPError {\n constructor(action: string, resource?: string) {\n const msg = resource\n ? `Not authorized to ${action} on '${resource}'`\n : `Not authorized to ${action}`\n super(ErrorCodes.AUTHORIZATION_ERROR, msg, {\n action,\n ...(resource && { resource }),\n })\n this.name = 'AuthorizationError'\n }\n}\n\n/**\n * Thrown when rate limits are exceeded\n */\nexport class RateLimitError extends MCPError {\n constructor(retryAfterMs?: number) {\n super(ErrorCodes.RATE_LIMIT_ERROR, 'Rate limit exceeded', {\n ...(retryAfterMs && { retryAfterMs }),\n })\n this.name = 'RateLimitError'\n }\n}\n\n/**\n * Thrown when an operation times out\n */\nexport class TimeoutError extends MCPError {\n constructor(operation: string, timeoutMs: number) {\n super(ErrorCodes.TIMEOUT_ERROR, `Operation '${operation}' timed out after ${timeoutMs}ms`, {\n operation,\n timeoutMs,\n })\n this.name = 'TimeoutError'\n }\n}\n\n/**\n * Thrown when a required dependency is unavailable\n */\nexport class DependencyError extends MCPError {\n constructor(dependency: string, reason: string) {\n super(ErrorCodes.DEPENDENCY_ERROR, `Dependency '${dependency}' unavailable: ${reason}`, {\n dependency,\n reason,\n })\n this.name = 'DependencyError'\n }\n}\n\n/**\n * Thrown when server configuration is invalid\n */\nexport class ConfigurationError extends MCPError {\n constructor(setting: string, reason: string) {\n super(ErrorCodes.CONFIGURATION_ERROR, `Invalid configuration '${setting}': ${reason}`, {\n setting,\n reason,\n })\n this.name = 'ConfigurationError'\n }\n}\n\n/**\n * Thrown when payment is required to access a tool\n */\nexport class PaymentRequiredError extends MCPError {\n constructor(toolName: string, options?: { upgradeUrl?: string; priceId?: string }) {\n super(ErrorCodes.PAYMENT_REQUIRED, `Payment required to use '${toolName}'`, {\n tool: toolName,\n ...(options?.upgradeUrl && { upgradeUrl: options.upgradeUrl }),\n ...(options?.priceId && { priceId: options.priceId }),\n })\n this.name = 'PaymentRequiredError'\n }\n}\n\n/**\n * Thrown when user doesn't have enough credits\n */\nexport class InsufficientCreditsError extends MCPError {\n constructor(required: number, available: number, options?: { purchaseUrl?: string }) {\n super(ErrorCodes.INSUFFICIENT_CREDITS, `Insufficient credits: need ${required}, have ${available}`, {\n required,\n available,\n ...(options?.purchaseUrl && { purchaseUrl: options.purchaseUrl }),\n })\n this.name = 'InsufficientCreditsError'\n }\n}\n\n/**\n * Thrown when a subscription tier is required\n */\nexport class SubscriptionRequiredError extends MCPError {\n constructor(requiredTier: string, currentTier?: string, options?: { upgradeUrl?: string }) {\n const msg = currentTier \n ? `Subscription '${requiredTier}' required (current: '${currentTier}')`\n : `Subscription '${requiredTier}' required`\n super(ErrorCodes.SUBSCRIPTION_REQUIRED, msg, {\n requiredTier,\n ...(currentTier && { currentTier }),\n ...(options?.upgradeUrl && { upgradeUrl: options.upgradeUrl }),\n })\n this.name = 'SubscriptionRequiredError'\n }\n}\n","import { z, ZodError, type ZodSchema, type ZodTypeDef, type SafeParseReturnType } from 'zod'\nimport { ValidationError } from '../errors'\n\n// Re-export zod for convenience\nexport { z, ZodError, type ZodSchema }\nexport type { ZodTypeDef }\n\n/**\n * Options for input validation\n */\nexport interface ValidateOptions {\n /** Strip unknown keys from objects (default: true) */\n stripUnknown?: boolean\n /** Custom error formatter */\n formatError?: (error: ZodError) => string\n}\n\n/**\n * Validates input against a Zod schema\n * Throws ValidationError on failure with detailed field info\n */\nexport function validate<T>(\n schema: ZodSchema<T>,\n input: unknown,\n options: ValidateOptions = {}\n): T {\n const { stripUnknown = true } = options\n\n const result = (\n stripUnknown\n ? schema.safeParse(input)\n : schema instanceof z.ZodObject\n ? schema.strict().safeParse(input)\n : schema.safeParse(input)\n ) as SafeParseReturnType<unknown, T>\n\n if (!result.success) {\n const firstError = result.error.errors[0]\n const field = firstError.path.join('.') || 'input'\n const reason = firstError.message\n throw new ValidationError(field, reason, firstError.path.length > 0 \n ? getNestedValue(input, firstError.path) \n : input\n )\n }\n\n return result.data\n}\n\n/**\n * Creates a validated tool handler\n * Wraps your handler function with automatic input validation\n */\nexport function validateInput<TInput, TOutput>(\n schema: ZodSchema<TInput>,\n handler: (input: TInput) => TOutput | Promise<TOutput>,\n options: ValidateOptions = {}\n): (input: unknown) => Promise<TOutput> {\n return async (input: unknown) => {\n const validated = validate(schema, input, options)\n return handler(validated)\n }\n}\n\n\n/**\n * Helper to extract nested value from object by path\n */\nfunction getNestedValue(obj: unknown, path: (string | number)[]): unknown {\n let current = obj\n for (const key of path) {\n if (current === null || current === undefined) return undefined\n current = (current as Record<string | number, unknown>)[key]\n }\n return current\n}\n\n/**\n * Common schema patterns for MCP tools\n */\nexport const schemas = {\n /** Non-empty string */\n nonEmptyString: z.string().min(1, 'Cannot be empty'),\n \n /** Positive integer */\n positiveInt: z.number().int().positive(),\n \n /** Pagination limit (1-100, default 10) */\n limit: z.number().int().min(1).max(100).default(10),\n \n /** Pagination offset (>= 0, default 0) */\n offset: z.number().int().min(0).default(0),\n \n /** URL string */\n url: z.string().url(),\n \n /** Email string */\n email: z.string().email(),\n \n /** UUID string */\n uuid: z.string().uuid(),\n \n /** ISO date string */\n isoDate: z.string().datetime(),\n \n /** Boolean with string coercion ('true'/'false' -> boolean) */\n booleanish: z.union([\n z.boolean(),\n z.enum(['true', 'false']).transform(v => v === 'true'),\n ]),\n}\n\n/**\n * Type helper to infer schema type\n */\nexport type Infer<T extends ZodSchema> = z.infer<T>\n","export type LogLevel = 'debug' | 'info' | 'warn' | 'error'\n\nexport interface LogEntry {\n timestamp?: string\n level: LogLevel\n service: string\n message: string\n [key: string]: unknown\n}\n\nexport interface LoggerOptions {\n /** Minimum log level to output (default: 'info') */\n level?: LogLevel\n /** Custom output function (default: console methods) */\n output?: (entry: LogEntry) => void\n /** Include timestamps (default: true) */\n timestamps?: boolean\n /** Pretty print JSON (default: false, use true for local dev) */\n pretty?: boolean\n}\n\nconst LEVEL_PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n}\n\n/**\n * Creates a structured logger for MCP servers\n */\nexport function createLogger(service: string, options: LoggerOptions = {}) {\n const {\n level: minLevel = 'info',\n timestamps = true,\n pretty = false,\n } = options\n\n const shouldLog = (level: LogLevel): boolean => {\n return LEVEL_PRIORITY[level] >= LEVEL_PRIORITY[minLevel]\n }\n\n const formatEntry = (entry: LogEntry): string => {\n return pretty ? JSON.stringify(entry, null, 2) : JSON.stringify(entry)\n }\n\n const log = (level: LogLevel, message: string, data?: Record<string, unknown>) => {\n if (!shouldLog(level)) return\n\n const entry: LogEntry = {\n ...(timestamps && { timestamp: new Date().toISOString() }),\n level,\n service,\n message,\n ...data,\n }\n\n if (options.output) {\n options.output(entry)\n } else {\n const formatted = formatEntry(entry)\n switch (level) {\n case 'debug':\n console.debug(formatted)\n break\n case 'info':\n console.info(formatted)\n break\n case 'warn':\n console.warn(formatted)\n break\n case 'error':\n console.error(formatted)\n break\n }\n }\n\n return entry\n }\n\n return {\n debug: (message: string, data?: Record<string, unknown>) => log('debug', message, data),\n info: (message: string, data?: Record<string, unknown>) => log('info', message, data),\n warn: (message: string, data?: Record<string, unknown>) => log('warn', message, data),\n error: (message: string, data?: Record<string, unknown>) => log('error', message, data),\n \n /**\n * Create a child logger with additional context\n */\n child: (context: Record<string, unknown>) => {\n return createLogger(service, {\n ...options,\n output: (entry) => {\n const merged = { ...entry, ...context }\n if (options.output) {\n options.output(merged)\n } else {\n const formatted = pretty ? JSON.stringify(merged, null, 2) : JSON.stringify(merged)\n console[entry.level](formatted)\n }\n },\n })\n },\n }\n}\n\nexport type Logger = ReturnType<typeof createLogger>\n","export interface TelemetryConfig {\n /** Your OpenConductor API key */\n apiKey: string\n /** Server name for identification */\n serverName: string\n /** Server version */\n serverVersion?: string\n /** Custom endpoint (default: OpenConductor production) */\n endpoint?: string\n /** Batch size before flushing (default: 10) */\n batchSize?: number\n /** Flush interval in ms (default: 30000) */\n flushInterval?: number\n /** Enable debug logging (default: false) */\n debug?: boolean\n}\n\nexport interface ToolMetric {\n tool: string\n duration: number\n success: boolean\n error?: string\n timestamp: string\n}\n\nexport interface TelemetryBatch {\n serverName: string\n serverVersion?: string\n metrics: ToolMetric[]\n meta: {\n sdkVersion: string\n nodeVersion: string\n platform: string\n }\n}\n\nconst SDK_VERSION = '1.0.0'\nconst DEFAULT_ENDPOINT = 'https://api.openconductor.ai/functions/v1/telemetry'\n\nlet globalTelemetry: Telemetry | null = null\n\n/**\n * Initialize telemetry for your MCP server\n * Call this once at startup with your OpenConductor API key\n */\nexport function initTelemetry(config: TelemetryConfig): Telemetry {\n globalTelemetry = new Telemetry(config)\n return globalTelemetry\n}\n\n/**\n * Get the global telemetry instance (if initialized)\n */\nexport function getTelemetry(): Telemetry | null {\n return globalTelemetry\n}\n\n\nexport class Telemetry {\n private config: Required<Omit<TelemetryConfig, 'serverVersion'>> & Pick<TelemetryConfig, 'serverVersion'>\n private buffer: ToolMetric[] = []\n private flushTimer: ReturnType<typeof setInterval> | null = null\n\n constructor(config: TelemetryConfig) {\n this.config = {\n apiKey: config.apiKey,\n serverName: config.serverName,\n serverVersion: config.serverVersion,\n endpoint: config.endpoint ?? DEFAULT_ENDPOINT,\n batchSize: config.batchSize ?? 10,\n flushInterval: config.flushInterval ?? 30000,\n debug: config.debug ?? false,\n }\n\n // Start periodic flush\n this.flushTimer = setInterval(() => {\n this.flush().catch(this.handleError.bind(this))\n }, this.config.flushInterval)\n\n // Flush on process exit\n if (typeof process !== 'undefined') {\n process.on('beforeExit', () => this.flush())\n process.on('SIGINT', () => {\n this.flush().finally(() => process.exit(0))\n })\n process.on('SIGTERM', () => {\n this.flush().finally(() => process.exit(0))\n })\n }\n\n this.log('Telemetry initialized', { serverName: config.serverName })\n }\n\n /**\n * Track a tool invocation\n */\n trackToolCall(\n tool: string,\n duration: number,\n success: boolean,\n error?: string\n ): void {\n const metric: ToolMetric = {\n tool,\n duration,\n success,\n ...(error && { error }),\n timestamp: new Date().toISOString(),\n }\n\n this.buffer.push(metric)\n this.log('Metric tracked', { ...metric })\n\n // Auto-flush if buffer is full\n if (this.buffer.length >= this.config.batchSize) {\n this.flush().catch(this.handleError.bind(this))\n }\n }\n\n /**\n * Flush buffered metrics to OpenConductor\n */\n async flush(): Promise<void> {\n if (this.buffer.length === 0) return\n\n const metrics = [...this.buffer]\n this.buffer = []\n\n const batch: TelemetryBatch = {\n serverName: this.config.serverName,\n serverVersion: this.config.serverVersion,\n metrics,\n meta: {\n sdkVersion: SDK_VERSION,\n nodeVersion: typeof process !== 'undefined' ? process.version : 'unknown',\n platform: typeof process !== 'undefined' ? process.platform : 'unknown',\n },\n }\n\n this.log('Flushing metrics', { count: metrics.length })\n\n try {\n const response = await fetch(this.config.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.config.apiKey}`,\n 'X-OpenConductor-SDK': SDK_VERSION,\n },\n body: JSON.stringify(batch),\n })\n\n if (!response.ok) {\n throw new Error(`Telemetry flush failed: ${response.status} ${response.statusText}`)\n }\n\n this.log('Metrics flushed successfully', { count: metrics.length })\n } catch (error) {\n // Put metrics back in buffer on failure\n this.buffer.unshift(...metrics)\n throw error\n }\n }\n\n /**\n * Stop telemetry collection\n */\n shutdown(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer)\n this.flushTimer = null\n }\n this.flush().catch(this.handleError.bind(this))\n this.log('Telemetry shutdown')\n }\n\n private log(message: string, data?: Record<string, unknown>): void {\n if (this.config.debug) {\n console.debug(JSON.stringify({\n timestamp: new Date().toISOString(),\n level: 'debug',\n service: 'openconductor-telemetry',\n message,\n ...data,\n }))\n }\n }\n\n private handleError(error: unknown): void {\n if (this.config.debug) {\n console.error('[OpenConductor Telemetry Error]', error)\n }\n }\n}\n","import { MCPError, ToolExecutionError, TimeoutError } from '../errors'\nimport { createLogger, type Logger } from '../logger'\nimport { getTelemetry } from '../telemetry'\n\nexport interface HealthCheckInfo {\n name: string\n version: string\n description?: string\n uptime?: () => number\n checks?: Record<string, () => Promise<boolean> | boolean>\n}\n\nexport interface HealthCheckResponse {\n status: 'healthy' | 'degraded' | 'unhealthy'\n name: string\n version: string\n description?: string\n uptime?: number\n timestamp: string\n checks?: Record<string, boolean>\n}\n\n/**\n * Creates a standard health check response for MCP servers\n */\nexport function createHealthCheck(info: HealthCheckInfo) {\n return async (): Promise<HealthCheckResponse> => {\n const checks: Record<string, boolean> = {}\n let allHealthy = true\n\n if (info.checks) {\n for (const [name, check] of Object.entries(info.checks)) {\n try {\n checks[name] = await check()\n if (!checks[name]) allHealthy = false\n } catch {\n checks[name] = false\n allHealthy = false\n }\n }\n }\n\n return {\n status: allHealthy ? 'healthy' : 'degraded',\n name: info.name,\n version: info.version,\n ...(info.description && { description: info.description }),\n ...(info.uptime && { uptime: info.uptime() }),\n timestamp: new Date().toISOString(),\n ...(Object.keys(checks).length > 0 && { checks }),\n }\n }\n}\n\n\nexport interface WrapToolOptions {\n /** Tool name for logging and telemetry */\n name: string\n /** Timeout in milliseconds (default: 30000) */\n timeout?: number\n /** Custom logger instance */\n logger?: Logger\n /** Enable telemetry reporting (default: true if telemetry initialized) */\n telemetry?: boolean\n}\n\nexport interface ToolContext {\n /** Unique ID for this tool call */\n callId: string\n /** Tool name */\n name: string\n /** Start time of execution */\n startTime: number\n /** Logger scoped to this call */\n log: Logger\n}\n\n/**\n * Wraps a tool handler with automatic error handling, logging, timeouts, and telemetry\n */\nexport function wrapTool<TInput, TOutput>(\n handler: (input: TInput, ctx: ToolContext) => TOutput | Promise<TOutput>,\n options: WrapToolOptions\n): (input: TInput) => Promise<TOutput> {\n const {\n name,\n timeout = 30000,\n telemetry: enableTelemetry = true,\n } = options\n\n const baseLogger = options.logger ?? createLogger(name)\n\n return async (input: TInput): Promise<TOutput> => {\n const callId = generateCallId()\n const startTime = Date.now()\n const log = baseLogger.child({ callId })\n\n const ctx: ToolContext = { callId, name, startTime, log }\n\n log.info('Tool invoked', { tool: name, input: sanitizeInput(input) })\n\n try {\n // Create timeout promise\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => {\n reject(new TimeoutError(name, timeout))\n }, timeout)\n })\n\n // Race handler against timeout\n const result = await Promise.race([\n Promise.resolve(handler(input, ctx)),\n timeoutPromise,\n ])\n\n const duration = Date.now() - startTime\n log.info('Tool completed', { tool: name, duration })\n\n // Report success to telemetry\n if (enableTelemetry) {\n const tel = getTelemetry()\n tel?.trackToolCall(name, duration, true)\n }\n\n return result\n } catch (error) {\n const duration = Date.now() - startTime\n const errorMessage = error instanceof Error ? error.message : String(error)\n\n log.error('Tool failed', { \n tool: name, \n duration, \n error: errorMessage,\n stack: error instanceof Error ? error.stack : undefined,\n })\n\n // Report failure to telemetry\n if (enableTelemetry) {\n const tel = getTelemetry()\n tel?.trackToolCall(name, duration, false, errorMessage)\n }\n\n // Re-throw MCPErrors as-is, wrap others\n if (error instanceof MCPError) {\n throw error\n }\n\n throw new ToolExecutionError(\n name,\n errorMessage,\n error instanceof Error ? error : undefined\n )\n }\n }\n}\n\n/**\n * Generates a unique call ID\n */\nfunction generateCallId(): string {\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`\n}\n\n/**\n * Sanitizes input for logging (removes sensitive fields)\n */\nfunction sanitizeInput(input: unknown): unknown {\n if (typeof input !== 'object' || input === null) return input\n\n const sensitiveKeys = ['password', 'token', 'secret', 'key', 'auth', 'credential']\n const sanitized: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(input as Record<string, unknown>)) {\n if (sensitiveKeys.some(k => key.toLowerCase().includes(k))) {\n sanitized[key] = '[REDACTED]'\n } else {\n sanitized[key] = value\n }\n }\n\n return sanitized\n}\n","import {\n PaymentRequiredError,\n InsufficientCreditsError,\n SubscriptionRequiredError,\n ConfigurationError,\n} from '../errors'\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface PaymentConfig {\n /** OpenConductor API key for billing */\n apiKey: string\n /** Base URL for billing API (default: https://api.openconductor.ai) */\n apiUrl?: string\n /** Default upgrade URL to show users */\n upgradeUrl?: string\n /** Enable test mode (skips actual billing) */\n testMode?: boolean\n}\n\nexport interface CreditRequirement {\n /** Number of credits to deduct per call */\n credits: number\n}\n\nexport interface SubscriptionRequirement {\n /** Required subscription tier (e.g., 'pro', 'enterprise') */\n tier: string\n /** Alternative tiers that also grant access */\n allowedTiers?: string[]\n}\n\nexport interface StripeRequirement {\n /** Stripe Price ID for per-call billing */\n priceId: string\n}\n\nexport type PaymentRequirement = \n | CreditRequirement \n | SubscriptionRequirement \n | StripeRequirement\n\nexport interface UserContext {\n /** User ID for billing lookup */\n userId: string\n /** Optional API key override */\n apiKey?: string\n}\n\nexport interface BillingStatus {\n /** Whether the user can proceed */\n allowed: boolean\n /** Current credit balance (if applicable) */\n credits?: number\n /** Current subscription tier (if applicable) */\n tier?: string\n /** Reason for denial (if not allowed) */\n reason?: string\n /** URL for upgrade/purchase */\n actionUrl?: string\n}\n\n// ============================================================================\n// Configuration\n// ============================================================================\n\nlet paymentConfig: PaymentConfig | null = null\n\n/**\n * Initialize payment/billing configuration\n * \n * @example\n * ```typescript\n * initPayment({\n * apiKey: process.env.OPENCONDUCTOR_API_KEY!,\n * upgradeUrl: 'https://myapp.com/upgrade'\n * })\n * ```\n */\nexport function initPayment(config: PaymentConfig): void {\n paymentConfig = {\n apiUrl: 'https://api.openconductor.ai',\n testMode: false,\n ...config,\n }\n}\n\n/**\n * Get current payment configuration\n */\nexport function getPaymentConfig(): PaymentConfig | null {\n return paymentConfig\n}\n\n// ============================================================================\n// Billing Client\n// ============================================================================\n\ninterface CheckBillingParams {\n userId: string\n requirement: PaymentRequirement\n toolName: string\n}\n\ninterface DeductCreditsParams {\n userId: string\n credits: number\n toolName: string\n callId?: string\n}\n\nasync function checkBilling(params: CheckBillingParams): Promise<BillingStatus> {\n const config = paymentConfig\n if (!config) {\n throw new ConfigurationError('payment', 'Payment not initialized. Call initPayment() first.')\n }\n\n // Test mode - always allow\n if (config.testMode) {\n return { allowed: true, credits: 9999, tier: 'test' }\n }\n\n try {\n const response = await fetch(`${config.apiUrl}/functions/v1/billing-check`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${config.apiKey}`,\n },\n body: JSON.stringify({\n userId: params.userId,\n requirement: params.requirement,\n tool: params.toolName,\n }),\n })\n\n if (!response.ok) {\n // Non-2xx response - treat as billing check failed\n const errorBody = await response.text()\n console.error('[payment] Billing check failed:', response.status, errorBody)\n return {\n allowed: false,\n reason: 'Billing service unavailable',\n actionUrl: config.upgradeUrl,\n }\n }\n\n return await response.json() as BillingStatus\n } catch (error) {\n // Network error - fail open or closed based on config\n console.error('[payment] Billing check error:', error)\n return {\n allowed: false,\n reason: 'Unable to verify billing status',\n actionUrl: config.upgradeUrl,\n }\n }\n}\n\nasync function deductCredits(params: DeductCreditsParams): Promise<boolean> {\n const config = paymentConfig\n if (!config) return false\n\n // Test mode - don't actually deduct\n if (config.testMode) return true\n\n try {\n const response = await fetch(`${config.apiUrl}/functions/v1/billing-deduct`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${config.apiKey}`,\n },\n body: JSON.stringify({\n userId: params.userId,\n credits: params.credits,\n tool: params.toolName,\n callId: params.callId,\n }),\n })\n\n return response.ok\n } catch (error) {\n console.error('[payment] Credit deduction error:', error)\n return false\n }\n}\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\nfunction isCreditRequirement(req: PaymentRequirement): req is CreditRequirement {\n return 'credits' in req && typeof req.credits === 'number'\n}\n\nfunction isSubscriptionRequirement(req: PaymentRequirement): req is SubscriptionRequirement {\n return 'tier' in req && typeof req.tier === 'string'\n}\n\nfunction isStripeRequirement(req: PaymentRequirement): req is StripeRequirement {\n return 'priceId' in req && typeof req.priceId === 'string'\n}\n\n// ============================================================================\n// Main Middleware\n// ============================================================================\n\nexport interface RequirePaymentOptions {\n /** Tool name for billing records */\n toolName?: string\n /** Function to extract user ID from input */\n getUserId?: (input: unknown) => string | undefined\n /** Custom error handler */\n onPaymentError?: (error: Error) => void\n}\n\n/**\n * One-line payment middleware for MCP tools\n * \n * @example Credits-based billing\n * ```typescript\n * const paidTool = requirePayment({ credits: 10 })(myHandler)\n * ```\n * \n * @example Subscription tier requirement\n * ```typescript\n * const premiumTool = requirePayment({ tier: 'pro' })(myHandler)\n * ```\n * \n * @example With wrapTool\n * ```typescript\n * const safePaidTool = wrapTool(\n * requirePayment({ credits: 5 })(myHandler),\n * { name: 'premium-analysis' }\n * )\n * ```\n */\nexport function requirePayment<TInput extends { userId?: string }, TOutput>(\n requirement: PaymentRequirement,\n options: RequirePaymentOptions = {}\n) {\n return (\n handler: (input: TInput) => TOutput | Promise<TOutput>\n ): ((input: TInput) => Promise<TOutput>) => {\n \n const { toolName = 'unknown', getUserId } = options\n\n return async (input: TInput): Promise<TOutput> => {\n // Extract user ID\n const userId = getUserId?.(input) ?? input.userId\n \n if (!userId) {\n throw new PaymentRequiredError(toolName, {\n upgradeUrl: paymentConfig?.upgradeUrl,\n })\n }\n\n // Check billing status\n const status = await checkBilling({\n userId,\n requirement,\n toolName,\n })\n\n if (!status.allowed) {\n // Throw appropriate error based on requirement type\n if (isCreditRequirement(requirement)) {\n throw new InsufficientCreditsError(\n requirement.credits,\n status.credits ?? 0,\n { purchaseUrl: status.actionUrl }\n )\n }\n\n if (isSubscriptionRequirement(requirement)) {\n throw new SubscriptionRequiredError(\n requirement.tier,\n status.tier,\n { upgradeUrl: status.actionUrl }\n )\n }\n\n // Generic payment required\n throw new PaymentRequiredError(toolName, {\n upgradeUrl: status.actionUrl,\n ...(isStripeRequirement(requirement) && { priceId: requirement.priceId }),\n })\n }\n\n // Execute the handler\n const result = await handler(input)\n\n // Deduct credits after successful execution (if credit-based)\n if (isCreditRequirement(requirement)) {\n await deductCredits({\n userId,\n credits: requirement.credits,\n toolName,\n })\n }\n\n return result\n }\n }\n}\n\n// ============================================================================\n// Convenience Functions\n// ============================================================================\n\n/**\n * Create a paid tool with built-in payment verification\n * \n * @example\n * ```typescript\n * const analyzeData = createPaidTool({\n * name: 'analyze-data',\n * payment: { credits: 10 },\n * handler: async (input) => {\n * // Your tool logic\n * return result\n * }\n * })\n * ```\n */\nexport function createPaidTool<TInput extends { userId?: string }, TOutput>(config: {\n name: string\n payment: PaymentRequirement\n handler: (input: TInput) => TOutput | Promise<TOutput>\n getUserId?: (input: TInput) => string | undefined\n}): (input: TInput) => Promise<TOutput> {\n return requirePayment<TInput, TOutput>(config.payment, {\n toolName: config.name,\n getUserId: config.getUserId as (input: unknown) => string | undefined,\n })(config.handler)\n}\n\n/**\n * Check if a user can access a paid feature without executing it\n * Useful for UI gating\n * \n * @example\n * ```typescript\n * const canAccess = await canUserAccess('user_123', { credits: 10 }, 'premium-tool')\n * if (!canAccess.allowed) {\n * showUpgradePrompt(canAccess.actionUrl)\n * }\n * ```\n */\nexport async function canUserAccess(\n userId: string,\n requirement: PaymentRequirement,\n toolName: string = 'check'\n): Promise<BillingStatus> {\n return checkBilling({ userId, requirement, toolName })\n}\n\n/**\n * Get user's current billing status\n */\nexport async function getUserBillingStatus(userId: string): Promise<{\n credits: number\n tier: string\n active: boolean\n} | null> {\n const config = paymentConfig\n if (!config) return null\n\n if (config.testMode) {\n return { credits: 9999, tier: 'test', active: true }\n }\n\n try {\n const response = await fetch(`${config.apiUrl}/functions/v1/billing-status/${userId}`, {\n headers: {\n 'Authorization': `Bearer ${config.apiKey}`,\n },\n })\n\n if (!response.ok) return null\n return await response.json()\n } catch {\n return null\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors/codes.ts","../src/errors/index.ts","../src/validate/index.ts","../src/logger/index.ts","../src/telemetry/index.ts","../src/server/index.ts","../src/payment/index.ts"],"names":["z"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * JSON-RPC 2.0 Standard Error Codes\n * https://www.jsonrpc.org/specification#error_object\n */\nexport const ErrorCodes = {\n // JSON-RPC 2.0 Standard Errors\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603,\n\n // MCP-Specific Errors (-32000 to -32099 reserved for implementation)\n TOOL_NOT_FOUND: -32001,\n TOOL_EXECUTION_ERROR: -32002,\n RESOURCE_NOT_FOUND: -32003,\n AUTHENTICATION_ERROR: -32004,\n AUTHORIZATION_ERROR: -32005,\n RATE_LIMIT_ERROR: -32006,\n TIMEOUT_ERROR: -32007,\n VALIDATION_ERROR: -32008,\n DEPENDENCY_ERROR: -32009,\n CONFIGURATION_ERROR: -32010,\n PAYMENT_REQUIRED: -32011,\n INSUFFICIENT_CREDITS: -32012,\n SUBSCRIPTION_REQUIRED: -32013,\n} as const\n\nexport type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes]\n","import { ErrorCodes, type ErrorCode } from './codes'\n\nexport { ErrorCodes, type ErrorCode } from './codes'\n\n/**\n * Base error class for MCP servers\n * Formats errors according to JSON-RPC 2.0 specification\n */\nexport class MCPError extends Error {\n public readonly code: ErrorCode\n public readonly data?: Record<string, unknown>\n\n constructor(\n code: ErrorCode,\n message: string,\n data?: Record<string, unknown>\n ) {\n super(message)\n this.name = 'MCPError'\n this.code = code\n this.data = data\n\n // Maintains proper stack trace in V8 environments\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor)\n }\n }\n\n /**\n * Returns JSON-RPC 2.0 formatted error object\n */\n toJSON() {\n return {\n code: this.code,\n message: this.message,\n ...(this.data && { data: this.data }),\n }\n }\n\n /**\n * Create error response for JSON-RPC\n */\n toResponse(id: string | number | null = null) {\n return {\n jsonrpc: '2.0' as const,\n id,\n error: this.toJSON(),\n }\n }\n}\n\n/**\n * Thrown when tool input validation fails\n */\nexport class ValidationError extends MCPError {\n constructor(field: string, reason: string, value?: unknown) {\n super(ErrorCodes.INVALID_PARAMS, `Validation failed for '${field}': ${reason}`, {\n field,\n reason,\n ...(value !== undefined && { value }),\n })\n this.name = 'ValidationError'\n }\n}\n\n/**\n * Thrown when a requested tool doesn't exist\n */\nexport class ToolNotFoundError extends MCPError {\n constructor(toolName: string) {\n super(ErrorCodes.TOOL_NOT_FOUND, `Tool '${toolName}' not found`, {\n tool: toolName,\n })\n this.name = 'ToolNotFoundError'\n }\n}\n\n/**\n * Thrown when tool execution fails\n */\nexport class ToolExecutionError extends MCPError {\n constructor(toolName: string, reason: string, cause?: Error) {\n super(ErrorCodes.TOOL_EXECUTION_ERROR, `Tool '${toolName}' failed: ${reason}`, {\n tool: toolName,\n reason,\n ...(cause && { cause: cause.message }),\n })\n this.name = 'ToolExecutionError'\n }\n}\n\n/**\n * Thrown when a requested resource doesn't exist\n */\nexport class ResourceNotFoundError extends MCPError {\n constructor(resourceUri: string) {\n super(ErrorCodes.RESOURCE_NOT_FOUND, `Resource '${resourceUri}' not found`, {\n uri: resourceUri,\n })\n this.name = 'ResourceNotFoundError'\n }\n}\n\n/**\n * Thrown when authentication fails\n */\nexport class AuthenticationError extends MCPError {\n constructor(reason: string = 'Authentication required') {\n super(ErrorCodes.AUTHENTICATION_ERROR, reason)\n this.name = 'AuthenticationError'\n }\n}\n\n/**\n * Thrown when authorization fails (authenticated but not permitted)\n */\nexport class AuthorizationError extends MCPError {\n constructor(action: string, resource?: string) {\n const msg = resource\n ? `Not authorized to ${action} on '${resource}'`\n : `Not authorized to ${action}`\n super(ErrorCodes.AUTHORIZATION_ERROR, msg, {\n action,\n ...(resource && { resource }),\n })\n this.name = 'AuthorizationError'\n }\n}\n\n/**\n * Thrown when rate limits are exceeded\n */\nexport class RateLimitError extends MCPError {\n constructor(retryAfterMs?: number) {\n super(ErrorCodes.RATE_LIMIT_ERROR, 'Rate limit exceeded', {\n ...(retryAfterMs && { retryAfterMs }),\n })\n this.name = 'RateLimitError'\n }\n}\n\n/**\n * Thrown when an operation times out\n */\nexport class TimeoutError extends MCPError {\n constructor(operation: string, timeoutMs: number) {\n super(ErrorCodes.TIMEOUT_ERROR, `Operation '${operation}' timed out after ${timeoutMs}ms`, {\n operation,\n timeoutMs,\n })\n this.name = 'TimeoutError'\n }\n}\n\n/**\n * Thrown when a required dependency is unavailable\n */\nexport class DependencyError extends MCPError {\n constructor(dependency: string, reason: string) {\n super(ErrorCodes.DEPENDENCY_ERROR, `Dependency '${dependency}' unavailable: ${reason}`, {\n dependency,\n reason,\n })\n this.name = 'DependencyError'\n }\n}\n\n/**\n * Thrown when server configuration is invalid\n */\nexport class ConfigurationError extends MCPError {\n constructor(setting: string, reason: string) {\n super(ErrorCodes.CONFIGURATION_ERROR, `Invalid configuration '${setting}': ${reason}`, {\n setting,\n reason,\n })\n this.name = 'ConfigurationError'\n }\n}\n\n/**\n * Thrown when payment is required to access a tool\n */\nexport class PaymentRequiredError extends MCPError {\n constructor(toolName: string, options?: { upgradeUrl?: string; priceId?: string }) {\n super(ErrorCodes.PAYMENT_REQUIRED, `Payment required to use '${toolName}'`, {\n tool: toolName,\n ...(options?.upgradeUrl && { upgradeUrl: options.upgradeUrl }),\n ...(options?.priceId && { priceId: options.priceId }),\n })\n this.name = 'PaymentRequiredError'\n }\n}\n\n/**\n * Thrown when user doesn't have enough credits\n */\nexport class InsufficientCreditsError extends MCPError {\n constructor(required: number, available: number, options?: { purchaseUrl?: string }) {\n super(ErrorCodes.INSUFFICIENT_CREDITS, `Insufficient credits: need ${required}, have ${available}`, {\n required,\n available,\n ...(options?.purchaseUrl && { purchaseUrl: options.purchaseUrl }),\n })\n this.name = 'InsufficientCreditsError'\n }\n}\n\n/**\n * Thrown when a subscription tier is required\n */\nexport class SubscriptionRequiredError extends MCPError {\n constructor(requiredTier: string, currentTier?: string, options?: { upgradeUrl?: string }) {\n const msg = currentTier \n ? `Subscription '${requiredTier}' required (current: '${currentTier}')`\n : `Subscription '${requiredTier}' required`\n super(ErrorCodes.SUBSCRIPTION_REQUIRED, msg, {\n requiredTier,\n ...(currentTier && { currentTier }),\n ...(options?.upgradeUrl && { upgradeUrl: options.upgradeUrl }),\n })\n this.name = 'SubscriptionRequiredError'\n }\n}\n","import { z, ZodError, type ZodSchema, type ZodTypeDef, type SafeParseReturnType } from 'zod'\nimport { ValidationError } from '../errors'\n\n// Re-export zod for convenience\nexport { z, ZodError, type ZodSchema }\nexport type { ZodTypeDef }\n\n/**\n * Options for input validation\n */\nexport interface ValidateOptions {\n /** Strip unknown keys from objects (default: true) */\n stripUnknown?: boolean\n /** Custom error formatter */\n formatError?: (error: ZodError) => string\n}\n\n/**\n * Validates input against a Zod schema\n * Throws ValidationError on failure with detailed field info\n */\nexport function validate<T>(\n schema: ZodSchema<T>,\n input: unknown,\n options: ValidateOptions = {}\n): T {\n const { stripUnknown = true } = options\n\n const result = (\n stripUnknown\n ? schema.safeParse(input)\n : schema instanceof z.ZodObject\n ? schema.strict().safeParse(input)\n : schema.safeParse(input)\n ) as SafeParseReturnType<unknown, T>\n\n if (!result.success) {\n const firstError = result.error.errors[0]\n const field = firstError.path.join('.') || 'input'\n const reason = firstError.message\n throw new ValidationError(field, reason, firstError.path.length > 0 \n ? getNestedValue(input, firstError.path) \n : input\n )\n }\n\n return result.data\n}\n\n/**\n * Creates a validated tool handler\n * Wraps your handler function with automatic input validation\n */\nexport function validateInput<TInput, TOutput>(\n schema: ZodSchema<TInput>,\n handler: (input: TInput) => TOutput | Promise<TOutput>,\n options: ValidateOptions = {}\n): (input: unknown) => Promise<TOutput> {\n return async (input: unknown) => {\n const validated = validate(schema, input, options)\n return handler(validated)\n }\n}\n\n\n/**\n * Helper to extract nested value from object by path\n */\nfunction getNestedValue(obj: unknown, path: (string | number)[]): unknown {\n let current = obj\n for (const key of path) {\n if (current === null || current === undefined) return undefined\n current = (current as Record<string | number, unknown>)[key]\n }\n return current\n}\n\n/**\n * Common schema patterns for MCP tools\n */\nexport const schemas = {\n /** Non-empty string */\n nonEmptyString: z.string().min(1, 'Cannot be empty'),\n \n /** Positive integer */\n positiveInt: z.number().int().positive(),\n \n /** Pagination limit (1-100, default 10) */\n limit: z.number().int().min(1).max(100).default(10),\n \n /** Pagination offset (>= 0, default 0) */\n offset: z.number().int().min(0).default(0),\n \n /** URL string */\n url: z.string().url(),\n \n /** Email string */\n email: z.string().email(),\n \n /** UUID string */\n uuid: z.string().uuid(),\n \n /** ISO date string */\n isoDate: z.string().datetime(),\n \n /** Boolean with string coercion ('true'/'false' -> boolean) */\n booleanish: z.union([\n z.boolean(),\n z.enum(['true', 'false']).transform(v => v === 'true'),\n ]),\n}\n\n/**\n * Type helper to infer schema type\n */\nexport type Infer<T extends ZodSchema> = z.infer<T>\n","export type LogLevel = 'debug' | 'info' | 'warn' | 'error'\n\nexport interface LogEntry {\n timestamp?: string\n level: LogLevel\n service: string\n message: string\n [key: string]: unknown\n}\n\nexport interface LoggerOptions {\n /** Minimum log level to output (default: 'info') */\n level?: LogLevel\n /** Custom output function (default: console methods) */\n output?: (entry: LogEntry) => void\n /** Include timestamps (default: true) */\n timestamps?: boolean\n /** Pretty print JSON (default: false, use true for local dev) */\n pretty?: boolean\n}\n\nconst LEVEL_PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n}\n\n/**\n * Creates a structured logger for MCP servers\n */\nexport function createLogger(service: string, options: LoggerOptions = {}) {\n const {\n level: minLevel = 'info',\n timestamps = true,\n pretty = false,\n } = options\n\n const shouldLog = (level: LogLevel): boolean => {\n return LEVEL_PRIORITY[level] >= LEVEL_PRIORITY[minLevel]\n }\n\n const formatEntry = (entry: LogEntry): string => {\n return pretty ? JSON.stringify(entry, null, 2) : JSON.stringify(entry)\n }\n\n const log = (level: LogLevel, message: string, data?: Record<string, unknown>) => {\n if (!shouldLog(level)) return\n\n const entry: LogEntry = {\n ...(timestamps && { timestamp: new Date().toISOString() }),\n level,\n service,\n message,\n ...data,\n }\n\n if (options.output) {\n options.output(entry)\n } else {\n const formatted = formatEntry(entry)\n switch (level) {\n case 'debug':\n console.debug(formatted)\n break\n case 'info':\n console.info(formatted)\n break\n case 'warn':\n console.warn(formatted)\n break\n case 'error':\n console.error(formatted)\n break\n }\n }\n\n return entry\n }\n\n return {\n debug: (message: string, data?: Record<string, unknown>) => log('debug', message, data),\n info: (message: string, data?: Record<string, unknown>) => log('info', message, data),\n warn: (message: string, data?: Record<string, unknown>) => log('warn', message, data),\n error: (message: string, data?: Record<string, unknown>) => log('error', message, data),\n \n /**\n * Create a child logger with additional context\n */\n child: (context: Record<string, unknown>) => {\n return createLogger(service, {\n ...options,\n output: (entry) => {\n const merged = { ...entry, ...context }\n if (options.output) {\n options.output(merged)\n } else {\n const formatted = pretty ? JSON.stringify(merged, null, 2) : JSON.stringify(merged)\n console[entry.level](formatted)\n }\n },\n })\n },\n }\n}\n\nexport type Logger = ReturnType<typeof createLogger>\n","export interface TelemetryConfig {\n /** Your OpenConductor API key */\n apiKey: string\n /** Server name for identification */\n serverName: string\n /** Server version */\n serverVersion?: string\n /** Custom endpoint (default: OpenConductor production) */\n endpoint?: string\n /** Batch size before flushing (default: 10) */\n batchSize?: number\n /** Flush interval in ms (default: 30000) */\n flushInterval?: number\n /** Enable debug logging (default: false) */\n debug?: boolean\n}\n\nexport interface ToolMetric {\n tool: string\n duration: number\n success: boolean\n error?: string\n timestamp: string\n}\n\nexport interface TelemetryBatch {\n serverName: string\n serverVersion?: string\n metrics: ToolMetric[]\n meta: {\n sdkVersion: string\n nodeVersion: string\n platform: string\n }\n}\n\nconst SDK_VERSION = '1.0.0'\nconst DEFAULT_ENDPOINT = 'https://api.openconductor.ai/functions/v1/telemetry'\n\nlet globalTelemetry: Telemetry | null = null\n\n/**\n * Initialize telemetry for your MCP server\n * Call this once at startup with your OpenConductor API key\n */\nexport function initTelemetry(config: TelemetryConfig): Telemetry {\n globalTelemetry = new Telemetry(config)\n return globalTelemetry\n}\n\n/**\n * Get the global telemetry instance (if initialized)\n */\nexport function getTelemetry(): Telemetry | null {\n return globalTelemetry\n}\n\n\nexport class Telemetry {\n private config: Required<Omit<TelemetryConfig, 'serverVersion'>> & Pick<TelemetryConfig, 'serverVersion'>\n private buffer: ToolMetric[] = []\n private flushTimer: ReturnType<typeof setInterval> | null = null\n\n constructor(config: TelemetryConfig) {\n this.config = {\n apiKey: config.apiKey,\n serverName: config.serverName,\n serverVersion: config.serverVersion,\n endpoint: config.endpoint ?? DEFAULT_ENDPOINT,\n batchSize: config.batchSize ?? 10,\n flushInterval: config.flushInterval ?? 30000,\n debug: config.debug ?? false,\n }\n\n // Start periodic flush\n this.flushTimer = setInterval(() => {\n this.flush().catch(this.handleError.bind(this))\n }, this.config.flushInterval)\n\n // Flush on process exit\n if (typeof process !== 'undefined') {\n process.on('beforeExit', () => this.flush())\n process.on('SIGINT', () => {\n this.flush().finally(() => process.exit(0))\n })\n process.on('SIGTERM', () => {\n this.flush().finally(() => process.exit(0))\n })\n }\n\n this.log('Telemetry initialized', { serverName: config.serverName })\n }\n\n /**\n * Track a tool invocation\n */\n trackToolCall(\n tool: string,\n duration: number,\n success: boolean,\n error?: string\n ): void {\n const metric: ToolMetric = {\n tool,\n duration,\n success,\n ...(error && { error }),\n timestamp: new Date().toISOString(),\n }\n\n this.buffer.push(metric)\n this.log('Metric tracked', { ...metric })\n\n // Auto-flush if buffer is full\n if (this.buffer.length >= this.config.batchSize) {\n this.flush().catch(this.handleError.bind(this))\n }\n }\n\n /**\n * Flush buffered metrics to OpenConductor\n */\n async flush(): Promise<void> {\n if (this.buffer.length === 0) return\n\n const metrics = [...this.buffer]\n this.buffer = []\n\n const batch: TelemetryBatch = {\n serverName: this.config.serverName,\n serverVersion: this.config.serverVersion,\n metrics,\n meta: {\n sdkVersion: SDK_VERSION,\n nodeVersion: typeof process !== 'undefined' ? process.version : 'unknown',\n platform: typeof process !== 'undefined' ? process.platform : 'unknown',\n },\n }\n\n this.log('Flushing metrics', { count: metrics.length })\n\n try {\n const response = await fetch(this.config.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.config.apiKey}`,\n 'X-OpenConductor-SDK': SDK_VERSION,\n },\n body: JSON.stringify(batch),\n })\n\n if (!response.ok) {\n throw new Error(`Telemetry flush failed: ${response.status} ${response.statusText}`)\n }\n\n this.log('Metrics flushed successfully', { count: metrics.length })\n } catch (error) {\n // Put metrics back in buffer on failure\n this.buffer.unshift(...metrics)\n throw error\n }\n }\n\n /**\n * Stop telemetry collection\n */\n shutdown(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer)\n this.flushTimer = null\n }\n this.flush().catch(this.handleError.bind(this))\n this.log('Telemetry shutdown')\n }\n\n private log(message: string, data?: Record<string, unknown>): void {\n if (this.config.debug) {\n console.debug(JSON.stringify({\n timestamp: new Date().toISOString(),\n level: 'debug',\n service: 'openconductor-telemetry',\n message,\n ...data,\n }))\n }\n }\n\n private handleError(error: unknown): void {\n if (this.config.debug) {\n console.error('[OpenConductor Telemetry Error]', error)\n }\n }\n}\n","import { MCPError, ToolExecutionError, TimeoutError } from '../errors'\nimport { createLogger, type Logger } from '../logger'\nimport { getTelemetry } from '../telemetry'\n\nexport interface HealthCheckInfo {\n name: string\n version: string\n description?: string\n uptime?: () => number\n checks?: Record<string, () => Promise<boolean> | boolean>\n}\n\nexport interface HealthCheckResponse {\n status: 'healthy' | 'degraded' | 'unhealthy'\n name: string\n version: string\n description?: string\n uptime?: number\n timestamp: string\n checks?: Record<string, boolean>\n}\n\n/**\n * Creates a standard health check response for MCP servers\n */\nexport function createHealthCheck(info: HealthCheckInfo) {\n return async (): Promise<HealthCheckResponse> => {\n const checks: Record<string, boolean> = {}\n let allHealthy = true\n\n if (info.checks) {\n for (const [name, check] of Object.entries(info.checks)) {\n try {\n checks[name] = await check()\n if (!checks[name]) allHealthy = false\n } catch {\n checks[name] = false\n allHealthy = false\n }\n }\n }\n\n return {\n status: allHealthy ? 'healthy' : 'degraded',\n name: info.name,\n version: info.version,\n ...(info.description && { description: info.description }),\n ...(info.uptime && { uptime: info.uptime() }),\n timestamp: new Date().toISOString(),\n ...(Object.keys(checks).length > 0 && { checks }),\n }\n }\n}\n\n\nexport interface WrapToolOptions {\n /** Tool name for logging and telemetry */\n name: string\n /** Timeout in milliseconds (default: 30000) */\n timeout?: number\n /** Custom logger instance */\n logger?: Logger\n /** Enable telemetry reporting (default: true if telemetry initialized) */\n telemetry?: boolean\n}\n\nexport interface ToolContext {\n /** Unique ID for this tool call */\n callId: string\n /** Tool name */\n name: string\n /** Start time of execution */\n startTime: number\n /** Logger scoped to this call */\n log: Logger\n}\n\n/**\n * Wraps a tool handler with automatic error handling, logging, timeouts, and telemetry\n */\nexport function wrapTool<TInput, TOutput>(\n handler: (input: TInput, ctx: ToolContext) => TOutput | Promise<TOutput>,\n options: WrapToolOptions\n): (input: TInput) => Promise<TOutput> {\n const {\n name,\n timeout = 30000,\n telemetry: enableTelemetry = true,\n } = options\n\n const baseLogger = options.logger ?? createLogger(name)\n\n return async (input: TInput): Promise<TOutput> => {\n const callId = generateCallId()\n const startTime = Date.now()\n const log = baseLogger.child({ callId })\n\n const ctx: ToolContext = { callId, name, startTime, log }\n\n log.info('Tool invoked', { tool: name, input: sanitizeInput(input) })\n\n try {\n // Create timeout promise\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => {\n reject(new TimeoutError(name, timeout))\n }, timeout)\n })\n\n // Race handler against timeout\n const result = await Promise.race([\n Promise.resolve(handler(input, ctx)),\n timeoutPromise,\n ])\n\n const duration = Date.now() - startTime\n log.info('Tool completed', { tool: name, duration })\n\n // Report success to telemetry\n if (enableTelemetry) {\n const tel = getTelemetry()\n tel?.trackToolCall(name, duration, true)\n }\n\n return result\n } catch (error) {\n const duration = Date.now() - startTime\n const errorMessage = error instanceof Error ? error.message : String(error)\n\n log.error('Tool failed', { \n tool: name, \n duration, \n error: errorMessage,\n stack: error instanceof Error ? error.stack : undefined,\n })\n\n // Report failure to telemetry\n if (enableTelemetry) {\n const tel = getTelemetry()\n tel?.trackToolCall(name, duration, false, errorMessage)\n }\n\n // Re-throw MCPErrors as-is, wrap others\n if (error instanceof MCPError) {\n throw error\n }\n\n throw new ToolExecutionError(\n name,\n errorMessage,\n error instanceof Error ? error : undefined\n )\n }\n }\n}\n\n/**\n * Generates a unique call ID\n */\nfunction generateCallId(): string {\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`\n}\n\n/**\n * Sanitizes input for logging (removes sensitive fields)\n */\nfunction sanitizeInput(input: unknown): unknown {\n if (typeof input !== 'object' || input === null) return input\n\n const sensitiveKeys = ['password', 'token', 'secret', 'key', 'auth', 'credential']\n const sanitized: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(input as Record<string, unknown>)) {\n if (sensitiveKeys.some(k => key.toLowerCase().includes(k))) {\n sanitized[key] = '[REDACTED]'\n } else {\n sanitized[key] = value\n }\n }\n\n return sanitized\n}\n","import {\n PaymentRequiredError,\n InsufficientCreditsError,\n SubscriptionRequiredError,\n ConfigurationError,\n} from '../errors'\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface PaymentConfig {\n /** OpenConductor API key for billing */\n apiKey: string\n /** Base URL for billing API (default: https://api.openconductor.ai) */\n apiUrl?: string\n /** Default upgrade URL to show users */\n upgradeUrl?: string\n /** Enable test mode (skips actual billing) */\n testMode?: boolean\n}\n\nexport interface CreditRequirement {\n /** Number of credits to deduct per call */\n credits: number\n}\n\nexport interface SubscriptionRequirement {\n /** Required subscription tier (e.g., 'pro', 'enterprise') */\n tier: string\n /** Alternative tiers that also grant access */\n allowedTiers?: string[]\n}\n\nexport interface StripeRequirement {\n /** Stripe Price ID for per-call billing */\n priceId: string\n}\n\nexport type PaymentRequirement = \n | CreditRequirement \n | SubscriptionRequirement \n | StripeRequirement\n\nexport interface UserContext {\n /** User ID for billing lookup */\n userId: string\n /** Optional API key override */\n apiKey?: string\n}\n\nexport interface BillingStatus {\n /** Whether the user can proceed */\n allowed: boolean\n /** Current credit balance (if applicable) */\n credits?: number\n /** Current subscription tier (if applicable) */\n tier?: string\n /** Reason for denial (if not allowed) */\n reason?: string\n /** URL for upgrade/purchase */\n actionUrl?: string\n}\n\n// ============================================================================\n// Configuration\n// ============================================================================\n\nlet paymentConfig: PaymentConfig | null = null\n\n/**\n * Initialize payment/billing configuration\n * \n * @example\n * ```typescript\n * initPayment({\n * apiKey: process.env.OPENCONDUCTOR_API_KEY!,\n * upgradeUrl: 'https://myapp.com/upgrade'\n * })\n * ```\n */\nexport function initPayment(config: PaymentConfig): void {\n paymentConfig = {\n apiUrl: 'https://api.openconductor.ai',\n testMode: false,\n ...config,\n }\n}\n\n/**\n * Get current payment configuration\n */\nexport function getPaymentConfig(): PaymentConfig | null {\n return paymentConfig\n}\n\n// ============================================================================\n// Billing Client\n// ============================================================================\n\ninterface CheckBillingParams {\n userId: string\n requirement: PaymentRequirement\n toolName: string\n}\n\ninterface DeductCreditsParams {\n userId: string\n credits: number\n toolName: string\n callId?: string\n}\n\nasync function checkBilling(params: CheckBillingParams): Promise<BillingStatus> {\n const config = paymentConfig\n if (!config) {\n throw new ConfigurationError('payment', 'Payment not initialized. Call initPayment() first.')\n }\n\n // Test mode - always allow\n if (config.testMode) {\n return { allowed: true, credits: 9999, tier: 'test' }\n }\n\n try {\n const response = await fetch(`${config.apiUrl}/functions/v1/billing-check`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${config.apiKey}`,\n },\n body: JSON.stringify({\n userId: params.userId,\n requirement: params.requirement,\n tool: params.toolName,\n }),\n })\n\n if (!response.ok) {\n // Non-2xx response - treat as billing check failed\n const errorBody = await response.text()\n console.error('[payment] Billing check failed:', response.status, errorBody)\n return {\n allowed: false,\n reason: 'Billing service unavailable',\n actionUrl: config.upgradeUrl,\n }\n }\n\n return await response.json() as BillingStatus\n } catch (error) {\n // Network error - fail open or closed based on config\n console.error('[payment] Billing check error:', error)\n return {\n allowed: false,\n reason: 'Unable to verify billing status',\n actionUrl: config.upgradeUrl,\n }\n }\n}\n\nasync function deductCredits(params: DeductCreditsParams): Promise<boolean> {\n const config = paymentConfig\n if (!config) return false\n\n // Test mode - don't actually deduct\n if (config.testMode) return true\n\n try {\n const response = await fetch(`${config.apiUrl}/functions/v1/billing-deduct`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${config.apiKey}`,\n },\n body: JSON.stringify({\n userId: params.userId,\n credits: params.credits,\n tool: params.toolName,\n callId: params.callId,\n }),\n })\n\n return response.ok\n } catch (error) {\n console.error('[payment] Credit deduction error:', error)\n return false\n }\n}\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\nfunction isCreditRequirement(req: PaymentRequirement): req is CreditRequirement {\n return 'credits' in req && typeof req.credits === 'number'\n}\n\nfunction isSubscriptionRequirement(req: PaymentRequirement): req is SubscriptionRequirement {\n return 'tier' in req && typeof req.tier === 'string'\n}\n\nfunction isStripeRequirement(req: PaymentRequirement): req is StripeRequirement {\n return 'priceId' in req && typeof req.priceId === 'string'\n}\n\n// ============================================================================\n// Main Middleware\n// ============================================================================\n\nexport interface RequirePaymentOptions {\n /** Tool name for billing records */\n toolName?: string\n /** Function to extract user ID from input */\n getUserId?: (input: unknown) => string | undefined\n /** Custom error handler */\n onPaymentError?: (error: Error) => void\n}\n\n/**\n * One-line payment middleware for MCP tools\n * \n * @example Credits-based billing\n * ```typescript\n * const paidTool = requirePayment({ credits: 10 })(myHandler)\n * ```\n * \n * @example Subscription tier requirement\n * ```typescript\n * const premiumTool = requirePayment({ tier: 'pro' })(myHandler)\n * ```\n * \n * @example With wrapTool\n * ```typescript\n * const safePaidTool = wrapTool(\n * requirePayment({ credits: 5 })(myHandler),\n * { name: 'premium-analysis' }\n * )\n * ```\n */\nexport function requirePayment<TInput extends { userId?: string }, TOutput>(\n requirement: PaymentRequirement,\n options: RequirePaymentOptions = {}\n) {\n return (\n handler: (input: TInput) => TOutput | Promise<TOutput>\n ): ((input: TInput) => Promise<TOutput>) => {\n \n const { toolName = 'unknown', getUserId } = options\n\n return async (input: TInput): Promise<TOutput> => {\n // Extract user ID\n const userId = getUserId?.(input) ?? input.userId\n \n if (!userId) {\n throw new PaymentRequiredError(toolName, {\n upgradeUrl: paymentConfig?.upgradeUrl,\n })\n }\n\n // Check billing status\n const status = await checkBilling({\n userId,\n requirement,\n toolName,\n })\n\n if (!status.allowed) {\n // Throw appropriate error based on requirement type\n if (isCreditRequirement(requirement)) {\n throw new InsufficientCreditsError(\n requirement.credits,\n status.credits ?? 0,\n { purchaseUrl: status.actionUrl }\n )\n }\n\n if (isSubscriptionRequirement(requirement)) {\n throw new SubscriptionRequiredError(\n requirement.tier,\n status.tier,\n { upgradeUrl: status.actionUrl }\n )\n }\n\n // Generic payment required\n throw new PaymentRequiredError(toolName, {\n upgradeUrl: status.actionUrl,\n ...(isStripeRequirement(requirement) && { priceId: requirement.priceId }),\n })\n }\n\n // Execute the handler\n const result = await handler(input)\n\n // Deduct credits after successful execution (if credit-based)\n if (isCreditRequirement(requirement)) {\n await deductCredits({\n userId,\n credits: requirement.credits,\n toolName,\n })\n }\n\n return result\n }\n }\n}\n\n// ============================================================================\n// Convenience Functions\n// ============================================================================\n\n/**\n * Create a paid tool with built-in payment verification\n * \n * @example\n * ```typescript\n * const analyzeData = createPaidTool({\n * name: 'analyze-data',\n * payment: { credits: 10 },\n * handler: async (input) => {\n * // Your tool logic\n * return result\n * }\n * })\n * ```\n */\nexport function createPaidTool<TInput extends { userId?: string }, TOutput>(config: {\n name: string\n payment: PaymentRequirement\n handler: (input: TInput) => TOutput | Promise<TOutput>\n getUserId?: (input: TInput) => string | undefined\n}): (input: TInput) => Promise<TOutput> {\n return requirePayment<TInput, TOutput>(config.payment, {\n toolName: config.name,\n getUserId: config.getUserId as (input: unknown) => string | undefined,\n })(config.handler)\n}\n\n/**\n * Check if a user can access a paid feature without executing it\n * Useful for UI gating\n * \n * @example\n * ```typescript\n * const canAccess = await canUserAccess('user_123', { credits: 10 }, 'premium-tool')\n * if (!canAccess.allowed) {\n * showUpgradePrompt(canAccess.actionUrl)\n * }\n * ```\n */\nexport async function canUserAccess(\n userId: string,\n requirement: PaymentRequirement,\n toolName: string = 'check'\n): Promise<BillingStatus> {\n return checkBilling({ userId, requirement, toolName })\n}\n\n/**\n * Get user's current billing status\n */\nexport async function getUserBillingStatus(userId: string): Promise<{\n credits: number\n tier: string\n active: boolean\n} | null> {\n const config = paymentConfig\n if (!config) return null\n\n if (config.testMode) {\n return { credits: 9999, tier: 'test', active: true }\n }\n\n try {\n const response = await fetch(`${config.apiUrl}/functions/v1/billing-status/${userId}`, {\n headers: {\n 'Authorization': `Bearer ${config.apiKey}`,\n },\n })\n\n if (!response.ok) return null\n return await response.json()\n } catch {\n return null\n }\n}\n\n// ============================================================================\n// Checkout Helpers\n// ============================================================================\n\nexport type CreditPack = 'starter' | 'pro' | 'business'\n\nexport interface CreditPackInfo {\n name: string\n credits: number\n price: number\n perCredit: number\n savings: number\n bestFor: string\n popular?: boolean\n}\n\nexport interface CheckoutSession {\n sessionId: string\n url: string\n pack: CreditPack\n credits: number\n price: number\n perCredit: number\n}\n\n/**\n * Get available credit packs and pricing\n * \n * @example\n * ```typescript\n * const packs = await getCreditPacks()\n * console.log(packs.pro) // { name: 'Pro Pack', credits: 500, price: 39.99, ... }\n * ```\n */\nexport async function getCreditPacks(): Promise<Record<CreditPack, CreditPackInfo> | null> {\n const config = paymentConfig\n if (!config) return null\n\n try {\n const response = await fetch(`${config.apiUrl}/functions/v1/credit-packs`)\n if (!response.ok) return null\n const data = await response.json()\n return data.packs\n } catch {\n return null\n }\n}\n\n/**\n * Create a Stripe checkout session for purchasing credits\n * Returns a URL to redirect the user to for payment\n * \n * @example\n * ```typescript\n * const checkout = await createCreditsCheckout('pro', {\n * successUrl: 'https://myapp.com/success',\n * cancelUrl: 'https://myapp.com/pricing',\n * })\n * \n * // Redirect user to checkout\n * window.location.href = checkout.url\n * ```\n */\nexport async function createCreditsCheckout(\n pack: CreditPack,\n options: {\n successUrl?: string\n cancelUrl?: string\n } = {}\n): Promise<CheckoutSession | null> {\n const config = paymentConfig\n if (!config) {\n console.error('[payment] Payment not initialized. Call initPayment() first.')\n return null\n }\n\n try {\n const response = await fetch(`${config.apiUrl}/functions/v1/stripe-checkout-credits`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${config.apiKey}`,\n },\n body: JSON.stringify({\n pack,\n successUrl: options.successUrl,\n cancelUrl: options.cancelUrl,\n }),\n })\n\n if (!response.ok) {\n const error = await response.text()\n console.error('[payment] Checkout creation failed:', error)\n return null\n }\n\n return await response.json() as CheckoutSession\n } catch (error) {\n console.error('[payment] Checkout error:', error)\n return null\n }\n}\n\n/**\n * Generate a direct checkout URL for embedding in upgrade prompts\n * \n * @example In an error handler:\n * ```typescript\n * catch (error) {\n * if (error instanceof InsufficientCreditsError) {\n * const checkoutUrl = await getCheckoutUrl('pro')\n * return { error: `Insufficient credits. Buy more: ${checkoutUrl}` }\n * }\n * }\n * ```\n */\nexport async function getCheckoutUrl(pack: CreditPack): Promise<string | null> {\n const session = await createCreditsCheckout(pack)\n return session?.url ?? null\n}\n\n// ============================================================================\n// Upgrade Prompts\n// ============================================================================\n\nexport interface UpgradePromptOptions {\n /** Required credits for the blocked action */\n required?: number\n /** Currently available credits */\n available?: number\n /** Tool that was blocked */\n toolName?: string\n /** Include direct checkout links */\n includeLinks?: boolean\n}\n\n/**\n * Generate a user-friendly upgrade prompt message\n * Use this in your error handlers to show helpful messages\n * \n * @example\n * ```typescript\n * catch (error) {\n * if (error instanceof InsufficientCreditsError) {\n * const prompt = await generateUpgradePrompt({\n * required: error.data.required,\n * available: error.data.available,\n * toolName: 'analyze-data'\n * })\n * console.log(prompt.message)\n * // \"You need 10 more credits to use analyze-data. \n * // Buy the Pro Pack (500 credits) for $39.99 ā https://...\"\n * }\n * }\n * ```\n */\nexport async function generateUpgradePrompt(\n options: UpgradePromptOptions = {}\n): Promise<{\n message: string\n shortMessage: string\n recommendedPack: CreditPack\n packs: Record<CreditPack, { credits: number; price: number; url: string | null }>\n}> {\n const { required = 0, available = 0, toolName, includeLinks = true } = options\n const needed = Math.max(0, required - available)\n \n // Determine recommended pack based on needed credits\n let recommendedPack: CreditPack = 'starter'\n if (needed > 100) recommendedPack = 'pro'\n if (needed > 500) recommendedPack = 'business'\n \n // Get pack URLs if requested\n const packUrls: Record<CreditPack, string | null> = {\n starter: null,\n pro: null,\n business: null,\n }\n \n if (includeLinks) {\n const [starterUrl, proUrl, businessUrl] = await Promise.all([\n getCheckoutUrl('starter'),\n getCheckoutUrl('pro'),\n getCheckoutUrl('business'),\n ])\n packUrls.starter = starterUrl\n packUrls.pro = proUrl\n packUrls.business = businessUrl\n }\n \n // Build message\n const toolPart = toolName ? ` to use ${toolName}` : ''\n const shortMessage = `Insufficient credits: need ${required}, have ${available}`\n \n let message = `You need ${needed} more credits${toolPart}.\\n\\n`\n message += `š³ Quick top-up options:\\n`\n message += ` ⢠Starter: 100 credits for $9.99${packUrls.starter ? ` ā ${packUrls.starter}` : ''}\\n`\n message += ` ⢠Pro: 500 credits for $39.99 (20% off)${packUrls.pro ? ` ā ${packUrls.pro}` : ''}\\n`\n message += ` ⢠Business: 2,000 credits for $119.99 (40% off)${packUrls.business ? ` ā ${packUrls.business}` : ''}\\n`\n \n if (recommendedPack !== 'starter') {\n message += `\\n⨠Recommended: ${recommendedPack.charAt(0).toUpperCase() + recommendedPack.slice(1)} Pack`\n }\n \n return {\n message,\n shortMessage,\n recommendedPack,\n packs: {\n starter: { credits: 100, price: 9.99, url: packUrls.starter },\n pro: { credits: 500, price: 39.99, url: packUrls.pro },\n business: { credits: 2000, price: 119.99, url: packUrls.business },\n },\n }\n}\n\n/**\n * Get a simple checkout URL for the dashboard\n * Useful when you don't want to create a full Stripe session\n */\nexport function getDashboardCheckoutUrl(options: {\n required?: number\n available?: number\n pack?: CreditPack\n} = {}): string {\n const params = new URLSearchParams()\n params.set('action', 'buy-credits')\n if (options.required) params.set('required', String(options.required))\n if (options.available) params.set('available', String(options.available))\n if (options.pack) params.set('pack', options.pack)\n return `https://dashboard.openconductor.ai?${params.toString()}`\n}\n\n/**\n * Create an error handler that automatically generates upgrade prompts\n * \n * @example\n * ```typescript\n * const handleError = createUpgradeErrorHandler({\n * onInsufficientCredits: (prompt) => {\n * return { error: prompt.shortMessage, upgradeUrl: prompt.packs.pro.url }\n * }\n * })\n * \n * // In your tool:\n * try {\n * return await paidHandler(input)\n * } catch (error) {\n * return handleError(error)\n * }\n * ```\n */\nexport function createUpgradeErrorHandler(handlers: {\n onInsufficientCredits?: (prompt: Awaited<ReturnType<typeof generateUpgradePrompt>>) => unknown\n onSubscriptionRequired?: (error: SubscriptionRequiredError) => unknown\n onPaymentRequired?: (error: PaymentRequiredError) => unknown\n onOtherError?: (error: Error) => unknown\n}) {\n return async (error: Error): Promise<unknown> => {\n if (error instanceof InsufficientCreditsError && handlers.onInsufficientCredits) {\n const prompt = await generateUpgradePrompt({\n required: error.data?.required as number,\n available: error.data?.available as number,\n })\n return handlers.onInsufficientCredits(prompt)\n }\n \n if (error instanceof SubscriptionRequiredError && handlers.onSubscriptionRequired) {\n return handlers.onSubscriptionRequired(error)\n }\n \n if (error instanceof PaymentRequiredError && handlers.onPaymentRequired) {\n return handlers.onPaymentRequired(error)\n }\n \n if (handlers.onOtherError) {\n return handlers.onOtherError(error)\n }\n \n throw error\n }\n}\n"]}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors/codes.ts","../src/errors/index.ts","../src/validate/index.ts","../src/logger/index.ts","../src/telemetry/index.ts","../src/server/index.ts","../src/payment/index.ts"],"names":[],"mappings":";;;;AAIO,IAAM,UAAA,GAAa;AAAA;AAAA,EAExB,WAAA,EAAa,MAAA;AAAA,EACb,eAAA,EAAiB,MAAA;AAAA,EACjB,gBAAA,EAAkB,MAAA;AAAA,EAClB,cAAA,EAAgB,MAAA;AAAA,EAChB,cAAA,EAAgB,MAAA;AAAA;AAAA,EAGhB,cAAA,EAAgB,MAAA;AAAA,EAChB,oBAAA,EAAsB,MAAA;AAAA,EACtB,kBAAA,EAAoB,MAAA;AAAA,EACpB,oBAAA,EAAsB,MAAA;AAAA,EACtB,mBAAA,EAAqB,MAAA;AAAA,EACrB,gBAAA,EAAkB,MAAA;AAAA,EAClB,aAAA,EAAe,MAAA;AAAA,EACf,gBAAA,EAAkB,MAAA;AAAA,EAClB,gBAAA,EAAkB,MAAA;AAAA,EAClB,mBAAA,EAAqB,MAAA;AAAA,EACrB,gBAAA,EAAkB,MAAA;AAAA,EAClB,oBAAA,EAAsB,MAAA;AAAA,EACtB,qBAAA,EAAuB;AACzB;;;AClBO,IAAM,QAAA,GAAN,cAAuB,KAAA,CAAM;AAAA,EAClB,IAAA;AAAA,EACA,IAAA;AAAA,EAEhB,WAAA,CACE,IAAA,EACA,OAAA,EACA,IAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,UAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAGZ,IAAA,IAAI,MAAM,iBAAA,EAAmB;AAC3B,MAAA,KAAA,CAAM,iBAAA,CAAkB,IAAA,EAAM,IAAA,CAAK,WAAW,CAAA;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAS;AACP,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,GAAI,IAAA,CAAK,IAAA,IAAQ,EAAE,IAAA,EAAM,KAAK,IAAA;AAAK,KACrC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CAAW,KAA6B,IAAA,EAAM;AAC5C,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,EAAA;AAAA,MACA,KAAA,EAAO,KAAK,MAAA;AAAO,KACrB;AAAA,EACF;AACF;AAKO,IAAM,eAAA,GAAN,cAA8B,QAAA,CAAS;AAAA,EAC5C,WAAA,CAAY,KAAA,EAAe,MAAA,EAAgB,KAAA,EAAiB;AAC1D,IAAA,KAAA,CAAM,WAAW,cAAA,EAAgB,CAAA,uBAAA,EAA0B,KAAK,CAAA,GAAA,EAAM,MAAM,CAAA,CAAA,EAAI;AAAA,MAC9E,KAAA;AAAA,MACA,MAAA;AAAA,MACA,GAAI,KAAA,KAAU,MAAA,IAAa,EAAE,KAAA;AAAM,KACpC,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AACF;AAKO,IAAM,iBAAA,GAAN,cAAgC,QAAA,CAAS;AAAA,EAC9C,YAAY,QAAA,EAAkB;AAC5B,IAAA,KAAA,CAAM,UAAA,CAAW,cAAA,EAAgB,CAAA,MAAA,EAAS,QAAQ,CAAA,WAAA,CAAA,EAAe;AAAA,MAC/D,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AAAA,EACd;AACF;AAKO,IAAM,kBAAA,GAAN,cAAiC,QAAA,CAAS;AAAA,EAC/C,WAAA,CAAY,QAAA,EAAkB,MAAA,EAAgB,KAAA,EAAe;AAC3D,IAAA,KAAA,CAAM,WAAW,oBAAA,EAAsB,CAAA,MAAA,EAAS,QAAQ,CAAA,UAAA,EAAa,MAAM,CAAA,CAAA,EAAI;AAAA,MAC7E,IAAA,EAAM,QAAA;AAAA,MACN,MAAA;AAAA,MACA,GAAI,KAAA,IAAS,EAAE,KAAA,EAAO,MAAM,OAAA;AAAQ,KACrC,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AAAA,EACd;AACF;AAKO,IAAM,qBAAA,GAAN,cAAoC,QAAA,CAAS;AAAA,EAClD,YAAY,WAAA,EAAqB;AAC/B,IAAA,KAAA,CAAM,UAAA,CAAW,kBAAA,EAAoB,CAAA,UAAA,EAAa,WAAW,CAAA,WAAA,CAAA,EAAe;AAAA,MAC1E,GAAA,EAAK;AAAA,KACN,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,uBAAA;AAAA,EACd;AACF;AAKO,IAAM,mBAAA,GAAN,cAAkC,QAAA,CAAS;AAAA,EAChD,WAAA,CAAY,SAAiB,yBAAA,EAA2B;AACtD,IAAA,KAAA,CAAM,UAAA,CAAW,sBAAsB,MAAM,CAAA;AAC7C,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AAAA,EACd;AACF;AAKO,IAAM,kBAAA,GAAN,cAAiC,QAAA,CAAS;AAAA,EAC/C,WAAA,CAAY,QAAgB,QAAA,EAAmB;AAC7C,IAAA,MAAM,GAAA,GAAM,WACR,CAAA,kBAAA,EAAqB,MAAM,QAAQ,QAAQ,CAAA,CAAA,CAAA,GAC3C,qBAAqB,MAAM,CAAA,CAAA;AAC/B,IAAA,KAAA,CAAM,UAAA,CAAW,qBAAqB,GAAA,EAAK;AAAA,MACzC,MAAA;AAAA,MACA,GAAI,QAAA,IAAY,EAAE,QAAA;AAAS,KAC5B,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AAAA,EACd;AACF;AAKO,IAAM,cAAA,GAAN,cAA6B,QAAA,CAAS;AAAA,EAC3C,YAAY,YAAA,EAAuB;AACjC,IAAA,KAAA,CAAM,UAAA,CAAW,kBAAkB,qBAAA,EAAuB;AAAA,MACxD,GAAI,YAAA,IAAgB,EAAE,YAAA;AAAa,KACpC,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AAAA,EACd;AACF;AAKO,IAAM,YAAA,GAAN,cAA2B,QAAA,CAAS;AAAA,EACzC,WAAA,CAAY,WAAmB,SAAA,EAAmB;AAChD,IAAA,KAAA,CAAM,WAAW,aAAA,EAAe,CAAA,WAAA,EAAc,SAAS,CAAA,kBAAA,EAAqB,SAAS,CAAA,EAAA,CAAA,EAAM;AAAA,MACzF,SAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AAAA,EACd;AACF;AAKO,IAAM,eAAA,GAAN,cAA8B,QAAA,CAAS;AAAA,EAC5C,WAAA,CAAY,YAAoB,MAAA,EAAgB;AAC9C,IAAA,KAAA,CAAM,WAAW,gBAAA,EAAkB,CAAA,YAAA,EAAe,UAAU,CAAA,eAAA,EAAkB,MAAM,CAAA,CAAA,EAAI;AAAA,MACtF,UAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AACF;AAKO,IAAM,kBAAA,GAAN,cAAiC,QAAA,CAAS;AAAA,EAC/C,WAAA,CAAY,SAAiB,MAAA,EAAgB;AAC3C,IAAA,KAAA,CAAM,WAAW,mBAAA,EAAqB,CAAA,uBAAA,EAA0B,OAAO,CAAA,GAAA,EAAM,MAAM,CAAA,CAAA,EAAI;AAAA,MACrF,OAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AAAA,EACd;AACF;AAKO,IAAM,oBAAA,GAAN,cAAmC,QAAA,CAAS;AAAA,EACjD,WAAA,CAAY,UAAkB,OAAA,EAAqD;AACjF,IAAA,KAAA,CAAM,UAAA,CAAW,gBAAA,EAAkB,CAAA,yBAAA,EAA4B,QAAQ,CAAA,CAAA,CAAA,EAAK;AAAA,MAC1E,IAAA,EAAM,QAAA;AAAA,MACN,GAAI,OAAA,EAAS,UAAA,IAAc,EAAE,UAAA,EAAY,QAAQ,UAAA,EAAW;AAAA,MAC5D,GAAI,OAAA,EAAS,OAAA,IAAW,EAAE,OAAA,EAAS,QAAQ,OAAA;AAAQ,KACpD,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AAAA,EACd;AACF;AAKO,IAAM,wBAAA,GAAN,cAAuC,QAAA,CAAS;AAAA,EACrD,WAAA,CAAY,QAAA,EAAkB,SAAA,EAAmB,OAAA,EAAoC;AACnF,IAAA,KAAA,CAAM,WAAW,oBAAA,EAAsB,CAAA,2BAAA,EAA8B,QAAQ,CAAA,OAAA,EAAU,SAAS,CAAA,CAAA,EAAI;AAAA,MAClG,QAAA;AAAA,MACA,SAAA;AAAA,MACA,GAAI,OAAA,EAAS,WAAA,IAAe,EAAE,WAAA,EAAa,QAAQ,WAAA;AAAY,KAChE,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,0BAAA;AAAA,EACd;AACF;AAKO,IAAM,yBAAA,GAAN,cAAwC,QAAA,CAAS;AAAA,EACtD,WAAA,CAAY,YAAA,EAAsB,WAAA,EAAsB,OAAA,EAAmC;AACzF,IAAA,MAAM,GAAA,GAAM,cACR,CAAA,cAAA,EAAiB,YAAY,yBAAyB,WAAW,CAAA,EAAA,CAAA,GACjE,iBAAiB,YAAY,CAAA,UAAA,CAAA;AACjC,IAAA,KAAA,CAAM,UAAA,CAAW,uBAAuB,GAAA,EAAK;AAAA,MAC3C,YAAA;AAAA,MACA,GAAI,WAAA,IAAe,EAAE,WAAA,EAAY;AAAA,MACjC,GAAI,OAAA,EAAS,UAAA,IAAc,EAAE,UAAA,EAAY,QAAQ,UAAA;AAAW,KAC7D,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,2BAAA;AAAA,EACd;AACF;AC1MO,SAAS,QAAA,CACd,MAAA,EACA,KAAA,EACA,OAAA,GAA2B,EAAC,EACzB;AACH,EAAA,MAAM,EAAE,YAAA,GAAe,IAAA,EAAK,GAAI,OAAA;AAEhC,EAAA,MAAM,SACJ,YAAA,GACI,MAAA,CAAO,SAAA,CAAU,KAAK,IACtB,MAAA,YAAkB,CAAA,CAAE,SAAA,GAClB,MAAA,CAAO,QAAO,CAAE,SAAA,CAAU,KAAK,CAAA,GAC/B,MAAA,CAAO,UAAU,KAAK,CAAA;AAG9B,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA;AACxC,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,IAAK,OAAA;AAC3C,IAAA,MAAM,SAAS,UAAA,CAAW,OAAA;AAC1B,IAAA,MAAM,IAAI,eAAA;AAAA,MAAgB,KAAA;AAAA,MAAO,MAAA;AAAA,MAAQ,UAAA,CAAW,KAAK,MAAA,GAAS,CAAA,GAC9D,eAAe,KAAA,EAAO,UAAA,CAAW,IAAI,CAAA,GACrC;AAAA,KACJ;AAAA,EACF;AAEA,EAAA,OAAO,MAAA,CAAO,IAAA;AAChB;AAMO,SAAS,aAAA,CACd,MAAA,EACA,OAAA,EACA,OAAA,GAA2B,EAAC,EACU;AACtC,EAAA,OAAO,OAAO,KAAA,KAAmB;AAC/B,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,MAAA,EAAQ,KAAA,EAAO,OAAO,CAAA;AACjD,IAAA,OAAO,QAAQ,SAAS,CAAA;AAAA,EAC1B,CAAA;AACF;AAMA,SAAS,cAAA,CAAe,KAAc,IAAA,EAAoC;AACxE,EAAA,IAAI,OAAA,GAAU,GAAA;AACd,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,IAAI,OAAA,KAAY,IAAA,IAAQ,OAAA,KAAY,MAAA,EAAW,OAAO,MAAA;AACtD,IAAA,OAAA,GAAW,QAA6C,GAAG,CAAA;AAAA,EAC7D;AACA,EAAA,OAAO,OAAA;AACT;AAKO,IAAM,OAAA,GAAU;AAAA;AAAA,EAErB,gBAAgB,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,GAAG,iBAAiB,CAAA;AAAA;AAAA,EAGnD,aAAa,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,GAAM,QAAA,EAAS;AAAA;AAAA,EAGvC,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,EAAI,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,QAAQ,EAAE,CAAA;AAAA;AAAA,EAGlD,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AAAA;AAAA,EAGzC,GAAA,EAAK,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,EAAI;AAAA;AAAA,EAGpB,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,CAAE,KAAA,EAAM;AAAA;AAAA,EAGxB,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,IAAA,EAAK;AAAA;AAAA,EAGtB,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAG7B,UAAA,EAAY,EAAE,KAAA,CAAM;AAAA,IAClB,EAAE,OAAA,EAAQ;AAAA,IACV,CAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,OAAO,CAAC,CAAA,CAAE,SAAA,CAAU,CAAA,CAAA,KAAK,CAAA,KAAM,MAAM;AAAA,GACtD;AACH;;;ACzFA,IAAM,cAAA,GAA2C;AAAA,EAC/C,KAAA,EAAO,CAAA;AAAA,EACP,IAAA,EAAM,CAAA;AAAA,EACN,IAAA,EAAM,CAAA;AAAA,EACN,KAAA,EAAO;AACT,CAAA;AAKO,SAAS,YAAA,CAAa,OAAA,EAAiB,OAAA,GAAyB,EAAC,EAAG;AACzE,EAAA,MAAM;AAAA,IACJ,OAAO,QAAA,GAAW,MAAA;AAAA,IAClB,UAAA,GAAa,IAAA;AAAA,IACb,MAAA,GAAS;AAAA,GACX,GAAI,OAAA;AAEJ,EAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KAA6B;AAC9C,IAAA,OAAO,cAAA,CAAe,KAAK,CAAA,IAAK,cAAA,CAAe,QAAQ,CAAA;AAAA,EACzD,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAA4B;AAC/C,IAAA,OAAO,MAAA,GAAS,KAAK,SAAA,CAAU,KAAA,EAAO,MAAM,CAAC,CAAA,GAAI,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AAAA,EACvE,CAAA;AAEA,EAAA,MAAM,GAAA,GAAM,CAAC,KAAA,EAAiB,OAAA,EAAiB,IAAA,KAAmC;AAChF,IAAA,IAAI,CAAC,SAAA,CAAU,KAAK,CAAA,EAAG;AAEvB,IAAA,MAAM,KAAA,GAAkB;AAAA,MACtB,GAAI,cAAc,EAAE,SAAA,EAAA,qBAAe,IAAA,EAAK,EAAE,aAAY,EAAE;AAAA,MACxD,KAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,GAAG;AAAA,KACL;AAEA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,OAAA,CAAQ,OAAO,KAAK,CAAA;AAAA,IACtB,CAAA,MAAO;AACL,MAAA,MAAM,SAAA,GAAY,YAAY,KAAK,CAAA;AACnC,MAAA,QAAQ,KAAA;AAAO,QACb,KAAK,OAAA;AACH,UAAA,OAAA,CAAQ,MAAM,SAAS,CAAA;AACvB,UAAA;AAAA,QACF,KAAK,MAAA;AACH,UAAA,OAAA,CAAQ,KAAK,SAAS,CAAA;AACtB,UAAA;AAAA,QACF,KAAK,MAAA;AACH,UAAA,OAAA,CAAQ,KAAK,SAAS,CAAA;AACtB,UAAA;AAAA,QACF,KAAK,OAAA;AACH,UAAA,OAAA,CAAQ,MAAM,SAAS,CAAA;AACvB,UAAA;AAAA;AACJ,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,OAAO,CAAC,OAAA,EAAiB,SAAmC,GAAA,CAAI,OAAA,EAAS,SAAS,IAAI,CAAA;AAAA,IACtF,MAAM,CAAC,OAAA,EAAiB,SAAmC,GAAA,CAAI,MAAA,EAAQ,SAAS,IAAI,CAAA;AAAA,IACpF,MAAM,CAAC,OAAA,EAAiB,SAAmC,GAAA,CAAI,MAAA,EAAQ,SAAS,IAAI,CAAA;AAAA,IACpF,OAAO,CAAC,OAAA,EAAiB,SAAmC,GAAA,CAAI,OAAA,EAAS,SAAS,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA,IAKtF,KAAA,EAAO,CAAC,OAAA,KAAqC;AAC3C,MAAA,OAAO,aAAa,OAAA,EAAS;AAAA,QAC3B,GAAG,OAAA;AAAA,QACH,MAAA,EAAQ,CAAC,KAAA,KAAU;AACjB,UAAA,MAAM,MAAA,GAAS,EAAE,GAAG,KAAA,EAAO,GAAG,OAAA,EAAQ;AACtC,UAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,YAAA,OAAA,CAAQ,OAAO,MAAM,CAAA;AAAA,UACvB,CAAA,MAAO;AACL,YAAA,MAAM,SAAA,GAAY,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,MAAM,CAAC,CAAA,GAAI,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAClF,YAAA,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,CAAE,SAAS,CAAA;AAAA,UAChC;AAAA,QACF;AAAA,OACD,CAAA;AAAA,IACH;AAAA,GACF;AACF;;;ACpEA,IAAM,WAAA,GAAc,OAAA;AACpB,IAAM,gBAAA,GAAmB,qDAAA;AAEzB,IAAI,eAAA,GAAoC,IAAA;AAMjC,SAAS,cAAc,MAAA,EAAoC;AAChE,EAAA,eAAA,GAAkB,IAAI,UAAU,MAAM,CAAA;AACtC,EAAA,OAAO,eAAA;AACT;AAKO,SAAS,YAAA,GAAiC;AAC/C,EAAA,OAAO,eAAA;AACT;AAGO,IAAM,YAAN,MAAgB;AAAA,EACb,MAAA;AAAA,EACA,SAAuB,EAAC;AAAA,EACxB,UAAA,GAAoD,IAAA;AAAA,EAE5D,YAAY,MAAA,EAAyB;AACnC,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,eAAe,MAAA,CAAO,aAAA;AAAA,MACtB,QAAA,EAAU,OAAO,QAAA,IAAY,gBAAA;AAAA,MAC7B,SAAA,EAAW,OAAO,SAAA,IAAa,EAAA;AAAA,MAC/B,aAAA,EAAe,OAAO,aAAA,IAAiB,GAAA;AAAA,MACvC,KAAA,EAAO,OAAO,KAAA,IAAS;AAAA,KACzB;AAGA,IAAA,IAAA,CAAK,UAAA,GAAa,YAAY,MAAM;AAClC,MAAA,IAAA,CAAK,OAAM,CAAE,KAAA,CAAM,KAAK,WAAA,CAAY,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IAChD,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,aAAa,CAAA;AAG5B,IAAA,IAAI,OAAO,YAAY,WAAA,EAAa;AAClC,MAAA,OAAA,CAAQ,EAAA,CAAG,YAAA,EAAc,MAAM,IAAA,CAAK,OAAO,CAAA;AAC3C,MAAA,OAAA,CAAQ,EAAA,CAAG,UAAU,MAAM;AACzB,QAAA,IAAA,CAAK,OAAM,CAAE,OAAA,CAAQ,MAAM,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,MAC5C,CAAC,CAAA;AACD,MAAA,OAAA,CAAQ,EAAA,CAAG,WAAW,MAAM;AAC1B,QAAA,IAAA,CAAK,OAAM,CAAE,OAAA,CAAQ,MAAM,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,MAC5C,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,IAAA,CAAK,IAAI,uBAAA,EAAyB,EAAE,UAAA,EAAY,MAAA,CAAO,YAAY,CAAA;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,CACE,IAAA,EACA,QAAA,EACA,OAAA,EACA,KAAA,EACM;AACN,IAAA,MAAM,MAAA,GAAqB;AAAA,MACzB,IAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,GAAI,KAAA,IAAS,EAAE,KAAA,EAAM;AAAA,MACrB,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACpC;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,MAAM,CAAA;AACvB,IAAA,IAAA,CAAK,GAAA,CAAI,gBAAA,EAAkB,EAAE,GAAG,QAAQ,CAAA;AAGxC,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,IAAU,IAAA,CAAK,OAAO,SAAA,EAAW;AAC/C,MAAA,IAAA,CAAK,OAAM,CAAE,KAAA,CAAM,KAAK,WAAA,CAAY,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAE9B,IAAA,MAAM,OAAA,GAAU,CAAC,GAAG,IAAA,CAAK,MAAM,CAAA;AAC/B,IAAA,IAAA,CAAK,SAAS,EAAC;AAEf,IAAA,MAAM,KAAA,GAAwB;AAAA,MAC5B,UAAA,EAAY,KAAK,MAAA,CAAO,UAAA;AAAA,MACxB,aAAA,EAAe,KAAK,MAAA,CAAO,aAAA;AAAA,MAC3B,OAAA;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,UAAA,EAAY,WAAA;AAAA,QACZ,WAAA,EAAa,OAAO,OAAA,KAAY,WAAA,GAAc,QAAQ,OAAA,GAAU,SAAA;AAAA,QAChE,QAAA,EAAU,OAAO,OAAA,KAAY,WAAA,GAAc,QAAQ,QAAA,GAAW;AAAA;AAChE,KACF;AAEA,IAAA,IAAA,CAAK,IAAI,kBAAA,EAAoB,EAAE,KAAA,EAAO,OAAA,CAAQ,QAAQ,CAAA;AAEtD,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,IAAA,CAAK,OAAO,QAAA,EAAU;AAAA,QACjD,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,eAAA,EAAiB,CAAA,OAAA,EAAU,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,CAAA;AAAA,UAC7C,qBAAA,EAAuB;AAAA,SACzB;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAK;AAAA,OAC3B,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,MAAM,CAAA,wBAAA,EAA2B,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,MACrF;AAEA,MAAA,IAAA,CAAK,IAAI,8BAAA,EAAgC,EAAE,KAAA,EAAO,OAAA,CAAQ,QAAQ,CAAA;AAAA,IACpE,SAAS,KAAA,EAAO;AAEd,MAAA,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,OAAO,CAAA;AAC9B,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAiB;AACf,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,aAAA,CAAc,KAAK,UAAU,CAAA;AAC7B,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,IACpB;AACA,IAAA,IAAA,CAAK,OAAM,CAAE,KAAA,CAAM,KAAK,WAAA,CAAY,IAAA,CAAK,IAAI,CAAC,CAAA;AAC9C,IAAA,IAAA,CAAK,IAAI,oBAAoB,CAAA;AAAA,EAC/B;AAAA,EAEQ,GAAA,CAAI,SAAiB,IAAA,EAAsC;AACjE,IAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,MAAA,OAAA,CAAQ,KAAA,CAAM,KAAK,SAAA,CAAU;AAAA,QAC3B,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAClC,KAAA,EAAO,OAAA;AAAA,QACP,OAAA,EAAS,yBAAA;AAAA,QACT,OAAA;AAAA,QACA,GAAG;AAAA,OACJ,CAAC,CAAA;AAAA,IACJ;AAAA,EACF;AAAA,EAEQ,YAAY,KAAA,EAAsB;AACxC,IAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,MAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AAAA,IACxD;AAAA,EACF;AACF;;;ACxKO,SAAS,kBAAkB,IAAA,EAAuB;AACvD,EAAA,OAAO,YAA0C;AAC/C,IAAA,MAAM,SAAkC,EAAC;AACzC,IAAA,IAAI,UAAA,GAAa,IAAA;AAEjB,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,KAAA,MAAW,CAAC,MAAM,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,EAAG;AACvD,QAAA,IAAI;AACF,UAAA,MAAA,CAAO,IAAI,CAAA,GAAI,MAAM,KAAA,EAAM;AAC3B,UAAA,IAAI,CAAC,MAAA,CAAO,IAAI,CAAA,EAAG,UAAA,GAAa,KAAA;AAAA,QAClC,CAAA,CAAA,MAAQ;AACN,UAAA,MAAA,CAAO,IAAI,CAAA,GAAI,KAAA;AACf,UAAA,UAAA,GAAa,KAAA;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,aAAa,SAAA,GAAY,UAAA;AAAA,MACjC,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,GAAI,IAAA,CAAK,WAAA,IAAe,EAAE,WAAA,EAAa,KAAK,WAAA,EAAY;AAAA,MACxD,GAAI,IAAA,CAAK,MAAA,IAAU,EAAE,MAAA,EAAQ,IAAA,CAAK,QAAO,EAAE;AAAA,MAC3C,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,GAAI,OAAO,IAAA,CAAK,MAAM,EAAE,MAAA,GAAS,CAAA,IAAK,EAAE,MAAA;AAAO,KACjD;AAAA,EACF,CAAA;AACF;AA4BO,SAAS,QAAA,CACd,SACA,OAAA,EACqC;AACrC,EAAA,MAAM;AAAA,IACJ,IAAA;AAAA,IACA,OAAA,GAAU,GAAA;AAAA,IACV,WAAW,eAAA,GAAkB;AAAA,GAC/B,GAAI,OAAA;AAEJ,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,MAAA,IAAU,YAAA,CAAa,IAAI,CAAA;AAEtD,EAAA,OAAO,OAAO,KAAA,KAAoC;AAChD,IAAA,MAAM,SAAS,cAAA,EAAe;AAC9B,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,GAAA,GAAM,UAAA,CAAW,KAAA,CAAM,EAAE,QAAQ,CAAA;AAEvC,IAAA,MAAM,GAAA,GAAmB,EAAE,MAAA,EAAQ,IAAA,EAAM,WAAW,GAAA,EAAI;AAExD,IAAA,GAAA,CAAI,IAAA,CAAK,gBAAgB,EAAE,IAAA,EAAM,MAAM,KAAA,EAAO,aAAA,CAAc,KAAK,CAAA,EAAG,CAAA;AAEpE,IAAA,IAAI;AAEF,MAAA,MAAM,cAAA,GAAiB,IAAI,OAAA,CAAe,CAAC,GAAG,MAAA,KAAW;AACvD,QAAA,UAAA,CAAW,MAAM;AACf,UAAA,MAAA,CAAO,IAAI,YAAA,CAAa,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,QACxC,GAAG,OAAO,CAAA;AAAA,MACZ,CAAC,CAAA;AAGD,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,IAAA,CAAK;AAAA,QAChC,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAC,CAAA;AAAA,QACnC;AAAA,OACD,CAAA;AAED,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC9B,MAAA,GAAA,CAAI,KAAK,gBAAA,EAAkB,EAAE,IAAA,EAAM,IAAA,EAAM,UAAU,CAAA;AAGnD,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,MAAM,MAAM,YAAA,EAAa;AACzB,QAAA,GAAA,EAAK,aAAA,CAAc,IAAA,EAAM,QAAA,EAAU,IAAI,CAAA;AAAA,MACzC;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC9B,MAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAE1E,MAAA,GAAA,CAAI,MAAM,aAAA,EAAe;AAAA,QACvB,IAAA,EAAM,IAAA;AAAA,QACN,QAAA;AAAA,QACA,KAAA,EAAO,YAAA;AAAA,QACP,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,KAAA,GAAQ;AAAA,OAC/C,CAAA;AAGD,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,MAAM,MAAM,YAAA,EAAa;AACzB,QAAA,GAAA,EAAK,aAAA,CAAc,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,YAAY,CAAA;AAAA,MACxD;AAGA,MAAA,IAAI,iBAAiB,QAAA,EAAU;AAC7B,QAAA,MAAM,KAAA;AAAA,MACR;AAEA,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,IAAA;AAAA,QACA,YAAA;AAAA,QACA,KAAA,YAAiB,QAAQ,KAAA,GAAQ;AAAA,OACnC;AAAA,IACF;AAAA,EACF,CAAA;AACF;AAKA,SAAS,cAAA,GAAyB;AAChC,EAAA,OAAO,GAAG,IAAA,CAAK,GAAA,EAAI,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,EAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAC7E;AAKA,SAAS,cAAc,KAAA,EAAyB;AAC9C,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,MAAM,OAAO,KAAA;AAExD,EAAA,MAAM,gBAAgB,CAAC,UAAA,EAAY,SAAS,QAAA,EAAU,KAAA,EAAO,QAAQ,YAAY,CAAA;AACjF,EAAA,MAAM,YAAqC,EAAC;AAE5C,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAgC,CAAA,EAAG;AAC3E,IAAA,IAAI,aAAA,CAAc,KAAK,CAAA,CAAA,KAAK,GAAA,CAAI,aAAY,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG;AAC1D,MAAA,SAAA,CAAU,GAAG,CAAA,GAAI,YAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,GAAG,CAAA,GAAI,KAAA;AAAA,IACnB;AAAA,EACF;AAEA,EAAA,OAAO,SAAA;AACT;;;ACjHA,IAAI,aAAA,GAAsC,IAAA;AAanC,SAAS,YAAY,MAAA,EAA6B;AACvD,EAAA,aAAA,GAAgB;AAAA,IACd,MAAA,EAAQ,8BAAA;AAAA,IACR,QAAA,EAAU,KAAA;AAAA,IACV,GAAG;AAAA,GACL;AACF;AAKO,SAAS,gBAAA,GAAyC;AACvD,EAAA,OAAO,aAAA;AACT;AAmBA,eAAe,aAAa,MAAA,EAAoD;AAC9E,EAAA,MAAM,MAAA,GAAS,aAAA;AACf,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,kBAAA,CAAmB,SAAA,EAAW,oDAAoD,CAAA;AAAA,EAC9F;AAGA,EAAA,IAAI,OAAO,QAAA,EAAU;AACnB,IAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,MAAM,MAAA,EAAO;AAAA,EACtD;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,2BAAA,CAAA,EAA+B;AAAA,MAC1E,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,eAAA,EAAiB,CAAA,OAAA,EAAU,MAAA,CAAO,MAAM,CAAA;AAAA,OAC1C;AAAA,MACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,MAAM,MAAA,CAAO;AAAA,OACd;AAAA,KACF,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAEhB,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,MAAA,OAAA,CAAQ,KAAA,CAAM,iCAAA,EAAmC,QAAA,CAAS,MAAA,EAAQ,SAAS,CAAA;AAC3E,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,6BAAA;AAAA,QACR,WAAW,MAAA,CAAO;AAAA,OACpB;AAAA,IACF;AAEA,IAAA,OAAO,MAAM,SAAS,IAAA,EAAK;AAAA,EAC7B,SAAS,KAAA,EAAO;AAEd,IAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,KAAK,CAAA;AACrD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,MAAA,EAAQ,iCAAA;AAAA,MACR,WAAW,MAAA,CAAO;AAAA,KACpB;AAAA,EACF;AACF;AAEA,eAAe,cAAc,MAAA,EAA+C;AAC1E,EAAA,MAAM,MAAA,GAAS,aAAA;AACf,EAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AAGpB,EAAA,IAAI,MAAA,CAAO,UAAU,OAAO,IAAA;AAE5B,EAAA,IAAI;AACF,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,4BAAA,CAAA,EAAgC;AAAA,MAC3E,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,eAAA,EAAiB,CAAA,OAAA,EAAU,MAAA,CAAO,MAAM,CAAA;AAAA,OAC1C;AAAA,MACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,MAAM,MAAA,CAAO,QAAA;AAAA,QACb,QAAQ,MAAA,CAAO;AAAA,OAChB;AAAA,KACF,CAAA;AAED,IAAA,OAAO,QAAA,CAAS,EAAA;AAAA,EAClB,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,qCAAqC,KAAK,CAAA;AACxD,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAMA,SAAS,oBAAoB,GAAA,EAAmD;AAC9E,EAAA,OAAO,SAAA,IAAa,GAAA,IAAO,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA;AACpD;AAEA,SAAS,0BAA0B,GAAA,EAAyD;AAC1F,EAAA,OAAO,MAAA,IAAU,GAAA,IAAO,OAAO,GAAA,CAAI,IAAA,KAAS,QAAA;AAC9C;AAEA,SAAS,oBAAoB,GAAA,EAAmD;AAC9E,EAAA,OAAO,SAAA,IAAa,GAAA,IAAO,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA;AACpD;AAoCO,SAAS,cAAA,CACd,WAAA,EACA,OAAA,GAAiC,EAAC,EAClC;AACA,EAAA,OAAO,CACL,OAAA,KAC0C;AAE1C,IAAA,MAAM,EAAE,QAAA,GAAW,SAAA,EAAW,SAAA,EAAU,GAAI,OAAA;AAE5C,IAAA,OAAO,OAAO,KAAA,KAAoC;AAEhD,MAAA,MAAM,MAAA,GAAS,SAAA,GAAY,KAAK,CAAA,IAAK,KAAA,CAAM,MAAA;AAE3C,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAM,IAAI,qBAAqB,QAAA,EAAU;AAAA,UACvC,YAAY,aAAA,EAAe;AAAA,SAC5B,CAAA;AAAA,MACH;AAGA,MAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa;AAAA,QAChC,MAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AAEnB,QAAA,IAAI,mBAAA,CAAoB,WAAW,CAAA,EAAG;AACpC,UAAA,MAAM,IAAI,wBAAA;AAAA,YACR,WAAA,CAAY,OAAA;AAAA,YACZ,OAAO,OAAA,IAAW,CAAA;AAAA,YAClB,EAAE,WAAA,EAAa,MAAA,CAAO,SAAA;AAAU,WAClC;AAAA,QACF;AAEA,QAAA,IAAI,yBAAA,CAA0B,WAAW,CAAA,EAAG;AAC1C,UAAA,MAAM,IAAI,yBAAA;AAAA,YACR,WAAA,CAAY,IAAA;AAAA,YACZ,MAAA,CAAO,IAAA;AAAA,YACP,EAAE,UAAA,EAAY,MAAA,CAAO,SAAA;AAAU,WACjC;AAAA,QACF;AAGA,QAAA,MAAM,IAAI,qBAAqB,QAAA,EAAU;AAAA,UACvC,YAAY,MAAA,CAAO,SAAA;AAAA,UACnB,GAAI,mBAAA,CAAoB,WAAW,KAAK,EAAE,OAAA,EAAS,YAAY,OAAA;AAAQ,SACxE,CAAA;AAAA,MACH;AAGA,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,KAAK,CAAA;AAGlC,MAAA,IAAI,mBAAA,CAAoB,WAAW,CAAA,EAAG;AACpC,QAAA,MAAM,aAAA,CAAc;AAAA,UAClB,MAAA;AAAA,UACA,SAAS,WAAA,CAAY,OAAA;AAAA,UACrB;AAAA,SACD,CAAA;AAAA,MACH;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,EACF,CAAA;AACF;AAqBO,SAAS,eAA4D,MAAA,EAKpC;AACtC,EAAA,OAAO,cAAA,CAAgC,OAAO,OAAA,EAAS;AAAA,IACrD,UAAU,MAAA,CAAO,IAAA;AAAA,IACjB,WAAW,MAAA,CAAO;AAAA,GACnB,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AACnB;AAcA,eAAsB,aAAA,CACpB,MAAA,EACA,WAAA,EACA,QAAA,GAAmB,OAAA,EACK;AACxB,EAAA,OAAO,YAAA,CAAa,EAAE,MAAA,EAAQ,WAAA,EAAa,UAAU,CAAA;AACvD;AAKA,eAAsB,qBAAqB,MAAA,EAIjC;AACR,EAAA,MAAM,MAAA,GAAS,aAAA;AACf,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,IAAI,OAAO,QAAA,EAAU;AACnB,IAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,QAAQ,IAAA,EAAK;AAAA,EACrD;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,OAAO,MAAM,CAAA,6BAAA,EAAgC,MAAM,CAAA,CAAA,EAAI;AAAA,MACrF,OAAA,EAAS;AAAA,QACP,eAAA,EAAiB,CAAA,OAAA,EAAU,MAAA,CAAO,MAAM,CAAA;AAAA;AAC1C,KACD,CAAA;AAED,IAAA,IAAI,CAAC,QAAA,CAAS,EAAA,EAAI,OAAO,IAAA;AACzB,IAAA,OAAO,MAAM,SAAS,IAAA,EAAK;AAAA,EAC7B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF","file":"index.mjs","sourcesContent":["/**\n * JSON-RPC 2.0 Standard Error Codes\n * https://www.jsonrpc.org/specification#error_object\n */\nexport const ErrorCodes = {\n // JSON-RPC 2.0 Standard Errors\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603,\n\n // MCP-Specific Errors (-32000 to -32099 reserved for implementation)\n TOOL_NOT_FOUND: -32001,\n TOOL_EXECUTION_ERROR: -32002,\n RESOURCE_NOT_FOUND: -32003,\n AUTHENTICATION_ERROR: -32004,\n AUTHORIZATION_ERROR: -32005,\n RATE_LIMIT_ERROR: -32006,\n TIMEOUT_ERROR: -32007,\n VALIDATION_ERROR: -32008,\n DEPENDENCY_ERROR: -32009,\n CONFIGURATION_ERROR: -32010,\n PAYMENT_REQUIRED: -32011,\n INSUFFICIENT_CREDITS: -32012,\n SUBSCRIPTION_REQUIRED: -32013,\n} as const\n\nexport type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes]\n","import { ErrorCodes, type ErrorCode } from './codes'\n\nexport { ErrorCodes, type ErrorCode } from './codes'\n\n/**\n * Base error class for MCP servers\n * Formats errors according to JSON-RPC 2.0 specification\n */\nexport class MCPError extends Error {\n public readonly code: ErrorCode\n public readonly data?: Record<string, unknown>\n\n constructor(\n code: ErrorCode,\n message: string,\n data?: Record<string, unknown>\n ) {\n super(message)\n this.name = 'MCPError'\n this.code = code\n this.data = data\n\n // Maintains proper stack trace in V8 environments\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor)\n }\n }\n\n /**\n * Returns JSON-RPC 2.0 formatted error object\n */\n toJSON() {\n return {\n code: this.code,\n message: this.message,\n ...(this.data && { data: this.data }),\n }\n }\n\n /**\n * Create error response for JSON-RPC\n */\n toResponse(id: string | number | null = null) {\n return {\n jsonrpc: '2.0' as const,\n id,\n error: this.toJSON(),\n }\n }\n}\n\n/**\n * Thrown when tool input validation fails\n */\nexport class ValidationError extends MCPError {\n constructor(field: string, reason: string, value?: unknown) {\n super(ErrorCodes.INVALID_PARAMS, `Validation failed for '${field}': ${reason}`, {\n field,\n reason,\n ...(value !== undefined && { value }),\n })\n this.name = 'ValidationError'\n }\n}\n\n/**\n * Thrown when a requested tool doesn't exist\n */\nexport class ToolNotFoundError extends MCPError {\n constructor(toolName: string) {\n super(ErrorCodes.TOOL_NOT_FOUND, `Tool '${toolName}' not found`, {\n tool: toolName,\n })\n this.name = 'ToolNotFoundError'\n }\n}\n\n/**\n * Thrown when tool execution fails\n */\nexport class ToolExecutionError extends MCPError {\n constructor(toolName: string, reason: string, cause?: Error) {\n super(ErrorCodes.TOOL_EXECUTION_ERROR, `Tool '${toolName}' failed: ${reason}`, {\n tool: toolName,\n reason,\n ...(cause && { cause: cause.message }),\n })\n this.name = 'ToolExecutionError'\n }\n}\n\n/**\n * Thrown when a requested resource doesn't exist\n */\nexport class ResourceNotFoundError extends MCPError {\n constructor(resourceUri: string) {\n super(ErrorCodes.RESOURCE_NOT_FOUND, `Resource '${resourceUri}' not found`, {\n uri: resourceUri,\n })\n this.name = 'ResourceNotFoundError'\n }\n}\n\n/**\n * Thrown when authentication fails\n */\nexport class AuthenticationError extends MCPError {\n constructor(reason: string = 'Authentication required') {\n super(ErrorCodes.AUTHENTICATION_ERROR, reason)\n this.name = 'AuthenticationError'\n }\n}\n\n/**\n * Thrown when authorization fails (authenticated but not permitted)\n */\nexport class AuthorizationError extends MCPError {\n constructor(action: string, resource?: string) {\n const msg = resource\n ? `Not authorized to ${action} on '${resource}'`\n : `Not authorized to ${action}`\n super(ErrorCodes.AUTHORIZATION_ERROR, msg, {\n action,\n ...(resource && { resource }),\n })\n this.name = 'AuthorizationError'\n }\n}\n\n/**\n * Thrown when rate limits are exceeded\n */\nexport class RateLimitError extends MCPError {\n constructor(retryAfterMs?: number) {\n super(ErrorCodes.RATE_LIMIT_ERROR, 'Rate limit exceeded', {\n ...(retryAfterMs && { retryAfterMs }),\n })\n this.name = 'RateLimitError'\n }\n}\n\n/**\n * Thrown when an operation times out\n */\nexport class TimeoutError extends MCPError {\n constructor(operation: string, timeoutMs: number) {\n super(ErrorCodes.TIMEOUT_ERROR, `Operation '${operation}' timed out after ${timeoutMs}ms`, {\n operation,\n timeoutMs,\n })\n this.name = 'TimeoutError'\n }\n}\n\n/**\n * Thrown when a required dependency is unavailable\n */\nexport class DependencyError extends MCPError {\n constructor(dependency: string, reason: string) {\n super(ErrorCodes.DEPENDENCY_ERROR, `Dependency '${dependency}' unavailable: ${reason}`, {\n dependency,\n reason,\n })\n this.name = 'DependencyError'\n }\n}\n\n/**\n * Thrown when server configuration is invalid\n */\nexport class ConfigurationError extends MCPError {\n constructor(setting: string, reason: string) {\n super(ErrorCodes.CONFIGURATION_ERROR, `Invalid configuration '${setting}': ${reason}`, {\n setting,\n reason,\n })\n this.name = 'ConfigurationError'\n }\n}\n\n/**\n * Thrown when payment is required to access a tool\n */\nexport class PaymentRequiredError extends MCPError {\n constructor(toolName: string, options?: { upgradeUrl?: string; priceId?: string }) {\n super(ErrorCodes.PAYMENT_REQUIRED, `Payment required to use '${toolName}'`, {\n tool: toolName,\n ...(options?.upgradeUrl && { upgradeUrl: options.upgradeUrl }),\n ...(options?.priceId && { priceId: options.priceId }),\n })\n this.name = 'PaymentRequiredError'\n }\n}\n\n/**\n * Thrown when user doesn't have enough credits\n */\nexport class InsufficientCreditsError extends MCPError {\n constructor(required: number, available: number, options?: { purchaseUrl?: string }) {\n super(ErrorCodes.INSUFFICIENT_CREDITS, `Insufficient credits: need ${required}, have ${available}`, {\n required,\n available,\n ...(options?.purchaseUrl && { purchaseUrl: options.purchaseUrl }),\n })\n this.name = 'InsufficientCreditsError'\n }\n}\n\n/**\n * Thrown when a subscription tier is required\n */\nexport class SubscriptionRequiredError extends MCPError {\n constructor(requiredTier: string, currentTier?: string, options?: { upgradeUrl?: string }) {\n const msg = currentTier \n ? `Subscription '${requiredTier}' required (current: '${currentTier}')`\n : `Subscription '${requiredTier}' required`\n super(ErrorCodes.SUBSCRIPTION_REQUIRED, msg, {\n requiredTier,\n ...(currentTier && { currentTier }),\n ...(options?.upgradeUrl && { upgradeUrl: options.upgradeUrl }),\n })\n this.name = 'SubscriptionRequiredError'\n }\n}\n","import { z, ZodError, type ZodSchema, type ZodTypeDef, type SafeParseReturnType } from 'zod'\nimport { ValidationError } from '../errors'\n\n// Re-export zod for convenience\nexport { z, ZodError, type ZodSchema }\nexport type { ZodTypeDef }\n\n/**\n * Options for input validation\n */\nexport interface ValidateOptions {\n /** Strip unknown keys from objects (default: true) */\n stripUnknown?: boolean\n /** Custom error formatter */\n formatError?: (error: ZodError) => string\n}\n\n/**\n * Validates input against a Zod schema\n * Throws ValidationError on failure with detailed field info\n */\nexport function validate<T>(\n schema: ZodSchema<T>,\n input: unknown,\n options: ValidateOptions = {}\n): T {\n const { stripUnknown = true } = options\n\n const result = (\n stripUnknown\n ? schema.safeParse(input)\n : schema instanceof z.ZodObject\n ? schema.strict().safeParse(input)\n : schema.safeParse(input)\n ) as SafeParseReturnType<unknown, T>\n\n if (!result.success) {\n const firstError = result.error.errors[0]\n const field = firstError.path.join('.') || 'input'\n const reason = firstError.message\n throw new ValidationError(field, reason, firstError.path.length > 0 \n ? getNestedValue(input, firstError.path) \n : input\n )\n }\n\n return result.data\n}\n\n/**\n * Creates a validated tool handler\n * Wraps your handler function with automatic input validation\n */\nexport function validateInput<TInput, TOutput>(\n schema: ZodSchema<TInput>,\n handler: (input: TInput) => TOutput | Promise<TOutput>,\n options: ValidateOptions = {}\n): (input: unknown) => Promise<TOutput> {\n return async (input: unknown) => {\n const validated = validate(schema, input, options)\n return handler(validated)\n }\n}\n\n\n/**\n * Helper to extract nested value from object by path\n */\nfunction getNestedValue(obj: unknown, path: (string | number)[]): unknown {\n let current = obj\n for (const key of path) {\n if (current === null || current === undefined) return undefined\n current = (current as Record<string | number, unknown>)[key]\n }\n return current\n}\n\n/**\n * Common schema patterns for MCP tools\n */\nexport const schemas = {\n /** Non-empty string */\n nonEmptyString: z.string().min(1, 'Cannot be empty'),\n \n /** Positive integer */\n positiveInt: z.number().int().positive(),\n \n /** Pagination limit (1-100, default 10) */\n limit: z.number().int().min(1).max(100).default(10),\n \n /** Pagination offset (>= 0, default 0) */\n offset: z.number().int().min(0).default(0),\n \n /** URL string */\n url: z.string().url(),\n \n /** Email string */\n email: z.string().email(),\n \n /** UUID string */\n uuid: z.string().uuid(),\n \n /** ISO date string */\n isoDate: z.string().datetime(),\n \n /** Boolean with string coercion ('true'/'false' -> boolean) */\n booleanish: z.union([\n z.boolean(),\n z.enum(['true', 'false']).transform(v => v === 'true'),\n ]),\n}\n\n/**\n * Type helper to infer schema type\n */\nexport type Infer<T extends ZodSchema> = z.infer<T>\n","export type LogLevel = 'debug' | 'info' | 'warn' | 'error'\n\nexport interface LogEntry {\n timestamp?: string\n level: LogLevel\n service: string\n message: string\n [key: string]: unknown\n}\n\nexport interface LoggerOptions {\n /** Minimum log level to output (default: 'info') */\n level?: LogLevel\n /** Custom output function (default: console methods) */\n output?: (entry: LogEntry) => void\n /** Include timestamps (default: true) */\n timestamps?: boolean\n /** Pretty print JSON (default: false, use true for local dev) */\n pretty?: boolean\n}\n\nconst LEVEL_PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n}\n\n/**\n * Creates a structured logger for MCP servers\n */\nexport function createLogger(service: string, options: LoggerOptions = {}) {\n const {\n level: minLevel = 'info',\n timestamps = true,\n pretty = false,\n } = options\n\n const shouldLog = (level: LogLevel): boolean => {\n return LEVEL_PRIORITY[level] >= LEVEL_PRIORITY[minLevel]\n }\n\n const formatEntry = (entry: LogEntry): string => {\n return pretty ? JSON.stringify(entry, null, 2) : JSON.stringify(entry)\n }\n\n const log = (level: LogLevel, message: string, data?: Record<string, unknown>) => {\n if (!shouldLog(level)) return\n\n const entry: LogEntry = {\n ...(timestamps && { timestamp: new Date().toISOString() }),\n level,\n service,\n message,\n ...data,\n }\n\n if (options.output) {\n options.output(entry)\n } else {\n const formatted = formatEntry(entry)\n switch (level) {\n case 'debug':\n console.debug(formatted)\n break\n case 'info':\n console.info(formatted)\n break\n case 'warn':\n console.warn(formatted)\n break\n case 'error':\n console.error(formatted)\n break\n }\n }\n\n return entry\n }\n\n return {\n debug: (message: string, data?: Record<string, unknown>) => log('debug', message, data),\n info: (message: string, data?: Record<string, unknown>) => log('info', message, data),\n warn: (message: string, data?: Record<string, unknown>) => log('warn', message, data),\n error: (message: string, data?: Record<string, unknown>) => log('error', message, data),\n \n /**\n * Create a child logger with additional context\n */\n child: (context: Record<string, unknown>) => {\n return createLogger(service, {\n ...options,\n output: (entry) => {\n const merged = { ...entry, ...context }\n if (options.output) {\n options.output(merged)\n } else {\n const formatted = pretty ? JSON.stringify(merged, null, 2) : JSON.stringify(merged)\n console[entry.level](formatted)\n }\n },\n })\n },\n }\n}\n\nexport type Logger = ReturnType<typeof createLogger>\n","export interface TelemetryConfig {\n /** Your OpenConductor API key */\n apiKey: string\n /** Server name for identification */\n serverName: string\n /** Server version */\n serverVersion?: string\n /** Custom endpoint (default: OpenConductor production) */\n endpoint?: string\n /** Batch size before flushing (default: 10) */\n batchSize?: number\n /** Flush interval in ms (default: 30000) */\n flushInterval?: number\n /** Enable debug logging (default: false) */\n debug?: boolean\n}\n\nexport interface ToolMetric {\n tool: string\n duration: number\n success: boolean\n error?: string\n timestamp: string\n}\n\nexport interface TelemetryBatch {\n serverName: string\n serverVersion?: string\n metrics: ToolMetric[]\n meta: {\n sdkVersion: string\n nodeVersion: string\n platform: string\n }\n}\n\nconst SDK_VERSION = '1.0.0'\nconst DEFAULT_ENDPOINT = 'https://api.openconductor.ai/functions/v1/telemetry'\n\nlet globalTelemetry: Telemetry | null = null\n\n/**\n * Initialize telemetry for your MCP server\n * Call this once at startup with your OpenConductor API key\n */\nexport function initTelemetry(config: TelemetryConfig): Telemetry {\n globalTelemetry = new Telemetry(config)\n return globalTelemetry\n}\n\n/**\n * Get the global telemetry instance (if initialized)\n */\nexport function getTelemetry(): Telemetry | null {\n return globalTelemetry\n}\n\n\nexport class Telemetry {\n private config: Required<Omit<TelemetryConfig, 'serverVersion'>> & Pick<TelemetryConfig, 'serverVersion'>\n private buffer: ToolMetric[] = []\n private flushTimer: ReturnType<typeof setInterval> | null = null\n\n constructor(config: TelemetryConfig) {\n this.config = {\n apiKey: config.apiKey,\n serverName: config.serverName,\n serverVersion: config.serverVersion,\n endpoint: config.endpoint ?? DEFAULT_ENDPOINT,\n batchSize: config.batchSize ?? 10,\n flushInterval: config.flushInterval ?? 30000,\n debug: config.debug ?? false,\n }\n\n // Start periodic flush\n this.flushTimer = setInterval(() => {\n this.flush().catch(this.handleError.bind(this))\n }, this.config.flushInterval)\n\n // Flush on process exit\n if (typeof process !== 'undefined') {\n process.on('beforeExit', () => this.flush())\n process.on('SIGINT', () => {\n this.flush().finally(() => process.exit(0))\n })\n process.on('SIGTERM', () => {\n this.flush().finally(() => process.exit(0))\n })\n }\n\n this.log('Telemetry initialized', { serverName: config.serverName })\n }\n\n /**\n * Track a tool invocation\n */\n trackToolCall(\n tool: string,\n duration: number,\n success: boolean,\n error?: string\n ): void {\n const metric: ToolMetric = {\n tool,\n duration,\n success,\n ...(error && { error }),\n timestamp: new Date().toISOString(),\n }\n\n this.buffer.push(metric)\n this.log('Metric tracked', { ...metric })\n\n // Auto-flush if buffer is full\n if (this.buffer.length >= this.config.batchSize) {\n this.flush().catch(this.handleError.bind(this))\n }\n }\n\n /**\n * Flush buffered metrics to OpenConductor\n */\n async flush(): Promise<void> {\n if (this.buffer.length === 0) return\n\n const metrics = [...this.buffer]\n this.buffer = []\n\n const batch: TelemetryBatch = {\n serverName: this.config.serverName,\n serverVersion: this.config.serverVersion,\n metrics,\n meta: {\n sdkVersion: SDK_VERSION,\n nodeVersion: typeof process !== 'undefined' ? process.version : 'unknown',\n platform: typeof process !== 'undefined' ? process.platform : 'unknown',\n },\n }\n\n this.log('Flushing metrics', { count: metrics.length })\n\n try {\n const response = await fetch(this.config.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.config.apiKey}`,\n 'X-OpenConductor-SDK': SDK_VERSION,\n },\n body: JSON.stringify(batch),\n })\n\n if (!response.ok) {\n throw new Error(`Telemetry flush failed: ${response.status} ${response.statusText}`)\n }\n\n this.log('Metrics flushed successfully', { count: metrics.length })\n } catch (error) {\n // Put metrics back in buffer on failure\n this.buffer.unshift(...metrics)\n throw error\n }\n }\n\n /**\n * Stop telemetry collection\n */\n shutdown(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer)\n this.flushTimer = null\n }\n this.flush().catch(this.handleError.bind(this))\n this.log('Telemetry shutdown')\n }\n\n private log(message: string, data?: Record<string, unknown>): void {\n if (this.config.debug) {\n console.debug(JSON.stringify({\n timestamp: new Date().toISOString(),\n level: 'debug',\n service: 'openconductor-telemetry',\n message,\n ...data,\n }))\n }\n }\n\n private handleError(error: unknown): void {\n if (this.config.debug) {\n console.error('[OpenConductor Telemetry Error]', error)\n }\n }\n}\n","import { MCPError, ToolExecutionError, TimeoutError } from '../errors'\nimport { createLogger, type Logger } from '../logger'\nimport { getTelemetry } from '../telemetry'\n\nexport interface HealthCheckInfo {\n name: string\n version: string\n description?: string\n uptime?: () => number\n checks?: Record<string, () => Promise<boolean> | boolean>\n}\n\nexport interface HealthCheckResponse {\n status: 'healthy' | 'degraded' | 'unhealthy'\n name: string\n version: string\n description?: string\n uptime?: number\n timestamp: string\n checks?: Record<string, boolean>\n}\n\n/**\n * Creates a standard health check response for MCP servers\n */\nexport function createHealthCheck(info: HealthCheckInfo) {\n return async (): Promise<HealthCheckResponse> => {\n const checks: Record<string, boolean> = {}\n let allHealthy = true\n\n if (info.checks) {\n for (const [name, check] of Object.entries(info.checks)) {\n try {\n checks[name] = await check()\n if (!checks[name]) allHealthy = false\n } catch {\n checks[name] = false\n allHealthy = false\n }\n }\n }\n\n return {\n status: allHealthy ? 'healthy' : 'degraded',\n name: info.name,\n version: info.version,\n ...(info.description && { description: info.description }),\n ...(info.uptime && { uptime: info.uptime() }),\n timestamp: new Date().toISOString(),\n ...(Object.keys(checks).length > 0 && { checks }),\n }\n }\n}\n\n\nexport interface WrapToolOptions {\n /** Tool name for logging and telemetry */\n name: string\n /** Timeout in milliseconds (default: 30000) */\n timeout?: number\n /** Custom logger instance */\n logger?: Logger\n /** Enable telemetry reporting (default: true if telemetry initialized) */\n telemetry?: boolean\n}\n\nexport interface ToolContext {\n /** Unique ID for this tool call */\n callId: string\n /** Tool name */\n name: string\n /** Start time of execution */\n startTime: number\n /** Logger scoped to this call */\n log: Logger\n}\n\n/**\n * Wraps a tool handler with automatic error handling, logging, timeouts, and telemetry\n */\nexport function wrapTool<TInput, TOutput>(\n handler: (input: TInput, ctx: ToolContext) => TOutput | Promise<TOutput>,\n options: WrapToolOptions\n): (input: TInput) => Promise<TOutput> {\n const {\n name,\n timeout = 30000,\n telemetry: enableTelemetry = true,\n } = options\n\n const baseLogger = options.logger ?? createLogger(name)\n\n return async (input: TInput): Promise<TOutput> => {\n const callId = generateCallId()\n const startTime = Date.now()\n const log = baseLogger.child({ callId })\n\n const ctx: ToolContext = { callId, name, startTime, log }\n\n log.info('Tool invoked', { tool: name, input: sanitizeInput(input) })\n\n try {\n // Create timeout promise\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => {\n reject(new TimeoutError(name, timeout))\n }, timeout)\n })\n\n // Race handler against timeout\n const result = await Promise.race([\n Promise.resolve(handler(input, ctx)),\n timeoutPromise,\n ])\n\n const duration = Date.now() - startTime\n log.info('Tool completed', { tool: name, duration })\n\n // Report success to telemetry\n if (enableTelemetry) {\n const tel = getTelemetry()\n tel?.trackToolCall(name, duration, true)\n }\n\n return result\n } catch (error) {\n const duration = Date.now() - startTime\n const errorMessage = error instanceof Error ? error.message : String(error)\n\n log.error('Tool failed', { \n tool: name, \n duration, \n error: errorMessage,\n stack: error instanceof Error ? error.stack : undefined,\n })\n\n // Report failure to telemetry\n if (enableTelemetry) {\n const tel = getTelemetry()\n tel?.trackToolCall(name, duration, false, errorMessage)\n }\n\n // Re-throw MCPErrors as-is, wrap others\n if (error instanceof MCPError) {\n throw error\n }\n\n throw new ToolExecutionError(\n name,\n errorMessage,\n error instanceof Error ? error : undefined\n )\n }\n }\n}\n\n/**\n * Generates a unique call ID\n */\nfunction generateCallId(): string {\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`\n}\n\n/**\n * Sanitizes input for logging (removes sensitive fields)\n */\nfunction sanitizeInput(input: unknown): unknown {\n if (typeof input !== 'object' || input === null) return input\n\n const sensitiveKeys = ['password', 'token', 'secret', 'key', 'auth', 'credential']\n const sanitized: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(input as Record<string, unknown>)) {\n if (sensitiveKeys.some(k => key.toLowerCase().includes(k))) {\n sanitized[key] = '[REDACTED]'\n } else {\n sanitized[key] = value\n }\n }\n\n return sanitized\n}\n","import {\n PaymentRequiredError,\n InsufficientCreditsError,\n SubscriptionRequiredError,\n ConfigurationError,\n} from '../errors'\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface PaymentConfig {\n /** OpenConductor API key for billing */\n apiKey: string\n /** Base URL for billing API (default: https://api.openconductor.ai) */\n apiUrl?: string\n /** Default upgrade URL to show users */\n upgradeUrl?: string\n /** Enable test mode (skips actual billing) */\n testMode?: boolean\n}\n\nexport interface CreditRequirement {\n /** Number of credits to deduct per call */\n credits: number\n}\n\nexport interface SubscriptionRequirement {\n /** Required subscription tier (e.g., 'pro', 'enterprise') */\n tier: string\n /** Alternative tiers that also grant access */\n allowedTiers?: string[]\n}\n\nexport interface StripeRequirement {\n /** Stripe Price ID for per-call billing */\n priceId: string\n}\n\nexport type PaymentRequirement = \n | CreditRequirement \n | SubscriptionRequirement \n | StripeRequirement\n\nexport interface UserContext {\n /** User ID for billing lookup */\n userId: string\n /** Optional API key override */\n apiKey?: string\n}\n\nexport interface BillingStatus {\n /** Whether the user can proceed */\n allowed: boolean\n /** Current credit balance (if applicable) */\n credits?: number\n /** Current subscription tier (if applicable) */\n tier?: string\n /** Reason for denial (if not allowed) */\n reason?: string\n /** URL for upgrade/purchase */\n actionUrl?: string\n}\n\n// ============================================================================\n// Configuration\n// ============================================================================\n\nlet paymentConfig: PaymentConfig | null = null\n\n/**\n * Initialize payment/billing configuration\n * \n * @example\n * ```typescript\n * initPayment({\n * apiKey: process.env.OPENCONDUCTOR_API_KEY!,\n * upgradeUrl: 'https://myapp.com/upgrade'\n * })\n * ```\n */\nexport function initPayment(config: PaymentConfig): void {\n paymentConfig = {\n apiUrl: 'https://api.openconductor.ai',\n testMode: false,\n ...config,\n }\n}\n\n/**\n * Get current payment configuration\n */\nexport function getPaymentConfig(): PaymentConfig | null {\n return paymentConfig\n}\n\n// ============================================================================\n// Billing Client\n// ============================================================================\n\ninterface CheckBillingParams {\n userId: string\n requirement: PaymentRequirement\n toolName: string\n}\n\ninterface DeductCreditsParams {\n userId: string\n credits: number\n toolName: string\n callId?: string\n}\n\nasync function checkBilling(params: CheckBillingParams): Promise<BillingStatus> {\n const config = paymentConfig\n if (!config) {\n throw new ConfigurationError('payment', 'Payment not initialized. Call initPayment() first.')\n }\n\n // Test mode - always allow\n if (config.testMode) {\n return { allowed: true, credits: 9999, tier: 'test' }\n }\n\n try {\n const response = await fetch(`${config.apiUrl}/functions/v1/billing-check`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${config.apiKey}`,\n },\n body: JSON.stringify({\n userId: params.userId,\n requirement: params.requirement,\n tool: params.toolName,\n }),\n })\n\n if (!response.ok) {\n // Non-2xx response - treat as billing check failed\n const errorBody = await response.text()\n console.error('[payment] Billing check failed:', response.status, errorBody)\n return {\n allowed: false,\n reason: 'Billing service unavailable',\n actionUrl: config.upgradeUrl,\n }\n }\n\n return await response.json() as BillingStatus\n } catch (error) {\n // Network error - fail open or closed based on config\n console.error('[payment] Billing check error:', error)\n return {\n allowed: false,\n reason: 'Unable to verify billing status',\n actionUrl: config.upgradeUrl,\n }\n }\n}\n\nasync function deductCredits(params: DeductCreditsParams): Promise<boolean> {\n const config = paymentConfig\n if (!config) return false\n\n // Test mode - don't actually deduct\n if (config.testMode) return true\n\n try {\n const response = await fetch(`${config.apiUrl}/functions/v1/billing-deduct`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${config.apiKey}`,\n },\n body: JSON.stringify({\n userId: params.userId,\n credits: params.credits,\n tool: params.toolName,\n callId: params.callId,\n }),\n })\n\n return response.ok\n } catch (error) {\n console.error('[payment] Credit deduction error:', error)\n return false\n }\n}\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\nfunction isCreditRequirement(req: PaymentRequirement): req is CreditRequirement {\n return 'credits' in req && typeof req.credits === 'number'\n}\n\nfunction isSubscriptionRequirement(req: PaymentRequirement): req is SubscriptionRequirement {\n return 'tier' in req && typeof req.tier === 'string'\n}\n\nfunction isStripeRequirement(req: PaymentRequirement): req is StripeRequirement {\n return 'priceId' in req && typeof req.priceId === 'string'\n}\n\n// ============================================================================\n// Main Middleware\n// ============================================================================\n\nexport interface RequirePaymentOptions {\n /** Tool name for billing records */\n toolName?: string\n /** Function to extract user ID from input */\n getUserId?: (input: unknown) => string | undefined\n /** Custom error handler */\n onPaymentError?: (error: Error) => void\n}\n\n/**\n * One-line payment middleware for MCP tools\n * \n * @example Credits-based billing\n * ```typescript\n * const paidTool = requirePayment({ credits: 10 })(myHandler)\n * ```\n * \n * @example Subscription tier requirement\n * ```typescript\n * const premiumTool = requirePayment({ tier: 'pro' })(myHandler)\n * ```\n * \n * @example With wrapTool\n * ```typescript\n * const safePaidTool = wrapTool(\n * requirePayment({ credits: 5 })(myHandler),\n * { name: 'premium-analysis' }\n * )\n * ```\n */\nexport function requirePayment<TInput extends { userId?: string }, TOutput>(\n requirement: PaymentRequirement,\n options: RequirePaymentOptions = {}\n) {\n return (\n handler: (input: TInput) => TOutput | Promise<TOutput>\n ): ((input: TInput) => Promise<TOutput>) => {\n \n const { toolName = 'unknown', getUserId } = options\n\n return async (input: TInput): Promise<TOutput> => {\n // Extract user ID\n const userId = getUserId?.(input) ?? input.userId\n \n if (!userId) {\n throw new PaymentRequiredError(toolName, {\n upgradeUrl: paymentConfig?.upgradeUrl,\n })\n }\n\n // Check billing status\n const status = await checkBilling({\n userId,\n requirement,\n toolName,\n })\n\n if (!status.allowed) {\n // Throw appropriate error based on requirement type\n if (isCreditRequirement(requirement)) {\n throw new InsufficientCreditsError(\n requirement.credits,\n status.credits ?? 0,\n { purchaseUrl: status.actionUrl }\n )\n }\n\n if (isSubscriptionRequirement(requirement)) {\n throw new SubscriptionRequiredError(\n requirement.tier,\n status.tier,\n { upgradeUrl: status.actionUrl }\n )\n }\n\n // Generic payment required\n throw new PaymentRequiredError(toolName, {\n upgradeUrl: status.actionUrl,\n ...(isStripeRequirement(requirement) && { priceId: requirement.priceId }),\n })\n }\n\n // Execute the handler\n const result = await handler(input)\n\n // Deduct credits after successful execution (if credit-based)\n if (isCreditRequirement(requirement)) {\n await deductCredits({\n userId,\n credits: requirement.credits,\n toolName,\n })\n }\n\n return result\n }\n }\n}\n\n// ============================================================================\n// Convenience Functions\n// ============================================================================\n\n/**\n * Create a paid tool with built-in payment verification\n * \n * @example\n * ```typescript\n * const analyzeData = createPaidTool({\n * name: 'analyze-data',\n * payment: { credits: 10 },\n * handler: async (input) => {\n * // Your tool logic\n * return result\n * }\n * })\n * ```\n */\nexport function createPaidTool<TInput extends { userId?: string }, TOutput>(config: {\n name: string\n payment: PaymentRequirement\n handler: (input: TInput) => TOutput | Promise<TOutput>\n getUserId?: (input: TInput) => string | undefined\n}): (input: TInput) => Promise<TOutput> {\n return requirePayment<TInput, TOutput>(config.payment, {\n toolName: config.name,\n getUserId: config.getUserId as (input: unknown) => string | undefined,\n })(config.handler)\n}\n\n/**\n * Check if a user can access a paid feature without executing it\n * Useful for UI gating\n * \n * @example\n * ```typescript\n * const canAccess = await canUserAccess('user_123', { credits: 10 }, 'premium-tool')\n * if (!canAccess.allowed) {\n * showUpgradePrompt(canAccess.actionUrl)\n * }\n * ```\n */\nexport async function canUserAccess(\n userId: string,\n requirement: PaymentRequirement,\n toolName: string = 'check'\n): Promise<BillingStatus> {\n return checkBilling({ userId, requirement, toolName })\n}\n\n/**\n * Get user's current billing status\n */\nexport async function getUserBillingStatus(userId: string): Promise<{\n credits: number\n tier: string\n active: boolean\n} | null> {\n const config = paymentConfig\n if (!config) return null\n\n if (config.testMode) {\n return { credits: 9999, tier: 'test', active: true }\n }\n\n try {\n const response = await fetch(`${config.apiUrl}/functions/v1/billing-status/${userId}`, {\n headers: {\n 'Authorization': `Bearer ${config.apiKey}`,\n },\n })\n\n if (!response.ok) return null\n return await response.json()\n } catch {\n return null\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors/codes.ts","../src/errors/index.ts","../src/validate/index.ts","../src/logger/index.ts","../src/telemetry/index.ts","../src/server/index.ts","../src/payment/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * JSON-RPC 2.0 Standard Error Codes\n * https://www.jsonrpc.org/specification#error_object\n */\nexport const ErrorCodes = {\n // JSON-RPC 2.0 Standard Errors\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603,\n\n // MCP-Specific Errors (-32000 to -32099 reserved for implementation)\n TOOL_NOT_FOUND: -32001,\n TOOL_EXECUTION_ERROR: -32002,\n RESOURCE_NOT_FOUND: -32003,\n AUTHENTICATION_ERROR: -32004,\n AUTHORIZATION_ERROR: -32005,\n RATE_LIMIT_ERROR: -32006,\n TIMEOUT_ERROR: -32007,\n VALIDATION_ERROR: -32008,\n DEPENDENCY_ERROR: -32009,\n CONFIGURATION_ERROR: -32010,\n PAYMENT_REQUIRED: -32011,\n INSUFFICIENT_CREDITS: -32012,\n SUBSCRIPTION_REQUIRED: -32013,\n} as const\n\nexport type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes]\n","import { ErrorCodes, type ErrorCode } from './codes'\n\nexport { ErrorCodes, type ErrorCode } from './codes'\n\n/**\n * Base error class for MCP servers\n * Formats errors according to JSON-RPC 2.0 specification\n */\nexport class MCPError extends Error {\n public readonly code: ErrorCode\n public readonly data?: Record<string, unknown>\n\n constructor(\n code: ErrorCode,\n message: string,\n data?: Record<string, unknown>\n ) {\n super(message)\n this.name = 'MCPError'\n this.code = code\n this.data = data\n\n // Maintains proper stack trace in V8 environments\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor)\n }\n }\n\n /**\n * Returns JSON-RPC 2.0 formatted error object\n */\n toJSON() {\n return {\n code: this.code,\n message: this.message,\n ...(this.data && { data: this.data }),\n }\n }\n\n /**\n * Create error response for JSON-RPC\n */\n toResponse(id: string | number | null = null) {\n return {\n jsonrpc: '2.0' as const,\n id,\n error: this.toJSON(),\n }\n }\n}\n\n/**\n * Thrown when tool input validation fails\n */\nexport class ValidationError extends MCPError {\n constructor(field: string, reason: string, value?: unknown) {\n super(ErrorCodes.INVALID_PARAMS, `Validation failed for '${field}': ${reason}`, {\n field,\n reason,\n ...(value !== undefined && { value }),\n })\n this.name = 'ValidationError'\n }\n}\n\n/**\n * Thrown when a requested tool doesn't exist\n */\nexport class ToolNotFoundError extends MCPError {\n constructor(toolName: string) {\n super(ErrorCodes.TOOL_NOT_FOUND, `Tool '${toolName}' not found`, {\n tool: toolName,\n })\n this.name = 'ToolNotFoundError'\n }\n}\n\n/**\n * Thrown when tool execution fails\n */\nexport class ToolExecutionError extends MCPError {\n constructor(toolName: string, reason: string, cause?: Error) {\n super(ErrorCodes.TOOL_EXECUTION_ERROR, `Tool '${toolName}' failed: ${reason}`, {\n tool: toolName,\n reason,\n ...(cause && { cause: cause.message }),\n })\n this.name = 'ToolExecutionError'\n }\n}\n\n/**\n * Thrown when a requested resource doesn't exist\n */\nexport class ResourceNotFoundError extends MCPError {\n constructor(resourceUri: string) {\n super(ErrorCodes.RESOURCE_NOT_FOUND, `Resource '${resourceUri}' not found`, {\n uri: resourceUri,\n })\n this.name = 'ResourceNotFoundError'\n }\n}\n\n/**\n * Thrown when authentication fails\n */\nexport class AuthenticationError extends MCPError {\n constructor(reason: string = 'Authentication required') {\n super(ErrorCodes.AUTHENTICATION_ERROR, reason)\n this.name = 'AuthenticationError'\n }\n}\n\n/**\n * Thrown when authorization fails (authenticated but not permitted)\n */\nexport class AuthorizationError extends MCPError {\n constructor(action: string, resource?: string) {\n const msg = resource\n ? `Not authorized to ${action} on '${resource}'`\n : `Not authorized to ${action}`\n super(ErrorCodes.AUTHORIZATION_ERROR, msg, {\n action,\n ...(resource && { resource }),\n })\n this.name = 'AuthorizationError'\n }\n}\n\n/**\n * Thrown when rate limits are exceeded\n */\nexport class RateLimitError extends MCPError {\n constructor(retryAfterMs?: number) {\n super(ErrorCodes.RATE_LIMIT_ERROR, 'Rate limit exceeded', {\n ...(retryAfterMs && { retryAfterMs }),\n })\n this.name = 'RateLimitError'\n }\n}\n\n/**\n * Thrown when an operation times out\n */\nexport class TimeoutError extends MCPError {\n constructor(operation: string, timeoutMs: number) {\n super(ErrorCodes.TIMEOUT_ERROR, `Operation '${operation}' timed out after ${timeoutMs}ms`, {\n operation,\n timeoutMs,\n })\n this.name = 'TimeoutError'\n }\n}\n\n/**\n * Thrown when a required dependency is unavailable\n */\nexport class DependencyError extends MCPError {\n constructor(dependency: string, reason: string) {\n super(ErrorCodes.DEPENDENCY_ERROR, `Dependency '${dependency}' unavailable: ${reason}`, {\n dependency,\n reason,\n })\n this.name = 'DependencyError'\n }\n}\n\n/**\n * Thrown when server configuration is invalid\n */\nexport class ConfigurationError extends MCPError {\n constructor(setting: string, reason: string) {\n super(ErrorCodes.CONFIGURATION_ERROR, `Invalid configuration '${setting}': ${reason}`, {\n setting,\n reason,\n })\n this.name = 'ConfigurationError'\n }\n}\n\n/**\n * Thrown when payment is required to access a tool\n */\nexport class PaymentRequiredError extends MCPError {\n constructor(toolName: string, options?: { upgradeUrl?: string; priceId?: string }) {\n super(ErrorCodes.PAYMENT_REQUIRED, `Payment required to use '${toolName}'`, {\n tool: toolName,\n ...(options?.upgradeUrl && { upgradeUrl: options.upgradeUrl }),\n ...(options?.priceId && { priceId: options.priceId }),\n })\n this.name = 'PaymentRequiredError'\n }\n}\n\n/**\n * Thrown when user doesn't have enough credits\n */\nexport class InsufficientCreditsError extends MCPError {\n constructor(required: number, available: number, options?: { purchaseUrl?: string }) {\n super(ErrorCodes.INSUFFICIENT_CREDITS, `Insufficient credits: need ${required}, have ${available}`, {\n required,\n available,\n ...(options?.purchaseUrl && { purchaseUrl: options.purchaseUrl }),\n })\n this.name = 'InsufficientCreditsError'\n }\n}\n\n/**\n * Thrown when a subscription tier is required\n */\nexport class SubscriptionRequiredError extends MCPError {\n constructor(requiredTier: string, currentTier?: string, options?: { upgradeUrl?: string }) {\n const msg = currentTier \n ? `Subscription '${requiredTier}' required (current: '${currentTier}')`\n : `Subscription '${requiredTier}' required`\n super(ErrorCodes.SUBSCRIPTION_REQUIRED, msg, {\n requiredTier,\n ...(currentTier && { currentTier }),\n ...(options?.upgradeUrl && { upgradeUrl: options.upgradeUrl }),\n })\n this.name = 'SubscriptionRequiredError'\n }\n}\n","import { z, ZodError, type ZodSchema, type ZodTypeDef, type SafeParseReturnType } from 'zod'\nimport { ValidationError } from '../errors'\n\n// Re-export zod for convenience\nexport { z, ZodError, type ZodSchema }\nexport type { ZodTypeDef }\n\n/**\n * Options for input validation\n */\nexport interface ValidateOptions {\n /** Strip unknown keys from objects (default: true) */\n stripUnknown?: boolean\n /** Custom error formatter */\n formatError?: (error: ZodError) => string\n}\n\n/**\n * Validates input against a Zod schema\n * Throws ValidationError on failure with detailed field info\n */\nexport function validate<T>(\n schema: ZodSchema<T>,\n input: unknown,\n options: ValidateOptions = {}\n): T {\n const { stripUnknown = true } = options\n\n const result = (\n stripUnknown\n ? schema.safeParse(input)\n : schema instanceof z.ZodObject\n ? schema.strict().safeParse(input)\n : schema.safeParse(input)\n ) as SafeParseReturnType<unknown, T>\n\n if (!result.success) {\n const firstError = result.error.errors[0]\n const field = firstError.path.join('.') || 'input'\n const reason = firstError.message\n throw new ValidationError(field, reason, firstError.path.length > 0 \n ? getNestedValue(input, firstError.path) \n : input\n )\n }\n\n return result.data\n}\n\n/**\n * Creates a validated tool handler\n * Wraps your handler function with automatic input validation\n */\nexport function validateInput<TInput, TOutput>(\n schema: ZodSchema<TInput>,\n handler: (input: TInput) => TOutput | Promise<TOutput>,\n options: ValidateOptions = {}\n): (input: unknown) => Promise<TOutput> {\n return async (input: unknown) => {\n const validated = validate(schema, input, options)\n return handler(validated)\n }\n}\n\n\n/**\n * Helper to extract nested value from object by path\n */\nfunction getNestedValue(obj: unknown, path: (string | number)[]): unknown {\n let current = obj\n for (const key of path) {\n if (current === null || current === undefined) return undefined\n current = (current as Record<string | number, unknown>)[key]\n }\n return current\n}\n\n/**\n * Common schema patterns for MCP tools\n */\nexport const schemas = {\n /** Non-empty string */\n nonEmptyString: z.string().min(1, 'Cannot be empty'),\n \n /** Positive integer */\n positiveInt: z.number().int().positive(),\n \n /** Pagination limit (1-100, default 10) */\n limit: z.number().int().min(1).max(100).default(10),\n \n /** Pagination offset (>= 0, default 0) */\n offset: z.number().int().min(0).default(0),\n \n /** URL string */\n url: z.string().url(),\n \n /** Email string */\n email: z.string().email(),\n \n /** UUID string */\n uuid: z.string().uuid(),\n \n /** ISO date string */\n isoDate: z.string().datetime(),\n \n /** Boolean with string coercion ('true'/'false' -> boolean) */\n booleanish: z.union([\n z.boolean(),\n z.enum(['true', 'false']).transform(v => v === 'true'),\n ]),\n}\n\n/**\n * Type helper to infer schema type\n */\nexport type Infer<T extends ZodSchema> = z.infer<T>\n","export type LogLevel = 'debug' | 'info' | 'warn' | 'error'\n\nexport interface LogEntry {\n timestamp?: string\n level: LogLevel\n service: string\n message: string\n [key: string]: unknown\n}\n\nexport interface LoggerOptions {\n /** Minimum log level to output (default: 'info') */\n level?: LogLevel\n /** Custom output function (default: console methods) */\n output?: (entry: LogEntry) => void\n /** Include timestamps (default: true) */\n timestamps?: boolean\n /** Pretty print JSON (default: false, use true for local dev) */\n pretty?: boolean\n}\n\nconst LEVEL_PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n}\n\n/**\n * Creates a structured logger for MCP servers\n */\nexport function createLogger(service: string, options: LoggerOptions = {}) {\n const {\n level: minLevel = 'info',\n timestamps = true,\n pretty = false,\n } = options\n\n const shouldLog = (level: LogLevel): boolean => {\n return LEVEL_PRIORITY[level] >= LEVEL_PRIORITY[minLevel]\n }\n\n const formatEntry = (entry: LogEntry): string => {\n return pretty ? JSON.stringify(entry, null, 2) : JSON.stringify(entry)\n }\n\n const log = (level: LogLevel, message: string, data?: Record<string, unknown>) => {\n if (!shouldLog(level)) return\n\n const entry: LogEntry = {\n ...(timestamps && { timestamp: new Date().toISOString() }),\n level,\n service,\n message,\n ...data,\n }\n\n if (options.output) {\n options.output(entry)\n } else {\n const formatted = formatEntry(entry)\n switch (level) {\n case 'debug':\n console.debug(formatted)\n break\n case 'info':\n console.info(formatted)\n break\n case 'warn':\n console.warn(formatted)\n break\n case 'error':\n console.error(formatted)\n break\n }\n }\n\n return entry\n }\n\n return {\n debug: (message: string, data?: Record<string, unknown>) => log('debug', message, data),\n info: (message: string, data?: Record<string, unknown>) => log('info', message, data),\n warn: (message: string, data?: Record<string, unknown>) => log('warn', message, data),\n error: (message: string, data?: Record<string, unknown>) => log('error', message, data),\n \n /**\n * Create a child logger with additional context\n */\n child: (context: Record<string, unknown>) => {\n return createLogger(service, {\n ...options,\n output: (entry) => {\n const merged = { ...entry, ...context }\n if (options.output) {\n options.output(merged)\n } else {\n const formatted = pretty ? JSON.stringify(merged, null, 2) : JSON.stringify(merged)\n console[entry.level](formatted)\n }\n },\n })\n },\n }\n}\n\nexport type Logger = ReturnType<typeof createLogger>\n","export interface TelemetryConfig {\n /** Your OpenConductor API key */\n apiKey: string\n /** Server name for identification */\n serverName: string\n /** Server version */\n serverVersion?: string\n /** Custom endpoint (default: OpenConductor production) */\n endpoint?: string\n /** Batch size before flushing (default: 10) */\n batchSize?: number\n /** Flush interval in ms (default: 30000) */\n flushInterval?: number\n /** Enable debug logging (default: false) */\n debug?: boolean\n}\n\nexport interface ToolMetric {\n tool: string\n duration: number\n success: boolean\n error?: string\n timestamp: string\n}\n\nexport interface TelemetryBatch {\n serverName: string\n serverVersion?: string\n metrics: ToolMetric[]\n meta: {\n sdkVersion: string\n nodeVersion: string\n platform: string\n }\n}\n\nconst SDK_VERSION = '1.0.0'\nconst DEFAULT_ENDPOINT = 'https://api.openconductor.ai/functions/v1/telemetry'\n\nlet globalTelemetry: Telemetry | null = null\n\n/**\n * Initialize telemetry for your MCP server\n * Call this once at startup with your OpenConductor API key\n */\nexport function initTelemetry(config: TelemetryConfig): Telemetry {\n globalTelemetry = new Telemetry(config)\n return globalTelemetry\n}\n\n/**\n * Get the global telemetry instance (if initialized)\n */\nexport function getTelemetry(): Telemetry | null {\n return globalTelemetry\n}\n\n\nexport class Telemetry {\n private config: Required<Omit<TelemetryConfig, 'serverVersion'>> & Pick<TelemetryConfig, 'serverVersion'>\n private buffer: ToolMetric[] = []\n private flushTimer: ReturnType<typeof setInterval> | null = null\n\n constructor(config: TelemetryConfig) {\n this.config = {\n apiKey: config.apiKey,\n serverName: config.serverName,\n serverVersion: config.serverVersion,\n endpoint: config.endpoint ?? DEFAULT_ENDPOINT,\n batchSize: config.batchSize ?? 10,\n flushInterval: config.flushInterval ?? 30000,\n debug: config.debug ?? false,\n }\n\n // Start periodic flush\n this.flushTimer = setInterval(() => {\n this.flush().catch(this.handleError.bind(this))\n }, this.config.flushInterval)\n\n // Flush on process exit\n if (typeof process !== 'undefined') {\n process.on('beforeExit', () => this.flush())\n process.on('SIGINT', () => {\n this.flush().finally(() => process.exit(0))\n })\n process.on('SIGTERM', () => {\n this.flush().finally(() => process.exit(0))\n })\n }\n\n this.log('Telemetry initialized', { serverName: config.serverName })\n }\n\n /**\n * Track a tool invocation\n */\n trackToolCall(\n tool: string,\n duration: number,\n success: boolean,\n error?: string\n ): void {\n const metric: ToolMetric = {\n tool,\n duration,\n success,\n ...(error && { error }),\n timestamp: new Date().toISOString(),\n }\n\n this.buffer.push(metric)\n this.log('Metric tracked', { ...metric })\n\n // Auto-flush if buffer is full\n if (this.buffer.length >= this.config.batchSize) {\n this.flush().catch(this.handleError.bind(this))\n }\n }\n\n /**\n * Flush buffered metrics to OpenConductor\n */\n async flush(): Promise<void> {\n if (this.buffer.length === 0) return\n\n const metrics = [...this.buffer]\n this.buffer = []\n\n const batch: TelemetryBatch = {\n serverName: this.config.serverName,\n serverVersion: this.config.serverVersion,\n metrics,\n meta: {\n sdkVersion: SDK_VERSION,\n nodeVersion: typeof process !== 'undefined' ? process.version : 'unknown',\n platform: typeof process !== 'undefined' ? process.platform : 'unknown',\n },\n }\n\n this.log('Flushing metrics', { count: metrics.length })\n\n try {\n const response = await fetch(this.config.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.config.apiKey}`,\n 'X-OpenConductor-SDK': SDK_VERSION,\n },\n body: JSON.stringify(batch),\n })\n\n if (!response.ok) {\n throw new Error(`Telemetry flush failed: ${response.status} ${response.statusText}`)\n }\n\n this.log('Metrics flushed successfully', { count: metrics.length })\n } catch (error) {\n // Put metrics back in buffer on failure\n this.buffer.unshift(...metrics)\n throw error\n }\n }\n\n /**\n * Stop telemetry collection\n */\n shutdown(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer)\n this.flushTimer = null\n }\n this.flush().catch(this.handleError.bind(this))\n this.log('Telemetry shutdown')\n }\n\n private log(message: string, data?: Record<string, unknown>): void {\n if (this.config.debug) {\n console.debug(JSON.stringify({\n timestamp: new Date().toISOString(),\n level: 'debug',\n service: 'openconductor-telemetry',\n message,\n ...data,\n }))\n }\n }\n\n private handleError(error: unknown): void {\n if (this.config.debug) {\n console.error('[OpenConductor Telemetry Error]', error)\n }\n }\n}\n","import { MCPError, ToolExecutionError, TimeoutError } from '../errors'\nimport { createLogger, type Logger } from '../logger'\nimport { getTelemetry } from '../telemetry'\n\nexport interface HealthCheckInfo {\n name: string\n version: string\n description?: string\n uptime?: () => number\n checks?: Record<string, () => Promise<boolean> | boolean>\n}\n\nexport interface HealthCheckResponse {\n status: 'healthy' | 'degraded' | 'unhealthy'\n name: string\n version: string\n description?: string\n uptime?: number\n timestamp: string\n checks?: Record<string, boolean>\n}\n\n/**\n * Creates a standard health check response for MCP servers\n */\nexport function createHealthCheck(info: HealthCheckInfo) {\n return async (): Promise<HealthCheckResponse> => {\n const checks: Record<string, boolean> = {}\n let allHealthy = true\n\n if (info.checks) {\n for (const [name, check] of Object.entries(info.checks)) {\n try {\n checks[name] = await check()\n if (!checks[name]) allHealthy = false\n } catch {\n checks[name] = false\n allHealthy = false\n }\n }\n }\n\n return {\n status: allHealthy ? 'healthy' : 'degraded',\n name: info.name,\n version: info.version,\n ...(info.description && { description: info.description }),\n ...(info.uptime && { uptime: info.uptime() }),\n timestamp: new Date().toISOString(),\n ...(Object.keys(checks).length > 0 && { checks }),\n }\n }\n}\n\n\nexport interface WrapToolOptions {\n /** Tool name for logging and telemetry */\n name: string\n /** Timeout in milliseconds (default: 30000) */\n timeout?: number\n /** Custom logger instance */\n logger?: Logger\n /** Enable telemetry reporting (default: true if telemetry initialized) */\n telemetry?: boolean\n}\n\nexport interface ToolContext {\n /** Unique ID for this tool call */\n callId: string\n /** Tool name */\n name: string\n /** Start time of execution */\n startTime: number\n /** Logger scoped to this call */\n log: Logger\n}\n\n/**\n * Wraps a tool handler with automatic error handling, logging, timeouts, and telemetry\n */\nexport function wrapTool<TInput, TOutput>(\n handler: (input: TInput, ctx: ToolContext) => TOutput | Promise<TOutput>,\n options: WrapToolOptions\n): (input: TInput) => Promise<TOutput> {\n const {\n name,\n timeout = 30000,\n telemetry: enableTelemetry = true,\n } = options\n\n const baseLogger = options.logger ?? createLogger(name)\n\n return async (input: TInput): Promise<TOutput> => {\n const callId = generateCallId()\n const startTime = Date.now()\n const log = baseLogger.child({ callId })\n\n const ctx: ToolContext = { callId, name, startTime, log }\n\n log.info('Tool invoked', { tool: name, input: sanitizeInput(input) })\n\n try {\n // Create timeout promise\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => {\n reject(new TimeoutError(name, timeout))\n }, timeout)\n })\n\n // Race handler against timeout\n const result = await Promise.race([\n Promise.resolve(handler(input, ctx)),\n timeoutPromise,\n ])\n\n const duration = Date.now() - startTime\n log.info('Tool completed', { tool: name, duration })\n\n // Report success to telemetry\n if (enableTelemetry) {\n const tel = getTelemetry()\n tel?.trackToolCall(name, duration, true)\n }\n\n return result\n } catch (error) {\n const duration = Date.now() - startTime\n const errorMessage = error instanceof Error ? error.message : String(error)\n\n log.error('Tool failed', { \n tool: name, \n duration, \n error: errorMessage,\n stack: error instanceof Error ? error.stack : undefined,\n })\n\n // Report failure to telemetry\n if (enableTelemetry) {\n const tel = getTelemetry()\n tel?.trackToolCall(name, duration, false, errorMessage)\n }\n\n // Re-throw MCPErrors as-is, wrap others\n if (error instanceof MCPError) {\n throw error\n }\n\n throw new ToolExecutionError(\n name,\n errorMessage,\n error instanceof Error ? error : undefined\n )\n }\n }\n}\n\n/**\n * Generates a unique call ID\n */\nfunction generateCallId(): string {\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`\n}\n\n/**\n * Sanitizes input for logging (removes sensitive fields)\n */\nfunction sanitizeInput(input: unknown): unknown {\n if (typeof input !== 'object' || input === null) return input\n\n const sensitiveKeys = ['password', 'token', 'secret', 'key', 'auth', 'credential']\n const sanitized: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(input as Record<string, unknown>)) {\n if (sensitiveKeys.some(k => key.toLowerCase().includes(k))) {\n sanitized[key] = '[REDACTED]'\n } else {\n sanitized[key] = value\n }\n }\n\n return sanitized\n}\n","import {\n PaymentRequiredError,\n InsufficientCreditsError,\n SubscriptionRequiredError,\n ConfigurationError,\n} from '../errors'\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface PaymentConfig {\n /** OpenConductor API key for billing */\n apiKey: string\n /** Base URL for billing API (default: https://api.openconductor.ai) */\n apiUrl?: string\n /** Default upgrade URL to show users */\n upgradeUrl?: string\n /** Enable test mode (skips actual billing) */\n testMode?: boolean\n}\n\nexport interface CreditRequirement {\n /** Number of credits to deduct per call */\n credits: number\n}\n\nexport interface SubscriptionRequirement {\n /** Required subscription tier (e.g., 'pro', 'enterprise') */\n tier: string\n /** Alternative tiers that also grant access */\n allowedTiers?: string[]\n}\n\nexport interface StripeRequirement {\n /** Stripe Price ID for per-call billing */\n priceId: string\n}\n\nexport type PaymentRequirement = \n | CreditRequirement \n | SubscriptionRequirement \n | StripeRequirement\n\nexport interface UserContext {\n /** User ID for billing lookup */\n userId: string\n /** Optional API key override */\n apiKey?: string\n}\n\nexport interface BillingStatus {\n /** Whether the user can proceed */\n allowed: boolean\n /** Current credit balance (if applicable) */\n credits?: number\n /** Current subscription tier (if applicable) */\n tier?: string\n /** Reason for denial (if not allowed) */\n reason?: string\n /** URL for upgrade/purchase */\n actionUrl?: string\n}\n\n// ============================================================================\n// Configuration\n// ============================================================================\n\nlet paymentConfig: PaymentConfig | null = null\n\n/**\n * Initialize payment/billing configuration\n * \n * @example\n * ```typescript\n * initPayment({\n * apiKey: process.env.OPENCONDUCTOR_API_KEY!,\n * upgradeUrl: 'https://myapp.com/upgrade'\n * })\n * ```\n */\nexport function initPayment(config: PaymentConfig): void {\n paymentConfig = {\n apiUrl: 'https://api.openconductor.ai',\n testMode: false,\n ...config,\n }\n}\n\n/**\n * Get current payment configuration\n */\nexport function getPaymentConfig(): PaymentConfig | null {\n return paymentConfig\n}\n\n// ============================================================================\n// Billing Client\n// ============================================================================\n\ninterface CheckBillingParams {\n userId: string\n requirement: PaymentRequirement\n toolName: string\n}\n\ninterface DeductCreditsParams {\n userId: string\n credits: number\n toolName: string\n callId?: string\n}\n\nasync function checkBilling(params: CheckBillingParams): Promise<BillingStatus> {\n const config = paymentConfig\n if (!config) {\n throw new ConfigurationError('payment', 'Payment not initialized. Call initPayment() first.')\n }\n\n // Test mode - always allow\n if (config.testMode) {\n return { allowed: true, credits: 9999, tier: 'test' }\n }\n\n try {\n const response = await fetch(`${config.apiUrl}/functions/v1/billing-check`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${config.apiKey}`,\n },\n body: JSON.stringify({\n userId: params.userId,\n requirement: params.requirement,\n tool: params.toolName,\n }),\n })\n\n if (!response.ok) {\n // Non-2xx response - treat as billing check failed\n const errorBody = await response.text()\n console.error('[payment] Billing check failed:', response.status, errorBody)\n return {\n allowed: false,\n reason: 'Billing service unavailable',\n actionUrl: config.upgradeUrl,\n }\n }\n\n return await response.json() as BillingStatus\n } catch (error) {\n // Network error - fail open or closed based on config\n console.error('[payment] Billing check error:', error)\n return {\n allowed: false,\n reason: 'Unable to verify billing status',\n actionUrl: config.upgradeUrl,\n }\n }\n}\n\nasync function deductCredits(params: DeductCreditsParams): Promise<boolean> {\n const config = paymentConfig\n if (!config) return false\n\n // Test mode - don't actually deduct\n if (config.testMode) return true\n\n try {\n const response = await fetch(`${config.apiUrl}/functions/v1/billing-deduct`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${config.apiKey}`,\n },\n body: JSON.stringify({\n userId: params.userId,\n credits: params.credits,\n tool: params.toolName,\n callId: params.callId,\n }),\n })\n\n return response.ok\n } catch (error) {\n console.error('[payment] Credit deduction error:', error)\n return false\n }\n}\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\nfunction isCreditRequirement(req: PaymentRequirement): req is CreditRequirement {\n return 'credits' in req && typeof req.credits === 'number'\n}\n\nfunction isSubscriptionRequirement(req: PaymentRequirement): req is SubscriptionRequirement {\n return 'tier' in req && typeof req.tier === 'string'\n}\n\nfunction isStripeRequirement(req: PaymentRequirement): req is StripeRequirement {\n return 'priceId' in req && typeof req.priceId === 'string'\n}\n\n// ============================================================================\n// Main Middleware\n// ============================================================================\n\nexport interface RequirePaymentOptions {\n /** Tool name for billing records */\n toolName?: string\n /** Function to extract user ID from input */\n getUserId?: (input: unknown) => string | undefined\n /** Custom error handler */\n onPaymentError?: (error: Error) => void\n}\n\n/**\n * One-line payment middleware for MCP tools\n * \n * @example Credits-based billing\n * ```typescript\n * const paidTool = requirePayment({ credits: 10 })(myHandler)\n * ```\n * \n * @example Subscription tier requirement\n * ```typescript\n * const premiumTool = requirePayment({ tier: 'pro' })(myHandler)\n * ```\n * \n * @example With wrapTool\n * ```typescript\n * const safePaidTool = wrapTool(\n * requirePayment({ credits: 5 })(myHandler),\n * { name: 'premium-analysis' }\n * )\n * ```\n */\nexport function requirePayment<TInput extends { userId?: string }, TOutput>(\n requirement: PaymentRequirement,\n options: RequirePaymentOptions = {}\n) {\n return (\n handler: (input: TInput) => TOutput | Promise<TOutput>\n ): ((input: TInput) => Promise<TOutput>) => {\n \n const { toolName = 'unknown', getUserId } = options\n\n return async (input: TInput): Promise<TOutput> => {\n // Extract user ID\n const userId = getUserId?.(input) ?? input.userId\n \n if (!userId) {\n throw new PaymentRequiredError(toolName, {\n upgradeUrl: paymentConfig?.upgradeUrl,\n })\n }\n\n // Check billing status\n const status = await checkBilling({\n userId,\n requirement,\n toolName,\n })\n\n if (!status.allowed) {\n // Throw appropriate error based on requirement type\n if (isCreditRequirement(requirement)) {\n throw new InsufficientCreditsError(\n requirement.credits,\n status.credits ?? 0,\n { purchaseUrl: status.actionUrl }\n )\n }\n\n if (isSubscriptionRequirement(requirement)) {\n throw new SubscriptionRequiredError(\n requirement.tier,\n status.tier,\n { upgradeUrl: status.actionUrl }\n )\n }\n\n // Generic payment required\n throw new PaymentRequiredError(toolName, {\n upgradeUrl: status.actionUrl,\n ...(isStripeRequirement(requirement) && { priceId: requirement.priceId }),\n })\n }\n\n // Execute the handler\n const result = await handler(input)\n\n // Deduct credits after successful execution (if credit-based)\n if (isCreditRequirement(requirement)) {\n await deductCredits({\n userId,\n credits: requirement.credits,\n toolName,\n })\n }\n\n return result\n }\n }\n}\n\n// ============================================================================\n// Convenience Functions\n// ============================================================================\n\n/**\n * Create a paid tool with built-in payment verification\n * \n * @example\n * ```typescript\n * const analyzeData = createPaidTool({\n * name: 'analyze-data',\n * payment: { credits: 10 },\n * handler: async (input) => {\n * // Your tool logic\n * return result\n * }\n * })\n * ```\n */\nexport function createPaidTool<TInput extends { userId?: string }, TOutput>(config: {\n name: string\n payment: PaymentRequirement\n handler: (input: TInput) => TOutput | Promise<TOutput>\n getUserId?: (input: TInput) => string | undefined\n}): (input: TInput) => Promise<TOutput> {\n return requirePayment<TInput, TOutput>(config.payment, {\n toolName: config.name,\n getUserId: config.getUserId as (input: unknown) => string | undefined,\n })(config.handler)\n}\n\n/**\n * Check if a user can access a paid feature without executing it\n * Useful for UI gating\n * \n * @example\n * ```typescript\n * const canAccess = await canUserAccess('user_123', { credits: 10 }, 'premium-tool')\n * if (!canAccess.allowed) {\n * showUpgradePrompt(canAccess.actionUrl)\n * }\n * ```\n */\nexport async function canUserAccess(\n userId: string,\n requirement: PaymentRequirement,\n toolName: string = 'check'\n): Promise<BillingStatus> {\n return checkBilling({ userId, requirement, toolName })\n}\n\n/**\n * Get user's current billing status\n */\nexport async function getUserBillingStatus(userId: string): Promise<{\n credits: number\n tier: string\n active: boolean\n} | null> {\n const config = paymentConfig\n if (!config) return null\n\n if (config.testMode) {\n return { credits: 9999, tier: 'test', active: true }\n }\n\n try {\n const response = await fetch(`${config.apiUrl}/functions/v1/billing-status/${userId}`, {\n headers: {\n 'Authorization': `Bearer ${config.apiKey}`,\n },\n })\n\n if (!response.ok) return null\n return await response.json()\n } catch {\n return null\n }\n}\n\n// ============================================================================\n// Checkout Helpers\n// ============================================================================\n\nexport type CreditPack = 'starter' | 'pro' | 'business'\n\nexport interface CreditPackInfo {\n name: string\n credits: number\n price: number\n perCredit: number\n savings: number\n bestFor: string\n popular?: boolean\n}\n\nexport interface CheckoutSession {\n sessionId: string\n url: string\n pack: CreditPack\n credits: number\n price: number\n perCredit: number\n}\n\n/**\n * Get available credit packs and pricing\n * \n * @example\n * ```typescript\n * const packs = await getCreditPacks()\n * console.log(packs.pro) // { name: 'Pro Pack', credits: 500, price: 39.99, ... }\n * ```\n */\nexport async function getCreditPacks(): Promise<Record<CreditPack, CreditPackInfo> | null> {\n const config = paymentConfig\n if (!config) return null\n\n try {\n const response = await fetch(`${config.apiUrl}/functions/v1/credit-packs`)\n if (!response.ok) return null\n const data = await response.json()\n return data.packs\n } catch {\n return null\n }\n}\n\n/**\n * Create a Stripe checkout session for purchasing credits\n * Returns a URL to redirect the user to for payment\n * \n * @example\n * ```typescript\n * const checkout = await createCreditsCheckout('pro', {\n * successUrl: 'https://myapp.com/success',\n * cancelUrl: 'https://myapp.com/pricing',\n * })\n * \n * // Redirect user to checkout\n * window.location.href = checkout.url\n * ```\n */\nexport async function createCreditsCheckout(\n pack: CreditPack,\n options: {\n successUrl?: string\n cancelUrl?: string\n } = {}\n): Promise<CheckoutSession | null> {\n const config = paymentConfig\n if (!config) {\n console.error('[payment] Payment not initialized. Call initPayment() first.')\n return null\n }\n\n try {\n const response = await fetch(`${config.apiUrl}/functions/v1/stripe-checkout-credits`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${config.apiKey}`,\n },\n body: JSON.stringify({\n pack,\n successUrl: options.successUrl,\n cancelUrl: options.cancelUrl,\n }),\n })\n\n if (!response.ok) {\n const error = await response.text()\n console.error('[payment] Checkout creation failed:', error)\n return null\n }\n\n return await response.json() as CheckoutSession\n } catch (error) {\n console.error('[payment] Checkout error:', error)\n return null\n }\n}\n\n/**\n * Generate a direct checkout URL for embedding in upgrade prompts\n * \n * @example In an error handler:\n * ```typescript\n * catch (error) {\n * if (error instanceof InsufficientCreditsError) {\n * const checkoutUrl = await getCheckoutUrl('pro')\n * return { error: `Insufficient credits. Buy more: ${checkoutUrl}` }\n * }\n * }\n * ```\n */\nexport async function getCheckoutUrl(pack: CreditPack): Promise<string | null> {\n const session = await createCreditsCheckout(pack)\n return session?.url ?? null\n}\n\n// ============================================================================\n// Upgrade Prompts\n// ============================================================================\n\nexport interface UpgradePromptOptions {\n /** Required credits for the blocked action */\n required?: number\n /** Currently available credits */\n available?: number\n /** Tool that was blocked */\n toolName?: string\n /** Include direct checkout links */\n includeLinks?: boolean\n}\n\n/**\n * Generate a user-friendly upgrade prompt message\n * Use this in your error handlers to show helpful messages\n * \n * @example\n * ```typescript\n * catch (error) {\n * if (error instanceof InsufficientCreditsError) {\n * const prompt = await generateUpgradePrompt({\n * required: error.data.required,\n * available: error.data.available,\n * toolName: 'analyze-data'\n * })\n * console.log(prompt.message)\n * // \"You need 10 more credits to use analyze-data. \n * // Buy the Pro Pack (500 credits) for $39.99 ā https://...\"\n * }\n * }\n * ```\n */\nexport async function generateUpgradePrompt(\n options: UpgradePromptOptions = {}\n): Promise<{\n message: string\n shortMessage: string\n recommendedPack: CreditPack\n packs: Record<CreditPack, { credits: number; price: number; url: string | null }>\n}> {\n const { required = 0, available = 0, toolName, includeLinks = true } = options\n const needed = Math.max(0, required - available)\n \n // Determine recommended pack based on needed credits\n let recommendedPack: CreditPack = 'starter'\n if (needed > 100) recommendedPack = 'pro'\n if (needed > 500) recommendedPack = 'business'\n \n // Get pack URLs if requested\n const packUrls: Record<CreditPack, string | null> = {\n starter: null,\n pro: null,\n business: null,\n }\n \n if (includeLinks) {\n const [starterUrl, proUrl, businessUrl] = await Promise.all([\n getCheckoutUrl('starter'),\n getCheckoutUrl('pro'),\n getCheckoutUrl('business'),\n ])\n packUrls.starter = starterUrl\n packUrls.pro = proUrl\n packUrls.business = businessUrl\n }\n \n // Build message\n const toolPart = toolName ? ` to use ${toolName}` : ''\n const shortMessage = `Insufficient credits: need ${required}, have ${available}`\n \n let message = `You need ${needed} more credits${toolPart}.\\n\\n`\n message += `š³ Quick top-up options:\\n`\n message += ` ⢠Starter: 100 credits for $9.99${packUrls.starter ? ` ā ${packUrls.starter}` : ''}\\n`\n message += ` ⢠Pro: 500 credits for $39.99 (20% off)${packUrls.pro ? ` ā ${packUrls.pro}` : ''}\\n`\n message += ` ⢠Business: 2,000 credits for $119.99 (40% off)${packUrls.business ? ` ā ${packUrls.business}` : ''}\\n`\n \n if (recommendedPack !== 'starter') {\n message += `\\n⨠Recommended: ${recommendedPack.charAt(0).toUpperCase() + recommendedPack.slice(1)} Pack`\n }\n \n return {\n message,\n shortMessage,\n recommendedPack,\n packs: {\n starter: { credits: 100, price: 9.99, url: packUrls.starter },\n pro: { credits: 500, price: 39.99, url: packUrls.pro },\n business: { credits: 2000, price: 119.99, url: packUrls.business },\n },\n }\n}\n\n/**\n * Get a simple checkout URL for the dashboard\n * Useful when you don't want to create a full Stripe session\n */\nexport function getDashboardCheckoutUrl(options: {\n required?: number\n available?: number\n pack?: CreditPack\n} = {}): string {\n const params = new URLSearchParams()\n params.set('action', 'buy-credits')\n if (options.required) params.set('required', String(options.required))\n if (options.available) params.set('available', String(options.available))\n if (options.pack) params.set('pack', options.pack)\n return `https://dashboard.openconductor.ai?${params.toString()}`\n}\n\n/**\n * Create an error handler that automatically generates upgrade prompts\n * \n * @example\n * ```typescript\n * const handleError = createUpgradeErrorHandler({\n * onInsufficientCredits: (prompt) => {\n * return { error: prompt.shortMessage, upgradeUrl: prompt.packs.pro.url }\n * }\n * })\n * \n * // In your tool:\n * try {\n * return await paidHandler(input)\n * } catch (error) {\n * return handleError(error)\n * }\n * ```\n */\nexport function createUpgradeErrorHandler(handlers: {\n onInsufficientCredits?: (prompt: Awaited<ReturnType<typeof generateUpgradePrompt>>) => unknown\n onSubscriptionRequired?: (error: SubscriptionRequiredError) => unknown\n onPaymentRequired?: (error: PaymentRequiredError) => unknown\n onOtherError?: (error: Error) => unknown\n}) {\n return async (error: Error): Promise<unknown> => {\n if (error instanceof InsufficientCreditsError && handlers.onInsufficientCredits) {\n const prompt = await generateUpgradePrompt({\n required: error.data?.required as number,\n available: error.data?.available as number,\n })\n return handlers.onInsufficientCredits(prompt)\n }\n \n if (error instanceof SubscriptionRequiredError && handlers.onSubscriptionRequired) {\n return handlers.onSubscriptionRequired(error)\n }\n \n if (error instanceof PaymentRequiredError && handlers.onPaymentRequired) {\n return handlers.onPaymentRequired(error)\n }\n \n if (handlers.onOtherError) {\n return handlers.onOtherError(error)\n }\n \n throw error\n }\n}\n"]}
|