@cadraos/sdk 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/resources/base.ts","../src/errors/sdk-errors.ts","../src/utils/retry.ts","../src/utils/http.ts","../src/streaming/sse-client.ts","../src/streaming/stream-controller.ts","../src/resources/agents.ts","../src/resources/skills.ts","../src/resources/tools.ts","../src/resources/artifacts.ts","../src/resources/sessions.ts","../src/client.ts"],"names":["value"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Base Resource API\n *\n * Abstract base class for all resource APIs.\n * Provides common HTTP methods and path handling.\n */\n\nimport type { HttpClient } from '../utils/http.js';\nimport type { ListOptions, PaginatedResponse } from '../types/index.js';\n\n/**\n * Base Resource API class\n */\nexport abstract class BaseResourceAPI {\n protected readonly http: HttpClient;\n protected readonly basePath: string;\n\n constructor(http: HttpClient, basePath: string) {\n this.http = http;\n this.basePath = basePath;\n }\n\n /**\n * Build query parameters from list options\n */\n protected buildListQuery(options?: ListOptions): Record<string, string | number | boolean | undefined> {\n if (!options) return {};\n\n return {\n limit: options.limit,\n offset: options.offset,\n sort: options.sort,\n order: options.order,\n };\n }\n\n /**\n * HTTP GET request helper\n */\n protected async httpGet<T>(\n path: string,\n query?: Record<string, string | number | boolean | undefined>\n ): Promise<T> {\n return this.http.get<T>(`${this.basePath}${path}`, query);\n }\n\n /**\n * HTTP POST request helper\n */\n protected async httpPost<T>(\n path: string,\n body?: unknown,\n options?: { idempotencyKey?: string; skipRetry?: boolean }\n ): Promise<T> {\n return this.http.post<T>(`${this.basePath}${path}`, body, options);\n }\n\n /**\n * HTTP PATCH request helper\n */\n protected async httpPatch<T>(\n path: string,\n body?: unknown,\n options?: { idempotencyKey?: string }\n ): Promise<T> {\n return this.http.patch<T>(`${this.basePath}${path}`, body, options);\n }\n\n /**\n * HTTP DELETE request helper\n */\n protected async httpDelete<T>(path: string): Promise<T> {\n return this.http.delete<T>(`${this.basePath}${path}`);\n }\n\n /**\n * List resources with pagination\n */\n protected async listResources<T>(\n path: string,\n options?: ListOptions\n ): Promise<PaginatedResponse<T>> {\n const query = this.buildListQuery(options);\n // The API returns { data: T[], pagination: ... } which we unwrap\n return this.httpGet<PaginatedResponse<T>>(path, query);\n }\n}\n","/**\n * SDK Error Classes\n *\n * Typed error hierarchy for all SDK operations.\n * All errors extend AISaaSError and include code, status, and optional details.\n */\n\n/**\n * Base error class for all SDK errors\n */\nexport class AISaaSError extends Error {\n /** Error code */\n readonly code: string;\n /** HTTP status code */\n readonly status: number;\n /** Additional error details */\n readonly details?: Record<string, unknown>;\n /** Request ID from server (for debugging) */\n readonly requestId?: string;\n\n constructor(\n message: string,\n code: string,\n status: number,\n details?: Record<string, unknown>,\n requestId?: string\n ) {\n super(message);\n this.name = 'AISaaSError';\n this.code = code;\n this.status = status;\n this.details = details;\n this.requestId = requestId;\n\n // Maintains proper stack trace for where error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\n/**\n * Authentication error (401)\n * Thrown when API key is invalid, expired, or missing\n */\nexport class AuthenticationError extends AISaaSError {\n constructor(\n message: string = 'Authentication failed',\n code: string = 'authentication_error',\n details?: Record<string, unknown>,\n requestId?: string\n ) {\n super(message, code, 401, details, requestId);\n this.name = 'AuthenticationError';\n }\n}\n\n/**\n * Authorization error (403)\n * Thrown when user lacks permission for the requested operation\n */\nexport class AuthorizationError extends AISaaSError {\n constructor(\n message: string = 'Access denied',\n code: string = 'authorization_error',\n details?: Record<string, unknown>,\n requestId?: string\n ) {\n super(message, code, 403, details, requestId);\n this.name = 'AuthorizationError';\n }\n}\n\n/**\n * Not found error (404)\n * Thrown when requested resource does not exist\n */\nexport class NotFoundError extends AISaaSError {\n constructor(\n message: string = 'Resource not found',\n code: string = 'not_found',\n details?: Record<string, unknown>,\n requestId?: string\n ) {\n super(message, code, 404, details, requestId);\n this.name = 'NotFoundError';\n }\n}\n\n/**\n * Validation error (400/422)\n * Thrown when request input is invalid\n */\nexport class ValidationError extends AISaaSError {\n /** Field-level validation errors */\n readonly errors: Array<{ field: string; message: string }>;\n\n constructor(\n message: string = 'Validation failed',\n errors: Array<{ field: string; message: string }> = [],\n details?: Record<string, unknown>,\n requestId?: string\n ) {\n super(message, 'validation_error', 400, details, requestId);\n this.name = 'ValidationError';\n this.errors = errors;\n }\n}\n\n/**\n * Rate limit error (429)\n * Thrown when rate limit is exceeded\n */\nexport class RateLimitError extends AISaaSError {\n /** Seconds until rate limit resets */\n readonly retryAfter?: number;\n\n constructor(\n message: string = 'Rate limit exceeded',\n retryAfter?: number,\n details?: Record<string, unknown>,\n requestId?: string\n ) {\n super(message, 'rate_limit_error', 429, details, requestId);\n this.name = 'RateLimitError';\n this.retryAfter = retryAfter;\n }\n}\n\n/**\n * Server error (5xx)\n * Thrown for server-side errors\n */\nexport class ServerError extends AISaaSError {\n constructor(\n message: string = 'Server error',\n status: number = 500,\n details?: Record<string, unknown>,\n requestId?: string\n ) {\n super(message, 'server_error', status, details, requestId);\n this.name = 'ServerError';\n }\n}\n\n/**\n * Conflict error (409)\n * Thrown when there is a resource conflict\n */\nexport class ConflictError extends AISaaSError {\n constructor(\n message: string = 'Resource conflict',\n details?: Record<string, unknown>,\n requestId?: string\n ) {\n super(message, 'conflict', 409, details, requestId);\n this.name = 'ConflictError';\n }\n}\n\n/**\n * Timeout error\n * Thrown when a request or operation times out\n */\nexport class TimeoutError extends AISaaSError {\n constructor(\n message: string = 'Request timed out',\n details?: Record<string, unknown>,\n requestId?: string\n ) {\n super(message, 'timeout', 408, details, requestId);\n this.name = 'TimeoutError';\n }\n}\n\n/**\n * Network error\n * Thrown when there is a network connectivity issue\n */\nexport class NetworkError extends AISaaSError {\n constructor(\n message: string = 'Network error',\n details?: Record<string, unknown>\n ) {\n super(message, 'network_error', 0, details);\n this.name = 'NetworkError';\n }\n}\n\n/**\n * Parse error from API response to appropriate error class\n */\nexport function parseApiError(\n status: number,\n body: unknown,\n requestId?: string\n): AISaaSError {\n const errorBody = body as {\n error?: {\n code?: string;\n message?: string;\n details?: Record<string, unknown>;\n };\n } | null;\n\n const message = errorBody?.error?.message ?? 'An error occurred';\n const code = errorBody?.error?.code ?? 'unknown_error';\n const details = errorBody?.error?.details;\n\n switch (status) {\n case 400:\n case 422: {\n // Check if it's a validation error with field errors\n const fieldErrors = details?.errors as Record<string, string[]> | undefined;\n if (fieldErrors) {\n const errors: Array<{ field: string; message: string }> = [];\n for (const [field, messages] of Object.entries(fieldErrors)) {\n for (const msg of messages) {\n errors.push({ field, message: msg });\n }\n }\n return new ValidationError(message, errors, details, requestId);\n }\n return new ValidationError(message, [], details, requestId);\n }\n\n case 401:\n return new AuthenticationError(message, code, details, requestId);\n\n case 403:\n return new AuthorizationError(message, code, details, requestId);\n\n case 404:\n return new NotFoundError(message, code, details, requestId);\n\n case 409:\n return new ConflictError(message, details, requestId);\n\n case 429: {\n const retryAfter = details?.retryAfter as number | undefined;\n return new RateLimitError(message, retryAfter, details, requestId);\n }\n\n default:\n if (status >= 500) {\n return new ServerError(message, status, details, requestId);\n }\n return new AISaaSError(message, code, status, details, requestId);\n }\n}\n","/**\n * Retry utility with exponential backoff\n */\n\nimport { RateLimitError, ServerError } from '../errors/index.js';\n\n/**\n * Retry configuration\n */\nexport interface RetryConfig {\n /** Maximum number of retry attempts (default: 3) */\n maxRetries: number;\n /** Base delay in milliseconds (default: 1000) */\n baseDelayMs: number;\n /** Maximum delay in milliseconds (default: 30000) */\n maxDelayMs: number;\n /** Jitter factor (0-1, default: 0.1) */\n jitterFactor: number;\n}\n\n/**\n * Default retry configuration\n */\nexport const DEFAULT_RETRY_CONFIG: RetryConfig = {\n maxRetries: 3,\n baseDelayMs: 1000,\n maxDelayMs: 30000,\n jitterFactor: 0.1,\n};\n\n/**\n * Determine if an error should be retried\n */\nexport function shouldRetry(error: unknown, attempt: number, maxRetries: number): boolean {\n if (attempt >= maxRetries) {\n return false;\n }\n\n // Retry on rate limit errors\n if (error instanceof RateLimitError) {\n return true;\n }\n\n // Retry on 5xx server errors\n if (error instanceof ServerError) {\n return true;\n }\n\n // Retry on network errors\n if (error instanceof Error && error.name === 'NetworkError') {\n return true;\n }\n\n // Retry on timeout errors\n if (error instanceof Error && error.name === 'TimeoutError') {\n return true;\n }\n\n // Don't retry other errors (4xx except 429)\n return false;\n}\n\n/**\n * Calculate delay before next retry with exponential backoff and jitter\n */\nexport function calculateRetryDelay(\n attempt: number,\n config: RetryConfig,\n retryAfter?: number\n): number {\n // If server specified retry-after, use it\n if (retryAfter !== undefined && retryAfter > 0) {\n return retryAfter * 1000; // Convert seconds to milliseconds\n }\n\n // Exponential backoff: delay = base * 2^attempt\n const exponentialDelay = config.baseDelayMs * Math.pow(2, attempt);\n\n // Cap at max delay\n const cappedDelay = Math.min(exponentialDelay, config.maxDelayMs);\n\n // Add jitter to prevent thundering herd\n const jitter = cappedDelay * config.jitterFactor * Math.random();\n\n return cappedDelay + jitter;\n}\n\n/**\n * Sleep for specified milliseconds\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Retry wrapper for async operations\n */\nexport async function withRetry<T>(\n operation: () => Promise<T>,\n config: Partial<RetryConfig> = {}\n): Promise<T> {\n const fullConfig: RetryConfig = { ...DEFAULT_RETRY_CONFIG, ...config };\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= fullConfig.maxRetries; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error;\n\n if (!shouldRetry(error, attempt, fullConfig.maxRetries)) {\n throw error;\n }\n\n // Get retry-after from rate limit error if available\n const retryAfter = error instanceof RateLimitError ? error.retryAfter : undefined;\n const delay = calculateRetryDelay(attempt, fullConfig, retryAfter);\n\n await sleep(delay);\n }\n }\n\n // Should never reach here, but TypeScript needs this\n throw lastError;\n}\n","/**\n * HTTP Client\n *\n * Handles all HTTP requests with authentication, retry logic, and error handling.\n */\n\nimport {\n parseApiError,\n NetworkError,\n TimeoutError,\n} from '../errors/index.js';\nimport type { ApiResponse, ApiSuccessResponse } from '../types/index.js';\nimport { withRetry, type RetryConfig } from './retry.js';\n\n/**\n * HTTP Client configuration\n */\nexport interface HttpClientConfig {\n /** Base URL for API requests */\n baseUrl: string;\n /** API key for authentication */\n apiKey?: string;\n /** OAuth token for authentication */\n token?: string;\n /** Token provider callback (called before each request) */\n tokenProvider?: () => Promise<string>;\n /** Organization ID */\n orgId: number;\n /** Request timeout in milliseconds (default: 30000) */\n timeout: number;\n /** Retry configuration */\n retry: RetryConfig;\n /** Custom headers */\n headers?: Record<string, string>;\n}\n\n/**\n * Request options\n */\nexport interface RequestOptions {\n /** HTTP method */\n method: 'GET' | 'POST' | 'PATCH' | 'DELETE' | 'PUT';\n /** Request path (appended to base URL) */\n path: string;\n /** Request body */\n body?: unknown;\n /** Query parameters */\n query?: Record<string, string | number | boolean | undefined>;\n /** Additional headers */\n headers?: Record<string, string>;\n /** Skip retry (for non-idempotent operations) */\n skipRetry?: boolean;\n /** Idempotency key */\n idempotencyKey?: string;\n}\n\n/**\n * HTTP Client class\n */\nexport class HttpClient {\n private config: HttpClientConfig;\n private tokenRefreshAttempts = 0;\n private readonly maxTokenRefreshAttempts = 2;\n\n constructor(config: HttpClientConfig) {\n this.config = config;\n }\n\n /**\n * Get authorization header value\n */\n private async getAuthHeader(): Promise<string> {\n if (this.config.apiKey) {\n return `Bearer ${this.config.apiKey}`;\n }\n\n if (this.config.tokenProvider) {\n const token = await this.config.tokenProvider();\n return `Bearer ${token}`;\n }\n\n if (this.config.token) {\n return `Bearer ${this.config.token}`;\n }\n\n throw new Error('No authentication configured. Provide apiKey, token, or tokenProvider.');\n }\n\n /**\n * Build full URL with query parameters\n */\n private buildUrl(path: string, query?: Record<string, string | number | boolean | undefined>): string {\n // Use path directly - routes are at /api/v1/*\n const url = new URL(path, this.config.baseUrl);\n\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n return url.toString();\n }\n\n /**\n * Make an HTTP request\n */\n async request<T>(options: RequestOptions): Promise<T> {\n const makeRequest = async (): Promise<T> => {\n const url = this.buildUrl(options.path, options.query);\n const authHeader = await this.getAuthHeader();\n\n const headers: Record<string, string> = {\n 'Authorization': authHeader,\n 'X-Org-Id': String(this.config.orgId),\n 'Content-Type': 'application/json',\n ...this.config.headers,\n ...options.headers,\n };\n\n // Add idempotency key for mutating operations\n if (options.idempotencyKey) {\n headers['Idempotency-Key'] = options.idempotencyKey;\n }\n\n // Create abort controller for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n const response = await fetch(url, {\n method: options.method,\n headers,\n body: options.body !== undefined ? JSON.stringify(options.body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n // Get request ID from response headers\n const requestId = response.headers.get('X-Request-Id') ?? undefined;\n\n // Parse response body\n let body: unknown;\n const contentType = response.headers.get('Content-Type');\n if (contentType?.includes('application/json')) {\n body = await response.json();\n } else {\n body = await response.text();\n }\n\n // Handle errors\n if (!response.ok) {\n // Check for 401 and token provider - try refresh\n if (response.status === 401 && this.config.tokenProvider) {\n this.tokenRefreshAttempts++;\n if (this.tokenRefreshAttempts < this.maxTokenRefreshAttempts) {\n // Token provider should return a fresh token\n // Retry the request (token provider will be called again)\n return this.request(options);\n }\n }\n\n throw parseApiError(response.status, body, requestId);\n }\n\n // Reset token refresh attempts on success\n this.tokenRefreshAttempts = 0;\n\n // Handle success response\n const apiResponse = body as ApiResponse<T>;\n if ('success' in apiResponse && apiResponse.success) {\n return (apiResponse as ApiSuccessResponse<T>).data;\n }\n\n // If response doesn't match expected format, return as-is\n return body as T;\n\n } catch (error) {\n clearTimeout(timeoutId);\n\n // Handle abort (timeout)\n if (error instanceof Error && error.name === 'AbortError') {\n throw new TimeoutError(`Request timed out after ${this.config.timeout}ms`);\n }\n\n // Handle fetch errors (network issues)\n if (error instanceof TypeError && error.message.includes('fetch')) {\n throw new NetworkError(`Network error: ${error.message}`);\n }\n\n throw error;\n }\n };\n\n // Use retry wrapper for idempotent operations\n if (options.skipRetry) {\n return makeRequest();\n }\n\n return withRetry(makeRequest, this.config.retry);\n }\n\n /**\n * GET request\n */\n async get<T>(\n path: string,\n query?: Record<string, string | number | boolean | undefined>\n ): Promise<T> {\n return this.request<T>({\n method: 'GET',\n path,\n query,\n });\n }\n\n /**\n * POST request\n */\n async post<T>(\n path: string,\n body?: unknown,\n options?: { idempotencyKey?: string; skipRetry?: boolean }\n ): Promise<T> {\n return this.request<T>({\n method: 'POST',\n path,\n body,\n idempotencyKey: options?.idempotencyKey,\n skipRetry: options?.skipRetry,\n });\n }\n\n /**\n * PATCH request\n */\n async patch<T>(\n path: string,\n body?: unknown,\n options?: { idempotencyKey?: string }\n ): Promise<T> {\n return this.request<T>({\n method: 'PATCH',\n path,\n body,\n idempotencyKey: options?.idempotencyKey,\n });\n }\n\n /**\n * DELETE request\n */\n async delete<T>(path: string): Promise<T> {\n return this.request<T>({\n method: 'DELETE',\n path,\n skipRetry: true, // Don't retry deletes\n });\n }\n\n /**\n * Update configuration\n */\n updateConfig(config: Partial<HttpClientConfig>): void {\n this.config = { ...this.config, ...config };\n }\n}\n\n/**\n * Generate a random idempotency key\n */\nexport function generateIdempotencyKey(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 15);\n return `idem_${timestamp}_${random}`;\n}\n","/**\n * SSE Client\n *\n * Handles Server-Sent Events connections with automatic reconnection.\n * Uses fetch + ReadableStream for cross-platform compatibility.\n */\n\nimport type { SSEEvent, StreamEventType } from '../types/streaming.js';\n\n/**\n * SSE Client configuration\n */\nexport interface SSEClientConfig {\n /** Stream URL */\n url: string;\n /** Authorization header */\n authHeader: string;\n /** Organization ID */\n orgId: number;\n /** Event callback */\n onEvent: (event: SSEEvent) => void;\n /** Error callback */\n onError: (error: Error) => void;\n /** Connection state callback */\n onConnectionChange: (connected: boolean) => void;\n}\n\n/**\n * SSE Client class\n *\n * Implements SSE parsing using fetch + ReadableStream for compatibility\n * with both Node.js and browser environments.\n */\nexport class SSEClient {\n private config: SSEClientConfig;\n private abortController: AbortController | null = null;\n private connected = false;\n\n constructor(config: SSEClientConfig) {\n this.config = config;\n }\n\n /**\n * Connect to SSE endpoint\n */\n async connect(): Promise<void> {\n this.abortController = new AbortController();\n\n try {\n const response = await fetch(this.config.url, {\n method: 'GET',\n headers: {\n 'Authorization': this.config.authHeader,\n 'X-Org-Id': String(this.config.orgId),\n 'Accept': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n },\n signal: this.abortController.signal,\n });\n\n if (!response.ok) {\n throw new Error(`SSE connection failed: ${response.status} ${response.statusText}`);\n }\n\n if (!response.body) {\n throw new Error('Response body not available');\n }\n\n this.connected = true;\n this.config.onConnectionChange(true);\n\n // Parse SSE stream\n await this.parseStream(response.body);\n\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n // Intentional disconnect\n return;\n }\n this.config.onError(error instanceof Error ? error : new Error(String(error)));\n } finally {\n this.connected = false;\n this.config.onConnectionChange(false);\n }\n }\n\n /**\n * Disconnect from SSE endpoint\n */\n disconnect(): void {\n if (this.abortController) {\n this.abortController.abort();\n this.abortController = null;\n }\n this.connected = false;\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Parse SSE stream\n */\n private async parseStream(body: ReadableStream<Uint8Array>): Promise<void> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n\n let buffer = '';\n let currentEvent: Partial<{ type: string; id: string; data: string }> = {};\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n // Process complete lines\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? ''; // Keep incomplete line in buffer\n\n for (const line of lines) {\n // Empty line signals end of event\n if (line === '') {\n if (currentEvent.type && currentEvent.data !== undefined) {\n this.dispatchEvent(currentEvent as { type: string; id?: string; data: string });\n }\n currentEvent = {};\n continue;\n }\n\n // Skip comments (keepalive)\n if (line.startsWith(':')) {\n continue;\n }\n\n // Parse SSE fields\n const colonIndex = line.indexOf(':');\n if (colonIndex === -1) {\n continue;\n }\n\n const field = line.substring(0, colonIndex);\n // Value starts after colon, skip optional leading space\n let value = line.substring(colonIndex + 1);\n if (value.startsWith(' ')) {\n value = value.substring(1);\n }\n\n switch (field) {\n case 'event':\n currentEvent.type = value;\n break;\n case 'id':\n currentEvent.id = value;\n break;\n case 'data':\n // Append to existing data (multiple data lines)\n currentEvent.data = currentEvent.data\n ? currentEvent.data + '\\n' + value\n : value;\n break;\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n /**\n * Dispatch parsed event\n */\n private dispatchEvent(event: { type: string; id?: string; data: string }): void {\n try {\n // Parse JSON data\n let data: unknown;\n try {\n data = JSON.parse(event.data);\n } catch {\n // If not JSON, use raw string\n data = event.data;\n }\n\n const sseEvent: SSEEvent = {\n type: event.type as StreamEventType,\n id: event.id,\n data,\n };\n\n this.config.onEvent(sseEvent);\n } catch (error) {\n this.config.onError(\n error instanceof Error ? error : new Error(`Failed to parse event: ${String(error)}`)\n );\n }\n }\n}\n","/**\n * Stream Controller\n *\n * Manages execution streaming with automatic reconnection and fallback to polling.\n * Implements the StreamController interface for type-safe event handling.\n */\n\nimport { SSEClient } from './sse-client.js';\nimport { AISaaSError } from '../errors/index.js';\nimport type {\n StreamController,\n StreamEventMap,\n SSEEvent,\n StreamingStatus,\n StreamingConfig,\n CompleteEvent,\n ErrorEvent,\n} from '../types/streaming.js';\nimport type { AgentExecution, ExecutionLog } from '../types/agents.js';\n\n/**\n * Default streaming configuration\n */\nconst DEFAULT_STREAMING_CONFIG: StreamingConfig = {\n maxReconnectAttempts: 5,\n reconnectBaseDelayMs: 1000,\n reconnectMaxDelayMs: 10000,\n activityTimeoutMs: 30000,\n pollingIntervalMs: 2000,\n};\n\n/**\n * Stream controller creation options\n */\nexport interface ExecutionStreamControllerOptions {\n /** Execution ID to stream */\n executionId: string;\n /** Base URL for API */\n baseUrl: string;\n /** API key or token */\n apiKey?: string;\n /** Organization ID */\n orgId: number;\n /** Function to get execution status (for polling fallback) */\n getExecution: (executionId: string) => Promise<AgentExecution>;\n /** Streaming configuration */\n config?: Partial<StreamingConfig>;\n}\n\n/**\n * Execution Stream Controller\n *\n * Manages the lifecycle of an execution stream, including:\n * - SSE connection management\n * - Automatic reconnection with exponential backoff\n * - Fallback to polling on connection failure\n * - Event deduplication\n */\nexport interface ExecutionStreamController extends StreamController {\n /** Connect to the stream */\n connect(): Promise<void>;\n}\n\n/**\n * Internal implementation of ExecutionStreamController\n */\nclass ExecutionStreamControllerImpl implements ExecutionStreamController {\n private options: ExecutionStreamControllerOptions;\n private config: StreamingConfig;\n private sseClient: SSEClient | null = null;\n private status: StreamingStatus = 'connecting';\n private reconnectAttempts = 0;\n private seenEventIds = new Set<string>();\n private _lastEventId: string | null = null;\n private activityTimeoutId: ReturnType<typeof setTimeout> | null = null;\n private pollingIntervalId: ReturnType<typeof setInterval> | null = null;\n private finalExecution: AgentExecution | null = null;\n private finalError: ErrorEvent | null = null;\n\n // Event callbacks\n private listeners: {\n log: Array<(log: ExecutionLog) => void>;\n toolCall: Array<(data: StreamEventMap['toolCall']) => void>;\n toolResult: Array<(data: StreamEventMap['toolResult']) => void>;\n plan: Array<(data: StreamEventMap['plan']) => void>;\n complete: Array<(data: CompleteEvent) => void>;\n error: Array<(error: ErrorEvent) => void>;\n connectionChange: Array<(data: StreamEventMap['connectionChange']) => void>;\n } = {\n log: [],\n toolCall: [],\n toolResult: [],\n plan: [],\n complete: [],\n error: [],\n connectionChange: [],\n };\n\n // Promise for wait()\n private waitPromise: Promise<AgentExecution> | null = null;\n private waitResolve: ((execution: AgentExecution) => void) | null = null;\n private waitReject: ((error: Error) => void) | null = null;\n\n constructor(options: ExecutionStreamControllerOptions) {\n this.options = options;\n this.config = { ...DEFAULT_STREAMING_CONFIG, ...options.config };\n }\n\n /**\n * Get the last event ID (for resume support)\n */\n get lastEventId(): string | null {\n return this._lastEventId;\n }\n\n /**\n * Connect to the execution stream\n */\n async connect(): Promise<void> {\n this.status = 'connecting';\n this.reconnectAttempts = 0;\n\n try {\n await this.connectSSE();\n } catch (error) {\n await this.handleConnectionError(error);\n }\n }\n\n /**\n * Register event listener\n */\n on<K extends keyof StreamEventMap>(\n event: K,\n callback: (data: StreamEventMap[K]) => void\n ): void {\n const listeners = this.listeners[event];\n if (listeners) {\n // Type assertion needed due to variance issues\n (listeners as Array<(data: StreamEventMap[K]) => void>).push(callback);\n }\n }\n\n /**\n * Cancel the stream\n */\n cancel(): void {\n this.status = 'closed';\n this.stopActivityTimeout();\n this.stopPolling();\n\n if (this.sseClient) {\n this.sseClient.disconnect();\n this.sseClient = null;\n }\n }\n\n /**\n * Wait for completion\n */\n wait(): Promise<AgentExecution> {\n // If already complete, return immediately\n if (this.finalExecution) {\n return Promise.resolve(this.finalExecution);\n }\n if (this.finalError) {\n return Promise.reject(new AISaaSError(\n this.finalError.error,\n this.finalError.errorCode ?? 'execution_error',\n 500\n ));\n }\n\n // Create promise if not exists\n if (!this.waitPromise) {\n this.waitPromise = new Promise((resolve, reject) => {\n this.waitResolve = resolve;\n this.waitReject = reject;\n });\n }\n\n return this.waitPromise;\n }\n\n // ===== Private methods =====\n\n /**\n * Connect to SSE endpoint\n */\n private async connectSSE(): Promise<void> {\n const url = `${this.options.baseUrl}/agents/runs/${this.options.executionId}/stream`;\n\n this.sseClient = new SSEClient({\n url,\n authHeader: `Bearer ${this.options.apiKey}`,\n orgId: this.options.orgId,\n onEvent: (event) => this.handleEvent(event),\n onError: (error) => this.handleConnectionError(error),\n onConnectionChange: (connected) => {\n if (connected) {\n this.status = 'connected';\n this.reconnectAttempts = 0;\n this.resetActivityTimeout();\n }\n this.emit('connectionChange', { connected, usingFallback: false });\n },\n });\n\n await this.sseClient.connect();\n }\n\n /**\n * Handle incoming SSE event\n */\n private handleEvent(event: SSEEvent): void {\n // Reset activity timeout\n this.resetActivityTimeout();\n\n // Deduplicate by event ID\n if (event.id) {\n if (this.seenEventIds.has(event.id)) {\n return;\n }\n this.seenEventIds.add(event.id);\n this._lastEventId = event.id;\n\n // Limit set size to prevent memory leaks\n if (this.seenEventIds.size > 1000) {\n const ids = Array.from(this.seenEventIds);\n this.seenEventIds = new Set(ids.slice(-500));\n }\n }\n\n // Map wire format (snake_case) to SDK format (camelCase)\n const data = event.data as Record<string, unknown>;\n\n switch (event.type) {\n case 'log':\n this.emit('log', data.log as ExecutionLog);\n break;\n\n case 'tool_call':\n this.emit('toolCall', {\n toolCallId: data.toolCallId as string,\n toolName: data.toolName as string,\n inputs: data.args as Record<string, unknown>,\n stepIndex: data.stepIndex as number ?? 0,\n });\n break;\n\n case 'tool_result':\n this.emit('toolResult', {\n toolCallId: data.toolCallId as string,\n toolName: data.toolName as string,\n result: data.result,\n durationMs: data.durationMs as number,\n });\n break;\n\n case 'complete':\n this.handleComplete(data);\n break;\n\n case 'error':\n this.handleError({\n error: data.error as string,\n errorCode: data.errorCode as string | undefined,\n });\n break;\n\n case 'timeout':\n if ((data as { retryable?: boolean }).retryable) {\n this.handleConnectionError(new Error('Stream timeout'));\n } else {\n this.handleError({\n error: data.error as string,\n errorCode: 'timeout',\n });\n }\n break;\n\n // Ignore connection-related events\n case 'connected':\n case 'subscribed':\n case 'step':\n break;\n }\n }\n\n /**\n * Handle completion\n */\n private handleComplete(data: Record<string, unknown>): void {\n this.status = 'closed';\n this.stopActivityTimeout();\n\n const execution: AgentExecution = {\n uuid: this.options.executionId,\n agentUuid: '',\n status: 'completed',\n input: { task: '' },\n output: data.output as string | undefined,\n logs: [],\n tokenUsage: data.tokenUsage as AgentExecution['tokenUsage'],\n cost: data.cost as number | undefined,\n queuedAt: '',\n ...data,\n };\n\n this.finalExecution = execution;\n this.emit('complete', { execution });\n\n if (this.waitResolve) {\n this.waitResolve(execution);\n }\n }\n\n /**\n * Handle error\n */\n private handleError(error: ErrorEvent): void {\n this.status = 'closed';\n this.stopActivityTimeout();\n\n this.finalError = error;\n this.emit('error', error);\n\n if (this.waitReject) {\n this.waitReject(new AISaaSError(\n error.error,\n error.errorCode ?? 'execution_error',\n 500\n ));\n }\n }\n\n /**\n * Handle connection error\n */\n private async handleConnectionError(error: unknown): Promise<void> {\n if (this.status === 'closed') {\n return;\n }\n\n // Attempt reconnection\n if (this.reconnectAttempts < this.config.maxReconnectAttempts) {\n this.status = 'reconnecting';\n this.reconnectAttempts++;\n\n const delay = Math.min(\n this.config.reconnectBaseDelayMs * Math.pow(2, this.reconnectAttempts),\n this.config.reconnectMaxDelayMs\n );\n\n await new Promise(resolve => setTimeout(resolve, delay));\n\n // Check if cancelled during delay (cancel() sets status to 'closed')\n if (this.status === 'closed' as StreamingStatus) {\n return;\n }\n\n try {\n await this.connectSSE();\n } catch {\n await this.handleConnectionError(error);\n }\n } else {\n // Fall back to polling\n this.status = 'fallback_polling';\n this.emit('connectionChange', { connected: false, usingFallback: true });\n this.startPolling();\n }\n }\n\n /**\n * Start polling fallback\n */\n private startPolling(): void {\n this.pollingIntervalId = setInterval(async () => {\n try {\n const execution = await this.options.getExecution(this.options.executionId);\n\n // Emit new logs\n for (const log of execution.logs) {\n if (!this.seenEventIds.has(log.uuid)) {\n this.seenEventIds.add(log.uuid);\n this.emit('log', log);\n }\n }\n\n // Check for completion\n if (execution.status === 'completed') {\n this.stopPolling();\n this.handleComplete(execution as unknown as Record<string, unknown>);\n } else if (execution.status === 'failed' || execution.status === 'cancelled') {\n this.stopPolling();\n this.handleError({\n error: execution.error ?? `Execution ${execution.status}`,\n errorCode: execution.status,\n });\n }\n } catch (error) {\n // Continue polling on errors\n console.error('Polling error:', error);\n }\n }, this.config.pollingIntervalMs);\n }\n\n /**\n * Stop polling\n */\n private stopPolling(): void {\n if (this.pollingIntervalId) {\n clearInterval(this.pollingIntervalId);\n this.pollingIntervalId = null;\n }\n }\n\n /**\n * Reset activity timeout\n */\n private resetActivityTimeout(): void {\n this.stopActivityTimeout();\n\n this.activityTimeoutId = setTimeout(() => {\n // Force reconnect on inactivity\n if (this.sseClient) {\n this.sseClient.disconnect();\n }\n this.handleConnectionError(new Error('Activity timeout'));\n }, this.config.activityTimeoutMs);\n }\n\n /**\n * Stop activity timeout\n */\n private stopActivityTimeout(): void {\n if (this.activityTimeoutId) {\n clearTimeout(this.activityTimeoutId);\n this.activityTimeoutId = null;\n }\n }\n\n /**\n * Emit event to listeners\n */\n private emit<K extends keyof StreamEventMap>(event: K, data: StreamEventMap[K]): void {\n const listeners = this.listeners[event];\n if (listeners) {\n for (const listener of listeners) {\n try {\n (listener as (data: StreamEventMap[K]) => void)(data);\n } catch (error) {\n console.error(`Error in ${event} listener:`, error);\n }\n }\n }\n }\n}\n\n/**\n * Create an execution stream controller\n */\nexport function createExecutionStreamController(\n options: ExecutionStreamControllerOptions\n): ExecutionStreamController {\n return new ExecutionStreamControllerImpl(options);\n}\n","/**\n * Agents Resource API\n *\n * Provides all agent-related operations:\n * - List: list(), get()\n * - Execute: execute(), executeSync(), stream()\n * - Receive: getExecution()\n * - Edit: update(), updateConfig(), cancelExecution()\n */\n\nimport { BaseResourceAPI } from './base.js';\nimport type { HttpClient } from '../utils/http.js';\nimport { generateIdempotencyKey } from '../utils/http.js';\nimport type {\n Agent,\n AgentListOptions,\n AgentExecution,\n AgentUpdateInput,\n AgentConfigUpdateInput,\n ExecuteInput,\n ExecuteResponse,\n PaginatedResponse,\n} from '../types/index.js';\nimport type { ExecutionStreamController } from '../streaming/stream-controller.js';\nimport { createExecutionStreamController } from '../streaming/stream-controller.js';\n\n/**\n * Agents API class\n */\nexport class AgentsAPI extends BaseResourceAPI {\n constructor(http: HttpClient, private readonly getStreamConfig: () => StreamConfig) {\n super(http, '/agents');\n }\n\n // ===== LIST Operations =====\n\n /**\n * List all agents in the organization\n *\n * @param options - List options (pagination, filtering)\n * @returns Paginated list of agents\n *\n * @example\n * ```typescript\n * const { data: agents, pagination } = await client.agents.list({ limit: 10 });\n * ```\n */\n async list(options?: AgentListOptions): Promise<PaginatedResponse<Agent>> {\n const query: Record<string, string | number | boolean | undefined> = {\n ...this.buildListQuery(options),\n status: options?.status,\n type: options?.type,\n };\n return this.httpGet<PaginatedResponse<Agent>>('', query);\n }\n\n /**\n * Get a single agent by UUID\n *\n * @param uuid - Agent UUID\n * @returns Agent with configuration\n *\n * @example\n * ```typescript\n * const agent = await client.agents.get('agent-uuid');\n * console.log(agent.config);\n * ```\n */\n async get(uuid: string): Promise<Agent> {\n return this.httpGet<Agent>(`/${uuid}`);\n }\n\n // ===== EXECUTE Operations =====\n\n /**\n * Start an agent execution (async)\n *\n * Returns immediately with execution ID. Use getExecution() to poll\n * for results, or use stream() for real-time updates.\n *\n * @param uuid - Agent UUID\n * @param input - Execution input (task, context, options)\n * @returns Execution ID and initial status\n *\n * @example\n * ```typescript\n * const { executionId, status } = await client.agents.execute('agent-uuid', {\n * task: 'Summarize the latest news about AI',\n * });\n * ```\n */\n async execute(uuid: string, input: ExecuteInput): Promise<ExecuteResponse> {\n const idempotencyKey = input.options?.idempotencyKey ?? generateIdempotencyKey();\n return this.httpPost<ExecuteResponse>(\n `/${uuid}/execute`,\n {\n task: input.task,\n context: input.context,\n options: input.options,\n },\n { idempotencyKey }\n );\n }\n\n /**\n * Execute an agent and wait for completion (sync)\n *\n * Polls the execution status until completion or failure.\n *\n * @param uuid - Agent UUID\n * @param input - Execution input\n * @param pollInterval - Polling interval in ms (default: 1000)\n * @returns Final execution result\n *\n * @example\n * ```typescript\n * const execution = await client.agents.executeSync('agent-uuid', {\n * task: 'Write a haiku about coding',\n * });\n * console.log(execution.output);\n * ```\n */\n async executeSync(\n uuid: string,\n input: ExecuteInput,\n pollInterval: number = 1000\n ): Promise<AgentExecution> {\n // Start the execution\n const { executionId } = await this.execute(uuid, input);\n\n // Poll until completion\n return this.pollExecution(executionId, pollInterval);\n }\n\n /**\n * Stream an agent execution\n *\n * Returns a StreamController for real-time event handling.\n *\n * @param uuid - Agent UUID\n * @param input - Execution input\n * @returns Stream controller for event handling\n *\n * @example\n * ```typescript\n * const stream = await client.agents.stream('agent-uuid', {\n * task: 'Research climate change',\n * });\n *\n * stream.on('log', (log) => console.log(log.title));\n * stream.on('toolCall', ({ toolName }) => console.log(`Calling ${toolName}`));\n * stream.on('complete', ({ execution }) => console.log(execution.output));\n *\n * const result = await stream.wait();\n * ```\n */\n async stream(uuid: string, input: ExecuteInput): Promise<ExecutionStreamController> {\n // Start the execution first\n const { executionId } = await this.execute(uuid, input);\n\n // Create and connect stream controller\n const config = this.getStreamConfig();\n const controller = createExecutionStreamController({\n executionId,\n baseUrl: config.baseUrl,\n apiKey: config.apiKey,\n orgId: config.orgId,\n getExecution: (id) => this.getExecution(id),\n });\n\n // Start the stream connection\n await controller.connect();\n\n return controller;\n }\n\n // ===== RECEIVE Operations =====\n\n /**\n * Get execution result by ID\n *\n * @param executionId - Execution UUID\n * @returns Execution details including status, output, logs\n *\n * @example\n * ```typescript\n * const execution = await client.agents.getExecution('exec-uuid');\n * if (execution.status === 'completed') {\n * console.log(execution.output);\n * }\n * ```\n */\n async getExecution(executionId: string): Promise<AgentExecution> {\n return this.http.get<AgentExecution>(`/executions/${executionId}`);\n }\n\n // ===== EDIT Operations =====\n\n /**\n * Update agent details\n *\n * @param uuid - Agent UUID\n * @param data - Fields to update\n * @returns Updated agent\n *\n * @example\n * ```typescript\n * const agent = await client.agents.update('agent-uuid', {\n * name: 'My Updated Agent',\n * description: 'New description',\n * });\n * ```\n */\n async update(uuid: string, data: AgentUpdateInput): Promise<Agent> {\n const idempotencyKey = generateIdempotencyKey();\n return this.httpPatch<Agent>(`/${uuid}`, data, { idempotencyKey });\n }\n\n /**\n * Update agent configuration\n *\n * @param uuid - Agent UUID\n * @param config - Configuration fields to update\n * @returns Updated agent\n *\n * @example\n * ```typescript\n * const agent = await client.agents.updateConfig('agent-uuid', {\n * temperature: 0.7,\n * maxIterations: 5,\n * });\n * ```\n */\n async updateConfig(uuid: string, config: AgentConfigUpdateInput): Promise<Agent> {\n const idempotencyKey = generateIdempotencyKey();\n return this.httpPatch<Agent>(`/${uuid}/config`, config, { idempotencyKey });\n }\n\n /**\n * Cancel a running execution\n *\n * @param executionId - Execution UUID\n * @returns Updated execution with cancelled status\n *\n * @example\n * ```typescript\n * const execution = await client.agents.cancelExecution('exec-uuid');\n * console.log(execution.status); // 'cancelled'\n * ```\n */\n async cancelExecution(executionId: string): Promise<AgentExecution> {\n return this.http.post<AgentExecution>(\n `/executions/${executionId}/cancel`,\n undefined,\n { skipRetry: true }\n );\n }\n\n // ===== Private helpers =====\n\n /**\n * Poll execution until completion\n */\n private async pollExecution(\n executionId: string,\n pollInterval: number\n ): Promise<AgentExecution> {\n while (true) {\n const execution = await this.getExecution(executionId);\n\n if (\n execution.status === 'completed' ||\n execution.status === 'failed' ||\n execution.status === 'cancelled'\n ) {\n return execution;\n }\n\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n }\n }\n}\n\n/**\n * Stream configuration passed from client\n */\nexport interface StreamConfig {\n baseUrl: string;\n apiKey?: string;\n token?: string;\n orgId: number;\n}\n","/**\n * Skills Resource API\n *\n * Provides all skill-related operations:\n * - List: list(), get(), getTools()\n * - Execute: execute()\n * - Receive: getExecution()\n * - Edit: update(), updatePrompt()\n */\n\nimport { BaseResourceAPI } from './base.js';\nimport type { HttpClient } from '../utils/http.js';\nimport { generateIdempotencyKey } from '../utils/http.js';\nimport type {\n Skill,\n SkillDetails,\n SkillListOptions,\n SkillTool,\n SkillExecuteInput,\n SkillExecution,\n SkillUpdateInput,\n PaginatedResponse,\n} from '../types/index.js';\n\n/**\n * Skills API class\n */\nexport class SkillsAPI extends BaseResourceAPI {\n constructor(http: HttpClient) {\n super(http, '/skills');\n }\n\n // ===== LIST Operations =====\n\n /**\n * List all skills in the organization\n *\n * @param options - List options (pagination, filtering by category/tags)\n * @returns Paginated list of skills\n *\n * @example\n * ```typescript\n * const { data: skills } = await client.skills.list({\n * category: 'writing',\n * tags: ['seo', 'blog'],\n * });\n * ```\n */\n async list(options?: SkillListOptions): Promise<PaginatedResponse<Skill>> {\n const query: Record<string, string | number | boolean | undefined> = {\n ...this.buildListQuery(options),\n category: options?.category,\n tags: options?.tags?.join(','),\n };\n return this.httpGet<PaginatedResponse<Skill>>('', query);\n }\n\n /**\n * Get a single skill by UUID with full details\n *\n * @param uuid - Skill UUID\n * @returns Skill with prompt template and tools\n *\n * @example\n * ```typescript\n * const skill = await client.skills.get('skill-uuid');\n * console.log(skill.promptTemplate);\n * ```\n */\n async get(uuid: string): Promise<SkillDetails> {\n return this.httpGet<SkillDetails>(`/${uuid}`);\n }\n\n /**\n * Get tools associated with a skill\n *\n * @param uuid - Skill UUID\n * @returns Array of tools used by the skill\n *\n * @example\n * ```typescript\n * const tools = await client.skills.getTools('skill-uuid');\n * tools.forEach(tool => console.log(tool.name));\n * ```\n */\n async getTools(uuid: string): Promise<SkillTool[]> {\n return this.httpGet<SkillTool[]>(`/${uuid}/tools`);\n }\n\n // ===== EXECUTE Operations =====\n\n /**\n * Execute a skill with variables\n *\n * @param uuid - Skill UUID\n * @param input - Variables and context for execution\n * @returns Skill execution result\n *\n * @example\n * ```typescript\n * const result = await client.skills.execute('skill-uuid', {\n * variables: {\n * topic: 'AI in healthcare',\n * tone: 'professional',\n * },\n * });\n * console.log(result.output);\n * ```\n */\n async execute(uuid: string, input: SkillExecuteInput): Promise<SkillExecution> {\n const idempotencyKey = generateIdempotencyKey();\n return this.httpPost<SkillExecution>(\n `/${uuid}/execute`,\n {\n variables: input.variables,\n context: input.context,\n },\n { idempotencyKey }\n );\n }\n\n // ===== RECEIVE Operations =====\n\n /**\n * Get skill execution result by ID\n *\n * @param executionId - Execution UUID\n * @returns Skill execution details\n *\n * @example\n * ```typescript\n * const execution = await client.skills.getExecution('exec-uuid');\n * ```\n */\n async getExecution(executionId: string): Promise<SkillExecution> {\n return this.http.get<SkillExecution>(`/executions/${executionId}`);\n }\n\n // ===== EDIT Operations =====\n\n /**\n * Update skill details\n *\n * @param uuid - Skill UUID\n * @param data - Fields to update\n * @returns Updated skill\n *\n * @example\n * ```typescript\n * const skill = await client.skills.update('skill-uuid', {\n * name: 'Updated Skill Name',\n * tags: ['new-tag'],\n * });\n * ```\n */\n async update(uuid: string, data: SkillUpdateInput): Promise<Skill> {\n const idempotencyKey = generateIdempotencyKey();\n return this.httpPatch<Skill>(`/${uuid}`, data, { idempotencyKey });\n }\n\n /**\n * Update skill prompt template\n *\n * @param uuid - Skill UUID\n * @param prompt - New prompt template\n * @returns Updated skill with new version\n *\n * @example\n * ```typescript\n * const skill = await client.skills.updatePrompt('skill-uuid',\n * 'Write a {{tone}} article about {{topic}}...'\n * );\n * console.log(skill.version); // Version incremented\n * ```\n */\n async updatePrompt(uuid: string, prompt: string): Promise<SkillDetails> {\n const idempotencyKey = generateIdempotencyKey();\n return this.httpPatch<SkillDetails>(`/${uuid}/prompt`, { promptTemplate: prompt }, { idempotencyKey });\n }\n}\n","/**\n * Tools Resource API\n *\n * Provides all tool-related operations:\n * - List: list(), get()\n * - Execute: execute(), validateInput()\n * - Receive: getExecution()\n * - Edit: update(), updateConfig()\n */\n\nimport { BaseResourceAPI } from './base.js';\nimport type { HttpClient } from '../utils/http.js';\nimport { generateIdempotencyKey } from '../utils/http.js';\nimport type {\n Tool,\n ToolListOptions,\n ToolExecution,\n ToolValidationResult,\n ToolUpdateInput,\n ToolConfigUpdateInput,\n PaginatedResponse,\n} from '../types/index.js';\n\n/**\n * Tools API class\n */\nexport class ToolsAPI extends BaseResourceAPI {\n constructor(http: HttpClient) {\n super(http, '/tools');\n }\n\n // ===== LIST Operations =====\n\n /**\n * List all tools in the organization\n *\n * @param options - List options (pagination, filtering)\n * @returns Paginated list of tools\n *\n * @example\n * ```typescript\n * const { data: tools } = await client.tools.list({\n * category: 'data',\n * isEnabled: true,\n * });\n * ```\n */\n async list(options?: ToolListOptions): Promise<PaginatedResponse<Tool>> {\n const query: Record<string, string | number | boolean | undefined> = {\n ...this.buildListQuery(options),\n category: options?.category,\n isEnabled: options?.isEnabled,\n };\n return this.httpGet<PaginatedResponse<Tool>>('', query);\n }\n\n /**\n * Get a single tool by UUID with schema\n *\n * @param uuid - Tool UUID\n * @returns Tool with input/output schemas\n *\n * @example\n * ```typescript\n * const tool = await client.tools.get('tool-uuid');\n * console.log(tool.inputSchema);\n * ```\n */\n async get(uuid: string): Promise<Tool> {\n return this.httpGet<Tool>(`/${uuid}`);\n }\n\n // ===== EXECUTE Operations =====\n\n /**\n * Execute a tool directly\n *\n * @param uuid - Tool UUID\n * @param input - Tool input (validated against inputSchema)\n * @returns Tool execution result\n *\n * @example\n * ```typescript\n * const result = await client.tools.execute('tool-uuid', {\n * query: 'weather in London',\n * limit: 5,\n * });\n * console.log(result.output);\n * ```\n */\n async execute(uuid: string, input: Record<string, unknown>): Promise<ToolExecution> {\n const idempotencyKey = generateIdempotencyKey();\n return this.httpPost<ToolExecution>(`/${uuid}/execute`, { input }, { idempotencyKey });\n }\n\n /**\n * Validate input against tool schema\n *\n * @param uuid - Tool UUID\n * @param input - Input to validate\n * @returns Validation result with errors if invalid\n *\n * @example\n * ```typescript\n * const validation = await client.tools.validateInput('tool-uuid', {\n * query: 'test',\n * });\n * if (!validation.valid) {\n * console.log(validation.errors);\n * }\n * ```\n */\n async validateInput(uuid: string, input: Record<string, unknown>): Promise<ToolValidationResult> {\n return this.httpPost<ToolValidationResult>(`/${uuid}/validate`, { input }, { skipRetry: false });\n }\n\n // ===== RECEIVE Operations =====\n\n /**\n * Get tool execution result by ID\n *\n * @param executionId - Execution UUID\n * @returns Tool execution details\n *\n * @example\n * ```typescript\n * const execution = await client.tools.getExecution('exec-uuid');\n * ```\n */\n async getExecution(executionId: string): Promise<ToolExecution> {\n return this.http.get<ToolExecution>(`/executions/${executionId}`);\n }\n\n // ===== EDIT Operations =====\n\n /**\n * Update tool details\n *\n * @param uuid - Tool UUID\n * @param data - Fields to update\n * @returns Updated tool\n *\n * @example\n * ```typescript\n * const tool = await client.tools.update('tool-uuid', {\n * name: 'Updated Tool Name',\n * description: 'New description',\n * });\n * ```\n */\n async update(uuid: string, data: ToolUpdateInput): Promise<Tool> {\n const idempotencyKey = generateIdempotencyKey();\n return this.httpPatch<Tool>(`/${uuid}`, data, { idempotencyKey });\n }\n\n /**\n * Update tool configuration\n *\n * @param uuid - Tool UUID\n * @param config - Configuration to update\n * @returns Updated tool\n *\n * @example\n * ```typescript\n * const tool = await client.tools.updateConfig('tool-uuid', {\n * isEnabled: false,\n * config: { apiKey: 'new-key' },\n * });\n * ```\n */\n async updateConfig(uuid: string, config: ToolConfigUpdateInput): Promise<Tool> {\n const idempotencyKey = generateIdempotencyKey();\n return this.httpPatch<Tool>(`/${uuid}/config`, config, { idempotencyKey });\n }\n}\n","/**\n * Artifacts Resource API\n *\n * Provides all artifact-related operations:\n * - List: list(), get()\n * - Receive: download(), downloadStream(), getSignedUrl()\n * - Edit: upload(), delete()\n */\n\nimport { BaseResourceAPI } from './base.js';\nimport type { HttpClient } from '../utils/http.js';\nimport type {\n Artifact,\n ArtifactListOptions,\n ArtifactDownloadOptions,\n SignedUrlResponse,\n ArtifactUploadInput,\n PaginatedResponse,\n} from '../types/index.js';\n\n/**\n * Artifacts API class\n */\nexport class ArtifactsAPI extends BaseResourceAPI {\n constructor(http: HttpClient) {\n super(http, '/artifacts');\n }\n\n // ===== LIST Operations =====\n\n /**\n * List artifacts for an execution\n *\n * @param executionId - Execution UUID\n * @param options - List options (pagination, filtering by type)\n * @returns Paginated list of artifacts\n *\n * @example\n * ```typescript\n * const { data: artifacts } = await client.artifacts.list('exec-uuid', {\n * type: 'file',\n * });\n * ```\n */\n async list(executionId: string, options?: ArtifactListOptions): Promise<PaginatedResponse<Artifact>> {\n const query: Record<string, string | number | boolean | undefined> = {\n ...this.buildListQuery(options),\n type: options?.type,\n };\n return this.http.get<PaginatedResponse<Artifact>>(`/executions/${executionId}/artifacts`, query);\n }\n\n /**\n * Get artifact metadata by UUID\n *\n * @param uuid - Artifact UUID\n * @returns Artifact metadata\n *\n * @example\n * ```typescript\n * const artifact = await client.artifacts.get('artifact-uuid');\n * console.log(artifact.name, artifact.size);\n * ```\n */\n async get(uuid: string): Promise<Artifact> {\n return this.httpGet<Artifact>(`/${uuid}`);\n }\n\n // ===== RECEIVE Operations =====\n\n /**\n * Download artifact content\n *\n * In Node.js returns Buffer, in browser returns Blob.\n *\n * @param uuid - Artifact UUID\n * @returns Artifact content as Buffer (Node.js) or Blob (browser)\n *\n * @example\n * ```typescript\n * const content = await client.artifacts.download('artifact-uuid');\n * // Node.js: Buffer\n * // Browser: Blob\n * ```\n */\n async download(uuid: string): Promise<Buffer | Blob> {\n // Make request expecting binary response\n const response = await this.http.request<Response>({\n method: 'GET',\n path: `${this.basePath}/${uuid}/download`,\n headers: {\n 'Accept': '*/*',\n },\n });\n\n // Handle response based on environment\n if (typeof window !== 'undefined') {\n // Browser environment - return Blob\n return response.blob();\n } else {\n // Node.js environment - return Buffer\n const arrayBuffer = await response.arrayBuffer();\n return Buffer.from(arrayBuffer);\n }\n }\n\n /**\n * Download artifact as a stream\n *\n * In Node.js returns Readable stream, in browser returns ReadableStream.\n *\n * @param uuid - Artifact UUID\n * @returns Readable stream\n *\n * @example\n * ```typescript\n * const stream = await client.artifacts.downloadStream('artifact-uuid');\n * // Pipe to file or process incrementally\n * ```\n */\n async downloadStream(uuid: string): Promise<ReadableStream<Uint8Array>> {\n const response = await this.http.request<Response>({\n method: 'GET',\n path: `${this.basePath}/${uuid}/stream`,\n headers: {\n 'Accept': '*/*',\n },\n });\n\n if (!response.body) {\n throw new Error('Response body is not available');\n }\n\n return response.body;\n }\n\n /**\n * Get a signed URL for direct download\n *\n * @param uuid - Artifact UUID\n * @param options - Options including expiration time\n * @returns Signed URL and expiration time\n *\n * @example\n * ```typescript\n * const { url, expiresAt } = await client.artifacts.getSignedUrl('artifact-uuid', {\n * expiresIn: 3600, // 1 hour\n * });\n * // Use URL for direct download\n * ```\n */\n async getSignedUrl(uuid: string, options?: ArtifactDownloadOptions): Promise<SignedUrlResponse> {\n return this.httpPost<SignedUrlResponse>(`/${uuid}/signed-url`, {\n expiresIn: options?.expiresIn ?? 3600,\n });\n }\n\n // ===== EDIT Operations =====\n\n /**\n * Upload a new artifact for an execution\n *\n * @param executionId - Execution UUID\n * @param input - Upload input (name, content, mime type)\n * @returns Created artifact metadata\n *\n * @example\n * ```typescript\n * const artifact = await client.artifacts.upload('exec-uuid', {\n * name: 'report.pdf',\n * content: fileBuffer,\n * mimeType: 'application/pdf',\n * });\n * ```\n */\n async upload(executionId: string, input: ArtifactUploadInput): Promise<Artifact> {\n // For multipart upload, we need to use FormData\n const formData = new FormData();\n\n // Handle different content types\n if (input.content instanceof Blob) {\n formData.append('file', input.content, input.name);\n } else if (typeof Buffer !== 'undefined' && Buffer.isBuffer(input.content)) {\n // Node.js Buffer - convert to Blob\n // Copy to a new ArrayBuffer to satisfy TypeScript's strict BlobPart type requirements\n const arrayBuffer = input.content.buffer.slice(\n input.content.byteOffset,\n input.content.byteOffset + input.content.byteLength\n ) as ArrayBuffer;\n const blob = new Blob([arrayBuffer], { type: input.mimeType ?? 'application/octet-stream' });\n formData.append('file', blob, input.name);\n } else if (input.content instanceof ReadableStream) {\n // Stream - need to collect into buffer first\n const chunks: ArrayBuffer[] = [];\n const reader = input.content.getReader();\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n // Copy to a new ArrayBuffer to satisfy TypeScript's strict BlobPart type requirements\n const arrayBuffer = value.buffer.slice(\n value.byteOffset,\n value.byteOffset + value.byteLength\n ) as ArrayBuffer;\n chunks.push(arrayBuffer);\n }\n const blob = new Blob(chunks, { type: input.mimeType ?? 'application/octet-stream' });\n formData.append('file', blob, input.name);\n }\n\n if (input.type) {\n formData.append('type', input.type);\n }\n if (input.metadata) {\n formData.append('metadata', JSON.stringify(input.metadata));\n }\n\n // Make request with FormData (no Content-Type header - fetch sets it automatically with boundary)\n return this.http.request<Artifact>({\n method: 'POST',\n path: `/executions/${executionId}/artifacts`,\n body: formData as unknown,\n headers: {\n // Remove Content-Type to let fetch set it with proper boundary\n },\n });\n }\n\n /**\n * Delete an artifact\n *\n * @param uuid - Artifact UUID\n *\n * @example\n * ```typescript\n * await client.artifacts.delete('artifact-uuid');\n * ```\n */\n async delete(uuid: string): Promise<void> {\n return this.httpDelete<void>(`/${uuid}`);\n }\n}\n","/**\n * Sessions Resource API\n *\n * Provides all session-related operations:\n * - List: list(), get()\n * - Execute: sendMessage(), stream()\n * - Receive: getHistory(), listArtifacts()\n * - Edit: create(), delete()\n */\n\nimport { BaseResourceAPI } from './base.js';\nimport type { HttpClient } from '../utils/http.js';\nimport { generateIdempotencyKey } from '../utils/http.js';\nimport type {\n Session,\n SessionListOptions,\n SessionHistory,\n SessionCreateInput,\n SendMessageInput,\n PaginatedResponse,\n SessionArtifact,\n SessionArtifactListOptions,\n} from '../types/index.js';\nimport type { AgentExecution, ExecuteResponse } from '../types/agents.js';\nimport type { ExecutionStreamController } from '../streaming/stream-controller.js';\nimport { createExecutionStreamController } from '../streaming/stream-controller.js';\nimport type { StreamConfig } from './agents.js';\n\n/**\n * Sessions API class\n */\nexport class SessionsAPI extends BaseResourceAPI {\n constructor(http: HttpClient, private readonly getStreamConfig: () => StreamConfig) {\n super(http, '/sessions');\n }\n\n // ===== LIST Operations =====\n\n /**\n * List all sessions in the organization\n *\n * @param options - List options (pagination, filtering by agent)\n * @returns Paginated list of sessions\n *\n * @example\n * ```typescript\n * const { data: sessions } = await client.sessions.list({\n * agentUuid: 'agent-uuid',\n * });\n * ```\n */\n async list(options?: SessionListOptions): Promise<PaginatedResponse<Session>> {\n const query: Record<string, string | number | boolean | undefined> = {\n ...this.buildListQuery(options),\n agentUuid: options?.agentUuid,\n };\n return this.httpGet<PaginatedResponse<Session>>('', query);\n }\n\n /**\n * Get session details by ID\n *\n * @param sessionId - Session ID\n * @returns Session details\n *\n * @example\n * ```typescript\n * const session = await client.sessions.get('session-id');\n * console.log(session.messageCount);\n * ```\n */\n async get(sessionId: string): Promise<Session> {\n return this.httpGet<Session>(`/${sessionId}`);\n }\n\n // ===== EXECUTE Operations =====\n\n /**\n * Send a message to a session\n *\n * Triggers an agent execution in the context of the session.\n * Returns immediately with execution ID. Use getHistory() to get\n * the response, or use stream() for real-time updates.\n *\n * @param sessionId - Session ID\n * @param input - Message content and optional context\n * @returns Execution ID and status\n *\n * @example\n * ```typescript\n * const { executionId } = await client.sessions.sendMessage('session-id', {\n * message: 'What is the capital of France?',\n * });\n * ```\n */\n async sendMessage(sessionId: string, input: SendMessageInput): Promise<ExecuteResponse> {\n const idempotencyKey = generateIdempotencyKey();\n return this.httpPost<ExecuteResponse>(\n `/${sessionId}/messages`,\n {\n message: input.message,\n context: input.context,\n },\n { idempotencyKey }\n );\n }\n\n /**\n * Send a message and wait for response (sync)\n *\n * @param sessionId - Session ID\n * @param input - Message content and optional context\n * @param pollInterval - Polling interval in ms (default: 1000)\n * @returns Final execution result\n *\n * @example\n * ```typescript\n * const execution = await client.sessions.sendMessageSync('session-id', {\n * message: 'What is the capital of France?',\n * });\n * console.log(execution.output);\n * ```\n */\n async sendMessageSync(\n sessionId: string,\n input: SendMessageInput,\n pollInterval: number = 1000\n ): Promise<AgentExecution> {\n const { executionId } = await this.sendMessage(sessionId, input);\n return this.pollExecution(executionId, pollInterval);\n }\n\n /**\n * Stream a message response\n *\n * Returns a StreamController for real-time event handling.\n *\n * @param sessionId - Session ID\n * @param input - Message content and optional context\n * @returns Stream controller\n *\n * @example\n * ```typescript\n * const stream = await client.sessions.stream('session-id', {\n * message: 'Tell me more about that',\n * });\n *\n * stream.on('log', (log) => console.log(log.title));\n * stream.on('complete', ({ execution }) => console.log(execution.output));\n *\n * const result = await stream.wait();\n * ```\n */\n async stream(sessionId: string, input: SendMessageInput): Promise<ExecutionStreamController> {\n const { executionId } = await this.sendMessage(sessionId, input);\n\n const config = this.getStreamConfig();\n const controller = createExecutionStreamController({\n executionId,\n baseUrl: config.baseUrl,\n apiKey: config.apiKey,\n orgId: config.orgId,\n getExecution: (id) => this.getExecution(id),\n });\n\n await controller.connect();\n return controller;\n }\n\n // ===== RECEIVE Operations =====\n\n /**\n * Get session conversation history\n *\n * @param sessionId - Session ID\n * @returns Session with all messages\n *\n * @example\n * ```typescript\n * const history = await client.sessions.getHistory('session-id');\n * history.messages.forEach(msg => {\n * console.log(`${msg.role}: ${msg.content}`);\n * });\n * ```\n */\n async getHistory(sessionId: string): Promise<SessionHistory> {\n return this.httpGet<SessionHistory>(`/${sessionId}/history`);\n }\n\n /**\n * List artifacts for a session\n *\n * Returns all artifacts generated across all executions in the session.\n * Useful for retrieving images, files, and other outputs created during\n * agent interactions.\n *\n * @param sessionId - Session ID\n * @param options - List options (filtering by type, pagination)\n * @returns Paginated list of session artifacts\n *\n * @example\n * ```typescript\n * // Get all images from a session\n * const { data: artifacts } = await client.sessions.listArtifacts('session-id', {\n * type: 'image',\n * });\n *\n * artifacts.forEach(artifact => {\n * console.log(artifact.filename, artifact.url);\n * });\n * ```\n */\n async listArtifacts(\n sessionId: string,\n options?: SessionArtifactListOptions\n ): Promise<PaginatedResponse<SessionArtifact>> {\n const query: Record<string, string | number | boolean | undefined> = {\n ...this.buildListQuery(options),\n type: options?.type,\n includeVariants: options?.includeVariants,\n };\n return this.httpGet<PaginatedResponse<SessionArtifact>>(`/${sessionId}/artifacts`, query);\n }\n\n /**\n * Get execution result\n */\n private async getExecution(executionId: string): Promise<AgentExecution> {\n return this.http.get<AgentExecution>(`/executions/${executionId}`);\n }\n\n // ===== EDIT Operations =====\n\n /**\n * Create a new session for an agent\n *\n * @param agentUuid - Agent UUID to associate with session\n * @param options - Optional system message\n * @returns Created session\n *\n * @example\n * ```typescript\n * const session = await client.sessions.create({\n * agentUuid: 'agent-uuid',\n * systemMessage: 'You are a helpful assistant.',\n * });\n * console.log(session.id);\n * ```\n */\n async create(input: SessionCreateInput): Promise<Session> {\n const idempotencyKey = generateIdempotencyKey();\n return this.httpPost<Session>('', input, { idempotencyKey });\n }\n\n /**\n * Delete a session and all its messages\n *\n * @param sessionId - Session ID\n *\n * @example\n * ```typescript\n * await client.sessions.delete('session-id');\n * ```\n */\n async delete(sessionId: string): Promise<void> {\n return this.httpDelete<void>(`/${sessionId}`);\n }\n\n // ===== Private helpers =====\n\n /**\n * Poll execution until completion\n */\n private async pollExecution(\n executionId: string,\n pollInterval: number\n ): Promise<AgentExecution> {\n while (true) {\n const execution = await this.getExecution(executionId);\n\n if (\n execution.status === 'completed' ||\n execution.status === 'failed' ||\n execution.status === 'cancelled'\n ) {\n return execution;\n }\n\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n }\n }\n}\n","/**\n * AI SaaS Client\n *\n * Main entry point for the SDK. Provides access to all resource APIs.\n *\n * @example\n * ```typescript\n * import { AISaaSClient } from '@cadraos/sdk';\n *\n * const client = new AISaaSClient({\n * apiKey: process.env.AISAAS_API_KEY,\n * orgId: Number(process.env.AISAAS_ORG_ID),\n * });\n *\n * // List agents\n * const { data: agents } = await client.agents.list();\n *\n * // Execute an agent\n * const execution = await client.agents.executeSync(agents[0].uuid, {\n * task: 'Summarize the latest news',\n * });\n *\n * // Stream an agent execution\n * const stream = await client.agents.stream(agents[0].uuid, {\n * task: 'Research climate change',\n * });\n *\n * stream.on('log', (log) => console.log(log.title));\n * stream.on('complete', ({ execution }) => console.log(execution.output));\n *\n * const result = await stream.wait();\n * ```\n */\n\nimport { AgentsAPI, ArtifactsAPI, SessionsAPI, SkillsAPI, ToolsAPI, type StreamConfig } from './resources/index.js';\nimport { HttpClient, type HttpClientConfig } from './utils/http.js';\nimport { DEFAULT_RETRY_CONFIG, type RetryConfig } from './utils/retry.js';\n\n/**\n * Default API base URL\n */\nconst DEFAULT_BASE_URL = 'https://api.aisaas.com/v1';\n\n/**\n * Default request timeout (30 seconds)\n */\nconst DEFAULT_TIMEOUT = 30000;\n\n/**\n * Client options for API key authentication\n */\nexport interface AISaaSClientOptionsApiKey {\n /** API key for authentication */\n apiKey: string;\n /** Organization ID */\n orgId: number;\n /** Base URL for API (default: https://api.aisaas.com/v1) */\n baseUrl?: string;\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n /** Maximum retry attempts (default: 3) */\n maxRetries?: number;\n /** Custom headers to include in all requests */\n headers?: Record<string, string>;\n}\n\n/**\n * Client options for OAuth token authentication\n */\nexport interface AISaaSClientOptionsToken {\n /** OAuth token for authentication */\n token: string;\n /** Organization ID */\n orgId: number;\n /** Base URL for API (default: https://api.aisaas.com/v1) */\n baseUrl?: string;\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n /** Maximum retry attempts (default: 3) */\n maxRetries?: number;\n /** Custom headers to include in all requests */\n headers?: Record<string, string>;\n}\n\n/**\n * Client options for token provider authentication\n */\nexport interface AISaaSClientOptionsTokenProvider {\n /** Token provider callback (called before each request) */\n tokenProvider: () => Promise<string>;\n /** Organization ID */\n orgId: number;\n /** Base URL for API (default: https://api.aisaas.com/v1) */\n baseUrl?: string;\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n /** Maximum retry attempts (default: 3) */\n maxRetries?: number;\n /** Custom headers to include in all requests */\n headers?: Record<string, string>;\n}\n\n/**\n * All client options\n */\nexport type AISaaSClientOptions =\n | AISaaSClientOptionsApiKey\n | AISaaSClientOptionsToken\n | AISaaSClientOptionsTokenProvider;\n\n/**\n * AI SaaS Client\n *\n * Main class for interacting with the AI SaaS API.\n * Provides access to all resource APIs (agents, skills, tools, artifacts, sessions).\n */\nexport class AISaaSClient {\n private readonly httpClient: HttpClient;\n private readonly config: {\n baseUrl: string;\n apiKey?: string;\n token?: string;\n tokenProvider?: () => Promise<string>;\n orgId: number;\n timeout: number;\n headers?: Record<string, string>;\n };\n\n /**\n * Agent operations (list, execute, stream, update)\n */\n readonly agents: AgentsAPI;\n\n /**\n * Skill operations (list, get, execute, update)\n */\n readonly skills: SkillsAPI;\n\n /**\n * Tool operations (list, get, execute, validate, update)\n */\n readonly tools: ToolsAPI;\n\n /**\n * Artifact operations (list, get, download, upload, delete)\n */\n readonly artifacts: ArtifactsAPI;\n\n /**\n * Session operations (list, get, create, message, delete)\n */\n readonly sessions: SessionsAPI;\n\n /**\n * Create a new AI SaaS client\n *\n * @param options - Client configuration options\n *\n * @example\n * ```typescript\n * // API key authentication\n * const client = new AISaaSClient({\n * apiKey: 'sk_...',\n * orgId: 123,\n * });\n *\n * // OAuth token authentication\n * const client = new AISaaSClient({\n * token: 'eyJ...',\n * orgId: 123,\n * });\n *\n * // Token provider (for automatic refresh)\n * const client = new AISaaSClient({\n * tokenProvider: async () => myAuth.getAccessToken(),\n * orgId: 123,\n * });\n * ```\n */\n constructor(options: AISaaSClientOptions) {\n // Validate options\n this.validateOptions(options);\n\n // Store configuration\n this.config = {\n baseUrl: options.baseUrl ?? DEFAULT_BASE_URL,\n orgId: options.orgId,\n timeout: options.timeout ?? DEFAULT_TIMEOUT,\n headers: options.headers,\n };\n\n // Set auth based on options type\n if ('apiKey' in options) {\n this.config.apiKey = options.apiKey;\n } else if ('token' in options) {\n this.config.token = options.token;\n } else if ('tokenProvider' in options) {\n this.config.tokenProvider = options.tokenProvider;\n }\n\n // Create retry configuration\n const retryConfig: RetryConfig = {\n ...DEFAULT_RETRY_CONFIG,\n maxRetries: options.maxRetries ?? DEFAULT_RETRY_CONFIG.maxRetries,\n };\n\n // Create HTTP client configuration\n const httpConfig: HttpClientConfig = {\n baseUrl: this.config.baseUrl,\n apiKey: this.config.apiKey,\n token: this.config.token,\n tokenProvider: this.config.tokenProvider,\n orgId: this.config.orgId,\n timeout: this.config.timeout,\n retry: retryConfig,\n headers: this.config.headers,\n };\n\n // Create HTTP client\n this.httpClient = new HttpClient(httpConfig);\n\n // Create stream config getter\n const getStreamConfig = (): StreamConfig => ({\n baseUrl: this.config.baseUrl,\n apiKey: this.config.apiKey,\n token: this.config.token,\n orgId: this.config.orgId,\n });\n\n // Initialize resource APIs\n this.agents = new AgentsAPI(this.httpClient, getStreamConfig);\n this.skills = new SkillsAPI(this.httpClient);\n this.tools = new ToolsAPI(this.httpClient);\n this.artifacts = new ArtifactsAPI(this.httpClient);\n this.sessions = new SessionsAPI(this.httpClient, getStreamConfig);\n }\n\n /**\n * Validate client options\n */\n private validateOptions(options: AISaaSClientOptions): void {\n // Check for auth\n const hasApiKey = 'apiKey' in options && options.apiKey;\n const hasToken = 'token' in options && options.token;\n const hasTokenProvider = 'tokenProvider' in options && options.tokenProvider;\n\n if (!hasApiKey && !hasToken && !hasTokenProvider) {\n throw new Error(\n 'Authentication required. Provide apiKey, token, or tokenProvider.'\n );\n }\n\n // Check for orgId\n if (options.orgId === undefined || options.orgId === null) {\n throw new Error('Organization ID (orgId) is required.');\n }\n\n if (typeof options.orgId !== 'number') {\n throw new Error('Organization ID (orgId) must be a number.');\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/resources/base.ts","../src/errors/sdk-errors.ts","../src/utils/retry.ts","../src/utils/http.ts","../src/streaming/sse-client.ts","../src/streaming/stream-controller.ts","../src/resources/agents.ts","../src/resources/skills.ts","../src/resources/tools.ts","../src/resources/artifacts.ts","../src/resources/sessions.ts","../src/client.ts"],"names":["value"],"mappings":";;;AAaO,IAAe,kBAAf,MAA+B;AAAA,EACjB,IAAA;AAAA,EACA,QAAA;AAAA,EAEnB,WAAA,CAAY,MAAkB,QAAA,EAAkB;AAC9C,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKU,eAAe,OAAA,EAA8E;AACrG,IAAA,IAAI,CAAC,OAAA,EAAS,OAAO,EAAC;AAEtB,IAAA,OAAO;AAAA,MACL,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,OAAO,OAAA,CAAQ;AAAA,KACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,OAAA,CACd,IAAA,EACA,KAAA,EACY;AACZ,IAAA,OAAO,IAAA,CAAK,KAAK,GAAA,CAAO,CAAA,EAAG,KAAK,QAAQ,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,QAAA,CACd,IAAA,EACA,IAAA,EACA,OAAA,EACY;AACZ,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAQ,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAA,EAAM,OAAO,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,SAAA,CACd,IAAA,EACA,IAAA,EACA,OAAA,EACY;AACZ,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAS,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAA,EAAM,OAAO,CAAA;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,WAAc,IAAA,EAA0B;AACtD,IAAA,OAAO,IAAA,CAAK,KAAK,MAAA,CAAU,CAAA,EAAG,KAAK,QAAQ,CAAA,EAAG,IAAI,CAAA,CAAE,CAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,aAAA,CACd,IAAA,EACA,OAAA,EAC+B;AAC/B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA;AAEzC,IAAA,OAAO,IAAA,CAAK,OAAA,CAA8B,IAAA,EAAM,KAAK,CAAA;AAAA,EACvD;AACF,CAAA;;;AC5EO,IAAM,WAAA,GAAN,cAA0B,KAAA,CAAM;AAAA;AAAA,EAE5B,IAAA;AAAA;AAAA,EAEA,MAAA;AAAA;AAAA,EAEA,OAAA;AAAA;AAAA,EAEA,SAAA;AAAA,EAET,WAAA,CACE,OAAA,EACA,IAAA,EACA,MAAA,EACA,SACA,SAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,aAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAGjB,IAAA,IAAI,MAAM,iBAAA,EAAmB;AAC3B,MAAA,KAAA,CAAM,iBAAA,CAAkB,IAAA,EAAM,IAAA,CAAK,WAAW,CAAA;AAAA,IAChD;AAAA,EACF;AACF;AAMO,IAAM,mBAAA,GAAN,cAAkC,WAAA,CAAY;AAAA,EACnD,YACE,OAAA,GAAkB,uBAAA,EAClB,IAAA,GAAe,sBAAA,EACf,SACA,SAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAA,EAAS,IAAA,EAAM,GAAA,EAAK,OAAA,EAAS,SAAS,CAAA;AAC5C,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AAAA,EACd;AACF;AAMO,IAAM,kBAAA,GAAN,cAAiC,WAAA,CAAY;AAAA,EAClD,YACE,OAAA,GAAkB,eAAA,EAClB,IAAA,GAAe,qBAAA,EACf,SACA,SAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAA,EAAS,IAAA,EAAM,GAAA,EAAK,OAAA,EAAS,SAAS,CAAA;AAC5C,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AAAA,EACd;AACF;AAMO,IAAM,aAAA,GAAN,cAA4B,WAAA,CAAY;AAAA,EAC7C,YACE,OAAA,GAAkB,oBAAA,EAClB,IAAA,GAAe,WAAA,EACf,SACA,SAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAA,EAAS,IAAA,EAAM,GAAA,EAAK,OAAA,EAAS,SAAS,CAAA;AAC5C,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AAAA,EACd;AACF;AAMO,IAAM,eAAA,GAAN,cAA8B,WAAA,CAAY;AAAA;AAAA,EAEtC,MAAA;AAAA,EAET,YACE,OAAA,GAAkB,mBAAA,EAClB,SAAoD,EAAC,EACrD,SACA,SAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAA,EAAS,kBAAA,EAAoB,GAAA,EAAK,OAAA,EAAS,SAAS,CAAA;AAC1D,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AACF;AAMO,IAAM,cAAA,GAAN,cAA6B,WAAA,CAAY;AAAA;AAAA,EAErC,UAAA;AAAA,EAET,WAAA,CACE,OAAA,GAAkB,qBAAA,EAClB,UAAA,EACA,SACA,SAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAA,EAAS,kBAAA,EAAoB,GAAA,EAAK,OAAA,EAAS,SAAS,CAAA;AAC1D,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AACZ,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,EACpB;AACF;AAMO,IAAM,WAAA,GAAN,cAA0B,WAAA,CAAY;AAAA,EAC3C,YACE,OAAA,GAAkB,cAAA,EAClB,MAAA,GAAiB,GAAA,EACjB,SACA,SAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAA,EAAS,cAAA,EAAgB,MAAA,EAAQ,OAAA,EAAS,SAAS,CAAA;AACzD,IAAA,IAAA,CAAK,IAAA,GAAO,aAAA;AAAA,EACd;AACF;AAMO,IAAM,aAAA,GAAN,cAA4B,WAAA,CAAY;AAAA,EAC7C,WAAA,CACE,OAAA,GAAkB,mBAAA,EAClB,OAAA,EACA,SAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAA,EAAS,UAAA,EAAY,GAAA,EAAK,OAAA,EAAS,SAAS,CAAA;AAClD,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AAAA,EACd;AACF;AAMO,IAAM,YAAA,GAAN,cAA2B,WAAA,CAAY;AAAA,EAC5C,WAAA,CACE,OAAA,GAAkB,mBAAA,EAClB,OAAA,EACA,SAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAA,EAAS,SAAA,EAAW,GAAA,EAAK,OAAA,EAAS,SAAS,CAAA;AACjD,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AAAA,EACd;AACF;AAMO,IAAM,YAAA,GAAN,cAA2B,WAAA,CAAY;AAAA,EAC5C,WAAA,CACE,OAAA,GAAkB,eAAA,EAClB,OAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAA,EAAS,eAAA,EAAiB,CAAA,EAAG,OAAO,CAAA;AAC1C,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AAAA,EACd;AACF;AAKO,SAAS,aAAA,CACd,MAAA,EACA,IAAA,EACA,SAAA,EACa;AACb,EAAA,MAAM,SAAA,GAAY,IAAA;AAQlB,EAAA,MAAM,OAAA,GAAU,SAAA,EAAW,KAAA,EAAO,OAAA,IAAW,mBAAA;AAC7C,EAAA,MAAM,IAAA,GAAO,SAAA,EAAW,KAAA,EAAO,IAAA,IAAQ,eAAA;AACvC,EAAA,MAAM,OAAA,GAAU,WAAW,KAAA,EAAO,OAAA;AAElC,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,GAAA;AAAA,IACL,KAAK,GAAA,EAAK;AAER,MAAA,MAAM,cAAc,OAAA,EAAS,MAAA;AAC7B,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,MAAM,SAAoD,EAAC;AAC3D,QAAA,KAAA,MAAW,CAAC,KAAA,EAAO,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC3D,UAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,YAAA,MAAA,CAAO,IAAA,CAAK,EAAE,KAAA,EAAO,OAAA,EAAS,KAAK,CAAA;AAAA,UACrC;AAAA,QACF;AACA,QAAA,OAAO,IAAI,eAAA,CAAgB,OAAA,EAAS,MAAA,EAAQ,SAAS,SAAS,CAAA;AAAA,MAChE;AACA,MAAA,OAAO,IAAI,eAAA,CAAgB,OAAA,EAAS,EAAC,EAAG,SAAS,SAAS,CAAA;AAAA,IAC5D;AAAA,IAEA,KAAK,GAAA;AACH,MAAA,OAAO,IAAI,mBAAA,CAAoB,OAAA,EAAS,IAAA,EAAM,SAAS,SAAS,CAAA;AAAA,IAElE,KAAK,GAAA;AACH,MAAA,OAAO,IAAI,kBAAA,CAAmB,OAAA,EAAS,IAAA,EAAM,SAAS,SAAS,CAAA;AAAA,IAEjE,KAAK,GAAA;AACH,MAAA,OAAO,IAAI,aAAA,CAAc,OAAA,EAAS,IAAA,EAAM,SAAS,SAAS,CAAA;AAAA,IAE5D,KAAK,GAAA;AACH,MAAA,OAAO,IAAI,aAAA,CAAc,OAAA,EAAS,OAAA,EAAS,SAAS,CAAA;AAAA,IAEtD,KAAK,GAAA,EAAK;AACR,MAAA,MAAM,aAAa,OAAA,EAAS,UAAA;AAC5B,MAAA,OAAO,IAAI,cAAA,CAAe,OAAA,EAAS,UAAA,EAAY,SAAS,SAAS,CAAA;AAAA,IACnE;AAAA,IAEA;AACE,MAAA,IAAI,UAAU,GAAA,EAAK;AACjB,QAAA,OAAO,IAAI,WAAA,CAAY,OAAA,EAAS,MAAA,EAAQ,SAAS,SAAS,CAAA;AAAA,MAC5D;AACA,MAAA,OAAO,IAAI,WAAA,CAAY,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,SAAS,SAAS,CAAA;AAAA;AAEtE;;;AClOO,IAAM,oBAAA,GAAoC;AAAA,EAC/C,UAAA,EAAY,CAAA;AAAA,EACZ,WAAA,EAAa,GAAA;AAAA,EACb,UAAA,EAAY,GAAA;AAAA,EACZ,YAAA,EAAc;AAChB,CAAA;AAKO,SAAS,WAAA,CAAY,KAAA,EAAgB,OAAA,EAAiB,UAAA,EAA6B;AACxF,EAAA,IAAI,WAAW,UAAA,EAAY;AACzB,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,IAAI,iBAAiB,cAAA,EAAgB;AACnC,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,iBAAiB,WAAA,EAAa;AAChC,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,cAAA,EAAgB;AAC3D,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,cAAA,EAAgB;AAC3D,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,OAAO,KAAA;AACT;AAKO,SAAS,mBAAA,CACd,OAAA,EACA,MAAA,EACA,UAAA,EACQ;AAER,EAAA,IAAI,UAAA,KAAe,MAAA,IAAa,UAAA,GAAa,CAAA,EAAG;AAC9C,IAAA,OAAO,UAAA,GAAa,GAAA;AAAA,EACtB;AAGA,EAAA,MAAM,mBAAmB,MAAA,CAAO,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,GAAG,OAAO,CAAA;AAGjE,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,gBAAA,EAAkB,OAAO,UAAU,CAAA;AAGhE,EAAA,MAAM,MAAA,GAAS,WAAA,GAAc,MAAA,CAAO,YAAA,GAAe,KAAK,MAAA,EAAO;AAE/D,EAAA,OAAO,WAAA,GAAc,MAAA;AACvB;AAKO,SAAS,MAAM,EAAA,EAA2B;AAC/C,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACzD;AAKA,eAAsB,SAAA,CACpB,SAAA,EACA,MAAA,GAA+B,EAAC,EACpB;AACZ,EAAA,MAAM,UAAA,GAA0B,EAAE,GAAG,oBAAA,EAAsB,GAAG,MAAA,EAAO;AACrE,EAAA,IAAI,SAAA;AAEJ,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,UAAA,CAAW,YAAY,OAAA,EAAA,EAAW;AACjE,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,SAAA,EAAU;AAAA,IACzB,SAAS,KAAA,EAAO;AACd,MAAA,SAAA,GAAY,KAAA;AAEZ,MAAA,IAAI,CAAC,WAAA,CAAY,KAAA,EAAO,OAAA,EAAS,UAAA,CAAW,UAAU,CAAA,EAAG;AACvD,QAAA,MAAM,KAAA;AAAA,MACR;AAGA,MAAA,MAAM,UAAA,GAAa,KAAA,YAAiB,cAAA,GAAiB,KAAA,CAAM,UAAA,GAAa,MAAA;AACxE,MAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,OAAA,EAAS,UAAA,EAAY,UAAU,CAAA;AAEjE,MAAA,MAAM,MAAM,KAAK,CAAA;AAAA,IACnB;AAAA,EACF;AAGA,EAAA,MAAM,SAAA;AACR;;;ACjEO,IAAM,aAAN,MAAiB;AAAA,EACd,MAAA;AAAA,EACA,oBAAA,GAAuB,CAAA;AAAA,EACd,uBAAA,GAA0B,CAAA;AAAA,EAE3C,YAAY,MAAA,EAA0B;AACpC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,aAAA,GAAiC;AAC7C,IAAA,IAAI,IAAA,CAAK,OAAO,MAAA,EAAQ;AACtB,MAAA,OAAO,CAAA,OAAA,EAAU,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,CAAA;AAAA,IACrC;AAEA,IAAA,IAAI,IAAA,CAAK,OAAO,aAAA,EAAe;AAC7B,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,MAAA,CAAO,aAAA,EAAc;AAC9C,MAAA,OAAO,UAAU,KAAK,CAAA,CAAA;AAAA,IACxB;AAEA,IAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,MAAA,OAAO,CAAA,OAAA,EAAU,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,CAAA;AAAA,IACpC;AAEA,IAAA,MAAM,IAAI,MAAM,wEAAwE,CAAA;AAAA,EAC1F;AAAA;AAAA;AAAA;AAAA,EAKQ,QAAA,CAAS,MAAc,KAAA,EAAuE;AAEpG,IAAA,MAAM,MAAM,IAAI,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,OAAO,OAAO,CAAA;AAE7C,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,QAAA,IAAI,UAAU,MAAA,EAAW;AACvB,UAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAI,QAAA,EAAS;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAW,OAAA,EAAqC;AACpD,IAAA,MAAM,cAAc,YAAwB;AAC1C,MAAA,MAAM,MAAM,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,IAAA,EAAM,QAAQ,KAAK,CAAA;AACrD,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,aAAA,EAAc;AAE5C,MAAA,MAAM,OAAA,GAAkC;AAAA,QACtC,eAAA,EAAiB,UAAA;AAAA,QACjB,UAAA,EAAY,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAAA,QACpC,cAAA,EAAgB,kBAAA;AAAA,QAChB,GAAG,KAAK,MAAA,CAAO,OAAA;AAAA,QACf,GAAG,OAAA,CAAQ;AAAA,OACb;AAGA,MAAA,IAAI,QAAQ,cAAA,EAAgB;AAC1B,QAAA,OAAA,CAAQ,iBAAiB,IAAI,OAAA,CAAQ,cAAA;AAAA,MACvC;AAGA,MAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,MAAA,MAAM,SAAA,GAAY,WAAW,MAAM,UAAA,CAAW,OAAM,EAAG,IAAA,CAAK,OAAO,OAAO,CAAA;AAE1E,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,UAChC,QAAQ,OAAA,CAAQ,MAAA;AAAA,UAChB,OAAA;AAAA,UACA,IAAA,EAAM,QAAQ,IAAA,KAAS,KAAA,CAAA,GAAY,KAAK,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA,GAAI,KAAA,CAAA;AAAA,UAClE,QAAQ,UAAA,CAAW;AAAA,SACpB,CAAA;AAED,QAAA,YAAA,CAAa,SAAS,CAAA;AAGtB,QAAA,MAAM,SAAA,GAAY,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK,KAAA,CAAA;AAG1D,QAAA,IAAI,IAAA;AACJ,QAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA;AACvD,QAAA,IAAI,WAAA,EAAa,QAAA,CAAS,kBAAkB,CAAA,EAAG;AAC7C,UAAA,IAAA,GAAO,MAAM,SAAS,IAAA,EAAK;AAAA,QAC7B,CAAA,MAAO;AACL,UAAA,IAAA,GAAO,MAAM,SAAS,IAAA,EAAK;AAAA,QAC7B;AAGA,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAEhB,UAAA,IAAI,QAAA,CAAS,MAAA,KAAW,GAAA,IAAO,IAAA,CAAK,OAAO,aAAA,EAAe;AACxD,YAAA,IAAA,CAAK,oBAAA,EAAA;AACL,YAAA,IAAI,IAAA,CAAK,oBAAA,GAAuB,IAAA,CAAK,uBAAA,EAAyB;AAG5D,cAAA,OAAO,IAAA,CAAK,QAAQ,OAAO,CAAA;AAAA,YAC7B;AAAA,UACF;AAEA,UAAA,MAAM,aAAA,CAAc,QAAA,CAAS,MAAA,EAAQ,IAAA,EAAM,SAAS,CAAA;AAAA,QACtD;AAGA,QAAA,IAAA,CAAK,oBAAA,GAAuB,CAAA;AAG5B,QAAA,MAAM,WAAA,GAAc,IAAA;AACpB,QAAA,IAAI,SAAA,IAAa,WAAA,IAAe,WAAA,CAAY,OAAA,EAAS;AACnD,UAAA,OAAQ,WAAA,CAAsC,IAAA;AAAA,QAChD;AAGA,QAAA,OAAO,IAAA;AAAA,MAET,SAAS,KAAA,EAAO;AACd,QAAA,YAAA,CAAa,SAAS,CAAA;AAGtB,QAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,YAAA,EAAc;AACzD,UAAA,MAAM,IAAI,YAAA,CAAa,CAAA,wBAAA,EAA2B,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,EAAA,CAAI,CAAA;AAAA,QAC3E;AAGA,QAAA,IAAI,iBAAiB,SAAA,IAAa,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,EAAG;AACjE,UAAA,MAAM,IAAI,YAAA,CAAa,CAAA,eAAA,EAAkB,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,QAC1D;AAEA,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAA;AAGA,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,OAAO,WAAA,EAAY;AAAA,IACrB;AAEA,IAAA,OAAO,SAAA,CAAU,WAAA,EAAa,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAA,CACJ,IAAA,EACA,KAAA,EACY;AACZ,IAAA,OAAO,KAAK,OAAA,CAAW;AAAA,MACrB,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,CACJ,IAAA,EACA,IAAA,EACA,OAAA,EACY;AACZ,IAAA,OAAO,KAAK,OAAA,CAAW;AAAA,MACrB,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA;AAAA,MACA,IAAA;AAAA,MACA,gBAAgB,OAAA,EAAS,cAAA;AAAA,MACzB,WAAW,OAAA,EAAS;AAAA,KACrB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,CACJ,IAAA,EACA,IAAA,EACA,OAAA,EACY;AACZ,IAAA,OAAO,KAAK,OAAA,CAAW;AAAA,MACrB,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA;AAAA,MACA,IAAA;AAAA,MACA,gBAAgB,OAAA,EAAS;AAAA,KAC1B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAU,IAAA,EAA0B;AACxC,IAAA,OAAO,KAAK,OAAA,CAAW;AAAA,MACrB,MAAA,EAAQ,QAAA;AAAA,MACR,IAAA;AAAA,MACA,SAAA,EAAW;AAAA;AAAA,KACZ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,MAAA,EAAyC;AACpD,IAAA,IAAA,CAAK,SAAS,EAAE,GAAG,IAAA,CAAK,MAAA,EAAQ,GAAG,MAAA,EAAO;AAAA,EAC5C;AACF,CAAA;AAKO,SAAS,sBAAA,GAAiC;AAC/C,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,CAAE,SAAS,EAAE,CAAA;AACxC,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,EAAE,CAAA;AACzD,EAAA,OAAO,CAAA,KAAA,EAAQ,SAAS,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AACpC;;;ACrPO,IAAM,YAAN,MAAgB;AAAA,EACb,MAAA;AAAA,EACA,eAAA,GAA0C,IAAA;AAAA,EAC1C,SAAA,GAAY,KAAA;AAAA,EAEpB,YAAY,MAAA,EAAyB;AACnC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAG3C,IAAA,OAAA,CAAQ,GAAA,CAAI,0BAAA,EAA4B,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AACvD,IAAA,OAAA,CAAQ,GAAA,CAAI,wBAAA,EAA0B,IAAA,CAAK,MAAA,CAAO,aAAa,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,SAAA,CAAU,CAAA,EAAG,EAAE,CAAC,QAAQ,SAAS,CAAA;AAC1H,IAAA,OAAA,CAAQ,GAAA,CAAI,mBAAA,EAAqB,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAElD,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,IAAA,CAAK,OAAO,GAAA,EAAK;AAAA,QAC5C,MAAA,EAAQ,KAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,eAAA,EAAiB,KAAK,MAAA,CAAO,UAAA;AAAA,UAC7B,UAAA,EAAY,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAAA,UACpC,QAAA,EAAU,mBAAA;AAAA,UACV,eAAA,EAAiB;AAAA,SACnB;AAAA,QACA,MAAA,EAAQ,KAAK,eAAA,CAAgB;AAAA,OAC9B,CAAA;AAED,MAAA,OAAA,CAAQ,GAAA,CAAI,4BAAA,EAA8B,QAAA,CAAS,MAAA,EAAQ,SAAS,UAAU,CAAA;AAC9E,MAAA,OAAA,CAAQ,IAAI,6BAAA,EAA+B;AAAA,QACzC,WAAA,EAAa,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA;AAAA,QAChD,YAAA,EAAc,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,eAAe;AAAA,OACnD,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAEhB,QAAA,IAAI,SAAA,GAAY,EAAA;AAChB,QAAA,IAAI;AACF,UAAA,SAAA,GAAY,MAAM,SAAS,IAAA,EAAK;AAChC,UAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,SAAS,CAAA;AAAA,QAC3D,SAAS,CAAA,EAAG;AACV,UAAA,OAAA,CAAQ,MAAM,qCAAqC,CAAA;AAAA,QACrD;AACA,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,QAAA,CAAS,MAAM,IAAI,QAAA,CAAS,UAAU,CAAA,GAAA,EAAM,SAAS,CAAA,CAAE,CAAA;AAAA,MACnG;AAEA,MAAA,IAAI,CAAC,SAAS,IAAA,EAAM;AAClB,QAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,MAC/C;AAEA,MAAA,OAAA,CAAQ,IAAI,0DAA0D,CAAA;AACtE,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,MAAA,IAAA,CAAK,MAAA,CAAO,mBAAmB,IAAI,CAAA;AAGnC,MAAA,MAAM,IAAA,CAAK,WAAA,CAAY,QAAA,CAAS,IAAI,CAAA;AAAA,IAEtC,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,YAAA,EAAc;AAEzD,QAAA,OAAA,CAAQ,IAAI,4CAA4C,CAAA;AACxD,QAAA;AAAA,MACF;AACA,MAAA,OAAA,CAAQ,KAAA,CAAM,+BAA+B,KAAK,CAAA;AAClD,MAAA,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA;AAAA,IAC/E,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,MAAA,IAAA,CAAK,MAAA,CAAO,mBAAmB,KAAK,CAAA;AACpC,MAAA,OAAA,CAAQ,IAAI,6BAA6B,CAAA;AAAA,IAC3C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAmB;AACjB,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAC3B,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,IACzB;AACA,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,YAAY,IAAA,EAAiD;AACzE,IAAA,MAAM,MAAA,GAAS,KAAK,SAAA,EAAU;AAC9B,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAEhC,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,eAAoE,EAAC;AACzE,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,IAAA,OAAA,CAAQ,IAAI,oCAAoC,CAAA;AAEhD,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,EAAM;AACX,QAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAE1C,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,OAAA,CAAQ,GAAA,CAAI,kDAAA,EAAoD,UAAA,EAAY,SAAA,EAAW,UAAU,CAAA;AACjG,UAAA;AAAA,QACF;AAEA,QAAA,UAAA,EAAA;AACA,QAAA,MAAM,QAAQ,OAAA,CAAQ,MAAA,CAAO,OAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AACpD,QAAA,MAAA,IAAU,KAAA;AAGV,QAAA,IAAI,cAAc,CAAA,EAAG;AACnB,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gBAAA,EAAmB,UAAU,CAAA,EAAA,EAAK,KAAA,CAAM,MAAM,CAAA,QAAA,CAAA,EAAY,KAAA,CAAM,SAAA,CAAU,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,QAC/F;AAGA,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC/B,QAAA,MAAA,GAAS,KAAA,CAAM,KAAI,IAAK,EAAA;AAExB,QAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AAExB,UAAA,IAAI,SAAS,EAAA,EAAI;AACf,YAAA,IAAI,YAAA,CAAa,IAAA,IAAQ,YAAA,CAAa,IAAA,KAAS,KAAA,CAAA,EAAW;AACxD,cAAA,UAAA,EAAA;AACA,cAAA,OAAA,CAAQ,GAAA,CAAI,mBAAmB,UAAU,CAAA,CAAA,CAAA,EAAK,aAAa,IAAA,EAAM,gBAAA,EAAkB,YAAA,CAAa,IAAA,CAAK,MAAM,CAAA;AAC3G,cAAA,IAAA,CAAK,cAAc,YAA2D,CAAA;AAAA,YAChF;AACA,YAAA,YAAA,GAAe,EAAC;AAChB,YAAA;AAAA,UACF;AAGA,UAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AACxB,YAAA;AAAA,UACF;AAGA,UAAA,MAAM,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AACnC,UAAA,IAAI,eAAe,CAAA,CAAA,EAAI;AACrB,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,UAAU,CAAA;AAE1C,UAAA,IAAIA,MAAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,UAAA,GAAa,CAAC,CAAA;AACzC,UAAA,IAAIA,MAAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AACzB,YAAAA,MAAAA,GAAQA,MAAAA,CAAM,SAAA,CAAU,CAAC,CAAA;AAAA,UAC3B;AAEA,UAAA,QAAQ,KAAA;AAAO,YACb,KAAK,OAAA;AACH,cAAA,YAAA,CAAa,IAAA,GAAOA,MAAAA;AACpB,cAAA;AAAA,YACF,KAAK,IAAA;AACH,cAAA,YAAA,CAAa,EAAA,GAAKA,MAAAA;AAClB,cAAA;AAAA,YACF,KAAK,MAAA;AAEH,cAAA,YAAA,CAAa,OAAO,YAAA,CAAa,IAAA,GAC7B,YAAA,CAAa,IAAA,GAAO,OAAOA,MAAAA,GAC3BA,MAAAA;AACJ,cAAA;AAAA;AACJ,QACF;AAAA,MACF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,IAAI,wDAAwD,CAAA;AACpE,MAAA,MAAA,CAAO,WAAA,EAAY;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,KAAA,EAA0D;AAC9E,IAAA,OAAA,CAAQ,IAAI,iCAAA,EAAmC,KAAA,CAAM,IAAA,EAAM,KAAA,EAAO,MAAM,EAAE,CAAA;AAE1E,IAAA,IAAI;AAEF,MAAA,IAAI,IAAA;AACJ,MAAA,IAAI;AACF,QAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AAC5B,QAAA,OAAA,CAAQ,GAAA,CAAI,8BAAA,EAAgC,OAAO,IAAA,EAAM,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,IAAc,CAAA,GAAI,EAAE,CAAA;AAAA,MAC9H,CAAA,CAAA,MAAQ;AAEN,QAAA,IAAA,GAAO,KAAA,CAAM,IAAA;AAAA,MACf;AAEA,MAAA,MAAM,QAAA,GAAqB;AAAA,QACzB,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,IAAI,KAAA,CAAM,EAAA;AAAA,QACV;AAAA,OACF;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,QAAQ,QAAQ,CAAA;AAAA,IAC9B,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,CAAO,OAAA;AAAA,QACV,KAAA,YAAiB,QAAQ,KAAA,GAAQ,IAAI,MAAM,CAAA,uBAAA,EAA0B,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE;AAAA,OACtF;AAAA,IACF;AAAA,EACF;AACF,CAAA;;;AC9NA,IAAM,wBAAA,GAA4C;AAAA,EAChD,oBAAA,EAAsB,CAAA;AAAA,EACtB,oBAAA,EAAsB,GAAA;AAAA,EACtB,mBAAA,EAAqB,GAAA;AAAA,EACrB,iBAAA,EAAmB,GAAA;AAAA,EACnB,iBAAA,EAAmB;AACrB,CAAA;AA6CA,IAAM,gCAAN,MAAyE;AAAA,EAC/D,OAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA,GAA8B,IAAA;AAAA,EAC9B,MAAA,GAA0B,YAAA;AAAA,EAC1B,iBAAA,GAAoB,CAAA;AAAA,EACpB,YAAA,uBAAmB,GAAA,EAAY;AAAA,EAC/B,YAAA,GAA8B,IAAA;AAAA,EAC9B,iBAAA,GAA0D,IAAA;AAAA,EAC1D,iBAAA,GAA2D,IAAA;AAAA,EAC3D,cAAA,GAAwC,IAAA;AAAA,EACxC,UAAA,GAAgC,IAAA;AAAA;AAAA,EAGhC,SAAA,GAeJ;AAAA,IACF,KAAK,EAAC;AAAA,IACN,UAAU,EAAC;AAAA,IACX,YAAY,EAAC;AAAA,IACb,MAAM,EAAC;AAAA,IACP,QAAQ,EAAC;AAAA,IACT,SAAS,EAAC;AAAA,IACV,UAAU,EAAC;AAAA,IACX,gBAAgB,EAAC;AAAA,IACjB,mBAAmB,EAAC;AAAA,IACpB,qBAAqB,EAAC;AAAA,IACtB,WAAW,EAAC;AAAA,IACZ,UAAU,EAAC;AAAA,IACX,OAAO,EAAC;AAAA,IACR,kBAAkB;AAAC,GACrB;AAAA;AAAA,EAGQ,WAAA,GAA8C,IAAA;AAAA,EAC9C,WAAA,GAA4D,IAAA;AAAA,EAC5D,UAAA,GAA8C,IAAA;AAAA,EAEtD,YAAY,OAAA,EAA2C;AACrD,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,SAAS,EAAE,GAAG,wBAAA,EAA0B,GAAG,QAAQ,MAAA,EAAO;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,WAAA,GAA6B;AAC/B,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,WAAA,GAAsB;AACxB,IAAA,OAAO,KAAK,OAAA,CAAQ,WAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAA,GAAgC;AAClC,IAAA,OAAO,KAAK,OAAA,CAAQ,SAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAA,CAAK,MAAA,GAAS,YAAA;AACd,IAAA,IAAA,CAAK,iBAAA,GAAoB,CAAA;AAEzB,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,UAAA,EAAW;AAAA,IACxB,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAA,CAAK,sBAAsB,KAAK,CAAA;AAAA,IACxC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,EAAA,CACE,OACA,QAAA,EACM;AACN,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AACtC,IAAA,IAAI,SAAA,EAAW;AAEb,MAAC,SAAA,CAAuD,KAAK,QAAQ,CAAA;AAAA,IACvE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAe;AACb,IAAA,IAAA,CAAK,MAAA,GAAS,QAAA;AACd,IAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,IAAA,IAAA,CAAK,WAAA,EAAY;AAEjB,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,IAAA,CAAK,UAAU,UAAA,EAAW;AAC1B,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,IACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,GAAgC;AAE9B,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,cAAc,CAAA;AAAA,IAC5C;AACA,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,OAAO,OAAA,CAAQ,OAAO,IAAI,WAAA;AAAA,QACxB,KAAK,UAAA,CAAW,KAAA;AAAA,QAChB,IAAA,CAAK,WAAW,SAAA,IAAa,iBAAA;AAAA,QAC7B;AAAA,OACD,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,IAAA,CAAK,WAAA,GAAc,IAAI,OAAA,CAAQ,CAAC,SAAS,MAAA,KAAW;AAClD,QAAA,IAAA,CAAK,WAAA,GAAc,OAAA;AACnB,QAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAAA,MACpB,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,UAAA,GAA4B;AACxC,IAAA,MAAM,GAAA,GAAM,GAAG,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA,aAAA,EAAgB,IAAA,CAAK,QAAQ,WAAW,CAAA,OAAA,CAAA;AAG3E,IAAA,IAAI,SAAA,GAAY,KAAK,OAAA,CAAQ,MAAA;AAC7B,IAAA,IAAI,CAAC,SAAA,IAAa,IAAA,CAAK,OAAA,CAAQ,aAAA,EAAe;AAC5C,MAAA,SAAA,GAAY,MAAM,IAAA,CAAK,OAAA,CAAQ,aAAA,EAAc;AAAA,IAC/C;AAEA,IAAA,OAAA,CAAQ,IAAI,0CAA0C,CAAA;AACtD,IAAA,OAAA,CAAQ,GAAA,CAAI,+BAA+B,GAAG,CAAA;AAC9C,IAAA,OAAA,CAAQ,GAAA,CAAI,iCAAA,EAAmC,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AACnE,IAAA,OAAA,CAAQ,GAAA,CAAI,qCAAA,EAAuC,IAAA,CAAK,OAAA,CAAQ,WAAW,CAAA;AAC3E,IAAA,OAAA,CAAQ,GAAA,CAAI,+BAAA,EAAiC,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA;AAC/D,IAAA,OAAA,CAAQ,GAAA,CAAI,gCAAA,EAAkC,SAAA,GAAY,CAAA,EAAG,SAAA,CAAU,UAAU,CAAA,EAAG,EAAE,CAAC,CAAA,GAAA,CAAA,GAAQ,SAAS,CAAA;AAExG,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,SAAA,CAAU;AAAA,MAC7B,GAAA;AAAA,MACA,UAAA,EAAY,UAAU,SAAS,CAAA,CAAA;AAAA,MAC/B,KAAA,EAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,MACpB,OAAA,EAAS,CAAC,KAAA,KAAU,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,MAC1C,OAAA,EAAS,CAAC,KAAA,KAAU;AAClB,QAAA,OAAA,CAAQ,KAAA,CAAM,qCAAqC,KAAK,CAAA;AACxD,QAAA,IAAA,CAAK,sBAAsB,KAAK,CAAA;AAAA,MAClC,CAAA;AAAA,MACA,kBAAA,EAAoB,CAAC,SAAA,KAAc;AACjC,QAAA,OAAA,CAAQ,GAAA,CAAI,iDAAiD,SAAS,CAAA;AACtE,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,IAAA,CAAK,MAAA,GAAS,WAAA;AACd,UAAA,IAAA,CAAK,iBAAA,GAAoB,CAAA;AACzB,UAAA,IAAA,CAAK,oBAAA,EAAqB;AAAA,QAC5B;AACA,QAAA,IAAA,CAAK,KAAK,kBAAA,EAAoB,EAAE,SAAA,EAAW,aAAA,EAAe,OAAO,CAAA;AAAA,MACnE;AAAA,KACD,CAAA;AAED,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,UAAU,OAAA,EAAQ;AAC7B,MAAA,OAAA,CAAQ,IAAI,gDAAgD,CAAA;AAAA,IAC9D,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,+CAA+C,KAAK,CAAA;AAClE,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,KAAA,EAAuB;AACzC,IAAA,OAAA,CAAQ,IAAI,4CAAA,EAA8C,KAAA,CAAM,IAAA,EAAM,KAAA,EAAO,MAAM,EAAE,CAAA;AAGrF,IAAA,IAAA,CAAK,oBAAA,EAAqB;AAG1B,IAAA,IAAI,MAAM,EAAA,EAAI;AACZ,MAAA,IAAI,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA,EAAG;AACnC,QAAA,OAAA,CAAQ,GAAA,CAAI,kDAAA,EAAoD,KAAA,CAAM,EAAE,CAAA;AACxE,QAAA;AAAA,MACF;AACA,MAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA;AAC9B,MAAA,IAAA,CAAK,eAAe,KAAA,CAAM,EAAA;AAG1B,MAAA,IAAI,IAAA,CAAK,YAAA,CAAa,IAAA,GAAO,GAAA,EAAM;AACjC,QAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,YAAY,CAAA;AACxC,QAAA,IAAA,CAAK,eAAe,IAAI,GAAA,CAAI,GAAA,CAAI,KAAA,CAAM,IAAI,CAAC,CAAA;AAAA,MAC7C;AAAA,IACF;AAGA,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,IAAA,OAAA,CAAQ,GAAA,CAAI,yCAAA,EAA2C,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAExE,IAAA,QAAQ,MAAM,IAAA;AAAM,MAClB,KAAK,KAAA,EAAO;AAIV,QAAA,MAAM,SAAS,IAAA,CAAK,GAAA;AACpB,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,OAAA,CAAQ,KAAK,wDAAwD,CAAA;AACrE,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,YAAA,GAAgB,MAAA,CAAO,OAAA,IAAuB,MAAA,CAAO,IAAA,IAAmB,MAAA;AAE9E,QAAA,MAAM,cAAA,GAA+B;AAAA,UACnC,IAAA,EAAO,OAAO,IAAA,IAAmB,CAAA,IAAA,EAAO,OAAO,SAAA,IAAa,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,UACtE,IAAA,EAAM,YAAA;AAAA,UACN,KAAA,EAAQ,MAAA,CAAO,OAAA,IAAuB,MAAA,CAAO,KAAA,IAAoB,EAAA;AAAA,UACjE,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,QAAA,EAAU;AAAA,YACR,GAAI,MAAA,CAAO,QAAA,IAAuC,EAAC;AAAA;AAAA,YAEnD,SAAA,EAAW,OAAO,SAAA,IAAuB;AAAA,WAC3C;AAAA,UACA,WAAW,MAAA,CAAO,SAAA,IAAA,iBAAuB,IAAI,IAAA,IAAO,WAAA,EAAY;AAAA,UAChE,YAAY,MAAA,CAAO;AAAA,SACrB;AAEA,QAAA,IAAA,CAAK,IAAA,CAAK,OAAO,cAAc,CAAA;AAC/B,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,WAAA;AAEH,QAAA,IAAA,CAAK,KAAK,UAAA,EAAY;AAAA,UACpB,YAAY,IAAA,CAAK,UAAA,IAAwB,CAAA,UAAA,EAAa,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,UAChE,QAAA,EAAW,KAAK,QAAA,IAAuB,cAAA;AAAA,UACvC,MAAA,EAAS,IAAA,CAAK,IAAA,IAAoC,EAAC;AAAA,UACnD,SAAA,EAAW,KAAK,SAAA,IAAuB;AAAA,SACxC,CAAA;AACD,QAAA;AAAA,MAEF,KAAK,aAAA;AAEH,QAAA,IAAA,CAAK,KAAK,YAAA,EAAc;AAAA,UACtB,YAAY,IAAA,CAAK,UAAA,IAAwB,CAAA,YAAA,EAAe,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,UAClE,QAAA,EAAW,KAAK,QAAA,IAAuB,cAAA;AAAA,UACvC,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,UAAA,EAAY,KAAK,UAAA,IAAwB;AAAA,SAC1C,CAAA;AACD,QAAA;AAAA,MAEF,KAAK,kBAAA;AAEH,QAAA,IAAA,CAAK,KAAK,QAAA,EAAU;AAAA,UAClB,QAAA,EAAU,IAAA,CAAK,QAAA,IAAsB,IAAA,CAAK,MAAA,IAAoB,EAAA;AAAA,UAC9D,SAAS,IAAA,CAAK,OAAA;AAAA,UACd,MAAA,EAAQ;AAAA,SACT,CAAA;AACD,QAAA;AAAA,MAEF,KAAK,UAAA;AACH,QAAA,IAAA,CAAK,eAAe,IAAI,CAAA;AACxB,QAAA;AAAA,MAEF,KAAK,OAAA;AACH,QAAA,IAAA,CAAK,WAAA,CAAY;AAAA,UACf,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,WAAW,IAAA,CAAK;AAAA,SACjB,CAAA;AACD,QAAA;AAAA,MACF,KAAK,QAAA;AAEH,QAAA,IAAA,CAAK,WAAA,CAAY;AAAA,UACf,KAAA,EAAQ,IAAA,CAAK,KAAA,IAAqB,IAAA,CAAK,OAAA,IAAsB,kBAAA;AAAA,UAC7D,SAAA,EAAY,KAAK,SAAA,IAAoC;AAAA,SACtD,CAAA;AACD,QAAA;AAAA,MAEF,KAAK,SAAA;AACH,QAAA,IAAK,KAAiC,SAAA,EAAW;AAC/C,UAAA,IAAA,CAAK,qBAAA,CAAsB,IAAI,KAAA,CAAM,gBAAgB,CAAC,CAAA;AAAA,QACxD,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,WAAA,CAAY;AAAA,YACf,OAAO,IAAA,CAAK,KAAA;AAAA,YACZ,SAAA,EAAW;AAAA,WACZ,CAAA;AAAA,QACH;AACA,QAAA;AAAA;AAAA,MAGF,KAAK,SAAA;AACH,QAAA,IAAA,CAAK,KAAK,SAAA,EAAW;AAAA,UACnB,aAAa,IAAA,CAAK,WAAA;AAAA,UAClB,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,MAAA,EAAQ,cAAA;AAAA,UACR,aAAa,IAAA,CAAK;AAAA,SACnB,CAAA;AACD,QAAA;AAAA;AAAA,MAGF,KAAK,UAAA;AACH,QAAA,IAAA,CAAK,KAAK,UAAA,EAAY;AAAA,UACpB,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,SAAA,EAAW,KAAK,SAAA,IAAuB,CAAA;AAAA,UACvC,aAAa,IAAA,CAAK,WAAA;AAAA,UAClB,YAAY,IAAA,CAAK,UAAA;AAAA,UACjB,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,WAAW,IAAA,CAAK;AAAA,SACjB,CAAA;AACD,QAAA;AAAA;AAAA,MAGF,KAAK,kBAAA;AACH,QAAA,IAAA,CAAK,KAAK,gBAAA,EAAkB;AAAA,UAC1B,aAAa,IAAA,CAAK,WAAA;AAAA,UAClB,OAAO,IAAA,CAAK,KAAA;AAAA,UAMZ,WAAW,IAAA,CAAK;AAAA,SACjB,CAAA;AACD,QAAA;AAAA;AAAA,MAGF,KAAK,oBAAA;AACH,QAAA,IAAA,CAAK,KAAK,mBAAA,EAAqB;AAAA,UAC7B,IAAA,EAAM,oBAAA;AAAA,UACN,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,iBAAiB,IAAA,CAAK,eAAA;AAAA,UACtB,iBAAiB,IAAA,CAAK,eAAA;AAAA,UACtB,aAAa,IAAA,CAAK,WAAA;AAAA,UAClB,WAAW,IAAA,CAAK,SAAA,IAAA,iBAAuB,IAAI,IAAA,IAAO,WAAA;AAAY,SAC/D,CAAA;AACD,QAAA;AAAA;AAAA,MAGF,KAAK,sBAAA;AACH,QAAA,IAAA,CAAK,KAAK,qBAAA,EAAuB;AAAA,UAC/B,IAAA,EAAM,sBAAA;AAAA,UACN,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,eAAe,IAAA,CAAK,aAAA;AAAA,UACpB,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,YAAY,IAAA,CAAK,UAAA;AAAA,UACjB,WAAW,IAAA,CAAK,SAAA,IAAA,iBAAuB,IAAI,IAAA,IAAO,WAAA;AAAY,SAC/D,CAAA;AACD,QAAA;AAAA;AAAA;AAAA,MAIF,KAAK,eAAA;AACH,QAAA,IAAA,CAAK,KAAK,UAAA,EAAY;AAAA,UACpB,MAAA,EAAS,KAAK,MAAA,IAA2F,UAAA;AAAA,UACzG,SAAA,EAAW,CAAA;AAAA,UACX,aAAa,IAAA,CAAK;AAAA,SACnB,CAAA;AACD,QAAA;AAAA;AAAA,MAGF,KAAK,YAAA;AACH,QAAA,IAAA,CAAK,KAAK,WAAA,EAAa;AAAA,UACrB,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,aAAa,IAAA,CAAK,WAAA;AAAA,UAClB,WAAW,IAAA,CAAK,SAAA,IAAA,iBAAuB,IAAI,IAAA,IAAO,WAAA;AAAY,SAC/D,CAAA;AACD,QAAA;AAMA;AACJ,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,IAAA,EAAqC;AAC1D,IAAA,IAAA,CAAK,MAAA,GAAS,QAAA;AACd,IAAA,IAAA,CAAK,mBAAA,EAAoB;AAGzB,IAAA,MAAM,SAAA,GAAa,IAAA,CAAK,SAAA,IAAoC,IAAA,CAAK,OAAA,CAAQ,SAAA;AAEzE,IAAA,MAAM,SAAA,GAA4B;AAAA,MAChC,IAAA,EAAM,KAAK,OAAA,CAAQ,WAAA;AAAA,MACnB,SAAA,EAAW,EAAA;AAAA,MACX,SAAA;AAAA,MACA,MAAA,EAAQ,WAAA;AAAA,MACR,KAAA,EAAO,EAAE,IAAA,EAAM,EAAA,EAAG;AAAA,MAClB,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,MAAM,EAAC;AAAA,MACP,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,QAAA,EAAU,EAAA;AAAA,MACV,GAAG;AAAA,KACL;AAEA,IAAA,IAAA,CAAK,cAAA,GAAiB,SAAA;AACtB,IAAA,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,EAAE,SAAA,EAAW,CAAA;AAEnC,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAA,CAAK,YAAY,SAAS,CAAA;AAAA,IAC5B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,KAAA,EAAyB;AAC3C,IAAA,IAAA,CAAK,MAAA,GAAS,QAAA;AACd,IAAA,IAAA,CAAK,mBAAA,EAAoB;AAEzB,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,IAAA,IAAA,CAAK,IAAA,CAAK,SAAS,KAAK,CAAA;AAExB,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,IAAA,CAAK,WAAW,IAAI,WAAA;AAAA,QAClB,KAAA,CAAM,KAAA;AAAA,QACN,MAAM,SAAA,IAAa,iBAAA;AAAA,QACnB;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,sBAAsB,KAAA,EAA+B;AACjE,IAAA,IAAI,IAAA,CAAK,WAAW,QAAA,EAAU;AAC5B,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,iBAAA,GAAoB,IAAA,CAAK,MAAA,CAAO,oBAAA,EAAsB;AAC7D,MAAA,IAAA,CAAK,MAAA,GAAS,cAAA;AACd,MAAA,IAAA,CAAK,iBAAA,EAAA;AAEL,MAAA,MAAM,QAAQ,IAAA,CAAK,GAAA;AAAA,QACjB,KAAK,MAAA,CAAO,oBAAA,GAAuB,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,iBAAiB,CAAA;AAAA,QACrE,KAAK,MAAA,CAAO;AAAA,OACd;AAEA,MAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,KAAK,CAAC,CAAA;AAGvD,MAAA,IAAI,IAAA,CAAK,WAAW,QAAA,EAA6B;AAC/C,QAAA;AAAA,MACF;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,KAAK,UAAA,EAAW;AAAA,MACxB,CAAA,CAAA,MAAQ;AACN,QAAA,MAAM,IAAA,CAAK,sBAAsB,KAAK,CAAA;AAAA,MACxC;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,IAAA,CAAK,MAAA,GAAS,kBAAA;AACd,MAAA,IAAA,CAAK,KAAK,kBAAA,EAAoB,EAAE,WAAW,KAAA,EAAO,aAAA,EAAe,MAAM,CAAA;AACvE,MAAA,IAAA,CAAK,YAAA,EAAa;AAAA,IACpB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAA,GAAqB;AAC3B,IAAA,IAAA,CAAK,iBAAA,GAAoB,YAAY,YAAY;AAC/C,MAAA,IAAI;AACF,QAAA,MAAM,YAAY,MAAM,IAAA,CAAK,QAAQ,YAAA,CAAa,IAAA,CAAK,QAAQ,WAAW,CAAA;AAG1E,QAAA,KAAA,MAAW,GAAA,IAAO,UAAU,IAAA,EAAM;AAChC,UAAA,IAAI,CAAC,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA,EAAG;AACpC,YAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA;AAC9B,YAAA,IAAA,CAAK,IAAA,CAAK,OAAO,GAAG,CAAA;AAAA,UACtB;AAAA,QACF;AAGA,QAAA,IAAI,SAAA,CAAU,WAAW,WAAA,EAAa;AACpC,UAAA,IAAA,CAAK,WAAA,EAAY;AACjB,UAAA,IAAA,CAAK,eAAe,SAA+C,CAAA;AAAA,QACrE,WAAW,SAAA,CAAU,MAAA,KAAW,QAAA,IAAY,SAAA,CAAU,WAAW,WAAA,EAAa;AAC5E,UAAA,IAAA,CAAK,WAAA,EAAY;AACjB,UAAA,IAAA,CAAK,WAAA,CAAY;AAAA,YACf,KAAA,EAAO,SAAA,CAAU,KAAA,IAAS,CAAA,UAAA,EAAa,UAAU,MAAM,CAAA,CAAA;AAAA,YACvD,WAAW,SAAA,CAAU;AAAA,WACtB,CAAA;AAAA,QACH;AAAA,MACF,SAAS,KAAA,EAAO;AAEd,QAAA,OAAA,CAAQ,KAAA,CAAM,kBAAkB,KAAK,CAAA;AAAA,MACvC;AAAA,IACF,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,iBAAiB,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAA,GAAoB;AAC1B,IAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,MAAA,aAAA,CAAc,KAAK,iBAAiB,CAAA;AACpC,MAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAA,GAA6B;AACnC,IAAA,IAAA,CAAK,mBAAA,EAAoB;AAEzB,IAAA,IAAA,CAAK,iBAAA,GAAoB,WAAW,MAAM;AAExC,MAAA,IAAI,KAAK,SAAA,EAAW;AAClB,QAAA,IAAA,CAAK,UAAU,UAAA,EAAW;AAAA,MAC5B;AACA,MAAA,IAAA,CAAK,qBAAA,CAAsB,IAAI,KAAA,CAAM,kBAAkB,CAAC,CAAA;AAAA,IAC1D,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,iBAAiB,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAA,GAA4B;AAClC,IAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,MAAA,YAAA,CAAa,KAAK,iBAAiB,CAAA;AACnC,MAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,IAAA,CAAqC,OAAU,IAAA,EAA+B;AACpF,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AACtC,IAAA,OAAA,CAAQ,IAAI,CAAA,iCAAA,EAAoC,KAAK,QAAQ,SAAA,EAAW,MAAA,IAAU,CAAC,CAAA,UAAA,CAAY,CAAA;AAC/F,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,QAAA,IAAI;AACF,UAAC,SAA+C,IAAI,CAAA;AAAA,QACtD,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,SAAA,EAAY,KAAK,CAAA,UAAA,CAAA,EAAc,KAAK,CAAA;AAAA,QACpD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF,CAAA;AAKO,SAAS,gCACd,OAAA,EAC2B;AAC3B,EAAA,OAAO,IAAI,8BAA8B,OAAO,CAAA;AAClD;;;ACvnBO,IAAM,SAAA,GAAN,cAAwB,eAAA,CAAgB;AAAA,EAC7C,WAAA,CAAY,MAAmC,eAAA,EAAqC;AAClF,IAAA,KAAA,CAAM,MAAM,SAAS,CAAA;AADwB,IAAA,IAAA,CAAA,eAAA,GAAA,eAAA;AAAA,EAE/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,KAAK,OAAA,EAA+D;AACxE,IAAA,MAAM,KAAA,GAA+D;AAAA,MACnE,GAAG,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA;AAAA,MAC9B,QAAQ,OAAA,EAAS,MAAA;AAAA,MACjB,MAAM,OAAA,EAAS;AAAA,KACjB;AACA,IAAA,OAAO,IAAA,CAAK,OAAA,CAAkC,EAAA,EAAI,KAAK,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,IAAI,IAAA,EAA8B;AACtC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAe,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA,MAAM,OAAA,CAAQ,IAAA,EAAc,KAAA,EAA+C;AACzE,IAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,OAAA,EAAS,cAAA,IAAkB,sBAAA,EAAuB;AAG/E,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,MACV,IAAI,IAAI,CAAA,QAAA,CAAA;AAAA,MACR;AAAA,QACE,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,OAAA,EAAS,KAAA,CAAM,OAAA,IAAW,EAAC;AAAA,QAC3B,eAAe,KAAA,CAAM,aAAA;AAAA,QACrB,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,GAAI,MAAM,QAAA,GAAW,EAAE,UAAU,KAAA,CAAM,QAAA,KAAa;AAAC,OACvD;AAAA,MACA,EAAE,cAAA;AAAe,KACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,MAAM,WAAA,CACJ,IAAA,EACA,KAAA,EACA,eAAuB,GAAA,EACE;AAEzB,IAAA,MAAM,EAAE,WAAA,EAAY,GAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,KAAK,CAAA;AAGtD,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,WAAA,EAAa,YAAY,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,MAAM,MAAA,CAAO,IAAA,EAAc,KAAA,EAAyD;AAClF,IAAA,OAAA,CAAQ,GAAA,CAAI,2CAA2C,IAAI,CAAA;AAG3D,IAAA,MAAM,EAAE,aAAa,SAAA,EAAU,GAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,KAAK,CAAA;AACjE,IAAA,OAAA,CAAQ,GAAA,CAAI,iCAAA,EAAmC,EAAE,WAAA,EAAa,WAAW,CAAA;AAGzE,IAAA,MAAM,MAAA,GAAS,KAAK,eAAA,EAAgB;AACpC,IAAA,OAAA,CAAQ,IAAI,6BAAA,EAA+B;AAAA,MACzC,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,MAAA,CAAO,OAAO,SAAA,CAAU,CAAA,EAAG,EAAE,CAAC,CAAA,GAAA,CAAA,GAAQ,SAAA;AAAA,MACjE,OAAO,MAAA,CAAO;AAAA,KACf,CAAA;AAED,IAAA,MAAM,aAAa,+BAAA,CAAgC;AAAA,MACjD,WAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,eAAe,MAAA,CAAO,aAAA;AAAA,MACtB,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,YAAA,EAAc,CAAC,EAAA,KAAO,IAAA,CAAK,aAAa,EAAE;AAAA,KAC3C,CAAA;AAKD,IAAA,OAAA,CAAQ,IAAI,iGAAiG,CAAA;AAE7G,IAAA,OAAO,UAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4BA,eAAA,CAAgB,aAAqB,SAAA,EAA+C;AAClF,IAAA,OAAA,CAAQ,GAAA,CAAI,wDAAwD,WAAW,CAAA;AAG/E,IAAA,MAAM,MAAA,GAAS,KAAK,eAAA,EAAgB;AACpC,IAAA,OAAA,CAAQ,IAAI,6BAAA,EAA+B;AAAA,MACzC,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,MAAA,CAAO,OAAO,SAAA,CAAU,CAAA,EAAG,EAAE,CAAC,CAAA,GAAA,CAAA,GAAQ,SAAA;AAAA,MACjE,OAAO,MAAA,CAAO;AAAA,KACf,CAAA;AAED,IAAA,MAAM,aAAa,+BAAA,CAAgC;AAAA,MACjD,WAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,eAAe,MAAA,CAAO,aAAA;AAAA,MACtB,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,YAAA,EAAc,CAAC,EAAA,KAAO,IAAA,CAAK,aAAa,EAAE;AAAA,KAC3C,CAAA;AAID,IAAA,OAAA,CAAQ,IAAI,wHAAwH,CAAA;AAEpI,IAAA,OAAO,UAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAM,aAAa,WAAA,EAA8C;AAC/D,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAoB,CAAA,YAAA,EAAe,WAAW,CAAA,CAAE,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,MAAM,MAAA,CAAO,IAAA,EAAc,IAAA,EAAwC;AACjE,IAAA,MAAM,iBAAiB,sBAAA,EAAuB;AAC9C,IAAA,OAAO,IAAA,CAAK,UAAiB,CAAA,CAAA,EAAI,IAAI,IAAI,IAAA,EAAM,EAAE,gBAAgB,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,YAAA,CAAa,IAAA,EAAc,MAAA,EAAgD;AAC/E,IAAA,MAAM,iBAAiB,sBAAA,EAAuB;AAC9C,IAAA,OAAO,IAAA,CAAK,UAAiB,CAAA,CAAA,EAAI,IAAI,WAAW,MAAA,EAAQ,EAAE,gBAAgB,CAAA;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,gBAAgB,WAAA,EAA8C;AAClE,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,eAAe,WAAW,CAAA,OAAA,CAAA;AAAA,MAC1B,MAAA;AAAA,MACA,EAAE,WAAW,IAAA;AAAK,KACpB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,aAAA,CACZ,WAAA,EACA,YAAA,EACyB;AACzB,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,YAAA,CAAa,WAAW,CAAA;AAErD,MAAA,IACE,SAAA,CAAU,WAAW,WAAA,IACrB,SAAA,CAAU,WAAW,QAAA,IACrB,SAAA,CAAU,WAAW,WAAA,EACrB;AACA,QAAA,OAAO,SAAA;AAAA,MACT;AAEA,MAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,YAAY,CAAC,CAAA;AAAA,IAClE;AAAA,EACF;AACF,CAAA;;;ACrUO,IAAM,SAAA,GAAN,cAAwB,eAAA,CAAgB;AAAA,EAC7C,YAAY,IAAA,EAAkB;AAC5B,IAAA,KAAA,CAAM,MAAM,SAAS,CAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAM,KAAK,OAAA,EAA+D;AACxE,IAAA,MAAM,KAAA,GAA+D;AAAA,MACnE,GAAG,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA;AAAA,MAC9B,UAAU,OAAA,EAAS,QAAA;AAAA,MACnB,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,IAAA,CAAK,GAAG;AAAA,KAC/B;AACA,IAAA,OAAO,IAAA,CAAK,OAAA,CAAkC,EAAA,EAAI,KAAK,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,IAAI,IAAA,EAAqC;AAC7C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAsB,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,SAAS,IAAA,EAAoC;AACjD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAqB,CAAA,CAAA,EAAI,IAAI,CAAA,MAAA,CAAQ,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,MAAM,OAAA,CAAQ,IAAA,EAAc,KAAA,EAAmD;AAC7E,IAAA,MAAM,iBAAiB,sBAAA,EAAuB;AAC9C,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,MACV,IAAI,IAAI,CAAA,QAAA,CAAA;AAAA,MACR;AAAA,QACE,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,SAAS,KAAA,CAAM;AAAA,OACjB;AAAA,MACA,EAAE,cAAA;AAAe,KACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,aAAa,WAAA,EAA8C;AAC/D,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAoB,CAAA,YAAA,EAAe,WAAW,CAAA,CAAE,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,MAAM,MAAA,CAAO,IAAA,EAAc,IAAA,EAAwC;AACjE,IAAA,MAAM,iBAAiB,sBAAA,EAAuB;AAC9C,IAAA,OAAO,IAAA,CAAK,UAAiB,CAAA,CAAA,EAAI,IAAI,IAAI,IAAA,EAAM,EAAE,gBAAgB,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,YAAA,CAAa,IAAA,EAAc,MAAA,EAAuC;AACtE,IAAA,MAAM,iBAAiB,sBAAA,EAAuB;AAC9C,IAAA,OAAO,IAAA,CAAK,SAAA,CAAwB,CAAA,CAAA,EAAI,IAAI,CAAA,OAAA,CAAA,EAAW,EAAE,cAAA,EAAgB,MAAA,EAAO,EAAG,EAAE,cAAA,EAAgB,CAAA;AAAA,EACvG;AACF,CAAA;;;ACzJO,IAAM,QAAA,GAAN,cAAuB,eAAA,CAAgB;AAAA,EAC5C,YAAY,IAAA,EAAkB;AAC5B,IAAA,KAAA,CAAM,MAAM,QAAQ,CAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAM,KAAK,OAAA,EAA6D;AACtE,IAAA,MAAM,KAAA,GAA+D;AAAA,MACnE,GAAG,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA;AAAA,MAC9B,UAAU,OAAA,EAAS,QAAA;AAAA,MACnB,WAAW,OAAA,EAAS;AAAA,KACtB;AACA,IAAA,OAAO,IAAA,CAAK,OAAA,CAAiC,EAAA,EAAI,KAAK,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,IAAI,IAAA,EAA6B;AACrC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAc,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,MAAM,OAAA,CAAQ,IAAA,EAAc,KAAA,EAAwD;AAClF,IAAA,MAAM,iBAAiB,sBAAA,EAAuB;AAC9C,IAAA,OAAO,IAAA,CAAK,QAAA,CAAwB,CAAA,CAAA,EAAI,IAAI,CAAA,QAAA,CAAA,EAAY,EAAE,KAAA,EAAM,EAAG,EAAE,cAAA,EAAgB,CAAA;AAAA,EACvF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,MAAM,aAAA,CAAc,IAAA,EAAc,KAAA,EAA+D;AAC/F,IAAA,OAAO,IAAA,CAAK,QAAA,CAA+B,CAAA,CAAA,EAAI,IAAI,CAAA,SAAA,CAAA,EAAa,EAAE,KAAA,EAAM,EAAG,EAAE,SAAA,EAAW,KAAA,EAAO,CAAA;AAAA,EACjG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,aAAa,WAAA,EAA6C;AAC9D,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAmB,CAAA,YAAA,EAAe,WAAW,CAAA,CAAE,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,MAAM,MAAA,CAAO,IAAA,EAAc,IAAA,EAAsC;AAC/D,IAAA,MAAM,iBAAiB,sBAAA,EAAuB;AAC9C,IAAA,OAAO,IAAA,CAAK,UAAgB,CAAA,CAAA,EAAI,IAAI,IAAI,IAAA,EAAM,EAAE,gBAAgB,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,YAAA,CAAa,IAAA,EAAc,MAAA,EAA8C;AAC7E,IAAA,MAAM,iBAAiB,sBAAA,EAAuB;AAC9C,IAAA,OAAO,IAAA,CAAK,UAAgB,CAAA,CAAA,EAAI,IAAI,WAAW,MAAA,EAAQ,EAAE,gBAAgB,CAAA;AAAA,EAC3E;AACF,CAAA;;;ACvJO,IAAM,YAAA,GAAN,cAA2B,eAAA,CAAgB;AAAA,EAChD,YAAY,IAAA,EAAkB;AAC5B,IAAA,KAAA,CAAM,MAAM,YAAY,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAM,IAAA,CAAK,WAAA,EAAqB,OAAA,EAAqE;AACnG,IAAA,MAAM,KAAA,GAA+D;AAAA,MACnE,GAAG,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA;AAAA,MAC9B,MAAM,OAAA,EAAS;AAAA,KACjB;AACA,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA,CAAiC,CAAA,YAAA,EAAe,WAAW,cAAc,KAAK,CAAA;AAAA,EACjG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,IAAI,IAAA,EAAiC;AACzC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAkB,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,MAAM,SAAS,IAAA,EAAsC;AAEnD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAkB;AAAA,MACjD,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,QAAQ,IAAI,IAAI,CAAA,SAAA,CAAA;AAAA,MAC9B,OAAA,EAAS;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACD,CAAA;AAGD,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAEjC,MAAA,OAAO,SAAS,IAAA,EAAK;AAAA,IACvB,CAAA,MAAO;AAEL,MAAA,MAAM,WAAA,GAAc,MAAM,QAAA,CAAS,WAAA,EAAY;AAC/C,MAAA,OAAO,MAAA,CAAO,KAAK,WAAW,CAAA;AAAA,IAChC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAM,eAAe,IAAA,EAAmD;AACtE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAkB;AAAA,MACjD,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,QAAQ,IAAI,IAAI,CAAA,OAAA,CAAA;AAAA,MAC9B,OAAA,EAAS;AAAA,QACP,QAAA,EAAU;AAAA;AACZ,KACD,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,IAAA,EAAM;AAClB,MAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,IAClD;AAEA,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,YAAA,CAAa,IAAA,EAAc,OAAA,EAA+D;AAC9F,IAAA,OAAO,IAAA,CAAK,QAAA,CAA4B,CAAA,CAAA,EAAI,IAAI,CAAA,WAAA,CAAA,EAAe;AAAA,MAC7D,SAAA,EAAW,SAAS,SAAA,IAAa;AAAA,KAClC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,MAAM,MAAA,CAAO,WAAA,EAAqB,KAAA,EAA+C;AAE/E,IAAA,MAAM,QAAA,GAAW,IAAI,QAAA,EAAS;AAG9B,IAAA,IAAI,KAAA,CAAM,mBAAmB,IAAA,EAAM;AACjC,MAAA,QAAA,CAAS,MAAA,CAAO,MAAA,EAAQ,KAAA,CAAM,OAAA,EAAS,MAAM,IAAI,CAAA;AAAA,IACnD,CAAA,MAAA,IAAW,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,QAAA,CAAS,KAAA,CAAM,OAAO,CAAA,EAAG;AAE1E,MAAA,MAAM,WAAA,GAAc,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,QACvC,MAAM,OAAA,CAAQ,UAAA;AAAA,QACd,KAAA,CAAM,OAAA,CAAQ,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ;AAAA,OAC3C;AACA,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,WAAW,CAAA,EAAG,EAAE,IAAA,EAAM,KAAA,CAAM,QAAA,IAAY,0BAAA,EAA4B,CAAA;AAC3F,MAAA,QAAA,CAAS,MAAA,CAAO,MAAA,EAAQ,IAAA,EAAM,KAAA,CAAM,IAAI,CAAA;AAAA,IAC1C,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,YAAmB,cAAA,EAAgB;AAElD,MAAA,MAAM,SAAuB,EAAC;AAC9B,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,SAAA,EAAU;AACvC,MAAA,OAAO,IAAA,EAAM;AACX,QAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,QAAA,IAAI,IAAA,EAAM;AACV,QAAA,MAAA,CAAO,IAAA,CAAK,IAAI,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,MACnC;AAEA,MAAA,MAAM,WAAA,GAAc,OAAO,MAAA,CAAO,CAAC,KAAK,KAAA,KAAU,GAAA,GAAM,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA;AACvE,MAAA,MAAM,QAAA,GAAW,IAAI,UAAA,CAAW,WAAW,CAAA;AAC3C,MAAA,IAAI,MAAA,GAAS,CAAA;AACb,MAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,QAAA,QAAA,CAAS,GAAA,CAAI,OAAO,MAAM,CAAA;AAC1B,QAAA,MAAA,IAAU,KAAA,CAAM,MAAA;AAAA,MAClB;AAEA,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,QAAA,CAAS,MAAqB,CAAA,EAAG,EAAE,IAAA,EAAM,KAAA,CAAM,QAAA,IAAY,0BAAA,EAA4B,CAAA;AAC9G,MAAA,QAAA,CAAS,MAAA,CAAO,MAAA,EAAQ,IAAA,EAAM,KAAA,CAAM,IAAI,CAAA;AAAA,IAC1C;AAEA,IAAA,IAAI,MAAM,IAAA,EAAM;AACd,MAAA,QAAA,CAAS,MAAA,CAAO,MAAA,EAAQ,KAAA,CAAM,IAAI,CAAA;AAAA,IACpC;AACA,IAAA,IAAI,MAAM,QAAA,EAAU;AAClB,MAAA,QAAA,CAAS,OAAO,UAAA,EAAY,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,QAAQ,CAAC,CAAA;AAAA,IAC5D;AAGA,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAkB;AAAA,MACjC,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,eAAe,WAAW,CAAA,UAAA,CAAA;AAAA,MAChC,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS;AAAA;AAAA;AAET,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,OAAO,IAAA,EAA6B;AACxC,IAAA,OAAO,IAAA,CAAK,UAAA,CAAiB,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAAA,EACzC;AACF,CAAA;;;ACpNO,IAAM,WAAA,GAAN,cAA0B,eAAA,CAAgB;AAAA,EAC/C,WAAA,CAAY,MAAmC,eAAA,EAAqC;AAClF,IAAA,KAAA,CAAM,MAAM,WAAW,CAAA;AADsB,IAAA,IAAA,CAAA,eAAA,GAAA,eAAA;AAAA,EAE/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,KAAK,OAAA,EAAmE;AAC5E,IAAA,MAAM,KAAA,GAA+D;AAAA,MACnE,GAAG,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA;AAAA,MAC9B,WAAW,OAAA,EAAS;AAAA,KACtB;AACA,IAAA,OAAO,IAAA,CAAK,OAAA,CAAoC,EAAA,EAAI,KAAK,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,IAAI,SAAA,EAAqC;AAC7C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAiB,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,MAAM,WAAA,CAAY,SAAA,EAAmB,KAAA,EAAmD;AACtF,IAAA,MAAM,iBAAiB,sBAAA,EAAuB;AAC9C,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,MACV,IAAI,SAAS,CAAA,SAAA,CAAA;AAAA,MACb;AAAA,QACE,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,SAAS,KAAA,CAAM,OAAA;AAAA;AAAA,QAEf,eAAe,KAAA,CAAM;AAAA,OACvB;AAAA,MACA,EAAE,cAAA;AAAe,KACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAM,eAAA,CACJ,SAAA,EACA,KAAA,EACA,eAAuB,GAAA,EACE;AACzB,IAAA,MAAM,EAAE,WAAA,EAAY,GAAI,MAAM,IAAA,CAAK,WAAA,CAAY,WAAW,KAAK,CAAA;AAC/D,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,WAAA,EAAa,YAAY,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,MAAM,MAAA,CAAO,SAAA,EAAmB,KAAA,EAA6D;AAC3F,IAAA,MAAM,EAAE,WAAA,EAAY,GAAI,MAAM,IAAA,CAAK,WAAA,CAAY,WAAW,KAAK,CAAA;AAE/D,IAAA,MAAM,MAAA,GAAS,KAAK,eAAA,EAAgB;AACpC,IAAA,MAAM,aAAa,+BAAA,CAAgC;AAAA,MACjD,WAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,YAAA,EAAc,CAAC,EAAA,KAAO,IAAA,CAAK,aAAa,EAAE;AAAA,KAC3C,CAAA;AAED,IAAA,MAAM,WAAW,OAAA,EAAQ;AACzB,IAAA,OAAO,UAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAM,WAAW,SAAA,EAA4C;AAC3D,IAAA,OAAO,IAAA,CAAK,OAAA,CAAwB,CAAA,CAAA,EAAI,SAAS,CAAA,QAAA,CAAU,CAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyBA,MAAM,aAAA,CACJ,SAAA,EACA,OAAA,EAC6C;AAC7C,IAAA,MAAM,KAAA,GAA+D;AAAA,MACnE,GAAG,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA;AAAA,MAC9B,MAAM,OAAA,EAAS,IAAA;AAAA,MACf,iBAAiB,OAAA,EAAS;AAAA,KAC5B;AACA,IAAA,OAAO,IAAA,CAAK,OAAA,CAA4C,CAAA,CAAA,EAAI,SAAS,cAAc,KAAK,CAAA;AAAA,EAC1F;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,aAAa,WAAA,EAA8C;AACvE,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAoB,CAAA,YAAA,EAAe,WAAW,CAAA,CAAE,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,MAAM,OAAO,KAAA,EAA6C;AACxD,IAAA,MAAM,iBAAiB,sBAAA,EAAuB;AAC9C,IAAA,OAAO,KAAK,QAAA,CAAkB,EAAA,EAAI,KAAA,EAAO,EAAE,gBAAgB,CAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,OAAO,SAAA,EAAkC;AAC7C,IAAA,OAAO,IAAA,CAAK,UAAA,CAAiB,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,aAAA,CACZ,WAAA,EACA,YAAA,EACyB;AACzB,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,YAAA,CAAa,WAAW,CAAA;AAErD,MAAA,IACE,SAAA,CAAU,WAAW,WAAA,IACrB,SAAA,CAAU,WAAW,QAAA,IACrB,SAAA,CAAU,WAAW,WAAA,EACrB;AACA,QAAA,OAAO,SAAA;AAAA,MACT;AAEA,MAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,YAAY,CAAC,CAAA;AAAA,IAClE;AAAA,EACF;AACF,CAAA;;;AC7PA,IAAM,gBAAA,GAAmB,2BAAA;AAKzB,IAAM,eAAA,GAAkB,GAAA;AAsEjB,IAAM,eAAN,MAAmB;AAAA,EACP,UAAA;AAAA,EACA,MAAA;AAAA;AAAA;AAAA;AAAA,EAaR,MAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4BT,YAAY,OAAA,EAA8B;AAExC,IAAA,IAAA,CAAK,gBAAgB,OAAO,CAAA;AAG5B,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,OAAA,EAAS,QAAQ,OAAA,IAAW,gBAAA;AAAA,MAC5B,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,OAAA,EAAS,QAAQ,OAAA,IAAW,eAAA;AAAA,MAC5B,SAAS,OAAA,CAAQ;AAAA,KACnB;AAGA,IAAA,IAAI,YAAY,OAAA,EAAS;AACvB,MAAA,IAAA,CAAK,MAAA,CAAO,SAAS,OAAA,CAAQ,MAAA;AAAA,IAC/B,CAAA,MAAA,IAAW,WAAW,OAAA,EAAS;AAC7B,MAAA,IAAA,CAAK,MAAA,CAAO,QAAQ,OAAA,CAAQ,KAAA;AAAA,IAC9B,CAAA,MAAA,IAAW,mBAAmB,OAAA,EAAS;AACrC,MAAA,IAAA,CAAK,MAAA,CAAO,gBAAgB,OAAA,CAAQ,aAAA;AAAA,IACtC;AAGA,IAAA,MAAM,WAAA,GAA2B;AAAA,MAC/B,GAAG,oBAAA;AAAA,MACH,UAAA,EAAY,OAAA,CAAQ,UAAA,IAAc,oBAAA,CAAqB;AAAA,KACzD;AAGA,IAAA,MAAM,UAAA,GAA+B;AAAA,MACnC,OAAA,EAAS,KAAK,MAAA,CAAO,OAAA;AAAA,MACrB,MAAA,EAAQ,KAAK,MAAA,CAAO,MAAA;AAAA,MACpB,KAAA,EAAO,KAAK,MAAA,CAAO,KAAA;AAAA,MACnB,aAAA,EAAe,KAAK,MAAA,CAAO,aAAA;AAAA,MAC3B,KAAA,EAAO,KAAK,MAAA,CAAO,KAAA;AAAA,MACnB,OAAA,EAAS,KAAK,MAAA,CAAO,OAAA;AAAA,MACrB,KAAA,EAAO,WAAA;AAAA,MACP,OAAA,EAAS,KAAK,MAAA,CAAO;AAAA,KACvB;AAGA,IAAA,IAAA,CAAK,UAAA,GAAa,IAAI,UAAA,CAAW,UAAU,CAAA;AAG3C,IAAA,MAAM,kBAAkB,OAAqB;AAAA,MAC3C,OAAA,EAAS,KAAK,MAAA,CAAO,OAAA;AAAA,MACrB,MAAA,EAAQ,KAAK,MAAA,CAAO,MAAA;AAAA,MACpB,KAAA,EAAO,KAAK,MAAA,CAAO,KAAA;AAAA,MACnB,aAAA,EAAe,KAAK,MAAA,CAAO,aAAA;AAAA,MAC3B,KAAA,EAAO,KAAK,MAAA,CAAO;AAAA,KACrB,CAAA;AAGA,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,SAAA,CAAU,IAAA,CAAK,YAAY,eAAe,CAAA;AAC5D,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,SAAA,CAAU,IAAA,CAAK,UAAU,CAAA;AAC3C,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,QAAA,CAAS,IAAA,CAAK,UAAU,CAAA;AACzC,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,YAAA,CAAa,IAAA,CAAK,UAAU,CAAA;AACjD,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,WAAA,CAAY,IAAA,CAAK,YAAY,eAAe,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,OAAA,EAAoC;AAE1D,IAAA,MAAM,SAAA,GAAY,QAAA,IAAY,OAAA,IAAW,OAAA,CAAQ,MAAA;AACjD,IAAA,MAAM,QAAA,GAAW,OAAA,IAAW,OAAA,IAAW,OAAA,CAAQ,KAAA;AAC/C,IAAA,MAAM,gBAAA,GAAmB,eAAA,IAAmB,OAAA,IAAW,OAAA,CAAQ,aAAA;AAE/D,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,QAAA,IAAY,CAAC,gBAAA,EAAkB;AAChD,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAGA,IAAA,IAAI,OAAA,CAAQ,KAAA,KAAU,MAAA,IAAa,OAAA,CAAQ,UAAU,IAAA,EAAM;AACzD,MAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,IACxD;AAEA,IAAA,IAAI,OAAO,OAAA,CAAQ,KAAA,KAAU,QAAA,EAAU;AACrC,MAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,IAC7D;AAAA,EACF;AACF","file":"index.cjs","sourcesContent":["/**\n * Base Resource API\n *\n * Abstract base class for all resource APIs.\n * Provides common HTTP methods and path handling.\n */\n\nimport type { HttpClient } from '../utils/http.js';\nimport type { ListOptions, PaginatedResponse } from '../types/index.js';\n\n/**\n * Base Resource API class\n */\nexport abstract class BaseResourceAPI {\n protected readonly http: HttpClient;\n protected readonly basePath: string;\n\n constructor(http: HttpClient, basePath: string) {\n this.http = http;\n this.basePath = basePath;\n }\n\n /**\n * Build query parameters from list options\n */\n protected buildListQuery(options?: ListOptions): Record<string, string | number | boolean | undefined> {\n if (!options) return {};\n\n return {\n limit: options.limit,\n offset: options.offset,\n sort: options.sort,\n order: options.order,\n };\n }\n\n /**\n * HTTP GET request helper\n */\n protected async httpGet<T>(\n path: string,\n query?: Record<string, string | number | boolean | undefined>\n ): Promise<T> {\n return this.http.get<T>(`${this.basePath}${path}`, query);\n }\n\n /**\n * HTTP POST request helper\n */\n protected async httpPost<T>(\n path: string,\n body?: unknown,\n options?: { idempotencyKey?: string; skipRetry?: boolean }\n ): Promise<T> {\n return this.http.post<T>(`${this.basePath}${path}`, body, options);\n }\n\n /**\n * HTTP PATCH request helper\n */\n protected async httpPatch<T>(\n path: string,\n body?: unknown,\n options?: { idempotencyKey?: string }\n ): Promise<T> {\n return this.http.patch<T>(`${this.basePath}${path}`, body, options);\n }\n\n /**\n * HTTP DELETE request helper\n */\n protected async httpDelete<T>(path: string): Promise<T> {\n return this.http.delete<T>(`${this.basePath}${path}`);\n }\n\n /**\n * List resources with pagination\n */\n protected async listResources<T>(\n path: string,\n options?: ListOptions\n ): Promise<PaginatedResponse<T>> {\n const query = this.buildListQuery(options);\n // The API returns { data: T[], pagination: ... } which we unwrap\n return this.httpGet<PaginatedResponse<T>>(path, query);\n }\n}\n","/**\n * SDK Error Classes\n *\n * Typed error hierarchy for all SDK operations.\n * All errors extend AISaaSError and include code, status, and optional details.\n */\n\n/**\n * Base error class for all SDK errors\n */\nexport class AISaaSError extends Error {\n /** Error code */\n readonly code: string;\n /** HTTP status code */\n readonly status: number;\n /** Additional error details */\n readonly details?: Record<string, unknown>;\n /** Request ID from server (for debugging) */\n readonly requestId?: string;\n\n constructor(\n message: string,\n code: string,\n status: number,\n details?: Record<string, unknown>,\n requestId?: string\n ) {\n super(message);\n this.name = 'AISaaSError';\n this.code = code;\n this.status = status;\n this.details = details;\n this.requestId = requestId;\n\n // Maintains proper stack trace for where error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\n/**\n * Authentication error (401)\n * Thrown when API key is invalid, expired, or missing\n */\nexport class AuthenticationError extends AISaaSError {\n constructor(\n message: string = 'Authentication failed',\n code: string = 'authentication_error',\n details?: Record<string, unknown>,\n requestId?: string\n ) {\n super(message, code, 401, details, requestId);\n this.name = 'AuthenticationError';\n }\n}\n\n/**\n * Authorization error (403)\n * Thrown when user lacks permission for the requested operation\n */\nexport class AuthorizationError extends AISaaSError {\n constructor(\n message: string = 'Access denied',\n code: string = 'authorization_error',\n details?: Record<string, unknown>,\n requestId?: string\n ) {\n super(message, code, 403, details, requestId);\n this.name = 'AuthorizationError';\n }\n}\n\n/**\n * Not found error (404)\n * Thrown when requested resource does not exist\n */\nexport class NotFoundError extends AISaaSError {\n constructor(\n message: string = 'Resource not found',\n code: string = 'not_found',\n details?: Record<string, unknown>,\n requestId?: string\n ) {\n super(message, code, 404, details, requestId);\n this.name = 'NotFoundError';\n }\n}\n\n/**\n * Validation error (400/422)\n * Thrown when request input is invalid\n */\nexport class ValidationError extends AISaaSError {\n /** Field-level validation errors */\n readonly errors: Array<{ field: string; message: string }>;\n\n constructor(\n message: string = 'Validation failed',\n errors: Array<{ field: string; message: string }> = [],\n details?: Record<string, unknown>,\n requestId?: string\n ) {\n super(message, 'validation_error', 400, details, requestId);\n this.name = 'ValidationError';\n this.errors = errors;\n }\n}\n\n/**\n * Rate limit error (429)\n * Thrown when rate limit is exceeded\n */\nexport class RateLimitError extends AISaaSError {\n /** Seconds until rate limit resets */\n readonly retryAfter?: number;\n\n constructor(\n message: string = 'Rate limit exceeded',\n retryAfter?: number,\n details?: Record<string, unknown>,\n requestId?: string\n ) {\n super(message, 'rate_limit_error', 429, details, requestId);\n this.name = 'RateLimitError';\n this.retryAfter = retryAfter;\n }\n}\n\n/**\n * Server error (5xx)\n * Thrown for server-side errors\n */\nexport class ServerError extends AISaaSError {\n constructor(\n message: string = 'Server error',\n status: number = 500,\n details?: Record<string, unknown>,\n requestId?: string\n ) {\n super(message, 'server_error', status, details, requestId);\n this.name = 'ServerError';\n }\n}\n\n/**\n * Conflict error (409)\n * Thrown when there is a resource conflict\n */\nexport class ConflictError extends AISaaSError {\n constructor(\n message: string = 'Resource conflict',\n details?: Record<string, unknown>,\n requestId?: string\n ) {\n super(message, 'conflict', 409, details, requestId);\n this.name = 'ConflictError';\n }\n}\n\n/**\n * Timeout error\n * Thrown when a request or operation times out\n */\nexport class TimeoutError extends AISaaSError {\n constructor(\n message: string = 'Request timed out',\n details?: Record<string, unknown>,\n requestId?: string\n ) {\n super(message, 'timeout', 408, details, requestId);\n this.name = 'TimeoutError';\n }\n}\n\n/**\n * Network error\n * Thrown when there is a network connectivity issue\n */\nexport class NetworkError extends AISaaSError {\n constructor(\n message: string = 'Network error',\n details?: Record<string, unknown>\n ) {\n super(message, 'network_error', 0, details);\n this.name = 'NetworkError';\n }\n}\n\n/**\n * Parse error from API response to appropriate error class\n */\nexport function parseApiError(\n status: number,\n body: unknown,\n requestId?: string\n): AISaaSError {\n const errorBody = body as {\n error?: {\n code?: string;\n message?: string;\n details?: Record<string, unknown>;\n };\n } | null;\n\n const message = errorBody?.error?.message ?? 'An error occurred';\n const code = errorBody?.error?.code ?? 'unknown_error';\n const details = errorBody?.error?.details;\n\n switch (status) {\n case 400:\n case 422: {\n // Check if it's a validation error with field errors\n const fieldErrors = details?.errors as Record<string, string[]> | undefined;\n if (fieldErrors) {\n const errors: Array<{ field: string; message: string }> = [];\n for (const [field, messages] of Object.entries(fieldErrors)) {\n for (const msg of messages) {\n errors.push({ field, message: msg });\n }\n }\n return new ValidationError(message, errors, details, requestId);\n }\n return new ValidationError(message, [], details, requestId);\n }\n\n case 401:\n return new AuthenticationError(message, code, details, requestId);\n\n case 403:\n return new AuthorizationError(message, code, details, requestId);\n\n case 404:\n return new NotFoundError(message, code, details, requestId);\n\n case 409:\n return new ConflictError(message, details, requestId);\n\n case 429: {\n const retryAfter = details?.retryAfter as number | undefined;\n return new RateLimitError(message, retryAfter, details, requestId);\n }\n\n default:\n if (status >= 500) {\n return new ServerError(message, status, details, requestId);\n }\n return new AISaaSError(message, code, status, details, requestId);\n }\n}\n","/**\n * Retry utility with exponential backoff\n */\n\nimport { RateLimitError, ServerError } from '../errors/index.js';\n\n/**\n * Retry configuration\n */\nexport interface RetryConfig {\n /** Maximum number of retry attempts (default: 3) */\n maxRetries: number;\n /** Base delay in milliseconds (default: 1000) */\n baseDelayMs: number;\n /** Maximum delay in milliseconds (default: 30000) */\n maxDelayMs: number;\n /** Jitter factor (0-1, default: 0.1) */\n jitterFactor: number;\n}\n\n/**\n * Default retry configuration\n */\nexport const DEFAULT_RETRY_CONFIG: RetryConfig = {\n maxRetries: 3,\n baseDelayMs: 1000,\n maxDelayMs: 30000,\n jitterFactor: 0.1,\n};\n\n/**\n * Determine if an error should be retried\n */\nexport function shouldRetry(error: unknown, attempt: number, maxRetries: number): boolean {\n if (attempt >= maxRetries) {\n return false;\n }\n\n // Retry on rate limit errors\n if (error instanceof RateLimitError) {\n return true;\n }\n\n // Retry on 5xx server errors\n if (error instanceof ServerError) {\n return true;\n }\n\n // Retry on network errors\n if (error instanceof Error && error.name === 'NetworkError') {\n return true;\n }\n\n // Retry on timeout errors\n if (error instanceof Error && error.name === 'TimeoutError') {\n return true;\n }\n\n // Don't retry other errors (4xx except 429)\n return false;\n}\n\n/**\n * Calculate delay before next retry with exponential backoff and jitter\n */\nexport function calculateRetryDelay(\n attempt: number,\n config: RetryConfig,\n retryAfter?: number\n): number {\n // If server specified retry-after, use it\n if (retryAfter !== undefined && retryAfter > 0) {\n return retryAfter * 1000; // Convert seconds to milliseconds\n }\n\n // Exponential backoff: delay = base * 2^attempt\n const exponentialDelay = config.baseDelayMs * Math.pow(2, attempt);\n\n // Cap at max delay\n const cappedDelay = Math.min(exponentialDelay, config.maxDelayMs);\n\n // Add jitter to prevent thundering herd\n const jitter = cappedDelay * config.jitterFactor * Math.random();\n\n return cappedDelay + jitter;\n}\n\n/**\n * Sleep for specified milliseconds\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Retry wrapper for async operations\n */\nexport async function withRetry<T>(\n operation: () => Promise<T>,\n config: Partial<RetryConfig> = {}\n): Promise<T> {\n const fullConfig: RetryConfig = { ...DEFAULT_RETRY_CONFIG, ...config };\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= fullConfig.maxRetries; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error;\n\n if (!shouldRetry(error, attempt, fullConfig.maxRetries)) {\n throw error;\n }\n\n // Get retry-after from rate limit error if available\n const retryAfter = error instanceof RateLimitError ? error.retryAfter : undefined;\n const delay = calculateRetryDelay(attempt, fullConfig, retryAfter);\n\n await sleep(delay);\n }\n }\n\n // Should never reach here, but TypeScript needs this\n throw lastError;\n}\n","/**\n * HTTP Client\n *\n * Handles all HTTP requests with authentication, retry logic, and error handling.\n */\n\nimport {\n parseApiError,\n NetworkError,\n TimeoutError,\n} from '../errors/index.js';\nimport type { ApiResponse, ApiSuccessResponse } from '../types/index.js';\nimport { withRetry, type RetryConfig } from './retry.js';\n\n/**\n * HTTP Client configuration\n */\nexport interface HttpClientConfig {\n /** Base URL for API requests */\n baseUrl: string;\n /** API key for authentication */\n apiKey?: string;\n /** OAuth token for authentication */\n token?: string;\n /** Token provider callback (called before each request) */\n tokenProvider?: () => Promise<string>;\n /** Organization ID */\n orgId: number;\n /** Request timeout in milliseconds (default: 30000) */\n timeout: number;\n /** Retry configuration */\n retry: RetryConfig;\n /** Custom headers */\n headers?: Record<string, string>;\n}\n\n/**\n * Request options\n */\nexport interface RequestOptions {\n /** HTTP method */\n method: 'GET' | 'POST' | 'PATCH' | 'DELETE' | 'PUT';\n /** Request path (appended to base URL) */\n path: string;\n /** Request body */\n body?: unknown;\n /** Query parameters */\n query?: Record<string, string | number | boolean | undefined>;\n /** Additional headers */\n headers?: Record<string, string>;\n /** Skip retry (for non-idempotent operations) */\n skipRetry?: boolean;\n /** Idempotency key */\n idempotencyKey?: string;\n}\n\n/**\n * HTTP Client class\n */\nexport class HttpClient {\n private config: HttpClientConfig;\n private tokenRefreshAttempts = 0;\n private readonly maxTokenRefreshAttempts = 2;\n\n constructor(config: HttpClientConfig) {\n this.config = config;\n }\n\n /**\n * Get authorization header value\n */\n private async getAuthHeader(): Promise<string> {\n if (this.config.apiKey) {\n return `Bearer ${this.config.apiKey}`;\n }\n\n if (this.config.tokenProvider) {\n const token = await this.config.tokenProvider();\n return `Bearer ${token}`;\n }\n\n if (this.config.token) {\n return `Bearer ${this.config.token}`;\n }\n\n throw new Error('No authentication configured. Provide apiKey, token, or tokenProvider.');\n }\n\n /**\n * Build full URL with query parameters\n */\n private buildUrl(path: string, query?: Record<string, string | number | boolean | undefined>): string {\n // Use path directly - routes are at /api/v1/*\n const url = new URL(path, this.config.baseUrl);\n\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n return url.toString();\n }\n\n /**\n * Make an HTTP request\n */\n async request<T>(options: RequestOptions): Promise<T> {\n const makeRequest = async (): Promise<T> => {\n const url = this.buildUrl(options.path, options.query);\n const authHeader = await this.getAuthHeader();\n\n const headers: Record<string, string> = {\n 'Authorization': authHeader,\n 'X-Org-Id': String(this.config.orgId),\n 'Content-Type': 'application/json',\n ...this.config.headers,\n ...options.headers,\n };\n\n // Add idempotency key for mutating operations\n if (options.idempotencyKey) {\n headers['Idempotency-Key'] = options.idempotencyKey;\n }\n\n // Create abort controller for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n const response = await fetch(url, {\n method: options.method,\n headers,\n body: options.body !== undefined ? JSON.stringify(options.body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n // Get request ID from response headers\n const requestId = response.headers.get('X-Request-Id') ?? undefined;\n\n // Parse response body\n let body: unknown;\n const contentType = response.headers.get('Content-Type');\n if (contentType?.includes('application/json')) {\n body = await response.json();\n } else {\n body = await response.text();\n }\n\n // Handle errors\n if (!response.ok) {\n // Check for 401 and token provider - try refresh\n if (response.status === 401 && this.config.tokenProvider) {\n this.tokenRefreshAttempts++;\n if (this.tokenRefreshAttempts < this.maxTokenRefreshAttempts) {\n // Token provider should return a fresh token\n // Retry the request (token provider will be called again)\n return this.request(options);\n }\n }\n\n throw parseApiError(response.status, body, requestId);\n }\n\n // Reset token refresh attempts on success\n this.tokenRefreshAttempts = 0;\n\n // Handle success response\n const apiResponse = body as ApiResponse<T>;\n if ('success' in apiResponse && apiResponse.success) {\n return (apiResponse as ApiSuccessResponse<T>).data;\n }\n\n // If response doesn't match expected format, return as-is\n return body as T;\n\n } catch (error) {\n clearTimeout(timeoutId);\n\n // Handle abort (timeout)\n if (error instanceof Error && error.name === 'AbortError') {\n throw new TimeoutError(`Request timed out after ${this.config.timeout}ms`);\n }\n\n // Handle fetch errors (network issues)\n if (error instanceof TypeError && error.message.includes('fetch')) {\n throw new NetworkError(`Network error: ${error.message}`);\n }\n\n throw error;\n }\n };\n\n // Use retry wrapper for idempotent operations\n if (options.skipRetry) {\n return makeRequest();\n }\n\n return withRetry(makeRequest, this.config.retry);\n }\n\n /**\n * GET request\n */\n async get<T>(\n path: string,\n query?: Record<string, string | number | boolean | undefined>\n ): Promise<T> {\n return this.request<T>({\n method: 'GET',\n path,\n query,\n });\n }\n\n /**\n * POST request\n */\n async post<T>(\n path: string,\n body?: unknown,\n options?: { idempotencyKey?: string; skipRetry?: boolean }\n ): Promise<T> {\n return this.request<T>({\n method: 'POST',\n path,\n body,\n idempotencyKey: options?.idempotencyKey,\n skipRetry: options?.skipRetry,\n });\n }\n\n /**\n * PATCH request\n */\n async patch<T>(\n path: string,\n body?: unknown,\n options?: { idempotencyKey?: string }\n ): Promise<T> {\n return this.request<T>({\n method: 'PATCH',\n path,\n body,\n idempotencyKey: options?.idempotencyKey,\n });\n }\n\n /**\n * DELETE request\n */\n async delete<T>(path: string): Promise<T> {\n return this.request<T>({\n method: 'DELETE',\n path,\n skipRetry: true, // Don't retry deletes\n });\n }\n\n /**\n * Update configuration\n */\n updateConfig(config: Partial<HttpClientConfig>): void {\n this.config = { ...this.config, ...config };\n }\n}\n\n/**\n * Generate a random idempotency key\n */\nexport function generateIdempotencyKey(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 15);\n return `idem_${timestamp}_${random}`;\n}\n","/**\n * SSE Client\n *\n * Handles Server-Sent Events connections with automatic reconnection.\n * Uses fetch + ReadableStream for cross-platform compatibility.\n */\n\nimport type { SSEEvent, StreamEventType } from '../types/streaming.js';\n\n/**\n * SSE Client configuration\n */\nexport interface SSEClientConfig {\n /** Stream URL */\n url: string;\n /** Authorization header */\n authHeader: string;\n /** Organization ID */\n orgId: number;\n /** Event callback */\n onEvent: (event: SSEEvent) => void;\n /** Error callback */\n onError: (error: Error) => void;\n /** Connection state callback */\n onConnectionChange: (connected: boolean) => void;\n}\n\n/**\n * SSE Client class\n *\n * Implements SSE parsing using fetch + ReadableStream for compatibility\n * with both Node.js and browser environments.\n */\nexport class SSEClient {\n private config: SSEClientConfig;\n private abortController: AbortController | null = null;\n private connected = false;\n\n constructor(config: SSEClientConfig) {\n this.config = config;\n }\n\n /**\n * Connect to SSE endpoint\n */\n async connect(): Promise<void> {\n this.abortController = new AbortController();\n\n // Debug logging for SSE connection\n console.log('[SDK:SSE] Connecting to:', this.config.url);\n console.log('[SDK:SSE] Auth header:', this.config.authHeader ? `${this.config.authHeader.substring(0, 30)}...` : 'MISSING');\n console.log('[SDK:SSE] Org ID:', this.config.orgId);\n\n try {\n const response = await fetch(this.config.url, {\n method: 'GET',\n headers: {\n 'Authorization': this.config.authHeader,\n 'X-Org-Id': String(this.config.orgId),\n 'Accept': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n },\n signal: this.abortController.signal,\n });\n\n console.log('[SDK:SSE] Response status:', response.status, response.statusText);\n console.log('[SDK:SSE] Response headers:', {\n contentType: response.headers.get('content-type'),\n cacheControl: response.headers.get('cache-control'),\n });\n\n if (!response.ok) {\n // Try to get error body for better debugging\n let errorBody = '';\n try {\n errorBody = await response.text();\n console.error('[SDK:SSE] Error response body:', errorBody);\n } catch (e) {\n console.error('[SDK:SSE] Could not read error body');\n }\n throw new Error(`SSE connection failed: ${response.status} ${response.statusText} - ${errorBody}`);\n }\n\n if (!response.body) {\n throw new Error('Response body not available');\n }\n\n console.log('[SDK:SSE] Connection successful, starting stream parsing');\n this.connected = true;\n this.config.onConnectionChange(true);\n\n // Parse SSE stream\n await this.parseStream(response.body);\n\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n // Intentional disconnect\n console.log('[SDK:SSE] Connection aborted (intentional)');\n return;\n }\n console.error('[SDK:SSE] Connection error:', error);\n this.config.onError(error instanceof Error ? error : new Error(String(error)));\n } finally {\n this.connected = false;\n this.config.onConnectionChange(false);\n console.log('[SDK:SSE] Connection closed');\n }\n }\n\n /**\n * Disconnect from SSE endpoint\n */\n disconnect(): void {\n if (this.abortController) {\n this.abortController.abort();\n this.abortController = null;\n }\n this.connected = false;\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Parse SSE stream\n */\n private async parseStream(body: ReadableStream<Uint8Array>): Promise<void> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n\n let buffer = '';\n let currentEvent: Partial<{ type: string; id: string; data: string }> = {};\n let chunkCount = 0;\n let eventCount = 0;\n\n console.log('[SDK:SSE] Starting to parse stream');\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n console.log('[SDK:SSE] Stream reading complete. Total chunks:', chunkCount, 'events:', eventCount);\n break;\n }\n\n chunkCount++;\n const chunk = decoder.decode(value, { stream: true });\n buffer += chunk;\n\n // Debug: Log raw chunk (first 200 chars)\n if (chunkCount <= 5) {\n console.log(`[SDK:SSE] Chunk ${chunkCount} (${value.length} bytes):`, chunk.substring(0, 200));\n }\n\n // Process complete lines\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? ''; // Keep incomplete line in buffer\n\n for (const line of lines) {\n // Empty line signals end of event\n if (line === '') {\n if (currentEvent.type && currentEvent.data !== undefined) {\n eventCount++;\n console.log(`[SDK:SSE] Event ${eventCount}:`, currentEvent.type, '- data length:', currentEvent.data.length);\n this.dispatchEvent(currentEvent as { type: string; id?: string; data: string });\n }\n currentEvent = {};\n continue;\n }\n\n // Skip comments (keepalive)\n if (line.startsWith(':')) {\n continue;\n }\n\n // Parse SSE fields\n const colonIndex = line.indexOf(':');\n if (colonIndex === -1) {\n continue;\n }\n\n const field = line.substring(0, colonIndex);\n // Value starts after colon, skip optional leading space\n let value = line.substring(colonIndex + 1);\n if (value.startsWith(' ')) {\n value = value.substring(1);\n }\n\n switch (field) {\n case 'event':\n currentEvent.type = value;\n break;\n case 'id':\n currentEvent.id = value;\n break;\n case 'data':\n // Append to existing data (multiple data lines)\n currentEvent.data = currentEvent.data\n ? currentEvent.data + '\\n' + value\n : value;\n break;\n }\n }\n }\n } finally {\n console.log('[SDK:SSE] parseStream finished. Releasing reader lock.');\n reader.releaseLock();\n }\n }\n\n /**\n * Dispatch parsed event\n */\n private dispatchEvent(event: { type: string; id?: string; data: string }): void {\n console.log('[SDK:SSE] dispatchEvent called:', event.type, 'id:', event.id);\n\n try {\n // Parse JSON data\n let data: unknown;\n try {\n data = JSON.parse(event.data);\n console.log('[SDK:SSE] Parsed event data:', typeof data, data && typeof data === 'object' ? Object.keys(data as object) : '');\n } catch {\n // If not JSON, use raw string\n data = event.data;\n }\n\n const sseEvent: SSEEvent = {\n type: event.type as StreamEventType,\n id: event.id,\n data,\n };\n\n this.config.onEvent(sseEvent);\n } catch (error) {\n this.config.onError(\n error instanceof Error ? error : new Error(`Failed to parse event: ${String(error)}`)\n );\n }\n }\n}\n","/**\n * Stream Controller\n *\n * Manages execution streaming with automatic reconnection and fallback to polling.\n * Implements the StreamController interface for type-safe event handling.\n */\n\nimport { SSEClient } from './sse-client.js';\nimport { AISaaSError } from '../errors/index.js';\nimport type {\n StreamController,\n StreamEventMap,\n SSEEvent,\n StreamingStatus,\n StreamingConfig,\n CompleteEvent,\n ErrorEvent,\n} from '../types/streaming.js';\nimport type { AgentExecution, ExecutionLog, LogType } from '../types/agents.js';\n\n/**\n * Default streaming configuration\n */\nconst DEFAULT_STREAMING_CONFIG: StreamingConfig = {\n maxReconnectAttempts: 5,\n reconnectBaseDelayMs: 1000,\n reconnectMaxDelayMs: 10000,\n activityTimeoutMs: 30000,\n pollingIntervalMs: 2000,\n};\n\n/**\n * Stream controller creation options\n */\nexport interface ExecutionStreamControllerOptions {\n /** Execution ID to stream */\n executionId: string;\n /** Session ID for conversation continuity */\n sessionId?: string;\n /** Base URL for API */\n baseUrl: string;\n /** API key or token */\n apiKey?: string;\n /** Token provider callback for dynamic auth */\n tokenProvider?: () => Promise<string>;\n /** Organization ID */\n orgId: number;\n /** Function to get execution status (for polling fallback) */\n getExecution: (executionId: string) => Promise<AgentExecution>;\n /** Streaming configuration */\n config?: Partial<StreamingConfig>;\n}\n\n/**\n * Execution Stream Controller\n *\n * Manages the lifecycle of an execution stream, including:\n * - SSE connection management\n * - Automatic reconnection with exponential backoff\n * - Fallback to polling on connection failure\n * - Event deduplication\n */\nexport interface ExecutionStreamController extends StreamController {\n /** Connect to the stream */\n connect(): Promise<void>;\n /** Get the execution ID */\n readonly executionId: string;\n /** Get the session ID (if available) */\n readonly sessionId: string | undefined;\n}\n\n/**\n * Internal implementation of ExecutionStreamController\n */\nclass ExecutionStreamControllerImpl implements ExecutionStreamController {\n private options: ExecutionStreamControllerOptions;\n private config: StreamingConfig;\n private sseClient: SSEClient | null = null;\n private status: StreamingStatus = 'connecting';\n private reconnectAttempts = 0;\n private seenEventIds = new Set<string>();\n private _lastEventId: string | null = null;\n private activityTimeoutId: ReturnType<typeof setTimeout> | null = null;\n private pollingIntervalId: ReturnType<typeof setInterval> | null = null;\n private finalExecution: AgentExecution | null = null;\n private finalError: ErrorEvent | null = null;\n\n // Event callbacks\n private listeners: {\n log: Array<(log: ExecutionLog) => void>;\n toolCall: Array<(data: StreamEventMap['toolCall']) => void>;\n toolResult: Array<(data: StreamEventMap['toolResult']) => void>;\n plan: Array<(data: StreamEventMap['plan']) => void>;\n paused: Array<(data: StreamEventMap['paused']) => void>;\n started: Array<(data: StreamEventMap['started']) => void>;\n progress: Array<(data: StreamEventMap['progress']) => void>;\n taskListUpdate: Array<(data: StreamEventMap['taskListUpdate']) => void>;\n delegationStarted: Array<(data: StreamEventMap['delegationStarted']) => void>;\n delegationCompleted: Array<(data: StreamEventMap['delegationCompleted']) => void>;\n textDelta: Array<(data: StreamEventMap['textDelta']) => void>;\n complete: Array<(data: CompleteEvent) => void>;\n error: Array<(error: ErrorEvent) => void>;\n connectionChange: Array<(data: StreamEventMap['connectionChange']) => void>;\n } = {\n log: [],\n toolCall: [],\n toolResult: [],\n plan: [],\n paused: [],\n started: [],\n progress: [],\n taskListUpdate: [],\n delegationStarted: [],\n delegationCompleted: [],\n textDelta: [],\n complete: [],\n error: [],\n connectionChange: [],\n };\n\n // Promise for wait()\n private waitPromise: Promise<AgentExecution> | null = null;\n private waitResolve: ((execution: AgentExecution) => void) | null = null;\n private waitReject: ((error: Error) => void) | null = null;\n\n constructor(options: ExecutionStreamControllerOptions) {\n this.options = options;\n this.config = { ...DEFAULT_STREAMING_CONFIG, ...options.config };\n }\n\n /**\n * Get the last event ID (for resume support)\n */\n get lastEventId(): string | null {\n return this._lastEventId;\n }\n\n /**\n * Get the execution ID\n */\n get executionId(): string {\n return this.options.executionId;\n }\n\n /**\n * Get the session ID (if available)\n */\n get sessionId(): string | undefined {\n return this.options.sessionId;\n }\n\n /**\n * Connect to the execution stream\n */\n async connect(): Promise<void> {\n this.status = 'connecting';\n this.reconnectAttempts = 0;\n\n try {\n await this.connectSSE();\n } catch (error) {\n await this.handleConnectionError(error);\n }\n }\n\n /**\n * Register event listener\n */\n on<K extends keyof StreamEventMap>(\n event: K,\n callback: (data: StreamEventMap[K]) => void\n ): void {\n const listeners = this.listeners[event];\n if (listeners) {\n // Type assertion needed due to variance issues\n (listeners as Array<(data: StreamEventMap[K]) => void>).push(callback);\n }\n }\n\n /**\n * Cancel the stream\n */\n cancel(): void {\n this.status = 'closed';\n this.stopActivityTimeout();\n this.stopPolling();\n\n if (this.sseClient) {\n this.sseClient.disconnect();\n this.sseClient = null;\n }\n }\n\n /**\n * Wait for completion\n */\n wait(): Promise<AgentExecution> {\n // If already complete, return immediately\n if (this.finalExecution) {\n return Promise.resolve(this.finalExecution);\n }\n if (this.finalError) {\n return Promise.reject(new AISaaSError(\n this.finalError.error,\n this.finalError.errorCode ?? 'execution_error',\n 500\n ));\n }\n\n // Create promise if not exists\n if (!this.waitPromise) {\n this.waitPromise = new Promise((resolve, reject) => {\n this.waitResolve = resolve;\n this.waitReject = reject;\n });\n }\n\n return this.waitPromise;\n }\n\n // ===== Private methods =====\n\n /**\n * Connect to SSE endpoint\n */\n private async connectSSE(): Promise<void> {\n const url = `${this.options.baseUrl}/agents/runs/${this.options.executionId}/stream`;\n\n // Resolve auth token: apiKey takes priority, then tokenProvider\n let authToken = this.options.apiKey;\n if (!authToken && this.options.tokenProvider) {\n authToken = await this.options.tokenProvider();\n }\n\n console.log('[SDK:StreamController] Connecting to SSE');\n console.log('[SDK:StreamController] URL:', url);\n console.log('[SDK:StreamController] baseUrl:', this.options.baseUrl);\n console.log('[SDK:StreamController] executionId:', this.options.executionId);\n console.log('[SDK:StreamController] orgId:', this.options.orgId);\n console.log('[SDK:StreamController] apiKey:', authToken ? `${authToken.substring(0, 20)}...` : 'MISSING');\n\n this.sseClient = new SSEClient({\n url,\n authHeader: `Bearer ${authToken}`,\n orgId: this.options.orgId,\n onEvent: (event) => this.handleEvent(event),\n onError: (error) => {\n console.error('[SDK:StreamController] SSE error:', error);\n this.handleConnectionError(error);\n },\n onConnectionChange: (connected) => {\n console.log('[SDK:StreamController] SSE connection change:', connected);\n if (connected) {\n this.status = 'connected';\n this.reconnectAttempts = 0;\n this.resetActivityTimeout();\n }\n this.emit('connectionChange', { connected, usingFallback: false });\n },\n });\n\n try {\n await this.sseClient.connect();\n console.log('[SDK:StreamController] SSE connect() completed');\n } catch (error) {\n console.error('[SDK:StreamController] SSE connect() threw:', error);\n throw error;\n }\n }\n\n /**\n * Handle incoming SSE event\n */\n private handleEvent(event: SSEEvent): void {\n console.log('[SDK:StreamController] handleEvent called:', event.type, 'id:', event.id);\n\n // Reset activity timeout\n this.resetActivityTimeout();\n\n // Deduplicate by event ID\n if (event.id) {\n if (this.seenEventIds.has(event.id)) {\n console.log('[SDK:StreamController] Skipping duplicate event:', event.id);\n return;\n }\n this.seenEventIds.add(event.id);\n this._lastEventId = event.id;\n\n // Limit set size to prevent memory leaks\n if (this.seenEventIds.size > 1000) {\n const ids = Array.from(this.seenEventIds);\n this.seenEventIds = new Set(ids.slice(-500));\n }\n }\n\n // Map wire format (snake_case) to SDK format (camelCase)\n const data = event.data as Record<string, unknown>;\n console.log('[SDK:StreamController] Event data keys:', Object.keys(data));\n\n switch (event.type) {\n case 'log': {\n // Transform log-collector format to ExecutionLog format\n // Log-collector sends: { stepIndex, logType, message, metadata, timestamp, durationMs }\n // ExecutionLog expects: { uuid, type, title, content, metadata, timestamp, durationMs }\n const rawLog = data.log as Record<string, unknown> | undefined;\n if (!rawLog) {\n console.warn('[StreamController] Received log event without log data');\n break;\n }\n\n // Get the log type - log-collector uses 'logType', fallback to 'type'\n const logTypeValue = (rawLog.logType as string) || (rawLog.type as string) || 'info';\n\n const transformedLog: ExecutionLog = {\n uuid: (rawLog.uuid as string) || `log-${rawLog.stepIndex || Date.now()}`,\n type: logTypeValue as LogType,\n title: (rawLog.message as string) || (rawLog.title as string) || '',\n content: rawLog.content as string | undefined,\n metadata: {\n ...(rawLog.metadata as Record<string, unknown> || {}),\n // Include stepIndex in metadata for deduplication\n stepIndex: rawLog.stepIndex as number ?? 0,\n },\n timestamp: rawLog.timestamp as string || new Date().toISOString(),\n durationMs: rawLog.durationMs as number | undefined,\n };\n\n this.emit('log', transformedLog);\n break;\n }\n\n case 'tool_call':\n // Fix: Handle undefined toolName gracefully (defensive coding)\n this.emit('toolCall', {\n toolCallId: data.toolCallId as string || `tool-call-${Date.now()}`,\n toolName: (data.toolName as string) || 'Unknown Tool',\n inputs: (data.args as Record<string, unknown>) || {},\n stepIndex: data.stepIndex as number ?? 0,\n });\n break;\n\n case 'tool_result':\n // Fix: Handle undefined toolName gracefully (defensive coding)\n this.emit('toolResult', {\n toolCallId: data.toolCallId as string || `tool-result-${Date.now()}`,\n toolName: (data.toolName as string) || 'Unknown Tool',\n result: data.result,\n durationMs: data.durationMs as number ?? 0,\n });\n break;\n\n case 'execution_paused':\n // Handle ask_user paused event\n this.emit('paused', {\n question: data.question as string || data.output as string || '',\n options: data.options as string[] | undefined,\n reason: 'waiting_user_input',\n });\n break;\n\n case 'complete':\n this.handleComplete(data);\n break;\n\n case 'error':\n this.handleError({\n error: data.error as string,\n errorCode: data.errorCode as string | undefined,\n });\n break;\n case 'failed':\n // Some SSE endpoints emit \"failed\" instead of \"error\"\n this.handleError({\n error: (data.error as string) || (data.message as string) || 'Execution failed',\n errorCode: (data.errorCode as string | undefined) || 'execution_failed',\n });\n break;\n\n case 'timeout':\n if ((data as { retryable?: boolean }).retryable) {\n this.handleConnectionError(new Error('Stream timeout'));\n } else {\n this.handleError({\n error: data.error as string,\n errorCode: 'timeout',\n });\n }\n break;\n\n // Handle started event - immediate feedback that execution began\n case 'started':\n this.emit('started', {\n executionId: data.executionId as string,\n agentUuid: data.agentUuid as string,\n status: 'initializing',\n currentStep: data.currentStep as string | undefined,\n });\n break;\n\n // Handle progress event - status updates during execution\n case 'progress':\n this.emit('progress', {\n status: data.status as 'initializing' | 'thinking' | 'acting' | 'observing' | 'planning' | 'paused',\n iteration: data.iteration as number ?? 0,\n currentStep: data.currentStep as string | undefined,\n tokenUsage: data.tokenUsage as { prompt: number; completion: number; total: number } | undefined,\n cost: data.cost as number | undefined,\n toolCalls: data.toolCalls as number | undefined,\n });\n break;\n\n // Handle task list update event from TaskTracker\n case 'task_list_update':\n this.emit('taskListUpdate', {\n executionId: data.executionId as string,\n tasks: data.tasks as Array<{\n id: string;\n content: string;\n activeForm?: string | null;\n status: 'pending' | 'in_progress' | 'completed';\n }>,\n timestamp: data.timestamp as string,\n });\n break;\n\n // Handle delegation started event (handoff_to_agent initiated)\n case 'delegation_started':\n this.emit('delegationStarted', {\n type: 'delegation_started',\n handoffId: data.handoffId as string,\n targetAgentUuid: data.targetAgentUuid as string,\n targetAgentName: data.targetAgentName as string | undefined,\n taskPreview: data.taskPreview as string,\n timestamp: data.timestamp as string || new Date().toISOString(),\n });\n break;\n\n // Handle delegation completed event (handoff_to_agent finished)\n case 'delegation_completed':\n this.emit('delegationCompleted', {\n type: 'delegation_completed',\n handoffId: data.handoffId as string,\n status: data.status as 'completed' | 'failed',\n resultPreview: data.resultPreview as string | undefined,\n error: data.error as string | undefined,\n durationMs: data.durationMs as number,\n timestamp: data.timestamp as string || new Date().toISOString(),\n });\n break;\n\n // Handle status_update event - immediate feedback (e.g., \"thinking\")\n // Map to progress event for consistency\n case 'status_update':\n this.emit('progress', {\n status: (data.status as 'thinking' | 'initializing' | 'acting' | 'observing' | 'planning' | 'paused') || 'thinking',\n iteration: 0,\n currentStep: data.message as string | undefined,\n });\n break;\n\n // Handle text_delta event - token-by-token streaming\n case 'text_delta':\n this.emit('textDelta', {\n delta: data.delta as string,\n executionId: data.executionId as string,\n timestamp: data.timestamp as string || new Date().toISOString(),\n });\n break;\n\n // Ignore connection-related events\n case 'connected':\n case 'subscribed':\n case 'step':\n break;\n }\n }\n\n /**\n * Handle completion\n */\n private handleComplete(data: Record<string, unknown>): void {\n this.status = 'closed';\n this.stopActivityTimeout();\n\n // sessionId can come from SSE event data or from the initial execute response\n const sessionId = (data.sessionId as string | undefined) ?? this.options.sessionId;\n\n const execution: AgentExecution = {\n uuid: this.options.executionId,\n agentUuid: '',\n sessionId,\n status: 'completed',\n input: { task: '' },\n output: data.output as string | undefined,\n logs: [],\n tokenUsage: data.tokenUsage as AgentExecution['tokenUsage'],\n cost: data.cost as number | undefined,\n queuedAt: '',\n ...data,\n };\n\n this.finalExecution = execution;\n this.emit('complete', { execution });\n\n if (this.waitResolve) {\n this.waitResolve(execution);\n }\n }\n\n /**\n * Handle error\n */\n private handleError(error: ErrorEvent): void {\n this.status = 'closed';\n this.stopActivityTimeout();\n\n this.finalError = error;\n this.emit('error', error);\n\n if (this.waitReject) {\n this.waitReject(new AISaaSError(\n error.error,\n error.errorCode ?? 'execution_error',\n 500\n ));\n }\n }\n\n /**\n * Handle connection error\n */\n private async handleConnectionError(error: unknown): Promise<void> {\n if (this.status === 'closed') {\n return;\n }\n\n // Attempt reconnection\n if (this.reconnectAttempts < this.config.maxReconnectAttempts) {\n this.status = 'reconnecting';\n this.reconnectAttempts++;\n\n const delay = Math.min(\n this.config.reconnectBaseDelayMs * Math.pow(2, this.reconnectAttempts),\n this.config.reconnectMaxDelayMs\n );\n\n await new Promise(resolve => setTimeout(resolve, delay));\n\n // Check if cancelled during delay (cancel() sets status to 'closed')\n if (this.status === 'closed' as StreamingStatus) {\n return;\n }\n\n try {\n await this.connectSSE();\n } catch {\n await this.handleConnectionError(error);\n }\n } else {\n // Fall back to polling\n this.status = 'fallback_polling';\n this.emit('connectionChange', { connected: false, usingFallback: true });\n this.startPolling();\n }\n }\n\n /**\n * Start polling fallback\n */\n private startPolling(): void {\n this.pollingIntervalId = setInterval(async () => {\n try {\n const execution = await this.options.getExecution(this.options.executionId);\n\n // Emit new logs\n for (const log of execution.logs) {\n if (!this.seenEventIds.has(log.uuid)) {\n this.seenEventIds.add(log.uuid);\n this.emit('log', log);\n }\n }\n\n // Check for completion\n if (execution.status === 'completed') {\n this.stopPolling();\n this.handleComplete(execution as unknown as Record<string, unknown>);\n } else if (execution.status === 'failed' || execution.status === 'cancelled') {\n this.stopPolling();\n this.handleError({\n error: execution.error ?? `Execution ${execution.status}`,\n errorCode: execution.status,\n });\n }\n } catch (error) {\n // Continue polling on errors\n console.error('Polling error:', error);\n }\n }, this.config.pollingIntervalMs);\n }\n\n /**\n * Stop polling\n */\n private stopPolling(): void {\n if (this.pollingIntervalId) {\n clearInterval(this.pollingIntervalId);\n this.pollingIntervalId = null;\n }\n }\n\n /**\n * Reset activity timeout\n */\n private resetActivityTimeout(): void {\n this.stopActivityTimeout();\n\n this.activityTimeoutId = setTimeout(() => {\n // Force reconnect on inactivity\n if (this.sseClient) {\n this.sseClient.disconnect();\n }\n this.handleConnectionError(new Error('Activity timeout'));\n }, this.config.activityTimeoutMs);\n }\n\n /**\n * Stop activity timeout\n */\n private stopActivityTimeout(): void {\n if (this.activityTimeoutId) {\n clearTimeout(this.activityTimeoutId);\n this.activityTimeoutId = null;\n }\n }\n\n /**\n * Emit event to listeners\n */\n private emit<K extends keyof StreamEventMap>(event: K, data: StreamEventMap[K]): void {\n const listeners = this.listeners[event];\n console.log(`[SDK:StreamController] Emitting '${event}' to ${listeners?.length || 0} listeners`);\n if (listeners) {\n for (const listener of listeners) {\n try {\n (listener as (data: StreamEventMap[K]) => void)(data);\n } catch (error) {\n console.error(`Error in ${event} listener:`, error);\n }\n }\n }\n }\n}\n\n/**\n * Create an execution stream controller\n */\nexport function createExecutionStreamController(\n options: ExecutionStreamControllerOptions\n): ExecutionStreamController {\n return new ExecutionStreamControllerImpl(options);\n}\n","/**\n * Agents Resource API\n *\n * Provides all agent-related operations:\n * - List: list(), get()\n * - Execute: execute(), executeSync(), stream()\n * - Receive: getExecution()\n * - Edit: update(), updateConfig(), cancelExecution()\n */\n\nimport { BaseResourceAPI } from './base.js';\nimport type { HttpClient } from '../utils/http.js';\nimport { generateIdempotencyKey } from '../utils/http.js';\nimport type {\n Agent,\n AgentListOptions,\n AgentExecution,\n AgentUpdateInput,\n AgentConfigUpdateInput,\n ExecuteInput,\n ExecuteResponse,\n PaginatedResponse,\n} from '../types/index.js';\nimport type { ExecutionStreamController } from '../streaming/stream-controller.js';\nimport { createExecutionStreamController } from '../streaming/stream-controller.js';\n\n/**\n * Agents API class\n */\nexport class AgentsAPI extends BaseResourceAPI {\n constructor(http: HttpClient, private readonly getStreamConfig: () => StreamConfig) {\n super(http, '/agents');\n }\n\n // ===== LIST Operations =====\n\n /**\n * List all agents in the organization\n *\n * @param options - List options (pagination, filtering)\n * @returns Paginated list of agents\n *\n * @example\n * ```typescript\n * const { data: agents, pagination } = await client.agents.list({ limit: 10 });\n * ```\n */\n async list(options?: AgentListOptions): Promise<PaginatedResponse<Agent>> {\n const query: Record<string, string | number | boolean | undefined> = {\n ...this.buildListQuery(options),\n status: options?.status,\n type: options?.type,\n };\n return this.httpGet<PaginatedResponse<Agent>>('', query);\n }\n\n /**\n * Get a single agent by UUID\n *\n * @param uuid - Agent UUID\n * @returns Agent with configuration\n *\n * @example\n * ```typescript\n * const agent = await client.agents.get('agent-uuid');\n * console.log(agent.config);\n * ```\n */\n async get(uuid: string): Promise<Agent> {\n return this.httpGet<Agent>(`/${uuid}`);\n }\n\n // ===== EXECUTE Operations =====\n\n /**\n * Start an agent execution (async)\n *\n * Returns immediately with execution ID. Use getExecution() to poll\n * for results, or use stream() for real-time updates.\n *\n * @param uuid - Agent UUID\n * @param input - Execution input (task, context, options)\n * @returns Execution ID and initial status\n *\n * @example\n * ```typescript\n * const { executionId, status } = await client.agents.execute('agent-uuid', {\n * task: 'Summarize the latest news about AI',\n * });\n * ```\n */\n async execute(uuid: string, input: ExecuteInput): Promise<ExecuteResponse> {\n const idempotencyKey = input.options?.idempotencyKey ?? generateIdempotencyKey();\n // Use SDK flat format: { task, context, attachmentIds, teamUuid, options }\n // This matches cadra-web's sdkFormatSchema which preserves teamUuid\n return this.httpPost<ExecuteResponse>(\n `/${uuid}/execute`,\n {\n task: input.task,\n context: input.context ?? {},\n attachmentIds: input.attachmentIds,\n options: input.options,\n ...(input.teamUuid ? { teamUuid: input.teamUuid } : {}),\n },\n { idempotencyKey }\n );\n }\n\n /**\n * Execute an agent and wait for completion (sync)\n *\n * Polls the execution status until completion or failure.\n *\n * @param uuid - Agent UUID\n * @param input - Execution input\n * @param pollInterval - Polling interval in ms (default: 1000)\n * @returns Final execution result\n *\n * @example\n * ```typescript\n * const execution = await client.agents.executeSync('agent-uuid', {\n * task: 'Write a haiku about coding',\n * });\n * console.log(execution.output);\n * ```\n */\n async executeSync(\n uuid: string,\n input: ExecuteInput,\n pollInterval: number = 1000\n ): Promise<AgentExecution> {\n // Start the execution\n const { executionId } = await this.execute(uuid, input);\n\n // Poll until completion\n return this.pollExecution(executionId, pollInterval);\n }\n\n /**\n * Stream an agent execution\n *\n * Returns a StreamController for real-time event handling.\n *\n * @param uuid - Agent UUID\n * @param input - Execution input\n * @returns Stream controller for event handling\n *\n * @example\n * ```typescript\n * const stream = await client.agents.stream('agent-uuid', {\n * task: 'Research climate change',\n * });\n *\n * stream.on('log', (log) => console.log(log.title));\n * stream.on('toolCall', ({ toolName }) => console.log(`Calling ${toolName}`));\n * stream.on('complete', ({ execution }) => console.log(execution.output));\n *\n * const result = await stream.wait();\n * ```\n */\n async stream(uuid: string, input: ExecuteInput): Promise<ExecutionStreamController> {\n console.log('[SDK:Agents] stream() called for agent:', uuid);\n\n // Start the execution first\n const { executionId, sessionId } = await this.execute(uuid, input);\n console.log('[SDK:Agents] Execution started:', { executionId, sessionId });\n\n // Create and connect stream controller\n const config = this.getStreamConfig();\n console.log('[SDK:Agents] Stream config:', {\n baseUrl: config.baseUrl,\n apiKey: config.apiKey ? `${config.apiKey.substring(0, 20)}...` : 'MISSING',\n orgId: config.orgId,\n });\n\n const controller = createExecutionStreamController({\n executionId,\n sessionId,\n baseUrl: config.baseUrl,\n apiKey: config.apiKey,\n tokenProvider: config.tokenProvider,\n orgId: config.orgId,\n getExecution: (id) => this.getExecution(id),\n });\n\n // IMPORTANT: Do NOT call connect() here!\n // The caller must register event listeners with .on() FIRST, then call .connect()\n // Otherwise events will be emitted to 0 listeners (race condition)\n console.log('[SDK:Agents] Stream controller created - caller must call connect() after registering listeners');\n\n return controller;\n }\n\n /**\n * Connect to an existing execution's stream\n *\n * Use this when the execution was started externally (e.g., via tRPC for team executions)\n * and you need to connect to its SSE stream for real-time updates.\n *\n * @param executionId - Execution UUID (already running)\n * @param sessionId - Optional session ID for conversation continuity\n * @returns Stream controller for the execution\n *\n * @example\n * ```typescript\n * // Execution started via tRPC\n * const executionId = await trpc.executions.start.mutate({ teamUuid, task });\n *\n * // Connect to SSE stream for real-time updates\n * const stream = client.agents.streamExecution(executionId);\n *\n * stream.on('log', (log) => console.log(log.title));\n * stream.on('delegationStarted', (data) => console.log('Subagent:', data.targetAgentName));\n * stream.on('complete', ({ execution }) => console.log(execution.output));\n *\n * await stream.connect();\n * const result = await stream.wait();\n * ```\n */\n streamExecution(executionId: string, sessionId?: string): ExecutionStreamController {\n console.log('[SDK:Agents] streamExecution() called for execution:', executionId);\n\n // Create stream controller for existing execution\n const config = this.getStreamConfig();\n console.log('[SDK:Agents] Stream config:', {\n baseUrl: config.baseUrl,\n apiKey: config.apiKey ? `${config.apiKey.substring(0, 20)}...` : 'MISSING',\n orgId: config.orgId,\n });\n\n const controller = createExecutionStreamController({\n executionId,\n sessionId,\n baseUrl: config.baseUrl,\n apiKey: config.apiKey,\n tokenProvider: config.tokenProvider,\n orgId: config.orgId,\n getExecution: (id) => this.getExecution(id),\n });\n\n // IMPORTANT: Do NOT call connect() here!\n // The caller must register event listeners with .on() FIRST, then call .connect()\n console.log('[SDK:Agents] Stream controller created for existing execution - caller must call connect() after registering listeners');\n\n return controller;\n }\n\n // ===== RECEIVE Operations =====\n\n /**\n * Get execution result by ID\n *\n * @param executionId - Execution UUID\n * @returns Execution details including status, output, logs\n *\n * @example\n * ```typescript\n * const execution = await client.agents.getExecution('exec-uuid');\n * if (execution.status === 'completed') {\n * console.log(execution.output);\n * }\n * ```\n */\n async getExecution(executionId: string): Promise<AgentExecution> {\n return this.http.get<AgentExecution>(`/executions/${executionId}`);\n }\n\n // ===== EDIT Operations =====\n\n /**\n * Update agent details\n *\n * @param uuid - Agent UUID\n * @param data - Fields to update\n * @returns Updated agent\n *\n * @example\n * ```typescript\n * const agent = await client.agents.update('agent-uuid', {\n * name: 'My Updated Agent',\n * description: 'New description',\n * });\n * ```\n */\n async update(uuid: string, data: AgentUpdateInput): Promise<Agent> {\n const idempotencyKey = generateIdempotencyKey();\n return this.httpPatch<Agent>(`/${uuid}`, data, { idempotencyKey });\n }\n\n /**\n * Update agent configuration\n *\n * @param uuid - Agent UUID\n * @param config - Configuration fields to update\n * @returns Updated agent\n *\n * @example\n * ```typescript\n * const agent = await client.agents.updateConfig('agent-uuid', {\n * temperature: 0.7,\n * maxIterations: 5,\n * });\n * ```\n */\n async updateConfig(uuid: string, config: AgentConfigUpdateInput): Promise<Agent> {\n const idempotencyKey = generateIdempotencyKey();\n return this.httpPatch<Agent>(`/${uuid}/config`, config, { idempotencyKey });\n }\n\n /**\n * Cancel a running execution\n *\n * @param executionId - Execution UUID\n * @returns Updated execution with cancelled status\n *\n * @example\n * ```typescript\n * const execution = await client.agents.cancelExecution('exec-uuid');\n * console.log(execution.status); // 'cancelled'\n * ```\n */\n async cancelExecution(executionId: string): Promise<AgentExecution> {\n return this.http.post<AgentExecution>(\n `/executions/${executionId}/cancel`,\n undefined,\n { skipRetry: true }\n );\n }\n\n // ===== Private helpers =====\n\n /**\n * Poll execution until completion\n */\n private async pollExecution(\n executionId: string,\n pollInterval: number\n ): Promise<AgentExecution> {\n while (true) {\n const execution = await this.getExecution(executionId);\n\n if (\n execution.status === 'completed' ||\n execution.status === 'failed' ||\n execution.status === 'cancelled'\n ) {\n return execution;\n }\n\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n }\n }\n}\n\n/**\n * Stream configuration passed from client\n */\nexport interface StreamConfig {\n baseUrl: string;\n apiKey?: string;\n token?: string;\n tokenProvider?: () => Promise<string>;\n orgId: number;\n}\n","/**\n * Skills Resource API\n *\n * Provides all skill-related operations:\n * - List: list(), get(), getTools()\n * - Execute: execute()\n * - Receive: getExecution()\n * - Edit: update(), updatePrompt()\n */\n\nimport { BaseResourceAPI } from './base.js';\nimport type { HttpClient } from '../utils/http.js';\nimport { generateIdempotencyKey } from '../utils/http.js';\nimport type {\n Skill,\n SkillDetails,\n SkillListOptions,\n SkillTool,\n SkillExecuteInput,\n SkillExecution,\n SkillUpdateInput,\n PaginatedResponse,\n} from '../types/index.js';\n\n/**\n * Skills API class\n */\nexport class SkillsAPI extends BaseResourceAPI {\n constructor(http: HttpClient) {\n super(http, '/skills');\n }\n\n // ===== LIST Operations =====\n\n /**\n * List all skills in the organization\n *\n * @param options - List options (pagination, filtering by category/tags)\n * @returns Paginated list of skills\n *\n * @example\n * ```typescript\n * const { data: skills } = await client.skills.list({\n * category: 'writing',\n * tags: ['seo', 'blog'],\n * });\n * ```\n */\n async list(options?: SkillListOptions): Promise<PaginatedResponse<Skill>> {\n const query: Record<string, string | number | boolean | undefined> = {\n ...this.buildListQuery(options),\n category: options?.category,\n tags: options?.tags?.join(','),\n };\n return this.httpGet<PaginatedResponse<Skill>>('', query);\n }\n\n /**\n * Get a single skill by UUID with full details\n *\n * @param uuid - Skill UUID\n * @returns Skill with prompt template and tools\n *\n * @example\n * ```typescript\n * const skill = await client.skills.get('skill-uuid');\n * console.log(skill.promptTemplate);\n * ```\n */\n async get(uuid: string): Promise<SkillDetails> {\n return this.httpGet<SkillDetails>(`/${uuid}`);\n }\n\n /**\n * Get tools associated with a skill\n *\n * @param uuid - Skill UUID\n * @returns Array of tools used by the skill\n *\n * @example\n * ```typescript\n * const tools = await client.skills.getTools('skill-uuid');\n * tools.forEach(tool => console.log(tool.name));\n * ```\n */\n async getTools(uuid: string): Promise<SkillTool[]> {\n return this.httpGet<SkillTool[]>(`/${uuid}/tools`);\n }\n\n // ===== EXECUTE Operations =====\n\n /**\n * Execute a skill with variables\n *\n * @param uuid - Skill UUID\n * @param input - Variables and context for execution\n * @returns Skill execution result\n *\n * @example\n * ```typescript\n * const result = await client.skills.execute('skill-uuid', {\n * variables: {\n * topic: 'AI in healthcare',\n * tone: 'professional',\n * },\n * });\n * console.log(result.output);\n * ```\n */\n async execute(uuid: string, input: SkillExecuteInput): Promise<SkillExecution> {\n const idempotencyKey = generateIdempotencyKey();\n return this.httpPost<SkillExecution>(\n `/${uuid}/execute`,\n {\n variables: input.variables,\n context: input.context,\n },\n { idempotencyKey }\n );\n }\n\n // ===== RECEIVE Operations =====\n\n /**\n * Get skill execution result by ID\n *\n * @param executionId - Execution UUID\n * @returns Skill execution details\n *\n * @example\n * ```typescript\n * const execution = await client.skills.getExecution('exec-uuid');\n * ```\n */\n async getExecution(executionId: string): Promise<SkillExecution> {\n return this.http.get<SkillExecution>(`/executions/${executionId}`);\n }\n\n // ===== EDIT Operations =====\n\n /**\n * Update skill details\n *\n * @param uuid - Skill UUID\n * @param data - Fields to update\n * @returns Updated skill\n *\n * @example\n * ```typescript\n * const skill = await client.skills.update('skill-uuid', {\n * name: 'Updated Skill Name',\n * tags: ['new-tag'],\n * });\n * ```\n */\n async update(uuid: string, data: SkillUpdateInput): Promise<Skill> {\n const idempotencyKey = generateIdempotencyKey();\n return this.httpPatch<Skill>(`/${uuid}`, data, { idempotencyKey });\n }\n\n /**\n * Update skill prompt template\n *\n * @param uuid - Skill UUID\n * @param prompt - New prompt template\n * @returns Updated skill with new version\n *\n * @example\n * ```typescript\n * const skill = await client.skills.updatePrompt('skill-uuid',\n * 'Write a {{tone}} article about {{topic}}...'\n * );\n * console.log(skill.version); // Version incremented\n * ```\n */\n async updatePrompt(uuid: string, prompt: string): Promise<SkillDetails> {\n const idempotencyKey = generateIdempotencyKey();\n return this.httpPatch<SkillDetails>(`/${uuid}/prompt`, { promptTemplate: prompt }, { idempotencyKey });\n }\n}\n","/**\n * Tools Resource API\n *\n * Provides all tool-related operations:\n * - List: list(), get()\n * - Execute: execute(), validateInput()\n * - Receive: getExecution()\n * - Edit: update(), updateConfig()\n */\n\nimport { BaseResourceAPI } from './base.js';\nimport type { HttpClient } from '../utils/http.js';\nimport { generateIdempotencyKey } from '../utils/http.js';\nimport type {\n Tool,\n ToolListOptions,\n ToolExecution,\n ToolValidationResult,\n ToolUpdateInput,\n ToolConfigUpdateInput,\n PaginatedResponse,\n} from '../types/index.js';\n\n/**\n * Tools API class\n */\nexport class ToolsAPI extends BaseResourceAPI {\n constructor(http: HttpClient) {\n super(http, '/tools');\n }\n\n // ===== LIST Operations =====\n\n /**\n * List all tools in the organization\n *\n * @param options - List options (pagination, filtering)\n * @returns Paginated list of tools\n *\n * @example\n * ```typescript\n * const { data: tools } = await client.tools.list({\n * category: 'data',\n * isEnabled: true,\n * });\n * ```\n */\n async list(options?: ToolListOptions): Promise<PaginatedResponse<Tool>> {\n const query: Record<string, string | number | boolean | undefined> = {\n ...this.buildListQuery(options),\n category: options?.category,\n isEnabled: options?.isEnabled,\n };\n return this.httpGet<PaginatedResponse<Tool>>('', query);\n }\n\n /**\n * Get a single tool by UUID with schema\n *\n * @param uuid - Tool UUID\n * @returns Tool with input/output schemas\n *\n * @example\n * ```typescript\n * const tool = await client.tools.get('tool-uuid');\n * console.log(tool.inputSchema);\n * ```\n */\n async get(uuid: string): Promise<Tool> {\n return this.httpGet<Tool>(`/${uuid}`);\n }\n\n // ===== EXECUTE Operations =====\n\n /**\n * Execute a tool directly\n *\n * @param uuid - Tool UUID\n * @param input - Tool input (validated against inputSchema)\n * @returns Tool execution result\n *\n * @example\n * ```typescript\n * const result = await client.tools.execute('tool-uuid', {\n * query: 'weather in London',\n * limit: 5,\n * });\n * console.log(result.output);\n * ```\n */\n async execute(uuid: string, input: Record<string, unknown>): Promise<ToolExecution> {\n const idempotencyKey = generateIdempotencyKey();\n return this.httpPost<ToolExecution>(`/${uuid}/execute`, { input }, { idempotencyKey });\n }\n\n /**\n * Validate input against tool schema\n *\n * @param uuid - Tool UUID\n * @param input - Input to validate\n * @returns Validation result with errors if invalid\n *\n * @example\n * ```typescript\n * const validation = await client.tools.validateInput('tool-uuid', {\n * query: 'test',\n * });\n * if (!validation.valid) {\n * console.log(validation.errors);\n * }\n * ```\n */\n async validateInput(uuid: string, input: Record<string, unknown>): Promise<ToolValidationResult> {\n return this.httpPost<ToolValidationResult>(`/${uuid}/validate`, { input }, { skipRetry: false });\n }\n\n // ===== RECEIVE Operations =====\n\n /**\n * Get tool execution result by ID\n *\n * @param executionId - Execution UUID\n * @returns Tool execution details\n *\n * @example\n * ```typescript\n * const execution = await client.tools.getExecution('exec-uuid');\n * ```\n */\n async getExecution(executionId: string): Promise<ToolExecution> {\n return this.http.get<ToolExecution>(`/executions/${executionId}`);\n }\n\n // ===== EDIT Operations =====\n\n /**\n * Update tool details\n *\n * @param uuid - Tool UUID\n * @param data - Fields to update\n * @returns Updated tool\n *\n * @example\n * ```typescript\n * const tool = await client.tools.update('tool-uuid', {\n * name: 'Updated Tool Name',\n * description: 'New description',\n * });\n * ```\n */\n async update(uuid: string, data: ToolUpdateInput): Promise<Tool> {\n const idempotencyKey = generateIdempotencyKey();\n return this.httpPatch<Tool>(`/${uuid}`, data, { idempotencyKey });\n }\n\n /**\n * Update tool configuration\n *\n * @param uuid - Tool UUID\n * @param config - Configuration to update\n * @returns Updated tool\n *\n * @example\n * ```typescript\n * const tool = await client.tools.updateConfig('tool-uuid', {\n * isEnabled: false,\n * config: { apiKey: 'new-key' },\n * });\n * ```\n */\n async updateConfig(uuid: string, config: ToolConfigUpdateInput): Promise<Tool> {\n const idempotencyKey = generateIdempotencyKey();\n return this.httpPatch<Tool>(`/${uuid}/config`, config, { idempotencyKey });\n }\n}\n","/**\n * Artifacts Resource API\n *\n * Provides all artifact-related operations:\n * - List: list(), get()\n * - Receive: download(), downloadStream(), getSignedUrl()\n * - Edit: upload(), delete()\n */\n\nimport { BaseResourceAPI } from './base.js';\nimport type { HttpClient } from '../utils/http.js';\nimport type {\n Artifact,\n ArtifactListOptions,\n ArtifactDownloadOptions,\n SignedUrlResponse,\n ArtifactUploadInput,\n PaginatedResponse,\n} from '../types/index.js';\n\n/**\n * Artifacts API class\n */\nexport class ArtifactsAPI extends BaseResourceAPI {\n constructor(http: HttpClient) {\n super(http, '/artifacts');\n }\n\n // ===== LIST Operations =====\n\n /**\n * List artifacts for an execution\n *\n * @param executionId - Execution UUID\n * @param options - List options (pagination, filtering by type)\n * @returns Paginated list of artifacts\n *\n * @example\n * ```typescript\n * const { data: artifacts } = await client.artifacts.list('exec-uuid', {\n * type: 'file',\n * });\n * ```\n */\n async list(executionId: string, options?: ArtifactListOptions): Promise<PaginatedResponse<Artifact>> {\n const query: Record<string, string | number | boolean | undefined> = {\n ...this.buildListQuery(options),\n type: options?.type,\n };\n return this.http.get<PaginatedResponse<Artifact>>(`/executions/${executionId}/artifacts`, query);\n }\n\n /**\n * Get artifact metadata by UUID\n *\n * @param uuid - Artifact UUID\n * @returns Artifact metadata\n *\n * @example\n * ```typescript\n * const artifact = await client.artifacts.get('artifact-uuid');\n * console.log(artifact.name, artifact.size);\n * ```\n */\n async get(uuid: string): Promise<Artifact> {\n return this.httpGet<Artifact>(`/${uuid}`);\n }\n\n // ===== RECEIVE Operations =====\n\n /**\n * Download artifact content\n *\n * In Node.js returns Buffer, in browser returns Blob.\n *\n * @param uuid - Artifact UUID\n * @returns Artifact content as Buffer (Node.js) or Blob (browser)\n *\n * @example\n * ```typescript\n * const content = await client.artifacts.download('artifact-uuid');\n * // Node.js: Buffer\n * // Browser: Blob\n * ```\n */\n async download(uuid: string): Promise<Buffer | Blob> {\n // Make request expecting binary response\n const response = await this.http.request<Response>({\n method: 'GET',\n path: `${this.basePath}/${uuid}/download`,\n headers: {\n 'Accept': '*/*',\n },\n });\n\n // Handle response based on environment\n if (typeof window !== 'undefined') {\n // Browser environment - return Blob\n return response.blob();\n } else {\n // Node.js environment - return Buffer\n const arrayBuffer = await response.arrayBuffer();\n return Buffer.from(arrayBuffer);\n }\n }\n\n /**\n * Download artifact as a stream\n *\n * In Node.js returns Readable stream, in browser returns ReadableStream.\n *\n * @param uuid - Artifact UUID\n * @returns Readable stream\n *\n * @example\n * ```typescript\n * const stream = await client.artifacts.downloadStream('artifact-uuid');\n * // Pipe to file or process incrementally\n * ```\n */\n async downloadStream(uuid: string): Promise<ReadableStream<Uint8Array>> {\n const response = await this.http.request<Response>({\n method: 'GET',\n path: `${this.basePath}/${uuid}/stream`,\n headers: {\n 'Accept': '*/*',\n },\n });\n\n if (!response.body) {\n throw new Error('Response body is not available');\n }\n\n return response.body;\n }\n\n /**\n * Get a signed URL for direct download\n *\n * @param uuid - Artifact UUID\n * @param options - Options including expiration time\n * @returns Signed URL and expiration time\n *\n * @example\n * ```typescript\n * const { url, expiresAt } = await client.artifacts.getSignedUrl('artifact-uuid', {\n * expiresIn: 3600, // 1 hour\n * });\n * // Use URL for direct download\n * ```\n */\n async getSignedUrl(uuid: string, options?: ArtifactDownloadOptions): Promise<SignedUrlResponse> {\n return this.httpPost<SignedUrlResponse>(`/${uuid}/signed-url`, {\n expiresIn: options?.expiresIn ?? 3600,\n });\n }\n\n // ===== EDIT Operations =====\n\n /**\n * Upload a new artifact for an execution\n *\n * @param executionId - Execution UUID\n * @param input - Upload input (name, content, mime type)\n * @returns Created artifact metadata\n *\n * @example\n * ```typescript\n * const artifact = await client.artifacts.upload('exec-uuid', {\n * name: 'report.pdf',\n * content: fileBuffer,\n * mimeType: 'application/pdf',\n * });\n * ```\n */\n async upload(executionId: string, input: ArtifactUploadInput): Promise<Artifact> {\n // For multipart upload, we need to use FormData\n const formData = new FormData();\n\n // Handle different content types\n if (input.content instanceof Blob) {\n formData.append('file', input.content, input.name);\n } else if (typeof Buffer !== 'undefined' && Buffer.isBuffer(input.content)) {\n // Node.js Buffer - slice to create a new ArrayBuffer (ensures proper ArrayBuffer type for BlobPart)\n const arrayBuffer = input.content.buffer.slice(\n input.content.byteOffset,\n input.content.byteOffset + input.content.byteLength\n ) as ArrayBuffer;\n const blob = new Blob([arrayBuffer], { type: input.mimeType ?? 'application/octet-stream' });\n formData.append('file', blob, input.name);\n } else if (input.content instanceof ReadableStream) {\n // Stream - need to collect into buffer first, then concatenate for Blob compatibility\n const chunks: Uint8Array[] = [];\n const reader = input.content.getReader();\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(new Uint8Array(value));\n }\n // Concatenate chunks into ArrayBuffer for proper BlobPart typing\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n // Use the underlying ArrayBuffer directly for Blob (proper ArrayBuffer type)\n const blob = new Blob([combined.buffer as ArrayBuffer], { type: input.mimeType ?? 'application/octet-stream' });\n formData.append('file', blob, input.name);\n }\n\n if (input.type) {\n formData.append('type', input.type);\n }\n if (input.metadata) {\n formData.append('metadata', JSON.stringify(input.metadata));\n }\n\n // Make request with FormData (no Content-Type header - fetch sets it automatically with boundary)\n return this.http.request<Artifact>({\n method: 'POST',\n path: `/executions/${executionId}/artifacts`,\n body: formData as unknown,\n headers: {\n // Remove Content-Type to let fetch set it with proper boundary\n },\n });\n }\n\n /**\n * Delete an artifact\n *\n * @param uuid - Artifact UUID\n *\n * @example\n * ```typescript\n * await client.artifacts.delete('artifact-uuid');\n * ```\n */\n async delete(uuid: string): Promise<void> {\n return this.httpDelete<void>(`/${uuid}`);\n }\n}\n","/**\n * Sessions Resource API\n *\n * Provides all session-related operations:\n * - List: list(), get()\n * - Execute: sendMessage(), stream()\n * - Receive: getHistory(), listArtifacts()\n * - Edit: create(), delete()\n */\n\nimport { BaseResourceAPI } from './base.js';\nimport type { HttpClient } from '../utils/http.js';\nimport { generateIdempotencyKey } from '../utils/http.js';\nimport type {\n Session,\n SessionListOptions,\n SessionHistory,\n SessionCreateInput,\n SendMessageInput,\n PaginatedResponse,\n SessionArtifact,\n SessionArtifactListOptions,\n} from '../types/index.js';\nimport type { AgentExecution, ExecuteResponse } from '../types/agents.js';\nimport type { ExecutionStreamController } from '../streaming/stream-controller.js';\nimport { createExecutionStreamController } from '../streaming/stream-controller.js';\nimport type { StreamConfig } from './agents.js';\n\n/**\n * Sessions API class\n */\nexport class SessionsAPI extends BaseResourceAPI {\n constructor(http: HttpClient, private readonly getStreamConfig: () => StreamConfig) {\n super(http, '/sessions');\n }\n\n // ===== LIST Operations =====\n\n /**\n * List all sessions in the organization\n *\n * @param options - List options (pagination, filtering by agent)\n * @returns Paginated list of sessions\n *\n * @example\n * ```typescript\n * const { data: sessions } = await client.sessions.list({\n * agentUuid: 'agent-uuid',\n * });\n * ```\n */\n async list(options?: SessionListOptions): Promise<PaginatedResponse<Session>> {\n const query: Record<string, string | number | boolean | undefined> = {\n ...this.buildListQuery(options),\n agentUuid: options?.agentUuid,\n };\n return this.httpGet<PaginatedResponse<Session>>('', query);\n }\n\n /**\n * Get session details by ID\n *\n * @param sessionId - Session ID\n * @returns Session details\n *\n * @example\n * ```typescript\n * const session = await client.sessions.get('session-id');\n * console.log(session.messageCount);\n * ```\n */\n async get(sessionId: string): Promise<Session> {\n return this.httpGet<Session>(`/${sessionId}`);\n }\n\n // ===== EXECUTE Operations =====\n\n /**\n * Send a message to a session\n *\n * Triggers an agent execution in the context of the session.\n * Returns immediately with execution ID. Use getHistory() to get\n * the response, or use stream() for real-time updates.\n *\n * @param sessionId - Session ID\n * @param input - Message content and optional context\n * @returns Execution ID and status\n *\n * @example\n * ```typescript\n * const { executionId } = await client.sessions.sendMessage('session-id', {\n * message: 'What is the capital of France?',\n * });\n * ```\n */\n async sendMessage(sessionId: string, input: SendMessageInput): Promise<ExecuteResponse> {\n const idempotencyKey = generateIdempotencyKey();\n return this.httpPost<ExecuteResponse>(\n `/${sessionId}/messages`,\n {\n message: input.message,\n context: input.context,\n // Pass attachment IDs for multi-modal messages (images, documents, etc.)\n attachmentIds: input.attachmentIds,\n },\n { idempotencyKey }\n );\n }\n\n /**\n * Send a message and wait for response (sync)\n *\n * @param sessionId - Session ID\n * @param input - Message content and optional context\n * @param pollInterval - Polling interval in ms (default: 1000)\n * @returns Final execution result\n *\n * @example\n * ```typescript\n * const execution = await client.sessions.sendMessageSync('session-id', {\n * message: 'What is the capital of France?',\n * });\n * console.log(execution.output);\n * ```\n */\n async sendMessageSync(\n sessionId: string,\n input: SendMessageInput,\n pollInterval: number = 1000\n ): Promise<AgentExecution> {\n const { executionId } = await this.sendMessage(sessionId, input);\n return this.pollExecution(executionId, pollInterval);\n }\n\n /**\n * Stream a message response\n *\n * Returns a StreamController for real-time event handling.\n *\n * @param sessionId - Session ID\n * @param input - Message content and optional context\n * @returns Stream controller\n *\n * @example\n * ```typescript\n * const stream = await client.sessions.stream('session-id', {\n * message: 'Tell me more about that',\n * });\n *\n * stream.on('log', (log) => console.log(log.title));\n * stream.on('complete', ({ execution }) => console.log(execution.output));\n *\n * const result = await stream.wait();\n * ```\n */\n async stream(sessionId: string, input: SendMessageInput): Promise<ExecutionStreamController> {\n const { executionId } = await this.sendMessage(sessionId, input);\n\n const config = this.getStreamConfig();\n const controller = createExecutionStreamController({\n executionId,\n sessionId,\n baseUrl: config.baseUrl,\n apiKey: config.apiKey,\n orgId: config.orgId,\n getExecution: (id) => this.getExecution(id),\n });\n\n await controller.connect();\n return controller;\n }\n\n // ===== RECEIVE Operations =====\n\n /**\n * Get session conversation history\n *\n * @param sessionId - Session ID\n * @returns Session with all messages\n *\n * @example\n * ```typescript\n * const history = await client.sessions.getHistory('session-id');\n * history.messages.forEach(msg => {\n * console.log(`${msg.role}: ${msg.content}`);\n * });\n * ```\n */\n async getHistory(sessionId: string): Promise<SessionHistory> {\n return this.httpGet<SessionHistory>(`/${sessionId}/history`);\n }\n\n /**\n * List artifacts for a session\n *\n * Returns all artifacts generated across all executions in the session.\n * Useful for retrieving images, files, and other outputs created during\n * agent interactions.\n *\n * @param sessionId - Session ID\n * @param options - List options (filtering by type, pagination)\n * @returns Paginated list of session artifacts\n *\n * @example\n * ```typescript\n * // Get all images from a session\n * const { data: artifacts } = await client.sessions.listArtifacts('session-id', {\n * type: 'image',\n * });\n *\n * artifacts.forEach(artifact => {\n * console.log(artifact.filename, artifact.url);\n * });\n * ```\n */\n async listArtifacts(\n sessionId: string,\n options?: SessionArtifactListOptions\n ): Promise<PaginatedResponse<SessionArtifact>> {\n const query: Record<string, string | number | boolean | undefined> = {\n ...this.buildListQuery(options),\n type: options?.type,\n includeVariants: options?.includeVariants,\n };\n return this.httpGet<PaginatedResponse<SessionArtifact>>(`/${sessionId}/artifacts`, query);\n }\n\n /**\n * Get execution result\n */\n private async getExecution(executionId: string): Promise<AgentExecution> {\n return this.http.get<AgentExecution>(`/executions/${executionId}`);\n }\n\n // ===== EDIT Operations =====\n\n /**\n * Create a new session for an agent\n *\n * @param agentUuid - Agent UUID to associate with session\n * @param options - Optional system message\n * @returns Created session\n *\n * @example\n * ```typescript\n * const session = await client.sessions.create({\n * agentUuid: 'agent-uuid',\n * systemMessage: 'You are a helpful assistant.',\n * });\n * console.log(session.id);\n * ```\n */\n async create(input: SessionCreateInput): Promise<Session> {\n const idempotencyKey = generateIdempotencyKey();\n return this.httpPost<Session>('', input, { idempotencyKey });\n }\n\n /**\n * Delete a session and all its messages\n *\n * @param sessionId - Session ID\n *\n * @example\n * ```typescript\n * await client.sessions.delete('session-id');\n * ```\n */\n async delete(sessionId: string): Promise<void> {\n return this.httpDelete<void>(`/${sessionId}`);\n }\n\n // ===== Private helpers =====\n\n /**\n * Poll execution until completion\n */\n private async pollExecution(\n executionId: string,\n pollInterval: number\n ): Promise<AgentExecution> {\n while (true) {\n const execution = await this.getExecution(executionId);\n\n if (\n execution.status === 'completed' ||\n execution.status === 'failed' ||\n execution.status === 'cancelled'\n ) {\n return execution;\n }\n\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n }\n }\n}\n","/**\n * AI SaaS Client\n *\n * Main entry point for the SDK. Provides access to all resource APIs.\n *\n * @example\n * ```typescript\n * import { AISaaSClient } from '@cadraos/sdk';\n *\n * const client = new AISaaSClient({\n * apiKey: process.env.AISAAS_API_KEY,\n * orgId: Number(process.env.AISAAS_ORG_ID),\n * });\n *\n * // List agents\n * const { data: agents } = await client.agents.list();\n *\n * // Execute an agent\n * const execution = await client.agents.executeSync(agents[0].uuid, {\n * task: 'Summarize the latest news',\n * });\n *\n * // Stream an agent execution\n * const stream = await client.agents.stream(agents[0].uuid, {\n * task: 'Research climate change',\n * });\n *\n * stream.on('log', (log) => console.log(log.title));\n * stream.on('complete', ({ execution }) => console.log(execution.output));\n *\n * const result = await stream.wait();\n * ```\n */\n\nimport { AgentsAPI, ArtifactsAPI, SessionsAPI, SkillsAPI, ToolsAPI, type StreamConfig } from './resources/index.js';\nimport { HttpClient, type HttpClientConfig } from './utils/http.js';\nimport { DEFAULT_RETRY_CONFIG, type RetryConfig } from './utils/retry.js';\n\n/**\n * Default API base URL\n */\nconst DEFAULT_BASE_URL = 'https://api.aisaas.com/v1';\n\n/**\n * Default request timeout (30 seconds)\n */\nconst DEFAULT_TIMEOUT = 30000;\n\n/**\n * Client options for API key authentication\n */\nexport interface AISaaSClientOptionsApiKey {\n /** API key for authentication */\n apiKey: string;\n /** Organization ID */\n orgId: number;\n /** Base URL for API (default: https://api.aisaas.com/v1) */\n baseUrl?: string;\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n /** Maximum retry attempts (default: 3) */\n maxRetries?: number;\n /** Custom headers to include in all requests */\n headers?: Record<string, string>;\n}\n\n/**\n * Client options for OAuth token authentication\n */\nexport interface AISaaSClientOptionsToken {\n /** OAuth token for authentication */\n token: string;\n /** Organization ID */\n orgId: number;\n /** Base URL for API (default: https://api.aisaas.com/v1) */\n baseUrl?: string;\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n /** Maximum retry attempts (default: 3) */\n maxRetries?: number;\n /** Custom headers to include in all requests */\n headers?: Record<string, string>;\n}\n\n/**\n * Client options for token provider authentication\n */\nexport interface AISaaSClientOptionsTokenProvider {\n /** Token provider callback (called before each request) */\n tokenProvider: () => Promise<string>;\n /** Organization ID */\n orgId: number;\n /** Base URL for API (default: https://api.aisaas.com/v1) */\n baseUrl?: string;\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n /** Maximum retry attempts (default: 3) */\n maxRetries?: number;\n /** Custom headers to include in all requests */\n headers?: Record<string, string>;\n}\n\n/**\n * All client options\n */\nexport type AISaaSClientOptions =\n | AISaaSClientOptionsApiKey\n | AISaaSClientOptionsToken\n | AISaaSClientOptionsTokenProvider;\n\n/**\n * AI SaaS Client\n *\n * Main class for interacting with the AI SaaS API.\n * Provides access to all resource APIs (agents, skills, tools, artifacts, sessions).\n */\nexport class AISaaSClient {\n private readonly httpClient: HttpClient;\n private readonly config: {\n baseUrl: string;\n apiKey?: string;\n token?: string;\n tokenProvider?: () => Promise<string>;\n orgId: number;\n timeout: number;\n headers?: Record<string, string>;\n };\n\n /**\n * Agent operations (list, execute, stream, update)\n */\n readonly agents: AgentsAPI;\n\n /**\n * Skill operations (list, get, execute, update)\n */\n readonly skills: SkillsAPI;\n\n /**\n * Tool operations (list, get, execute, validate, update)\n */\n readonly tools: ToolsAPI;\n\n /**\n * Artifact operations (list, get, download, upload, delete)\n */\n readonly artifacts: ArtifactsAPI;\n\n /**\n * Session operations (list, get, create, message, delete)\n */\n readonly sessions: SessionsAPI;\n\n /**\n * Create a new AI SaaS client\n *\n * @param options - Client configuration options\n *\n * @example\n * ```typescript\n * // API key authentication\n * const client = new AISaaSClient({\n * apiKey: 'sk_...',\n * orgId: 123,\n * });\n *\n * // OAuth token authentication\n * const client = new AISaaSClient({\n * token: 'eyJ...',\n * orgId: 123,\n * });\n *\n * // Token provider (for automatic refresh)\n * const client = new AISaaSClient({\n * tokenProvider: async () => myAuth.getAccessToken(),\n * orgId: 123,\n * });\n * ```\n */\n constructor(options: AISaaSClientOptions) {\n // Validate options\n this.validateOptions(options);\n\n // Store configuration\n this.config = {\n baseUrl: options.baseUrl ?? DEFAULT_BASE_URL,\n orgId: options.orgId,\n timeout: options.timeout ?? DEFAULT_TIMEOUT,\n headers: options.headers,\n };\n\n // Set auth based on options type\n if ('apiKey' in options) {\n this.config.apiKey = options.apiKey;\n } else if ('token' in options) {\n this.config.token = options.token;\n } else if ('tokenProvider' in options) {\n this.config.tokenProvider = options.tokenProvider;\n }\n\n // Create retry configuration\n const retryConfig: RetryConfig = {\n ...DEFAULT_RETRY_CONFIG,\n maxRetries: options.maxRetries ?? DEFAULT_RETRY_CONFIG.maxRetries,\n };\n\n // Create HTTP client configuration\n const httpConfig: HttpClientConfig = {\n baseUrl: this.config.baseUrl,\n apiKey: this.config.apiKey,\n token: this.config.token,\n tokenProvider: this.config.tokenProvider,\n orgId: this.config.orgId,\n timeout: this.config.timeout,\n retry: retryConfig,\n headers: this.config.headers,\n };\n\n // Create HTTP client\n this.httpClient = new HttpClient(httpConfig);\n\n // Create stream config getter\n const getStreamConfig = (): StreamConfig => ({\n baseUrl: this.config.baseUrl,\n apiKey: this.config.apiKey,\n token: this.config.token,\n tokenProvider: this.config.tokenProvider,\n orgId: this.config.orgId,\n });\n\n // Initialize resource APIs\n this.agents = new AgentsAPI(this.httpClient, getStreamConfig);\n this.skills = new SkillsAPI(this.httpClient);\n this.tools = new ToolsAPI(this.httpClient);\n this.artifacts = new ArtifactsAPI(this.httpClient);\n this.sessions = new SessionsAPI(this.httpClient, getStreamConfig);\n }\n\n /**\n * Validate client options\n */\n private validateOptions(options: AISaaSClientOptions): void {\n // Check for auth\n const hasApiKey = 'apiKey' in options && options.apiKey;\n const hasToken = 'token' in options && options.token;\n const hasTokenProvider = 'tokenProvider' in options && options.tokenProvider;\n\n if (!hasApiKey && !hasToken && !hasTokenProvider) {\n throw new Error(\n 'Authentication required. Provide apiKey, token, or tokenProvider.'\n );\n }\n\n // Check for orgId\n if (options.orgId === undefined || options.orgId === null) {\n throw new Error('Organization ID (orgId) is required.');\n }\n\n if (typeof options.orgId !== 'number') {\n throw new Error('Organization ID (orgId) must be a number.');\n }\n }\n}\n"]}