@cadraos/sdk 0.1.9 → 0.1.11-test
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chat/index.cjs +157 -50
- package/dist/chat/index.cjs.map +1 -1
- package/dist/chat/index.d.cts +58 -23
- package/dist/chat/index.d.ts +58 -23
- package/dist/chat/index.js +156 -51
- package/dist/chat/index.js.map +1 -1
- package/dist/chat/styles.css +1 -0
- package/dist/index.cjs +52 -30
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +29 -29
- package/dist/index.d.ts +29 -29
- package/dist/index.js +49 -29
- package/dist/index.js.map +1 -1
- package/package.json +6 -12
- package/dist/attachments/index.cjs +0 -879
- package/dist/attachments/index.cjs.map +0 -1
- package/dist/attachments/index.d.cts +0 -185
- package/dist/attachments/index.d.ts +0 -185
- package/dist/attachments/index.js +0 -875
- package/dist/attachments/index.js.map +0 -1
package/dist/chat/index.js.map
CHANGED
|
@@ -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","../../src/chat/adapters/default-adapter.ts","../../src/chat/context/ChatConfigContext.tsx","../../src/chat/hooks/useExecutionStream.ts","../../src/chat/hooks/useAgentChat.ts","../../src/chat/utils/compress-image.ts","../../src/chat/hooks/useFileAttachments.ts","../../src/chat/icons/index.tsx","../../src/chat/components/ChatContainer.tsx","../../src/chat/components/ChatInput.tsx","../../src/chat/components/FileDropZone.tsx","../../src/chat/components/internal-tools/AskUserPrompt.tsx","../../src/chat/components/MarkdownContent.tsx","../../src/chat/components/ToolCallEntry.tsx","../../src/chat/components/ChatMessage.tsx","../../src/chat/components/MessageList.tsx","../../src/chat/components/AgentChat.tsx","../../src/chat/components/internal-tools/TodoList.tsx","../../src/chat/index.ts"],"names":["value","result","useRef","useEffect","useState","useCallback","options","useMemo","jsx","cn","jsxs","ImageIcon","FileIcon","formatFileSize","FileDropZone","Fragment"],"mappings":"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","file":"index.js","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 ExecuteToolDirectRequest,\n ExecuteToolDirectResponse,\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 * Execute a tool directly, bypassing the agent runtime.\n *\n * Enqueues the tool for async processing via BullMQ (no LLM, no ReAct loop).\n * Use SSE or polling with the returned executionId to get the result.\n *\n * @param request - Direct execution request\n * @returns Queued execution response with executionId for tracking\n *\n * @example\n * ```typescript\n * const result = await client.tools.executeDirect({\n * toolUuid: 'tool-uuid',\n * parameters: { prompt: 'Generate an image of a sunset' },\n * });\n * console.log(result.executionId); // Use for polling/SSE\n * console.log(result.status); // 'queued'\n * ```\n */\n async executeDirect(request: ExecuteToolDirectRequest): Promise<ExecuteToolDirectResponse> {\n const idempotencyKey = generateIdempotencyKey();\n return this.httpPost<ExecuteToolDirectResponse>('/execute-direct', request, { 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","/**\n * Default adapter for ChatAdapter — thin wrapper around CadraClient\n *\n * Uses the CadraClient for all operations, providing proper auth,\n * retries, and streaming support out of the box.\n *\n * @module @cadraos/sdk/chat\n */\n\nimport { fetchEventSource } from \"@microsoft/fetch-event-source\";\nimport { AISaaSClient as CadraClient } from \"../../client.js\";\nimport type { ExecutionStreamController } from \"../../streaming/stream-controller.js\";\nimport type {\n Artifact,\n ChatAdapter,\n Execution,\n ExecutionResult,\n ListSessionsInput,\n SendMessageInput,\n SessionHistory,\n SessionList,\n StartExecutionInput,\n StreamEvent,\n StreamSubscriptionCallbacks,\n UploadUrlInput,\n UploadUrlResult,\n} from \"./types.js\";\n\n// =============================================================================\n// CONFIGURATION\n// =============================================================================\n\n/**\n * Configuration for the default HTTP adapter\n */\nexport interface DefaultAdapterConfig {\n /**\n * Pre-constructed CadraClient (takes priority over individual options)\n */\n client?: CadraClient;\n\n /**\n * Base URL for the API\n * @example \"https://api.example.com/v1\"\n */\n baseUrl?: string;\n\n /**\n * API key for authentication\n */\n apiKey?: string;\n\n /**\n * OAuth token for authentication\n */\n token?: string;\n\n /**\n * Token provider callback for dynamic auth\n */\n tokenProvider?: () => Promise<string>;\n\n /**\n * Organization ID for multi-tenant access\n */\n orgId?: number;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Resolve or construct a CadraClient from config\n */\nfunction resolveClient(config: DefaultAdapterConfig): CadraClient {\n if (config.client) return config.client;\n\n if (!config.baseUrl) {\n throw new Error(\"DefaultAdapterConfig requires either 'client' or 'baseUrl'\");\n }\n if (config.orgId === undefined || config.orgId === null) {\n throw new Error(\"DefaultAdapterConfig requires 'orgId' when 'client' is not provided\");\n }\n\n if (config.apiKey) {\n return new CadraClient({\n apiKey: config.apiKey,\n orgId: config.orgId,\n baseUrl: config.baseUrl,\n });\n }\n if (config.token) {\n return new CadraClient({\n token: config.token,\n orgId: config.orgId,\n baseUrl: config.baseUrl,\n });\n }\n if (config.tokenProvider) {\n return new CadraClient({\n tokenProvider: config.tokenProvider,\n orgId: config.orgId,\n baseUrl: config.baseUrl,\n });\n }\n\n throw new Error(\n \"DefaultAdapterConfig requires 'apiKey', 'token', or 'tokenProvider' when 'client' is not provided\"\n );\n}\n\n/**\n * Get the base URL from the config (for raw fetch requests)\n */\nfunction resolveBaseUrl(config: DefaultAdapterConfig): string {\n if (config.baseUrl) return config.baseUrl;\n // Fallback — client was provided without baseUrl; use default\n return \"https://api.cadra.io/v1\";\n}\n\n/**\n * Build auth headers for raw fetch (attachments API)\n */\nasync function getAuthHeaders(\n config: DefaultAdapterConfig\n): Promise<Record<string, string>> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n if (config.apiKey) {\n headers[\"Authorization\"] = `Bearer ${config.apiKey}`;\n } else if (config.token) {\n headers[\"Authorization\"] = `Bearer ${config.token}`;\n } else if (config.tokenProvider) {\n const token = await config.tokenProvider();\n headers[\"Authorization\"] = `Bearer ${token}`;\n }\n\n if (config.orgId !== undefined) {\n headers[\"X-Org-Id\"] = String(config.orgId);\n }\n\n return headers;\n}\n\n/**\n * Raw fetch helper for attachment endpoints (CadraClient doesn't have AttachmentsAPI yet)\n */\nasync function rawRequest<T>(\n config: DefaultAdapterConfig,\n method: string,\n path: string,\n body?: unknown\n): Promise<T> {\n const baseUrl = resolveBaseUrl(config);\n const url = `${baseUrl}${path}`;\n const headers = await getAuthHeaders(config);\n\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n let errorMessage = `HTTP ${response.status}: ${response.statusText}`;\n try {\n const errorData = JSON.parse(errorText);\n if (errorData.message) errorMessage = errorData.message;\n if (errorData.error?.message) errorMessage = errorData.error.message;\n } catch {\n if (errorText) errorMessage = errorText;\n }\n throw new Error(errorMessage);\n }\n\n const text = await response.text();\n if (!text) return undefined as T;\n\n const parsed = JSON.parse(text);\n // Handle { success: true, data: ... } wrapper\n if (parsed && typeof parsed === \"object\" && \"success\" in parsed && parsed.success && \"data\" in parsed) {\n return parsed.data as T;\n }\n return parsed as T;\n}\n\n// =============================================================================\n// ADAPTER FACTORY\n// =============================================================================\n\n/**\n * Create a default adapter that wraps CadraClient\n *\n * @param config - Adapter configuration\n * @returns ChatAdapter implementation backed by CadraClient\n *\n * @example\n * ```typescript\n * // With individual options\n * const adapter = createDefaultAdapter({\n * baseUrl: 'https://api.example.com/v1',\n * apiKey: 'your-api-key',\n * orgId: 123,\n * });\n *\n * // With pre-constructed client\n * const adapter = createDefaultAdapter({ client: myClient });\n * ```\n */\nexport function createDefaultAdapter(config: DefaultAdapterConfig): ChatAdapter {\n const client = resolveClient(config);\n const baseUrl = resolveBaseUrl(config);\n\n return {\n // -------------------------------------------------------------------------\n // Execution Methods\n // -------------------------------------------------------------------------\n\n async startExecution(input: StartExecutionInput): Promise<ExecutionResult> {\n // Build tenant context - always include tenantOrgId so tool calls are\n // scoped to the correct tenant org, not cadra's internal org.\n const tenantContext = config.orgId ? { tenantOrgId: config.orgId } : {};\n\n if (input.sessionId) {\n // Continue existing session\n const result = await client.sessions.sendMessage(input.sessionId, {\n message: input.content,\n attachmentIds: input.attachmentUuids,\n context: tenantContext,\n });\n return {\n executionId: result.executionId,\n sessionId: result.sessionId ?? input.sessionId,\n };\n }\n\n // New execution\n // For team execution, the execute endpoint ignores the path agent ID\n // when teamUuid is present, so use teamId as fallback for the path param\n const pathId = input.agentId || input.teamId || '';\n const result = await client.agents.execute(pathId, {\n task: input.content,\n context: tenantContext,\n attachmentIds: input.attachmentUuids,\n teamUuid: input.teamId,\n });\n return {\n executionId: result.executionId,\n sessionId: result.sessionId ?? \"\",\n };\n },\n\n async sendMessage(input: SendMessageInput): Promise<ExecutionResult> {\n const result = await client.sessions.sendMessage(input.sessionId, {\n message: input.content,\n attachmentIds: input.attachmentUuids,\n // Always include tenantOrgId so follow-up messages use the correct\n // tenant org for tool calls (not cadra's internal org).\n context: config.orgId ? { tenantOrgId: config.orgId } : undefined,\n });\n return {\n executionId: result.executionId,\n sessionId: result.sessionId ?? input.sessionId,\n };\n },\n\n async cancelExecution(uuid: string): Promise<void> {\n await client.agents.cancelExecution(uuid);\n },\n\n async getExecution(uuid: string): Promise<Execution> {\n const exec = await client.agents.getExecution(uuid);\n return {\n uuid: exec.uuid,\n status: exec.status === \"queued\" ? \"pending\" : exec.status as Execution[\"status\"],\n result: exec.output,\n error: exec.error,\n };\n },\n\n // -------------------------------------------------------------------------\n // Attachment Methods (raw fetch — CadraClient has no AttachmentsAPI yet)\n // -------------------------------------------------------------------------\n\n async getUploadUrl(input: UploadUrlInput): Promise<UploadUrlResult> {\n return rawRequest<UploadUrlResult>(config, \"POST\", \"/attachments/upload-url\", {\n sessionId: input.sessionId,\n filename: input.filename,\n mimeType: input.mimeType,\n size: input.size,\n });\n },\n\n async confirmUpload(uuid: string): Promise<void> {\n await rawRequest<void>(config, \"POST\", `/attachments/${uuid}/confirm`);\n },\n\n async getDownloadUrl(uuid: string): Promise<string> {\n const result = await rawRequest<{ url: string }>(config, \"GET\", `/attachments/${uuid}/download-url`);\n return result.url;\n },\n\n // -------------------------------------------------------------------------\n // Artifact Methods\n // -------------------------------------------------------------------------\n\n async getSessionArtifacts(sessionId: string): Promise<Artifact[]> {\n const result = await client.sessions.listArtifacts(sessionId);\n return (result.data ?? []).map((a: any) => ({\n uuid: a.uuid,\n type: a.type as Artifact[\"type\"],\n filename: a.filename,\n mimeType: a.mimeType,\n url: a.url,\n createdAt: a.createdAt,\n }));\n },\n\n // -------------------------------------------------------------------------\n // Session History Methods\n // -------------------------------------------------------------------------\n\n async getSessionHistory(sessionId: string): Promise<SessionHistory> {\n const history = await client.sessions.getHistory(sessionId);\n return {\n sessionId: history.session.id,\n agentId: history.session.agentUuid,\n messages: history.messages.map((m: any) => ({\n uuid: m.id,\n role: m.role as \"user\" | \"assistant\",\n content: m.content,\n timestamp: m.timestamp,\n })),\n createdAt: history.session.createdAt,\n updatedAt: history.session.lastMessageAt,\n };\n },\n\n // -------------------------------------------------------------------------\n // Session List Methods\n // -------------------------------------------------------------------------\n\n async listSessions(input: ListSessionsInput): Promise<SessionList> {\n const result = await client.sessions.list({\n agentUuid: input.agentId,\n limit: input.limit,\n offset: input.offset,\n });\n return {\n sessions: result.data.map((s: any) => ({\n id: s.id,\n agentId: s.agentUuid,\n createdAt: s.createdAt,\n lastMessageAt: s.lastMessageAt,\n messageCount: s.messageCount,\n lastUserMessage: s.lastUserMessage,\n })),\n total: result.pagination.total,\n hasMore: result.pagination.hasMore,\n };\n },\n\n // -------------------------------------------------------------------------\n // Stream Methods\n // -------------------------------------------------------------------------\n\n createStream(executionId: string, sessionId?: string): ExecutionStreamController {\n return client.agents.streamExecution(executionId, sessionId);\n },\n\n // -------------------------------------------------------------------------\n // SSE Stream URL (legacy backward compat)\n // -------------------------------------------------------------------------\n\n /**\n * @deprecated Use subscribeToStream() instead. getStreamUrl() exposes\n * API keys in URLs which are logged by browsers, proxies, and servers.\n */\n getStreamUrl(executionId: string): string {\n // Warn once per session in development mode\n if (typeof window !== \"undefined\" && process.env.NODE_ENV !== \"production\") {\n const warnKey = \"__cadra_getStreamUrl_deprecated__\";\n const win = window as unknown as Record<string, boolean>;\n if (!win[warnKey]) {\n win[warnKey] = true;\n console.warn(\n \"[CadraOS SDK] getStreamUrl() is deprecated. Use subscribeToStream() instead \" +\n \"which provides secure header-based auth. API keys in URLs are a security risk.\"\n );\n }\n }\n return `${baseUrl}/agents/runs/${executionId}/stream`;\n },\n\n // -------------------------------------------------------------------------\n // Secure SSE Streaming (Recommended)\n // -------------------------------------------------------------------------\n\n subscribeToStream(\n executionId: string,\n callbacks: StreamSubscriptionCallbacks\n ): () => void {\n const abortController = new AbortController();\n const url = `${baseUrl}/api/v1/agents/runs/${executionId}/stream`;\n\n // Build auth headers\n const getHeaders = async (): Promise<Record<string, string>> => {\n const headers: Record<string, string> = {\n Accept: \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n };\n\n if (config.apiKey) {\n headers[\"Authorization\"] = `Bearer ${config.apiKey}`;\n } else if (config.token) {\n headers[\"Authorization\"] = `Bearer ${config.token}`;\n } else if (config.tokenProvider) {\n const token = await config.tokenProvider();\n headers[\"Authorization\"] = `Bearer ${token}`;\n }\n\n if (config.orgId !== undefined) {\n headers[\"X-Org-Id\"] = String(config.orgId);\n }\n\n return headers;\n };\n\n // Terminal event types that signal stream completion\n const terminalEvents = new Set([\"complete\", \"failed\", \"error\"]);\n\n // Start the SSE connection\n (async () => {\n try {\n const headers = await getHeaders();\n callbacks.onConnectionChange?.(true);\n\n await fetchEventSource(url, {\n method: \"GET\",\n headers,\n signal: abortController.signal,\n openWhenHidden: true, // Keep connection open even when tab is hidden\n\n onopen: async (response) => {\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`SSE connection failed: ${response.status} - ${errorText}`);\n }\n },\n\n onmessage: (ev) => {\n // Skip keepalive comments\n if (!ev.event || ev.event === \"\") {\n return;\n }\n\n let data: unknown;\n try {\n data = ev.data ? JSON.parse(ev.data) : {};\n } catch {\n data = ev.data;\n }\n\n const event: StreamEvent = {\n type: ev.event,\n id: ev.id,\n data,\n };\n\n callbacks.onEvent(event);\n\n // Check for terminal events\n if (terminalEvents.has(ev.event)) {\n callbacks.onComplete?.();\n abortController.abort();\n }\n },\n\n onerror: (err) => {\n callbacks.onConnectionChange?.(false);\n callbacks.onError?.(err instanceof Error ? err : new Error(String(err)));\n // Re-throw to stop retrying on fatal errors\n throw err;\n },\n\n onclose: () => {\n callbacks.onConnectionChange?.(false);\n },\n });\n } catch (err) {\n // Ignore abort errors\n if (err instanceof Error && err.name === \"AbortError\") {\n return;\n }\n callbacks.onConnectionChange?.(false);\n callbacks.onError?.(err instanceof Error ? err : new Error(String(err)));\n }\n })();\n\n // Return cleanup function\n return () => {\n abortController.abort();\n callbacks.onConnectionChange?.(false);\n };\n },\n };\n}\n","\"use client\";\n\n/**\n * ChatConfigContext - Configuration provider for SDK chat components\n *\n * Provides a default adapter via context so that AgentChat can be used\n * without explicitly passing an adapter prop.\n *\n * @module @cadraos/sdk/chat\n */\n\nimport * as React from \"react\";\nimport { createContext, useContext, useMemo } from \"react\";\nimport { createDefaultAdapter, type DefaultAdapterConfig } from \"../adapters/default-adapter.js\";\nimport type { ChatAdapter } from \"../adapters/types.js\";\n\n// =============================================================================\n// CONTEXT\n// =============================================================================\n\ninterface ChatConfigContextValue {\n /** The configured adapter instance */\n adapter: ChatAdapter;\n}\n\nconst ChatConfigContext = createContext<ChatConfigContextValue | null>(null);\n\n// =============================================================================\n// PROVIDER\n// =============================================================================\n\nexport interface ChatConfigProviderProps {\n /**\n * Configuration for the default HTTP adapter\n */\n config: DefaultAdapterConfig;\n /**\n * Child components\n */\n children: React.ReactNode;\n}\n\n/**\n * Provider component that configures the default adapter for all child AgentChat components\n *\n * @example\n * ```tsx\n * import { ChatConfigProvider, AgentChat } from '@cadraos/sdk/chat';\n *\n * function App() {\n * return (\n * <ChatConfigProvider config={{\n * baseUrl: 'https://api.example.com/api/v1/external',\n * apiKey: 'your-api-key',\n * orgId: 123,\n * }}>\n * <AgentChat agentId=\"agent-uuid\" />\n * </ChatConfigProvider>\n * );\n * }\n * ```\n */\nexport function ChatConfigProvider({ config, children }: ChatConfigProviderProps) {\n const adapter = useMemo(\n () => createDefaultAdapter(config),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [config.baseUrl, config.apiKey, config.token, config.tokenProvider, config.orgId, config.client]\n );\n\n const value = useMemo(() => ({ adapter }), [adapter]);\n\n return (\n <ChatConfigContext.Provider value={value}>\n {children}\n </ChatConfigContext.Provider>\n );\n}\n\n// =============================================================================\n// HOOK\n// =============================================================================\n\n/**\n * Hook to access the chat configuration from context\n *\n * @returns The chat configuration context value\n * @throws Error if used outside of ChatConfigProvider\n */\nexport function useChatConfig(): ChatConfigContextValue {\n const context = useContext(ChatConfigContext);\n if (!context) {\n throw new Error(\n \"useChatConfig must be used within ChatConfigProvider or provide adapter prop to AgentChat\"\n );\n }\n return context;\n}\n\n/**\n * Hook to optionally access the chat configuration from context\n *\n * @returns The chat configuration context value, or null if not available\n */\nexport function useChatConfigOptional(): ChatConfigContextValue | null {\n return useContext(ChatConfigContext);\n}\n","\"use client\";\n\n/**\n * useExecutionStream - Real-time SSE streaming hook for agent executions\n *\n * Connects to the SSE endpoint to receive real-time events from agent execution.\n * Falls back to polling if SSE connection fails or is unavailable.\n *\n * Ported from: ai-saas-v2/src/extensions/agents/hooks/useExecutionStream.ts\n *\n * @module @cadraos/sdk/chat\n */\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { ClarificationData, ExecutionStreamEvent } from \"../types.js\";\n\n// =============================================================================\n// CONFIGURATION (inline - no external dependencies)\n// =============================================================================\n\n/**\n * SSE Configuration constants\n * These replace SSE_CONFIG from ai-saas-v2\n */\nconst STREAM_CONFIG = {\n /** Maximum reconnection attempts before falling back to polling */\n maxReconnectAttempts: 5,\n /** Base reconnection delay in milliseconds (uses exponential backoff) */\n baseReconnectDelayMs: 1000,\n /** Maximum reconnection delay in milliseconds */\n maxReconnectDelayMs: 10000,\n /** Client-side activity timeout - should be 3x keepalive interval */\n clientActivityTimeoutMs: 45000,\n} as const;\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface UseExecutionStreamOptions {\n /** Execution ID to stream events for */\n executionId: string | undefined;\n /** Function to get stream URL - allows adapter pattern */\n getStreamUrl: (executionId: string) => string;\n /** Whether streaming is enabled */\n enabled?: boolean;\n /** Callback for all events */\n onEvent?: (event: ExecutionStreamEvent) => void;\n /** Callback for log events */\n onLog?: (log: NonNullable<ExecutionStreamEvent[\"data\"][\"log\"]>) => void;\n /** Callback when a tool is called */\n onToolCall?: (toolName: string, args: unknown) => void;\n /** Callback when a tool returns a result */\n onToolResult?: (toolName: string, result: unknown, durationMs: number) => void;\n /** Callback for progress updates */\n onProgress?: (data: {\n iteration?: number;\n tokenUsage?: { prompt: number; completion: number; total: number };\n cost?: number;\n }) => void;\n /** Callback when execution completes */\n onComplete?: () => void;\n /** Callback when an error occurs */\n onError?: (error: string) => void;\n /** Callback when agent needs clarification */\n onClarification?: (data: ClarificationData) => void;\n /** Callback when connection status changes */\n onConnectionChange?: (connected: boolean, usingFallback: boolean) => void;\n}\n\nexport interface UseExecutionStreamResult {\n /** Whether SSE is currently connected */\n isConnected: boolean;\n /** Whether using polling fallback */\n isUsingFallback: boolean;\n /** Connection error message if any */\n connectionError: string | null;\n /** Disconnect from the stream */\n disconnect: () => void;\n /** Reconnect to the stream */\n reconnect: () => void;\n}\n\n// =============================================================================\n// HOOK IMPLEMENTATION\n// =============================================================================\n\n/**\n * Hook for streaming agent execution events via SSE\n *\n * @deprecated Prefer using `adapter.createStream()` which provides\n * fetch-based SSE with auth headers, automatic reconnection, and\n * polling fallback. This hook is kept for backward compatibility\n * with adapters that only implement `getStreamUrl`.\n *\n * @example\n * ```typescript\n * const { isConnected, disconnect } = useExecutionStream({\n * executionId: currentExecutionId,\n * getStreamUrl: (id) => adapter.getStreamUrl(id),\n * onLog: (log) => console.log(log.message),\n * onComplete: () => console.log('Done!'),\n * });\n * ```\n */\nexport function useExecutionStream(\n options: UseExecutionStreamOptions\n): UseExecutionStreamResult {\n const {\n executionId,\n getStreamUrl,\n enabled = true,\n onEvent,\n onLog,\n onToolCall,\n onToolResult,\n onProgress,\n onComplete,\n onError,\n onClarification,\n onConnectionChange,\n } = options;\n\n const [isConnected, setIsConnected] = useState(false);\n const [isUsingFallback, setIsUsingFallback] = useState(false);\n const [connectionError, setConnectionError] = useState<string | null>(null);\n\n const eventSourceRef = useRef<EventSource | null>(null);\n const reconnectTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const activityTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const reconnectAttemptsRef = useRef(0);\n const seenEventIdsRef = useRef<Set<string>>(new Set());\n const isTerminatedRef = useRef(false);\n\n /**\n * Clean up EventSource connection\n */\n const cleanup = useCallback(() => {\n if (reconnectTimeoutRef.current) {\n clearTimeout(reconnectTimeoutRef.current);\n reconnectTimeoutRef.current = null;\n }\n if (activityTimeoutRef.current) {\n clearTimeout(activityTimeoutRef.current);\n activityTimeoutRef.current = null;\n }\n if (eventSourceRef.current) {\n eventSourceRef.current.close();\n eventSourceRef.current = null;\n }\n seenEventIdsRef.current.clear();\n setIsConnected(false);\n }, []);\n\n /**\n * Reset activity timeout - called when any event is received\n */\n const resetActivityTimeout = useCallback(() => {\n if (activityTimeoutRef.current) {\n clearTimeout(activityTimeoutRef.current);\n }\n if (isTerminatedRef.current) return;\n\n activityTimeoutRef.current = setTimeout(() => {\n if (eventSourceRef.current) {\n eventSourceRef.current.close();\n eventSourceRef.current = null;\n setIsConnected(false);\n }\n }, STREAM_CONFIG.clientActivityTimeoutMs);\n }, []);\n\n /**\n * Handle incoming SSE events\n */\n const handleEvent = useCallback(\n (event: MessageEvent) => {\n console.log('[useExecutionStream] Event received:', event.type, event.data);\n try {\n resetActivityTimeout();\n const parsed: ExecutionStreamEvent = JSON.parse(event.data);\n console.log('[useExecutionStream] Parsed event:', parsed.type, parsed);\n\n // Deduplicate by event ID\n if (parsed.id && seenEventIdsRef.current.has(parsed.id)) {\n return;\n }\n if (parsed.id) {\n seenEventIdsRef.current.add(parsed.id);\n // Limit Set size to prevent memory leaks\n if (seenEventIdsRef.current.size > 1000) {\n const idsArray = Array.from(seenEventIdsRef.current);\n seenEventIdsRef.current = new Set(idsArray.slice(-500));\n }\n }\n\n // Call generic event handler\n onEvent?.(parsed);\n\n // Handle specific event types\n const eventType = parsed.type;\n const data = parsed.data;\n\n switch (eventType) {\n case \"log\":\n if (data.log) {\n onLog?.(data.log);\n\n // Dispatch specific log type handlers\n if (data.log.logType === \"tool_call\") {\n const toolName = data.log.metadata?.toolName as string;\n const args = data.log.metadata?.inputs;\n if (toolName) {\n onToolCall?.(toolName, args);\n }\n } else if (data.log.logType === \"tool_result\") {\n const toolName = data.log.metadata?.toolName as string;\n const result = data.log.metadata?.output;\n const durationMs = data.log.durationMs ?? 0;\n if (toolName) {\n onToolResult?.(toolName, result, durationMs);\n }\n }\n }\n break;\n\n case \"step\":\n onProgress?.({\n iteration: data.iteration as number | undefined,\n tokenUsage: data.tokenUsage as { prompt: number; completion: number; total: number } | undefined,\n cost: data.cost as number | undefined,\n });\n break;\n\n case \"tool_call\":\n if (data.toolName) {\n onToolCall?.(data.toolName as string, data.args);\n }\n break;\n\n case \"complete\":\n isTerminatedRef.current = true;\n if (activityTimeoutRef.current) {\n clearTimeout(activityTimeoutRef.current);\n activityTimeoutRef.current = null;\n }\n onComplete?.();\n break;\n\n case \"error\":\n const errorMsg = data.error || \"Unknown error\";\n isTerminatedRef.current = true;\n if (activityTimeoutRef.current) {\n clearTimeout(activityTimeoutRef.current);\n activityTimeoutRef.current = null;\n }\n onError?.(errorMsg as string);\n break;\n\n case \"timeout\":\n if (data.retryable && reconnectAttemptsRef.current < STREAM_CONFIG.maxReconnectAttempts) {\n reconnectAttemptsRef.current++;\n const delay = Math.min(\n STREAM_CONFIG.baseReconnectDelayMs * Math.pow(2, reconnectAttemptsRef.current),\n STREAM_CONFIG.maxReconnectDelayMs\n );\n setConnectionError(\"Stream timeout, reconnecting...\");\n reconnectTimeoutRef.current = setTimeout(() => {\n setConnectionError(null);\n }, delay);\n } else {\n setConnectionError(\"Stream timeout, using polling\");\n setIsUsingFallback(true);\n onConnectionChange?.(false, true);\n onError?.(\"Stream connection timed out. Updates will continue via polling.\");\n }\n break;\n\n case \"info\":\n if (data.fallback === \"polling\") {\n setIsUsingFallback(true);\n onConnectionChange?.(true, true);\n }\n break;\n\n case \"connected\":\n case \"subscribed\":\n setIsConnected(true);\n setIsUsingFallback(data.redisAvailable === false);\n onConnectionChange?.(true, data.redisAvailable === false);\n break;\n\n case \"clarification\":\n if (data.question) {\n onClarification?.({\n question: data.question as string,\n reason: data.reason as string | undefined,\n suggestedOptions: data.suggestedOptions as string[] | undefined,\n });\n }\n break;\n }\n } catch {\n // Parse error - ignore malformed events\n }\n },\n [\n onEvent,\n onLog,\n onToolCall,\n onToolResult,\n onProgress,\n onComplete,\n onError,\n onClarification,\n onConnectionChange,\n resetActivityTimeout,\n ]\n );\n\n /**\n * Connect to SSE endpoint\n */\n const connect = useCallback(() => {\n console.log('[useExecutionStream] connect called', { executionId, enabled });\n\n if (!executionId || !enabled) {\n console.log('[useExecutionStream] Skipping - executionId or enabled is falsy');\n return;\n }\n\n cleanup();\n isTerminatedRef.current = false;\n\n const url = getStreamUrl(executionId);\n console.log('[useExecutionStream] Connecting to:', url);\n\n try {\n const eventSource = new EventSource(url, {\n withCredentials: true,\n });\n console.log('[useExecutionStream] EventSource created');\n\n eventSource.onopen = () => {\n console.log('[useExecutionStream] EventSource onopen');\n reconnectAttemptsRef.current = 0;\n setConnectionError(null);\n resetActivityTimeout();\n };\n\n eventSource.onerror = (err) => {\n console.log('[useExecutionStream] EventSource onerror', { readyState: eventSource.readyState, err });\n if (eventSource.readyState === EventSource.CLOSED) {\n setIsConnected(false);\n\n if (reconnectAttemptsRef.current < STREAM_CONFIG.maxReconnectAttempts) {\n reconnectAttemptsRef.current++;\n const delay = Math.min(\n STREAM_CONFIG.baseReconnectDelayMs * Math.pow(2, reconnectAttemptsRef.current),\n STREAM_CONFIG.maxReconnectDelayMs\n );\n\n reconnectTimeoutRef.current = setTimeout(() => {\n connect();\n }, delay);\n } else {\n setConnectionError(\"Connection failed, using polling\");\n setIsUsingFallback(true);\n onConnectionChange?.(false, true);\n }\n }\n };\n\n // Listen for specific named events\n const eventTypes = [\n \"connected\",\n \"subscribed\",\n \"log\",\n \"step\",\n \"tool_call\",\n \"complete\",\n \"error\",\n \"info\",\n \"timeout\",\n \"clarification\",\n ];\n\n for (const eventType of eventTypes) {\n eventSource.addEventListener(eventType, handleEvent);\n }\n\n // For any unnamed events (fallback)\n eventSource.onmessage = handleEvent;\n\n eventSourceRef.current = eventSource;\n } catch {\n setConnectionError(\"Failed to connect to stream\");\n setIsUsingFallback(true);\n onConnectionChange?.(false, true);\n }\n }, [executionId, enabled, getStreamUrl, cleanup, handleEvent, onConnectionChange, resetActivityTimeout]);\n\n /**\n * Disconnect from SSE\n */\n const disconnect = useCallback(() => {\n cleanup();\n }, [cleanup]);\n\n /**\n * Reconnect to SSE\n */\n const reconnect = useCallback(() => {\n reconnectAttemptsRef.current = 0;\n isTerminatedRef.current = false;\n setConnectionError(null);\n setIsUsingFallback(false);\n connect();\n }, [connect]);\n\n // Connect when executionId changes\n useEffect(() => {\n console.log('[useExecutionStream] useEffect triggered', { executionId, enabled });\n if (executionId && enabled) {\n console.log('[useExecutionStream] Calling connect()');\n connect();\n }\n\n return () => {\n cleanup();\n };\n }, [executionId, enabled, connect, cleanup]);\n\n return {\n isConnected,\n isUsingFallback,\n connectionError,\n disconnect,\n reconnect,\n };\n}\n","\"use client\";\n\n/**\n * useAgentChat - Main state management hook for the chat component\n *\n * Provides:\n * - Message state management\n * - Streaming via ExecutionStreamController (preferred) or legacy useExecutionStream\n * - Error handling\n * - Session management\n * - Adapter integration\n *\n * @module @cadraos/sdk/chat\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { ChatAdapter, HistoryMessage } from \"../adapters/types.js\";\nimport { useChatConfigOptional } from \"../context/ChatConfigContext.js\";\nimport type { ExecutionStreamController } from \"../../streaming/stream-controller.js\";\nimport type { ExecutionLog } from \"../../types/agents.js\";\nimport type {\n ChatError,\n ChatMessage,\n ClarificationData,\n ExecutionStreamEvent,\n ToolCall,\n} from \"../types.js\";\nimport { useExecutionStream } from \"./useExecutionStream.js\";\n\n// =============================================================================\n// SILENT META-TOOLS\n// =============================================================================\n// Meta-tools that should not produce visible entries in the chat UI.\n// These are internal polling/monitoring tools called repeatedly during\n// team execution that would otherwise flood the chat with spam.\n// =============================================================================\nconst SILENT_TOOL_NAMES = new Set([\n \"check_delegations\",\n]);\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Generate a unique ID for messages\n */\nfunction generateId(): string {\n return `msg-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n}\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface UseAgentChatOptions {\n /**\n * UUID of the agent to chat with.\n * Optional when teamId is provided (team execution routes to team's lead orchestrator).\n */\n agentId?: string;\n /** Optional team UUID for team-based execution (routes to team's lead orchestrator) */\n teamId?: string;\n /**\n * Session ID to resume an existing conversation\n * If provided, the hook will attempt to load the session history on mount\n */\n sessionId?: string;\n /** Custom adapter (optional - uses context if not provided) */\n adapter?: ChatAdapter;\n /** Initial messages to populate the chat */\n initialMessages?: ChatMessage[];\n /** Callback fired when a new message is added */\n onMessage?: (message: ChatMessage) => void;\n /** Callback fired when an error occurs */\n onError?: (error: ChatError) => void;\n /**\n * Callback fired when a new session is created\n * Called with the sessionId when starting a new chat (no existing sessionId)\n * Useful for updating external state like session lists\n */\n onSessionCreated?: (sessionId: string) => void;\n /** @deprecated Use onSessionCreated instead */\n onSessionStart?: (sessionId: string) => void;\n /** Callback fired when a tool is called */\n onToolCall?: (toolName: string, args: unknown) => void;\n /** Callback fired when a tool result is received */\n onToolResult?: (toolName: string, result: unknown, durationMs?: number) => void;\n /** Callback fired when clarification is needed */\n onClarification?: (data: ClarificationData) => void;\n}\n\n/**\n * Options for sendMessage\n */\nexport interface SendMessageOptions {\n /** UUIDs of attached files to include with the message */\n attachmentUuids?: string[];\n}\n\nexport interface UseAgentChatResult {\n /** Current messages in the chat */\n messages: ChatMessage[];\n /** Whether a message is being sent */\n isLoading: boolean;\n /** Whether the assistant is currently streaming */\n isStreaming: boolean;\n /** Whether session history is being loaded */\n isLoadingHistory: boolean;\n /** Current error if any */\n error: ChatError | null;\n /** Current session ID */\n sessionId: string | null;\n /** Current clarification request if any */\n clarification: ClarificationData | null;\n /** Send a message to the agent */\n sendMessage: (content: string, options?: SendMessageOptions) => Promise<void>;\n /** Respond to a clarification request */\n respondToClarification: (response: string) => Promise<void>;\n /** Cancel the current execution */\n cancel: () => Promise<void>;\n /** Retry the last failed message */\n retry: () => void;\n /** Clear the current error */\n clearError: () => void;\n /** Clear all messages and start a new session */\n clearMessages: () => void;\n /**\n * Load history for a specific session\n * @param sessionId - Session ID to load\n * @returns Promise that resolves when history is loaded\n */\n loadSession: (sessionId: string) => Promise<void>;\n}\n\n// =============================================================================\n// HOOK IMPLEMENTATION\n// =============================================================================\n\n/**\n * Convert a history message to a ChatMessage\n */\nfunction historyToMessage(historyMsg: HistoryMessage): ChatMessage {\n return {\n id: historyMsg.uuid,\n role: historyMsg.role,\n content: historyMsg.content,\n timestamp: new Date(historyMsg.timestamp),\n attachments: historyMsg.attachments?.map((a) => ({\n uuid: a.uuid,\n filename: a.filename,\n mimeType: a.mimeType,\n size: a.size,\n category: a.category,\n previewUrl: a.previewUrl,\n thumbnailUrl: a.thumbnailUrl,\n status: \"ready\" as const,\n })),\n toolCalls: historyMsg.toolCalls?.map((tc) => ({\n id: tc.id,\n name: tc.name,\n args: tc.args,\n result: tc.result,\n status: tc.status,\n durationMs: tc.durationMs,\n })),\n };\n}\n\n/**\n * Main hook for managing chat state and interactions\n *\n * @example\n * ```typescript\n * const {\n * messages,\n * isLoading,\n * isStreaming,\n * sendMessage,\n * error,\n * } = useAgentChat({\n * agentId: 'agent-uuid',\n * adapter: myAdapter,\n * onMessage: (msg) => console.log('New message:', msg),\n * });\n *\n * // Send a message\n * await sendMessage('Hello, agent!');\n * ```\n */\nexport function useAgentChat(options: UseAgentChatOptions): UseAgentChatResult {\n const {\n agentId,\n teamId,\n sessionId: initialSessionId,\n adapter: propsAdapter,\n initialMessages = [],\n onMessage,\n onError,\n onSessionCreated,\n onSessionStart, // Deprecated, but still supported\n onToolCall,\n onToolResult,\n onClarification,\n } = options;\n\n // Get adapter from props or context\n const contextConfig = useChatConfigOptional();\n const adapter = propsAdapter ?? contextConfig?.adapter;\n\n if (!adapter) {\n throw new Error(\n \"No adapter provided. Use ChatConfigProvider or pass adapter prop to AgentChat.\"\n );\n }\n\n // Determine if we should use the new stream controller path\n const useStreamController = !!adapter.createStream;\n\n // Store callback props in refs to avoid stale closures.\n // The stream controller captures event listeners at connection time.\n // If callback identities change after connection (e.g., due to parent\n // re-renders or useCallback dep changes), the captured closures become stale.\n // Using refs ensures we always invoke the latest callback.\n const onToolCallRef = useRef(onToolCall);\n const onToolResultRef = useRef(onToolResult);\n useEffect(() => { onToolCallRef.current = onToolCall; }, [onToolCall]);\n useEffect(() => { onToolResultRef.current = onToolResult; }, [onToolResult]);\n\n // State\n const [messages, setMessages] = useState<ChatMessage[]>(initialMessages);\n const [isLoading, setIsLoading] = useState(false);\n const [isLoadingHistory, setIsLoadingHistory] = useState(false);\n const [error, setError] = useState<ChatError | null>(null);\n const [currentSessionId, setCurrentSessionId] = useState<string | null>(initialSessionId ?? null);\n const [currentExecutionId, setCurrentExecutionId] = useState<string | null>(null);\n const [clarification, setClarification] = useState<ClarificationData | null>(null);\n // Track streaming state for the new stream controller path\n const [isStreamControllerConnected, setIsStreamControllerConnected] = useState(false);\n\n // Track if we've already loaded the initial session\n const hasLoadedInitialSession = useRef(false);\n // Track sessions created internally by sendMessage (to avoid loading history for them)\n const internallyCreatedSessionRef = useRef<string | null>(null);\n\n // Refs for streaming content\n const streamingContentRef = useRef<string>(\"\");\n const streamingMessageIdRef = useRef<string | null>(null);\n const pendingToolCallsRef = useRef<Map<string, ToolCall>>(new Map());\n const lastMessageContentRef = useRef<string>(\"\");\n // Track tool call IDs whose onToolResult callback has already been invoked\n // to prevent duplicate invocations from log + dedicated event paths\n const firedToolResultsRef = useRef<Set<string>>(new Set());\n\n // Stream controller ref for the new path\n const streamControllerRef = useRef<ExecutionStreamController | null>(null);\n\n /**\n * Update the streaming message content\n */\n const updateStreamingMessage = useCallback((content: string) => {\n if (!streamingMessageIdRef.current) return;\n\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === streamingMessageIdRef.current\n ? { ...msg, content, isStreaming: true }\n : msg\n )\n );\n }, []);\n\n /**\n * Add or update a tool call on the streaming message.\n *\n * When the streaming message ref is still active, updates target that message.\n * When the ref has been cleared (e.g., after 'complete' event finalized the message),\n * falls back to the last assistant message so late-arriving tool_result events\n * (common due to Redis cross-channel race conditions) still get applied.\n */\n const updateToolCall = useCallback((toolCall: ToolCall) => {\n setMessages((prev) => {\n // Determine target message: active streaming message, or last assistant message as fallback\n const targetId = streamingMessageIdRef.current\n ?? [...prev].reverse().find((m) => m.role === \"assistant\")?.id;\n\n if (!targetId) return prev;\n\n return prev.map((msg) => {\n if (msg.id !== targetId) return msg;\n\n const existingIndex = msg.toolCalls?.findIndex((tc) => tc.id === toolCall.id) ?? -1;\n\n if (existingIndex >= 0) {\n // Update existing tool call\n const newToolCalls = [...(msg.toolCalls ?? [])];\n newToolCalls[existingIndex] = toolCall;\n return { ...msg, toolCalls: newToolCalls };\n } else {\n // Add new tool call\n return {\n ...msg,\n toolCalls: [...(msg.toolCalls ?? []), toolCall],\n };\n }\n });\n });\n }, []);\n\n /**\n * Finalize the streaming message\n */\n const finalizeStreamingMessage = useCallback(() => {\n if (!streamingMessageIdRef.current) return;\n\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === streamingMessageIdRef.current\n ? { ...msg, isStreaming: false }\n : msg\n )\n );\n\n streamingMessageIdRef.current = null;\n streamingContentRef.current = \"\";\n pendingToolCallsRef.current.clear();\n firedToolResultsRef.current.clear();\n }, []);\n\n /**\n * Handle an ExecutionLog from the stream controller.\n * Maps ExecutionLog format to the same handling as legacy SSE log events.\n */\n const handleExecutionLog = useCallback(\n (log: ExecutionLog) => {\n console.log('[useAgentChat] handleExecutionLog:', log.type, log.metadata);\n\n switch (log.type) {\n // Primary handlers for ai-saas-api worker log types\n case \"llm_response\": {\n // Only use metadata.text — never fall back to log.title which is the\n // generic label \"LLM Response\" and should not appear in the chat.\n const llmText = (log.metadata?.text as string) || \"\";\n if (llmText) {\n streamingContentRef.current = llmText;\n updateStreamingMessage(llmText);\n }\n break;\n }\n\n case \"message\": {\n const role = log.metadata?.role as string;\n const content = log.metadata?.content as string;\n if (role === \"assistant\" && content) {\n streamingContentRef.current = content;\n updateStreamingMessage(content);\n }\n break;\n }\n\n case \"info\":\n case \"system\":\n console.log('[useAgentChat] Status:', log.type, log.title);\n break;\n\n case \"tool_call\": {\n const toolName = log.metadata?.toolName as string;\n // Skip silent meta-tools (e.g., check_delegations) to avoid UI spam\n if (SILENT_TOOL_NAMES.has(toolName)) break;\n\n const toolCallId = (log.metadata?.toolCallId as string) || `tool-${Date.now()}`;\n const args = log.metadata?.inputs as Record<string, unknown>;\n\n const newToolCall: ToolCall = {\n id: toolCallId,\n name: toolName,\n args,\n status: \"running\",\n };\n\n pendingToolCallsRef.current.set(toolCallId, newToolCall);\n updateToolCall(newToolCall);\n onToolCallRef.current?.(toolName, args);\n break;\n }\n\n case \"tool_result\": {\n const resultToolName = log.metadata?.toolName as string;\n // Skip silent meta-tools (e.g., check_delegations) to avoid UI spam\n if (SILENT_TOOL_NAMES.has(resultToolName)) break;\n\n const resultToolCallId = log.metadata?.toolCallId as string;\n const result = log.metadata?.output;\n const durationMs = log.durationMs;\n\n let matchedToolCall = resultToolCallId\n ? pendingToolCallsRef.current.get(resultToolCallId)\n : undefined;\n\n if (!matchedToolCall) {\n for (const [, tc] of pendingToolCallsRef.current) {\n if (tc.name === resultToolName && tc.status === \"running\") {\n matchedToolCall = tc;\n break;\n }\n }\n }\n\n if (matchedToolCall) {\n const completedToolCall: ToolCall = {\n ...matchedToolCall,\n result,\n status: \"completed\",\n durationMs,\n };\n updateToolCall(completedToolCall);\n pendingToolCallsRef.current.delete(matchedToolCall.id);\n } else if (resultToolCallId) {\n // Late-arriving tool_result after finalization cleared the pending map.\n // Create a synthetic completed tool call so updateToolCall can match\n // it against the existing message's toolCalls array by ID.\n const lateToolCall: ToolCall = {\n id: resultToolCallId,\n name: resultToolName || \"unknown\",\n args: {},\n result,\n status: \"completed\",\n durationMs,\n };\n updateToolCall(lateToolCall);\n }\n // Mark this toolCallId as having fired onToolResult to prevent\n // duplicate invocations from the dedicated toolResult event path\n if (resultToolCallId) {\n firedToolResultsRef.current.add(resultToolCallId);\n }\n onToolResultRef.current?.(resultToolName, result, durationMs);\n break;\n }\n\n default:\n console.log('[useAgentChat] Unhandled log type:', log.type, log);\n }\n },\n [updateStreamingMessage, updateToolCall]\n );\n\n /**\n * Handle stream log events (legacy SSE path)\n */\n const handleStreamLog = useCallback(\n (log: NonNullable<ExecutionStreamEvent[\"data\"][\"log\"]>) => {\n console.log('[useAgentChat] handleStreamLog:', log.logType, log.metadata);\n\n switch (log.logType) {\n case \"llm_response\": {\n // Only use metadata.text — never fall back to log.message which is the\n // generic label \"LLM Response\" and should not appear in the chat.\n const llmText = (log.metadata?.text as string) || \"\";\n if (llmText) {\n streamingContentRef.current = llmText;\n updateStreamingMessage(llmText);\n }\n break;\n }\n\n case \"message\": {\n const role = log.metadata?.role as string;\n const content = log.metadata?.content as string;\n if (role === \"assistant\" && content) {\n streamingContentRef.current = content;\n updateStreamingMessage(content);\n }\n break;\n }\n\n case \"info\":\n case \"system\":\n console.log('[useAgentChat] Status:', log.logType, log.message);\n break;\n\n case \"response_text\":\n case \"text_chunk\": {\n const text = (log.metadata?.text as string) || log.message || \"\";\n streamingContentRef.current += text;\n updateStreamingMessage(streamingContentRef.current);\n break;\n }\n\n case \"tool_call\": {\n const toolName = log.metadata?.toolName as string;\n // Skip silent meta-tools (e.g., check_delegations) to avoid UI spam\n if (SILENT_TOOL_NAMES.has(toolName)) break;\n\n const toolCallId = (log.metadata?.toolCallId as string) || `tool-${Date.now()}`;\n const args = log.metadata?.inputs as Record<string, unknown>;\n\n const newToolCall: ToolCall = {\n id: toolCallId,\n name: toolName,\n args,\n status: \"running\",\n };\n\n pendingToolCallsRef.current.set(toolCallId, newToolCall);\n updateToolCall(newToolCall);\n onToolCallRef.current?.(toolName, args);\n break;\n }\n\n case \"tool_result\": {\n const resultToolName = log.metadata?.toolName as string;\n // Skip silent meta-tools (e.g., check_delegations) to avoid UI spam\n if (SILENT_TOOL_NAMES.has(resultToolName)) break;\n\n const resultToolCallId = log.metadata?.toolCallId as string;\n const result = log.metadata?.output;\n const durationMs = log.durationMs;\n\n let matchedToolCall = resultToolCallId\n ? pendingToolCallsRef.current.get(resultToolCallId)\n : undefined;\n\n if (!matchedToolCall) {\n for (const [, tc] of pendingToolCallsRef.current) {\n if (tc.name === resultToolName && tc.status === \"running\") {\n matchedToolCall = tc;\n break;\n }\n }\n }\n\n if (matchedToolCall) {\n const completedToolCall: ToolCall = {\n ...matchedToolCall,\n result,\n status: \"completed\",\n durationMs,\n };\n updateToolCall(completedToolCall);\n pendingToolCallsRef.current.delete(matchedToolCall.id);\n } else if (resultToolCallId) {\n // Late-arriving tool_result after finalization cleared the pending map.\n // Create a synthetic completed tool call so updateToolCall can match\n // it against the existing message's toolCalls array by ID.\n const lateToolCall: ToolCall = {\n id: resultToolCallId,\n name: resultToolName || \"unknown\",\n args: {},\n result,\n status: \"completed\",\n durationMs,\n };\n updateToolCall(lateToolCall);\n }\n // Mark this toolCallId as having fired onToolResult to prevent\n // duplicate invocations from the dedicated toolResult event path\n if (resultToolCallId) {\n firedToolResultsRef.current.add(resultToolCallId);\n }\n onToolResultRef.current?.(resultToolName, result, durationMs);\n break;\n }\n\n case \"final_response\": {\n const finalText = (log.metadata?.response as string | undefined) || log.message || \"\";\n if (finalText && finalText !== streamingContentRef.current) {\n streamingContentRef.current = finalText;\n updateStreamingMessage(finalText);\n }\n break;\n }\n\n default:\n console.log('[useAgentChat] Unknown log type:', log.logType, log);\n }\n },\n [updateStreamingMessage, updateToolCall]\n );\n\n /**\n * Handle clarification events\n */\n const handleClarification = useCallback(\n (data: ClarificationData) => {\n setClarification(data);\n onClarification?.(data);\n },\n [onClarification]\n );\n\n /**\n * Handle completion\n */\n const handleComplete = useCallback(() => {\n console.log('[useAgentChat] handleComplete called');\n setIsLoading(false);\n setIsStreamControllerConnected(false);\n finalizeStreamingMessage();\n setCurrentExecutionId(null);\n // Clean up stream controller\n streamControllerRef.current = null;\n }, [finalizeStreamingMessage]);\n\n /**\n * Handle errors\n */\n const handleError = useCallback(\n (errorMsg: string) => {\n console.log('[useAgentChat] handleError called:', errorMsg);\n const chatError: ChatError = {\n code: \"EXECUTION_ERROR\",\n message: errorMsg,\n retryable: true,\n };\n\n setError(chatError);\n setIsLoading(false);\n setIsStreamControllerConnected(false);\n finalizeStreamingMessage();\n setCurrentExecutionId(null);\n // Clean up stream controller\n streamControllerRef.current = null;\n onError?.(chatError);\n },\n [finalizeStreamingMessage, onError]\n );\n\n // ==========================================================================\n // LEGACY SSE PATH (useExecutionStream) — only active when createStream is NOT available\n // ==========================================================================\n\n // Only pass executionId to useExecutionStream when NOT using the new stream controller\n const legacyExecutionId = useStreamController ? undefined : currentExecutionId;\n\n const { isConnected: legacyIsConnected, isUsingFallback, disconnect } = useExecutionStream({\n executionId: legacyExecutionId ?? undefined,\n getStreamUrl: adapter.getStreamUrl ?? (() => \"\"),\n enabled: !!legacyExecutionId,\n onLog: handleStreamLog,\n onClarification: handleClarification,\n onComplete: handleComplete,\n onError: handleError,\n });\n\n // =========================================================================\n // LEGACY POLLING FALLBACK (only for legacy SSE path)\n // =========================================================================\n const pollingIntervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const pollingExecutionIdRef = useRef<string | null>(null);\n\n const stopPolling = useCallback(() => {\n if (pollingIntervalRef.current) {\n clearInterval(pollingIntervalRef.current);\n pollingIntervalRef.current = null;\n }\n pollingExecutionIdRef.current = null;\n }, []);\n\n const startPolling = useCallback((executionId: string) => {\n if (pollingExecutionIdRef.current === executionId) return;\n\n stopPolling();\n pollingExecutionIdRef.current = executionId;\n\n console.log('[useAgentChat] Starting polling fallback for:', executionId);\n\n const poll = async () => {\n if (pollingExecutionIdRef.current !== executionId) return;\n\n try {\n const execution = await adapter.getExecution(executionId);\n\n if (execution.status === \"completed\") {\n console.log('[useAgentChat] Polling: execution completed');\n if (execution.result) {\n streamingContentRef.current = execution.result;\n updateStreamingMessage(execution.result);\n }\n stopPolling();\n handleComplete();\n } else if (execution.status === \"failed\") {\n console.log('[useAgentChat] Polling: execution failed');\n stopPolling();\n handleError(execution.error || \"Execution failed\");\n }\n } catch (err) {\n console.warn('[useAgentChat] Polling error (will retry):', err);\n }\n };\n\n poll();\n pollingIntervalRef.current = setInterval(poll, 2000);\n }, [adapter, stopPolling, updateStreamingMessage, handleComplete, handleError]);\n\n // Legacy polling activation when SSE falls back (only for legacy path)\n useEffect(() => {\n if (!useStreamController && isUsingFallback && currentExecutionId && isLoading) {\n console.log('[useAgentChat] SSE fallback detected, activating polling');\n startPolling(currentExecutionId);\n }\n }, [useStreamController, isUsingFallback, currentExecutionId, isLoading, startPolling]);\n\n // Legacy SSE timeout fallback\n const sseTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n if (!useStreamController && currentExecutionId && isLoading && !legacyIsConnected && !isUsingFallback) {\n sseTimeoutRef.current = setTimeout(() => {\n if (!legacyIsConnected && currentExecutionId && isLoading) {\n console.log('[useAgentChat] SSE connection timeout, activating polling fallback');\n startPolling(currentExecutionId);\n }\n }, 10000);\n }\n\n return () => {\n if (sseTimeoutRef.current) {\n clearTimeout(sseTimeoutRef.current);\n sseTimeoutRef.current = null;\n }\n };\n }, [useStreamController, currentExecutionId, isLoading, legacyIsConnected, isUsingFallback, startPolling]);\n\n // Clean up polling when execution completes\n useEffect(() => {\n if (!currentExecutionId) {\n stopPolling();\n }\n return () => {\n stopPolling();\n };\n }, [currentExecutionId, stopPolling]);\n\n // =========================================================================\n // STREAM CONTROLLER PATH — connect ExecutionStreamController\n // =========================================================================\n\n /**\n * Set up and connect an ExecutionStreamController for the given execution\n */\n const connectStreamController = useCallback(\n (executionId: string, sessionId?: string) => {\n if (!adapter.createStream) return;\n\n // Cancel any existing controller\n if (streamControllerRef.current) {\n streamControllerRef.current.cancel();\n streamControllerRef.current = null;\n }\n\n console.log('[useAgentChat] Creating stream controller for:', executionId);\n\n const controller = adapter.createStream(executionId, sessionId);\n streamControllerRef.current = controller;\n\n // Register event listeners\n controller.on('log', (log) => {\n handleExecutionLog(log);\n });\n\n // Dedicated tool_call/tool_result events from the stream controller.\n // These fire in addition to the log-based tool events. The log path\n // already handles tool_call/tool_result log types and calls onToolCall/\n // onToolResult, but the dedicated events provide a second delivery path\n // that is more reliable for team executions and cross-channel scenarios.\n // We track which toolCallIds have already been handled via log events\n // to avoid duplicate onToolCall/onToolResult invocations.\n controller.on('toolCall', (data) => {\n const toolCallId = data.toolCallId || `tool-${Date.now()}`;\n const toolName = data.toolName;\n\n // Skip silent meta-tools\n if (SILENT_TOOL_NAMES.has(toolName)) return;\n\n // Only process if not already handled by log event\n if (!pendingToolCallsRef.current.has(toolCallId)) {\n const newToolCall: ToolCall = {\n id: toolCallId,\n name: toolName,\n args: data.inputs,\n status: \"running\",\n };\n pendingToolCallsRef.current.set(toolCallId, newToolCall);\n updateToolCall(newToolCall);\n onToolCallRef.current?.(toolName, data.inputs);\n }\n });\n\n controller.on('toolResult', (data) => {\n const toolCallId = data.toolCallId;\n const toolName = data.toolName;\n\n // Skip silent meta-tools\n if (SILENT_TOOL_NAMES.has(toolName)) return;\n\n // Skip if onToolResult already fired for this toolCallId via log path\n if (firedToolResultsRef.current.has(toolCallId)) return;\n\n // Check if already completed via log event path\n const existing = pendingToolCallsRef.current.get(toolCallId);\n if (existing && existing.status === \"completed\") return;\n\n if (existing) {\n const completedToolCall: ToolCall = {\n ...existing,\n result: data.result,\n status: \"completed\",\n durationMs: data.durationMs,\n };\n updateToolCall(completedToolCall);\n pendingToolCallsRef.current.delete(toolCallId);\n } else {\n // Late-arriving or log-path missed this - create synthetic entry\n const lateToolCall: ToolCall = {\n id: toolCallId,\n name: toolName,\n args: {},\n result: data.result,\n status: \"completed\",\n durationMs: data.durationMs,\n };\n updateToolCall(lateToolCall);\n }\n firedToolResultsRef.current.add(toolCallId);\n onToolResultRef.current?.(toolName, data.result, data.durationMs);\n });\n\n controller.on('textDelta', (data) => {\n streamingContentRef.current += data.delta;\n updateStreamingMessage(streamingContentRef.current);\n });\n\n controller.on('paused', (data) => {\n handleClarification({\n question: data.question,\n reason: data.reason,\n suggestedOptions: data.options,\n });\n });\n\n controller.on('complete', ({ execution }) => {\n // Use execution output as the final message if no streaming text was captured\n if (execution?.output && !streamingContentRef.current) {\n streamingContentRef.current = execution.output;\n updateStreamingMessage(execution.output);\n }\n handleComplete();\n });\n\n controller.on('error', (errorEvent) => {\n handleError(errorEvent.error);\n });\n\n controller.on('connectionChange', (data) => {\n setIsStreamControllerConnected(data.connected);\n });\n\n // Connect\n controller.connect().catch((err) => {\n console.error('[useAgentChat] Stream controller connect error:', err);\n handleError(err instanceof Error ? err.message : \"Stream connection failed\");\n });\n\n setIsStreamControllerConnected(true);\n },\n [adapter, handleExecutionLog, updateStreamingMessage, updateToolCall, handleClarification, handleComplete, handleError]\n );\n\n // =========================================================================\n // SEND MESSAGE\n // =========================================================================\n\n const sendMessage = useCallback(\n async (content: string, options?: SendMessageOptions) => {\n if (!content.trim()) return;\n\n const attachmentUuids = options?.attachmentUuids;\n\n lastMessageContentRef.current = content;\n setIsLoading(true);\n setError(null);\n setClarification(null);\n\n // Add user message\n const userMessage: ChatMessage = {\n id: generateId(),\n role: \"user\",\n content: content.trim(),\n timestamp: new Date(),\n };\n\n setMessages((prev) => [...prev, userMessage]);\n onMessage?.(userMessage);\n\n // Add placeholder assistant message\n const assistantMessageId = generateId();\n const assistantMessage: ChatMessage = {\n id: assistantMessageId,\n role: \"assistant\",\n content: \"\",\n timestamp: new Date(),\n isStreaming: true,\n toolCalls: [],\n };\n\n setMessages((prev) => [...prev, assistantMessage]);\n streamingMessageIdRef.current = assistantMessageId;\n streamingContentRef.current = \"\";\n\n try {\n console.log('[useAgentChat] Starting execution...', { agentId, sessionId: currentSessionId });\n\n // Start execution via adapter\n const result = await adapter.startExecution({\n agentId,\n teamId,\n sessionId: currentSessionId ?? undefined,\n content: content.trim(),\n attachmentUuids,\n });\n\n console.log('[useAgentChat] Execution started:', result);\n\n // Update session ID if new\n if (!currentSessionId && result.sessionId) {\n internallyCreatedSessionRef.current = result.sessionId;\n setCurrentSessionId(result.sessionId);\n onSessionCreated?.(result.sessionId);\n onSessionStart?.(result.sessionId);\n }\n\n // Connect to stream\n if (useStreamController) {\n // New path: use ExecutionStreamController\n connectStreamController(result.executionId, result.sessionId || currentSessionId || undefined);\n setCurrentExecutionId(result.executionId);\n } else {\n // Legacy path: set executionId to trigger useExecutionStream\n console.log('[useAgentChat] Setting executionId:', result.executionId);\n setCurrentExecutionId(result.executionId);\n }\n } catch (err) {\n console.error('[useAgentChat] Error starting execution:', err);\n const errorMessage = err instanceof Error ? err.message : \"Failed to send message\";\n handleError(errorMessage);\n }\n },\n [\n agentId,\n teamId,\n currentSessionId,\n adapter,\n useStreamController,\n connectStreamController,\n onMessage,\n onSessionCreated,\n onSessionStart,\n handleError,\n ]\n );\n\n /**\n * Respond to a clarification request\n */\n const respondToClarification = useCallback(\n async (response: string) => {\n if (!clarification) return;\n\n setClarification(null);\n await sendMessage(response);\n },\n [clarification, sendMessage]\n );\n\n /**\n * Cancel the current execution\n */\n const cancel = useCallback(async () => {\n if (currentExecutionId) {\n try {\n await adapter.cancelExecution(currentExecutionId);\n } catch {\n // Ignore cancel errors\n }\n\n // Cancel stream controller if active\n if (streamControllerRef.current) {\n streamControllerRef.current.cancel();\n streamControllerRef.current = null;\n }\n\n // Disconnect legacy SSE\n disconnect();\n\n setIsLoading(false);\n setIsStreamControllerConnected(false);\n finalizeStreamingMessage();\n setCurrentExecutionId(null);\n }\n }, [currentExecutionId, adapter, disconnect, finalizeStreamingMessage]);\n\n /**\n * Retry the last failed message\n */\n const retry = useCallback(() => {\n if (lastMessageContentRef.current && error) {\n setError(null);\n sendMessage(lastMessageContentRef.current);\n }\n }, [error, sendMessage]);\n\n /**\n * Clear the current error\n */\n const clearError = useCallback(() => {\n setError(null);\n }, []);\n\n /**\n * Clear all messages and reset session\n */\n const clearMessages = useCallback(() => {\n setMessages([]);\n setCurrentSessionId(null);\n hasLoadedInitialSession.current = false;\n internallyCreatedSessionRef.current = null;\n }, []);\n\n /**\n * Load session history from the API.\n * Also fetches session artifacts (images) and injects them as tool calls\n * on assistant messages so they render inline in the chat feed.\n */\n const loadSession = useCallback(\n async (sessionId: string) => {\n // Check if adapter supports session history\n if (!adapter.getSessionHistory) {\n const loadError: ChatError = {\n code: \"UNSUPPORTED_OPERATION\",\n message: \"Session history loading is not supported by this adapter\",\n retryable: false,\n };\n setError(loadError);\n onError?.(loadError);\n return;\n }\n\n setIsLoadingHistory(true);\n setError(null);\n\n try {\n // Fetch history and artifacts in parallel\n const [history, artifacts] = await Promise.all([\n adapter.getSessionHistory(sessionId),\n adapter.getSessionArtifacts?.(sessionId).catch(() => []) ?? Promise.resolve([]),\n ]);\n\n // Convert history messages to ChatMessage format\n const loadedMessages = history.messages.map(historyToMessage);\n\n // Inject image artifacts as tool calls on the assistant messages that\n // generated them. Match each artifact to the closest preceding assistant\n // message using timestamps so they appear in chronological order.\n const imageArtifacts = artifacts.filter(\n (a) => a.type === \"image\" || a.mimeType?.startsWith(\"image/\")\n );\n\n if (imageArtifacts.length > 0) {\n // Build index of assistant message positions\n const assistantIndices: number[] = [];\n for (let i = 0; i < loadedMessages.length; i++) {\n if (loadedMessages[i]!.role === \"assistant\") {\n assistantIndices.push(i);\n }\n }\n\n if (assistantIndices.length > 0) {\n // Group artifacts by their target assistant message index\n const artifactsByMsgIdx = new Map<number, typeof imageArtifacts>();\n\n for (const artifact of imageArtifacts) {\n let targetIdx = assistantIndices[assistantIndices.length - 1]!; // fallback: last assistant msg\n\n if (artifact.createdAt) {\n const artifactTime = new Date(artifact.createdAt).getTime();\n\n for (let i = assistantIndices.length - 1; i >= 0; i--) {\n const msgIdx = assistantIndices[i]!;\n const msg = loadedMessages[msgIdx]!;\n const msgTime = msg.timestamp ? new Date(msg.timestamp).getTime() : 0;\n\n if (msgTime <= artifactTime) {\n targetIdx = msgIdx;\n break;\n }\n }\n }\n\n const existing = artifactsByMsgIdx.get(targetIdx) ?? [];\n existing.push(artifact);\n artifactsByMsgIdx.set(targetIdx, existing);\n }\n\n // Attach grouped artifacts as synthetic tool calls on their target messages\n for (const [msgIdx, msgArtifacts] of artifactsByMsgIdx) {\n const targetMsg = loadedMessages[msgIdx]!;\n const existingToolCalls = targetMsg.toolCalls ?? [];\n\n const imageToolCalls: ToolCall[] = msgArtifacts.map((artifact, i) => ({\n id: `history-artifact-${artifact.uuid}-${i}`,\n name: \"generate_image\",\n args: {},\n result: {\n success: true,\n images: [{ url: artifact.url }],\n },\n status: \"completed\" as const,\n }));\n\n loadedMessages[msgIdx] = {\n id: targetMsg.id,\n role: targetMsg.role,\n content: targetMsg.content,\n timestamp: targetMsg.timestamp,\n isStreaming: targetMsg.isStreaming,\n attachments: targetMsg.attachments,\n thinkingBlocks: targetMsg.thinkingBlocks,\n toolCalls: [...existingToolCalls, ...imageToolCalls],\n };\n }\n }\n }\n\n setMessages(loadedMessages);\n setCurrentSessionId(sessionId);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"Failed to load session history\";\n const loadError: ChatError = {\n code: \"LOAD_HISTORY_ERROR\",\n message: errorMessage,\n retryable: true,\n };\n setError(loadError);\n onError?.(loadError);\n } finally {\n setIsLoadingHistory(false);\n }\n },\n [adapter, onError]\n );\n\n /**\n * Load initial session if sessionId prop is provided.\n * Skip if the session was just created by sendMessage (avoids race condition\n * where parent feeds the new session ID back as a prop).\n */\n useEffect(() => {\n if (initialSessionId && !hasLoadedInitialSession.current) {\n // Skip loading history for sessions we just created internally\n if (internallyCreatedSessionRef.current === initialSessionId) {\n hasLoadedInitialSession.current = true;\n return;\n }\n hasLoadedInitialSession.current = true;\n loadSession(initialSessionId);\n }\n }, [initialSessionId, loadSession]);\n\n // Clean up stream controller on unmount\n useEffect(() => {\n return () => {\n if (streamControllerRef.current) {\n streamControllerRef.current.cancel();\n streamControllerRef.current = null;\n }\n };\n }, []);\n\n // Compute isStreaming — use stream controller connected state or legacy\n const isStreaming = useMemo(() => {\n if (useStreamController) {\n return !!currentExecutionId && isStreamControllerConnected;\n }\n return !!currentExecutionId && legacyIsConnected;\n }, [useStreamController, currentExecutionId, isStreamControllerConnected, legacyIsConnected]);\n\n return {\n messages,\n isLoading,\n isStreaming,\n isLoadingHistory,\n error,\n sessionId: currentSessionId,\n clarification,\n sendMessage,\n respondToClarification,\n cancel,\n retry,\n clearError,\n clearMessages,\n loadSession,\n };\n}\n","/**\n * Client-side image compression using Canvas API.\n *\n * Resizes images to max 1920px on longest side and iteratively\n * reduces JPEG/WebP quality to hit a ~150KB target size.\n * Skips SVGs, non-image files, and files already under the target.\n */\n\nconst DEFAULT_TARGET_SIZE_KB = 150;\nconst MAX_DIMENSION = 1920;\nconst QUALITY_START = 0.85;\nconst QUALITY_STEP = 0.05;\nconst QUALITY_MIN = 0.1;\n\n/**\n * Load a File as an HTMLImageElement via object URL.\n */\nfunction loadImage(file: File): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n const url = URL.createObjectURL(file);\n img.onload = () => {\n URL.revokeObjectURL(url);\n resolve(img);\n };\n img.onerror = () => {\n URL.revokeObjectURL(url);\n reject(new Error(`Failed to load image: ${file.name}`));\n };\n img.src = url;\n });\n}\n\n/**\n * Calculate scaled dimensions keeping aspect ratio, capped at MAX_DIMENSION.\n */\nfunction getScaledDimensions(\n width: number,\n height: number,\n maxDim: number\n): { width: number; height: number } {\n if (width <= maxDim && height <= maxDim) {\n return { width, height };\n }\n const ratio = Math.min(maxDim / width, maxDim / height);\n return {\n width: Math.round(width * ratio),\n height: Math.round(height * ratio),\n };\n}\n\n/**\n * Draw image to canvas at target dimensions and export as blob.\n */\nfunction canvasToBlob(\n img: HTMLImageElement,\n width: number,\n height: number,\n format: string,\n quality: number\n): Promise<Blob> {\n return new Promise((resolve, reject) => {\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n reject(new Error(\"Failed to get canvas 2d context\"));\n return;\n }\n\n ctx.drawImage(img, 0, 0, width, height);\n\n canvas.toBlob(\n (blob) => {\n if (!blob) {\n reject(new Error(\"Canvas toBlob returned null\"));\n return;\n }\n resolve(blob);\n },\n format,\n quality\n );\n });\n}\n\n/**\n * Check if browser supports WebP encoding via canvas.\n */\nlet webpSupported: boolean | null = null;\nfunction supportsWebP(): boolean {\n if (webpSupported !== null) return webpSupported;\n try {\n const canvas = document.createElement(\"canvas\");\n canvas.width = 1;\n canvas.height = 1;\n webpSupported = canvas.toDataURL(\"image/webp\").startsWith(\"data:image/webp\");\n } catch {\n webpSupported = false;\n }\n return webpSupported;\n}\n\n/**\n * Determine output format and file extension for compressed image.\n */\nfunction getOutputFormat(_originalType: string): { mime: string; ext: string } {\n // Prefer WebP if supported, fall back to JPEG\n if (supportsWebP()) {\n return { mime: \"image/webp\", ext: \".webp\" };\n }\n return { mime: \"image/jpeg\", ext: \".jpg\" };\n}\n\n/**\n * Replace file extension in a filename.\n */\nfunction replaceExtension(filename: string, newExt: string): string {\n const dotIndex = filename.lastIndexOf(\".\");\n if (dotIndex === -1) return filename + newExt;\n return filename.substring(0, dotIndex) + newExt;\n}\n\n/**\n * Compress an image file to approximately targetSizeKB using Canvas API.\n *\n * - Returns the original file if it's already under targetSizeKB\n * - Skips SVGs and non-image files (returns as-is)\n * - Resizes to max 1920px on longest side\n * - Iteratively reduces quality to approach target size\n *\n * @param file - The File to compress\n * @param targetSizeKB - Target output size in KB (default: 150)\n * @returns Compressed File, or the original if no compression needed\n */\nexport async function compressImage(\n file: File,\n targetSizeKB: number = DEFAULT_TARGET_SIZE_KB\n): Promise<File> {\n // Skip non-image files\n if (!file.type.startsWith(\"image/\")) {\n return file;\n }\n\n // Skip SVGs - they're vector and already small\n if (file.type === \"image/svg+xml\") {\n return file;\n }\n\n // Skip GIFs - canvas loses animation frames\n if (file.type === \"image/gif\") {\n return file;\n }\n\n const targetBytes = targetSizeKB * 1024;\n\n // Already under target, no compression needed\n if (file.size <= targetBytes) {\n return file;\n }\n\n const img = await loadImage(file);\n\n const { width, height } = getScaledDimensions(\n img.naturalWidth,\n img.naturalHeight,\n MAX_DIMENSION\n );\n\n const { mime, ext } = getOutputFormat(file.type);\n\n // Iteratively reduce quality to hit target size\n let quality = QUALITY_START;\n let blob: Blob | null = null;\n\n while (quality >= QUALITY_MIN) {\n blob = await canvasToBlob(img, width, height, mime, quality);\n\n if (blob.size <= targetBytes) {\n break;\n }\n\n quality -= QUALITY_STEP;\n }\n\n // If we exhausted quality iterations, use whatever we got (lowest quality)\n if (!blob) {\n blob = await canvasToBlob(img, width, height, mime, QUALITY_MIN);\n }\n\n // If compressed is actually larger than original, return original\n if (blob.size >= file.size) {\n return file;\n }\n\n const newFilename = replaceExtension(file.name, ext);\n\n return new File([blob], newFilename, {\n type: mime,\n lastModified: Date.now(),\n });\n}\n","\"use client\";\n\n/**\n * useFileAttachments - Standalone hook for managing file attachment lifecycle\n *\n * Manages AttachmentFile[] state and provides callback props that can be\n * spread directly onto FileDropZone. Works standalone (e.g., in slides RemixPanel)\n * or composed into AgentChat.\n *\n * @example\n * ```tsx\n * // Standalone usage with direct upload\n * const attachments = useFileAttachments({\n * onUpload: async (file, meta) => {\n * const res = await fetch('/api/upload', { method: 'POST', body: file });\n * const data = await res.json();\n * return { uuid: data.url, uploadUrl: '' };\n * },\n * });\n *\n * <FileDropZone {...attachments.dropZoneProps} compact accept=\"image/*\" />\n * const urls = attachments.getReadyUrls();\n * ```\n *\n * @example\n * ```tsx\n * // With Cadra adapter\n * const attachments = useFileAttachments({\n * onUpload: async (file, meta) => {\n * const result = await adapter.getUploadUrl({ sessionId, ...meta });\n * return { uuid: result.attachmentUuid, uploadUrl: result.uploadUrl };\n * },\n * onConfirmUpload: (uuid) => adapter.confirmUpload(uuid),\n * });\n *\n * sendMessage(content, { attachmentUuids: attachments.getReadyUuids() });\n * attachments.clear();\n * ```\n *\n * @module @cadraos/sdk/chat\n */\n\nimport { useCallback, useRef, useState } from \"react\";\nimport type { AttachmentFile } from \"../types.js\";\nimport type { FileDropZoneProps } from \"../components/FileDropZone.js\";\nimport { compressImage } from \"../utils/compress-image.js\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface UseFileAttachmentsOptions {\n /**\n * Upload handler called immediately when files are dropped/selected.\n * Return the UUID and a presigned upload URL.\n * If uploadUrl is empty, the S3 PUT step in FileDropZone is skipped\n * (useful for direct-upload patterns where the upload happens here).\n */\n onUpload: (\n file: File,\n metadata: { filename: string; mimeType: string; size: number },\n ) => Promise<{ uuid: string; uploadUrl: string }>;\n\n /** Optional confirm callback after S3 PUT succeeds */\n onConfirmUpload?: (uuid: string) => Promise<void>;\n\n /**\n * Deferred upload handler called during prepareForSubmit().\n * Use this for two-phase upload patterns where files are uploaded to local\n * storage on drop, but a second upload to an AI service happens on submit.\n *\n * Receives the file and localUuid (from onUpload) and should return\n * the AI service's attachment UUID.\n *\n * If not provided, prepareForSubmit() returns the UUIDs from onUpload as-is.\n */\n onSubmitUpload?: (\n file: File,\n localUuid: string,\n metadata: { filename: string; mimeType: string; size: number },\n ) => Promise<string>;\n\n /** Error handler */\n onError?: (message: string) => void;\n\n /** Maximum number of files (default: 10) */\n maxFiles?: number;\n\n /** Maximum total upload size in MB (default: 100) */\n maxTotalSizeMB?: number;\n}\n\nexport interface UseFileAttachmentsResult {\n /** Current attachment files */\n files: AttachmentFile[];\n\n /**\n * Props to spread onto FileDropZone.\n * Includes: files, onFilesChange, onUpload, onConfirmUpload, onError, maxFiles, maxTotalSizeMB\n */\n dropZoneProps: Pick<\n FileDropZoneProps,\n \"files\" | \"onFilesChange\" | \"onUpload\" | \"onConfirmUpload\" | \"onError\" | \"maxFiles\" | \"maxTotalSizeMB\"\n >;\n\n /** Remove a file by UUID */\n removeFile: (uuid: string) => void;\n\n /** Get UUIDs of ready (uploaded) attachments — for Cadra adapter pattern */\n getReadyUuids: () => string[];\n\n /** Get UUIDs of ready attachments as URLs — for direct-upload pattern where uuid IS the url */\n getReadyUrls: () => string[];\n\n /**\n * Two-phase submit: uploads ready files to the AI service via onSubmitUpload,\n * returns the AI service attachment UUIDs. Call this on Generate/Remix.\n * If onSubmitUpload is not configured, returns getReadyUuids().\n */\n prepareForSubmit: () => Promise<string[]>;\n\n /** Clear all attachments (revokes preview URLs) */\n clear: () => void;\n\n /** Whether any files are currently uploading */\n isUploading: boolean;\n\n /** Whether there are files ready to send */\n hasReadyFiles: boolean;\n\n /** Total number of files */\n fileCount: number;\n}\n\n// =============================================================================\n// HOOK IMPLEMENTATION\n// =============================================================================\n\nexport function useFileAttachments(\n options: UseFileAttachmentsOptions,\n): UseFileAttachmentsResult {\n const { onUpload, onConfirmUpload, onSubmitUpload, onError, maxFiles = 10, maxTotalSizeMB = 100 } = options;\n\n const [files, setFiles] = useState<AttachmentFile[]>([]);\n // Keep a ref in sync for synchronous reads (getReadyUuids, etc.)\n const filesRef = useRef<AttachmentFile[]>(files);\n filesRef.current = files;\n\n const onFilesChange = useCallback((newFiles: AttachmentFile[]) => {\n // Sync ref immediately so getReadyUrls/getReadyUuids always read\n // the latest state, even before React re-renders.\n filesRef.current = newFiles;\n setFiles(newFiles);\n }, []);\n\n const removeFile = useCallback((uuid: string) => {\n setFiles((prev) => {\n const file = prev.find((f) => f.uuid === uuid);\n if (file?.previewUrl) {\n URL.revokeObjectURL(file.previewUrl);\n }\n return prev.filter((f) => f.uuid !== uuid);\n });\n }, []);\n\n const getReadyUuids = useCallback((): string[] => {\n return filesRef.current\n .filter((f) => f.status === \"ready\")\n .map((f) => f.uuid);\n }, []);\n\n const getReadyUrls = useCallback((): string[] => {\n // In direct-upload patterns, uuid is the URL\n return filesRef.current\n .filter((f) => f.status === \"ready\")\n .map((f) => f.uuid);\n }, []);\n\n const prepareForSubmit = useCallback(async (): Promise<string[]> => {\n const readyFiles = filesRef.current.filter((f) => f.status === \"ready\");\n console.log(\"[useFileAttachments] prepareForSubmit - readyFiles:\", readyFiles.length, \"hasSubmitUpload:\", !!onSubmitUpload);\n if (readyFiles.length === 0) return [];\n\n // If no deferred upload handler, just return existing UUIDs\n if (!onSubmitUpload) {\n return readyFiles.map((f) => f.uuid);\n }\n\n // Compress images and upload each ready file to the AI service\n const aiUuids: string[] = [];\n for (const attachment of readyFiles) {\n try {\n // Compress images before sending to AI service (same as playground)\n let fileToSend = attachment.file;\n if (attachment.category === \"image\") {\n try {\n fileToSend = await compressImage(attachment.file);\n } catch {\n // Compression failed, use original\n }\n }\n console.log(\"[useFileAttachments] Uploading to AI service:\", attachment.file.name, \"localUuid:\", attachment.uuid.substring(0, 40));\n const aiUuid = await onSubmitUpload(\n fileToSend,\n attachment.uuid,\n { filename: fileToSend.name, mimeType: fileToSend.type, size: fileToSend.size },\n );\n console.log(\"[useFileAttachments] AI service returned UUID:\", aiUuid);\n aiUuids.push(aiUuid);\n } catch (err) {\n const msg = err instanceof Error ? err.message : \"Submit upload failed\";\n console.error(\"[useFileAttachments] Submit upload failed for:\", attachment.file.name, msg);\n onError?.(msg);\n }\n }\n console.log(\"[useFileAttachments] prepareForSubmit result:\", aiUuids);\n return aiUuids;\n }, [onSubmitUpload, onError]);\n\n const clear = useCallback(() => {\n // Revoke all preview URLs before clearing\n for (const file of filesRef.current) {\n if (file.previewUrl) {\n URL.revokeObjectURL(file.previewUrl);\n }\n }\n setFiles([]);\n }, []);\n\n const isUploading = files.some(\n (f) => f.status === \"uploading\" || f.status === \"pending\" || f.status === \"processing\",\n );\n\n const hasReadyFiles = files.some((f) => f.status === \"ready\");\n\n const dropZoneProps: UseFileAttachmentsResult[\"dropZoneProps\"] = {\n files,\n onFilesChange,\n onUpload,\n onConfirmUpload,\n onError,\n maxFiles,\n maxTotalSizeMB,\n };\n\n return {\n files,\n dropZoneProps,\n removeFile,\n getReadyUuids,\n getReadyUrls,\n prepareForSubmit,\n clear,\n isUploading,\n hasReadyFiles,\n fileCount: files.length,\n };\n}\n","\"use client\";\n\n/**\n * Built-in SVG icons for @cadraos/sdk/chat\n *\n * These replace lucide-react to avoid external dependencies and reduce bundle size.\n *\n * @module @cadraos/sdk/chat\n */\n\n// =============================================================================\n// HELPER\n// =============================================================================\n\nfunction cn(...classes: (string | undefined | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n\n// =============================================================================\n// ICON PROPS\n// =============================================================================\n\nexport interface IconProps {\n /** Additional CSS classes */\n className?: string;\n /** Accessibility label */\n \"aria-label\"?: string;\n}\n\n// =============================================================================\n// MESSAGING ICONS\n// =============================================================================\n\nexport function SendIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path d=\"M22 2L11 13M22 2l-7 20-4-9-9-4 20-7z\" />\n </svg>\n );\n}\n\nexport function MessageCircleIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path d=\"M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z\" />\n </svg>\n );\n}\n\n// =============================================================================\n// ACTION ICONS\n// =============================================================================\n\nexport function PaperclipIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path d=\"M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48\" />\n </svg>\n );\n}\n\nexport function XIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path d=\"M18 6L6 18M6 6l12 12\" />\n </svg>\n );\n}\n\nexport function CheckIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n\nexport function CheckCircleIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\" />\n <polyline points=\"22 4 12 14.01 9 11.01\" />\n </svg>\n );\n}\n\nexport function CopyIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n );\n}\n\n// =============================================================================\n// NAVIGATION ICONS\n// =============================================================================\n\nexport function ChevronDownIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n );\n}\n\nexport function ChevronRightIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n );\n}\n\nexport function ChevronLeftIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <polyline points=\"15 18 9 12 15 6\" />\n </svg>\n );\n}\n\n// =============================================================================\n// LOADING & STATUS ICONS\n// =============================================================================\n\nexport function LoadingSpinner({ className, ...props }: IconProps) {\n return (\n <svg\n className={cn(\"animate-spin\", className)}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n {...props}\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n strokeOpacity=\"0.25\"\n />\n <path\n d=\"M4 12a8 8 0 0 1 8-8\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nexport function AlertCircleIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n );\n}\n\nexport function CircleIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n </svg>\n );\n}\n\nexport function StopCircleIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <rect x=\"9\" y=\"9\" width=\"6\" height=\"6\" />\n </svg>\n );\n}\n\n// =============================================================================\n// FILE & MEDIA ICONS\n// =============================================================================\n\nexport function ImageIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\n <circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\" />\n <polyline points=\"21 15 16 10 5 21\" />\n </svg>\n );\n}\n\nexport function ImagesIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path d=\"M18 22H4a2 2 0 0 1-2-2V6\" />\n <path d=\"m22 13-1.296-1.296a2.41 2.41 0 0 0-3.408 0L11 18\" />\n <circle cx=\"12\" cy=\"8\" r=\"2\" />\n <rect x=\"6\" y=\"2\" width=\"16\" height=\"16\" rx=\"2\" />\n </svg>\n );\n}\n\nexport function FileIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n </svg>\n );\n}\n\nexport function FileTextIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\" />\n <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\" />\n <polyline points=\"10 9 9 9 8 9\" />\n </svg>\n );\n}\n\nexport function CodeIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <polyline points=\"16 18 22 12 16 6\" />\n <polyline points=\"8 6 2 12 8 18\" />\n </svg>\n );\n}\n\n// =============================================================================\n// VIEW ICONS\n// =============================================================================\n\nexport function ZoomInIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n <line x1=\"11\" y1=\"8\" x2=\"11\" y2=\"14\" />\n <line x1=\"8\" y1=\"11\" x2=\"14\" y2=\"11\" />\n </svg>\n );\n}\n\nexport function ZoomOutIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n <line x1=\"8\" y1=\"11\" x2=\"14\" y2=\"11\" />\n </svg>\n );\n}\n\nexport function DownloadIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"7 10 12 15 17 10\" />\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\" />\n </svg>\n );\n}\n\nexport function ExternalLinkIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\n <polyline points=\"15 3 21 3 21 9\" />\n <line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\" />\n </svg>\n );\n}\n\nexport function Minimize2Icon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <polyline points=\"4 14 10 14 10 20\" />\n <polyline points=\"20 10 14 10 14 4\" />\n <line x1=\"14\" y1=\"10\" x2=\"21\" y2=\"3\" />\n <line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\" />\n </svg>\n );\n}\n\nexport function Maximize2Icon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <polyline points=\"15 3 21 3 21 9\" />\n <polyline points=\"9 21 3 21 3 15\" />\n <line x1=\"21\" y1=\"3\" x2=\"14\" y2=\"10\" />\n <line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\" />\n </svg>\n );\n}\n\n// =============================================================================\n// ROLE ICONS\n// =============================================================================\n\nexport function BotIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <rect x=\"3\" y=\"11\" width=\"18\" height=\"10\" rx=\"2\" />\n <circle cx=\"12\" cy=\"5\" r=\"2\" />\n <path d=\"M12 7v4\" />\n <line x1=\"8\" y1=\"16\" x2=\"8\" y2=\"16\" />\n <line x1=\"16\" y1=\"16\" x2=\"16\" y2=\"16\" />\n </svg>\n );\n}\n\nexport function UserIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\" />\n <circle cx=\"12\" cy=\"7\" r=\"4\" />\n </svg>\n );\n}\n\nexport function SparklesIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path d=\"M12 3l1.5 4.5L18 9l-4.5 1.5L12 15l-1.5-4.5L6 9l4.5-1.5L12 3z\" />\n <path d=\"M5 19l.5 1.5L7 21l-1.5.5L5 23l-.5-1.5L3 21l1.5-.5L5 19z\" />\n <path d=\"M19 5l.5 1.5L21 7l-1.5.5L19 9l-.5-1.5L17 7l1.5-.5L19 5z\" />\n </svg>\n );\n}\n\n// =============================================================================\n// TASK ICONS\n// =============================================================================\n\nexport function ListTodoIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <rect x=\"3\" y=\"5\" width=\"6\" height=\"6\" rx=\"1\" />\n <path d=\"m3 17 2 2 4-4\" />\n <path d=\"M13 6h8\" />\n <path d=\"M13 12h8\" />\n <path d=\"M13 18h8\" />\n </svg>\n );\n}\n\nexport function HelpCircleIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n );\n}\n\nexport function DatabaseIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <ellipse cx=\"12\" cy=\"5\" rx=\"9\" ry=\"3\" />\n <path d=\"M21 12c0 1.66-4 3-9 3s-9-1.34-9-3\" />\n <path d=\"M3 5v14c0 1.66 4 3 9 3s9-1.34 9-3V5\" />\n </svg>\n );\n}\n\nexport function ClockIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <polyline points=\"12 6 12 12 16 14\" />\n </svg>\n );\n}\n","\"use client\";\n\n/**\n * ChatContainer - Layout container for the chat interface\n *\n * Provides:\n * - Flex column layout\n * - Theme support\n * - Max height constraint\n * - Border and rounded corners\n *\n * @module @cadraos/sdk/chat\n */\n\nimport * as React from \"react\";\nimport type { ThemeMode } from \"../types.js\";\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nfunction cn(...classes: (string | undefined | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface ChatContainerProps {\n /** Child components (MessageList, ChatInput, etc.) */\n children: React.ReactNode;\n /** Maximum height of the container */\n maxHeight?: string | number;\n /** Additional CSS classes */\n className?: string;\n /** Theme mode */\n theme?: ThemeMode;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Container component for the chat interface\n *\n * @example\n * ```tsx\n * <ChatContainer maxHeight=\"600px\" theme=\"dark\">\n * <MessageList messages={messages} />\n * <ChatInput onSend={handleSend} />\n * </ChatContainer>\n * ```\n */\nexport function ChatContainer({\n children,\n maxHeight = \"600px\",\n className,\n theme = \"system\",\n}: ChatContainerProps) {\n const maxHeightValue =\n typeof maxHeight === \"number\" ? `${maxHeight}px` : maxHeight;\n\n return (\n <div\n className={cn(\n \"flex flex-col bg-white dark:bg-gray-900 rounded-lg border border-gray-200 dark:border-gray-700 overflow-hidden\",\n className\n )}\n style={{ maxHeight: maxHeightValue }}\n data-theme={theme}\n >\n {children}\n </div>\n );\n}\n\nexport default ChatContainer;\n","\"use client\";\n\n/**\n * ChatInput - Message input component with attachment support\n *\n * Features:\n * - Auto-resizing textarea\n * - Enter to send (Shift+Enter for newline)\n * - Attachment button with paperclip icon (optional)\n * - Attachment chips/thumbnails above textarea\n * - Send button with loading state\n * - Disabled state during streaming\n *\n * @module @cadraos/sdk/chat\n */\n\nimport * as React from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { LoadingSpinner, PaperclipIcon, SendIcon, StopCircleIcon, XIcon } from \"../icons/index.js\";\nimport type { AttachmentFile } from \"../types.js\";\nimport type { FileDropZoneRef } from \"./FileDropZone.js\";\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nfunction cn(...classes: (string | undefined | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface ChatInputProps {\n /** Callback when user sends a message */\n onSend: (content: string) => void | Promise<void>;\n /** Callback when user requests to stop/cancel */\n onStop?: () => void;\n /** Placeholder text */\n placeholder?: string;\n /** Whether the input is disabled */\n disabled?: boolean;\n /** Whether currently sending/streaming */\n isLoading?: boolean;\n /** Whether to enable attachments */\n enableAttachments?: boolean;\n /** Current attachment files (when enableAttachments is true) */\n attachments?: AttachmentFile[];\n /** Callback to remove an attachment */\n onRemoveAttachment?: (uuid: string) => void;\n /** Ref to FileDropZone for triggering file dialog */\n dropZoneRef?: React.RefObject<FileDropZoneRef | null>;\n /** Whether attachments are currently uploading */\n isUploadingAttachments?: boolean;\n /** Additional CSS classes */\n className?: string;\n}\n\n// =============================================================================\n// ATTACHMENT CHIP COMPONENT\n// =============================================================================\n\ninterface AttachmentChipProps {\n attachment: AttachmentFile;\n onRemove: (uuid: string) => void;\n}\n\nfunction AttachmentChip({ attachment, onRemove }: AttachmentChipProps) {\n const isLoading =\n attachment.status === \"uploading\" ||\n attachment.status === \"pending\" ||\n attachment.status === \"processing\";\n const isError = attachment.status === \"error\" || attachment.status === \"failed\";\n\n return (\n <div\n className={cn(\n \"inline-flex items-center gap-1.5 px-2 py-1 rounded-md text-xs max-w-[180px]\",\n isError\n ? \"bg-red-100 dark:bg-red-900/30 text-red-700 dark:text-red-300 border border-red-200 dark:border-red-800\"\n : \"bg-gray-100 dark:bg-gray-700 text-gray-700 dark:text-gray-300 border border-gray-200 dark:border-gray-600\",\n )}\n >\n {/* Thumbnail for images */}\n {attachment.previewUrl && (\n <img\n src={attachment.previewUrl}\n alt=\"\"\n className=\"w-5 h-5 rounded object-cover flex-shrink-0\"\n />\n )}\n\n {/* Filename */}\n <span className=\"truncate\">{attachment.file.name}</span>\n\n {/* Size / status */}\n {isLoading ? (\n <LoadingSpinner className=\"h-3 w-3 flex-shrink-0\" />\n ) : isError ? (\n <span className=\"flex-shrink-0 text-red-500\" title={attachment.error}>!</span>\n ) : (\n <span className=\"flex-shrink-0 text-gray-400 dark:text-gray-500\">\n {formatFileSize(attachment.actualSize ?? attachment.file.size)}\n </span>\n )}\n\n {/* Remove button */}\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onRemove(attachment.uuid);\n }}\n className=\"flex-shrink-0 p-0.5 rounded hover:bg-gray-200 dark:hover:bg-gray-600 transition-colors\"\n aria-label={`Remove ${attachment.file.name}`}\n disabled={isLoading}\n >\n <XIcon className=\"h-3 w-3\" />\n </button>\n </div>\n );\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Input component for sending chat messages\n *\n * @example\n * ```tsx\n * <ChatInput\n * onSend={async (content) => {\n * await sendMessage(content);\n * }}\n * placeholder=\"Type a message...\"\n * disabled={isStreaming}\n * />\n * ```\n */\nexport function ChatInput({\n onSend,\n onStop,\n placeholder = \"Type a message...\",\n disabled = false,\n isLoading = false,\n enableAttachments = false,\n attachments = [],\n onRemoveAttachment,\n dropZoneRef,\n isUploadingAttachments = false,\n className,\n}: ChatInputProps) {\n const [content, setContent] = useState(\"\");\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n const hasAttachments = enableAttachments && attachments.length > 0;\n\n // Auto-resize textarea\n useEffect(() => {\n const textarea = textareaRef.current;\n if (textarea) {\n // Reset height to calculate new height\n textarea.style.height = \"auto\";\n // Set new height based on scroll height (max 200px)\n textarea.style.height = `${Math.min(textarea.scrollHeight, 200)}px`;\n }\n }, [content]);\n\n const handleSubmit = useCallback(async () => {\n const trimmedContent = content.trim();\n // Allow send with attachments but no text\n if ((!trimmedContent && !hasAttachments) || disabled || isLoading || isUploadingAttachments) return;\n\n setContent(\"\");\n await onSend(trimmedContent);\n }, [content, hasAttachments, disabled, isLoading, isUploadingAttachments, onSend]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n // Enter to send, Shift+Enter for newline\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleSubmit();\n }\n },\n [handleSubmit]\n );\n\n const handleStopClick = useCallback(() => {\n onStop?.();\n }, [onStop]);\n\n const handleAttachClick = useCallback(() => {\n dropZoneRef?.current?.openFileDialog();\n }, [dropZoneRef]);\n\n const canSend =\n (content.trim().length > 0 || hasAttachments) &&\n !disabled &&\n !isLoading &&\n !isUploadingAttachments;\n const showStopButton = isLoading && onStop;\n\n return (\n <div\n className={cn(\n \"border-t border-gray-200 dark:border-gray-700 p-4\",\n className\n )}\n >\n {/* Attachment chips */}\n {hasAttachments && (\n <div className=\"flex flex-wrap gap-1.5 mb-2\">\n {attachments.map((attachment) => (\n <AttachmentChip\n key={attachment.uuid}\n attachment={attachment}\n onRemove={onRemoveAttachment ?? (() => {})}\n />\n ))}\n </div>\n )}\n\n <div className=\"flex items-end gap-2\">\n {/* Attach button */}\n {enableAttachments && (\n <button\n type=\"button\"\n onClick={handleAttachClick}\n disabled={disabled || isLoading}\n className={cn(\n \"flex-shrink-0 p-3 rounded-lg transition-colors\",\n \"text-gray-500 dark:text-gray-400\",\n \"hover:bg-gray-100 dark:hover:bg-gray-700\",\n \"disabled:opacity-50 disabled:cursor-not-allowed\",\n \"focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2\"\n )}\n aria-label=\"Attach files\"\n title=\"Attach files\"\n >\n <PaperclipIcon className=\"h-5 w-5\" />\n </button>\n )}\n\n {/* Textarea */}\n <div className=\"flex-1 relative\">\n <textarea\n ref={textareaRef}\n value={content}\n onChange={(e) => setContent(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={\n hasAttachments && !content\n ? `${attachments.length} file${attachments.length > 1 ? \"s\" : \"\"} attached. Add a message or press Enter to send.`\n : placeholder\n }\n disabled={disabled}\n rows={1}\n className={cn(\n \"w-full resize-none rounded-lg border px-4 py-3 text-sm\",\n \"border-gray-300 dark:border-gray-600\",\n \"bg-white dark:bg-gray-800\",\n \"text-gray-900 dark:text-gray-100\",\n \"placeholder-gray-500 dark:placeholder-gray-400\",\n \"focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\",\n \"disabled:opacity-50 disabled:cursor-not-allowed\"\n )}\n style={{ minHeight: \"44px\", maxHeight: \"200px\" }}\n />\n </div>\n\n {/* Stop or Send button */}\n {showStopButton ? (\n <button\n type=\"button\"\n onClick={handleStopClick}\n className={cn(\n \"flex-shrink-0 p-3 rounded-lg transition-colors\",\n \"bg-red-500 text-white hover:bg-red-600\",\n \"focus:outline-none focus:ring-2 focus:ring-red-500 focus:ring-offset-2\"\n )}\n aria-label=\"Stop generation\"\n >\n <StopCircleIcon className=\"h-5 w-5\" />\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={!canSend}\n className={cn(\n \"flex-shrink-0 p-3 rounded-lg transition-colors\",\n canSend\n ? \"bg-blue-500 text-white hover:bg-blue-600\"\n : \"bg-gray-200 dark:bg-gray-700 text-gray-400 dark:text-gray-500\",\n \"disabled:cursor-not-allowed\",\n \"focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2\"\n )}\n aria-label=\"Send message\"\n >\n {isLoading ? (\n <LoadingSpinner className=\"h-5 w-5\" />\n ) : (\n <SendIcon className=\"h-5 w-5\" />\n )}\n </button>\n )}\n </div>\n\n {/* Helper text */}\n <p className=\"mt-2 text-xs text-gray-500 dark:text-gray-400\">\n Press Enter to send, Shift+Enter for new line\n </p>\n </div>\n );\n}\n\nexport default ChatInput;\n","\"use client\";\n\n/**\n * FileDropZone - Reusable file upload component with drag-and-drop\n *\n * Supports drag-and-drop file upload with visual feedback, file validation,\n * image compression, upload progress tracking, and thumbnail previews.\n *\n * Two modes:\n * - Standalone: renders a drop zone UI (default)\n * - Wrapper: wraps children with a drag-drop overlay (when children provided)\n *\n * @packageDocumentation\n */\n\nimport React, {\n useState,\n useCallback,\n useRef,\n useEffect,\n useImperativeHandle,\n forwardRef,\n} from \"react\";\nimport { compressImage } from \"../utils/compress-image.js\";\nimport type { AttachmentFile } from \"../types.js\";\n\n// =============================================================================\n// INLINE SVG ICONS (no lucide-react dependency)\n// =============================================================================\n\ninterface IconProps {\n className?: string;\n}\n\nfunction Upload({ className }: IconProps) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" /><polyline points=\"17 8 12 3 7 8\" /><line x1=\"12\" x2=\"12\" y1=\"3\" y2=\"15\" />\n </svg>\n );\n}\n\nfunction X({ className }: IconProps) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\n <path d=\"M18 6 6 18\" /><path d=\"m6 6 12 12\" />\n </svg>\n );\n}\n\nfunction FileText({ className }: IconProps) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\n <path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\" /><path d=\"M14 2v4a2 2 0 0 0 2 2h4\" /><line x1=\"16\" x2=\"8\" y1=\"13\" y2=\"13\" /><line x1=\"16\" x2=\"8\" y1=\"17\" y2=\"17\" /><line x1=\"10\" x2=\"8\" y1=\"9\" y2=\"9\" />\n </svg>\n );\n}\n\nfunction ImageIcon({ className }: IconProps) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" ry=\"2\" /><circle cx=\"9\" cy=\"9\" r=\"2\" /><path d=\"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\" />\n </svg>\n );\n}\n\nfunction Music({ className }: IconProps) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\n <path d=\"M9 18V5l12-2v13\" /><circle cx=\"6\" cy=\"18\" r=\"3\" /><circle cx=\"18\" cy=\"16\" r=\"3\" />\n </svg>\n );\n}\n\nfunction Loader2({ className }: IconProps) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n );\n}\n\nfunction FileIcon({ className }: IconProps) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\n <path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\" /><path d=\"M14 2v4a2 2 0 0 0 2 2h4\" />\n </svg>\n );\n}\n\nfunction RotateCw({ className }: IconProps) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\n <path d=\"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\" /><path d=\"M21 3v5h-5\" />\n </svg>\n );\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nfunction cn(...classes: (string | undefined | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface FileDropZoneProps {\n files: AttachmentFile[];\n onFilesChange: (files: AttachmentFile[]) => void;\n /** Upload a file. Return the UUID and presigned URL. If uploadUrl is empty, the S3 PUT step is skipped. */\n onUpload: (\n file: File,\n metadata: { filename: string; mimeType: string; size: number },\n ) => Promise<{ uuid: string; uploadUrl: string }>;\n /** Confirm the upload after S3 PUT succeeds */\n onConfirmUpload?: (uuid: string) => Promise<void>;\n /** Error callback instead of toast */\n onError?: (message: string) => void;\n maxFiles?: number;\n maxTotalSizeMB?: number;\n disabled?: boolean;\n className?: string;\n /** Restrict accepted file types, e.g. \"image/*\" */\n accept?: string;\n /** Compact mode for embedding in small panels */\n compact?: boolean;\n children?: React.ReactNode;\n}\n\n/** Ref interface for programmatic access to FileDropZone */\nexport interface FileDropZoneRef {\n /** Trigger the file selection dialog */\n openFileDialog: () => void;\n}\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\nconst SUPPORTED_TYPES = {\n document: {\n mimeTypes: [\n \"application/pdf\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \"application/msword\",\n \"text/plain\",\n \"text/markdown\",\n \"text/csv\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n \"application/vnd.ms-excel\",\n ],\n extensions: [\n \".pdf\",\n \".docx\",\n \".doc\",\n \".txt\",\n \".md\",\n \".csv\",\n \".xlsx\",\n \".xls\",\n ],\n maxSizeMB: 25,\n label: \"Documents\",\n },\n image: {\n mimeTypes: [\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n \"image/svg+xml\",\n ],\n extensions: [\".png\", \".jpg\", \".jpeg\", \".gif\", \".webp\", \".svg\"],\n maxSizeMB: 10,\n label: \"Images\",\n },\n audio: {\n mimeTypes: [\n \"audio/mpeg\",\n \"audio/wav\",\n \"audio/mp4\",\n \"audio/ogg\",\n \"audio/webm\",\n ],\n extensions: [\".mp3\", \".wav\", \".m4a\", \".ogg\", \".webm\"],\n maxSizeMB: 50,\n label: \"Audio\",\n },\n};\n\nconst MAX_FILES_PER_DROP = 10;\nconst MAX_TOTAL_SIZE_MB = 100;\n\n// =============================================================================\n// UTILITY FUNCTIONS\n// =============================================================================\n\nfunction categorizeFile(\n mimeType: string,\n): \"document\" | \"image\" | \"audio\" | null {\n for (const [category, config] of Object.entries(SUPPORTED_TYPES)) {\n if (config.mimeTypes.includes(mimeType)) {\n return category as \"document\" | \"image\" | \"audio\";\n }\n }\n return null;\n}\n\nfunction validateFile(file: File): {\n valid: boolean;\n error?: string;\n category?: \"document\" | \"image\" | \"audio\";\n} {\n const category = categorizeFile(file.type);\n\n if (!category) {\n return {\n valid: false,\n error: `Unsupported file type: ${file.type || file.name.split(\".\").pop()}`,\n };\n }\n\n const config = SUPPORTED_TYPES[category];\n const maxSizeBytes = config.maxSizeMB * 1024 * 1024;\n\n if (file.size > maxSizeBytes) {\n return {\n valid: false,\n error: `${file.name} exceeds ${config.maxSizeMB}MB limit for ${config.label.toLowerCase()}`,\n };\n }\n\n return { valid: true, category };\n}\n\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction getCategoryIcon(category: \"document\" | \"image\" | \"audio\") {\n switch (category) {\n case \"document\":\n return FileText;\n case \"image\":\n return ImageIcon;\n case \"audio\":\n return Music;\n default:\n return FileIcon;\n }\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\nexport const FileDropZone = forwardRef<FileDropZoneRef, FileDropZoneProps>(\n function FileDropZone(\n {\n onFilesChange,\n files,\n onUpload,\n onConfirmUpload,\n onError,\n maxFiles = MAX_FILES_PER_DROP,\n maxTotalSizeMB = MAX_TOTAL_SIZE_MB,\n disabled = false,\n className,\n accept,\n compact = false,\n children,\n },\n ref,\n ) {\n const [isDragging, setIsDragging] = useState(false);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const dropZoneRef = useRef<HTMLDivElement>(null);\n const dragCounter = useRef(0);\n\n // Expose openFileDialog method via ref\n useImperativeHandle(\n ref,\n () => ({\n openFileDialog: () => {\n if (!disabled) {\n fileInputRef.current?.click();\n }\n },\n }),\n [disabled],\n );\n\n // Calculate current total size\n const currentTotalSize = files.reduce((sum, f) => sum + f.file.size, 0);\n\n // Upload a single file\n const uploadFile = useCallback(\n async (file: File, _tempId: string) => {\n const result = await onUpload(file, {\n filename: file.name,\n mimeType: file.type,\n size: file.size,\n });\n\n // If uploadUrl is provided, do the S3 PUT\n if (result.uploadUrl) {\n const uploadResponse = await fetch(result.uploadUrl, {\n method: \"PUT\",\n body: file,\n headers: { \"Content-Type\": file.type },\n });\n if (!uploadResponse.ok) {\n throw new Error(`Upload failed: ${uploadResponse.statusText}`);\n }\n }\n\n // Confirm if callback provided\n if (onConfirmUpload) {\n await onConfirmUpload(result.uuid);\n }\n\n return result.uuid;\n },\n [onUpload, onConfirmUpload],\n );\n\n // Handle file validation and upload\n const handleFiles = useCallback(\n async (selectedFiles: File[]) => {\n if (disabled) return;\n\n // Validate total file count\n if (files.length + selectedFiles.length > maxFiles) {\n onError?.(`Maximum ${maxFiles} files allowed`);\n return;\n }\n\n // Validate and categorize files\n const validFiles: {\n file: File;\n category: \"document\" | \"image\" | \"audio\";\n }[] = [];\n let newTotalSize = currentTotalSize;\n\n for (const file of selectedFiles) {\n const validation = validateFile(file);\n\n if (!validation.valid) {\n onError?.(validation.error!);\n continue;\n }\n\n newTotalSize += file.size;\n if (newTotalSize > maxTotalSizeMB * 1024 * 1024) {\n onError?.(`Total upload size exceeds ${maxTotalSizeMB}MB`);\n break;\n }\n\n validFiles.push({ file, category: validation.category! });\n }\n\n if (validFiles.length === 0) return;\n\n // Compress images before upload\n const processedFiles: {\n file: File;\n category: \"document\" | \"image\" | \"audio\";\n }[] = [];\n for (const entry of validFiles) {\n if (entry.category === \"image\") {\n try {\n const compressed = await compressImage(entry.file);\n processedFiles.push({ file: compressed, category: entry.category });\n } catch (err) {\n console.warn(\"Image compression failed, using original:\", err);\n processedFiles.push(entry);\n }\n } else {\n processedFiles.push(entry);\n }\n }\n\n // Create attachment records\n const newAttachments: AttachmentFile[] = processedFiles.map(\n ({ file, category }) => {\n const tempId = `temp-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n return {\n uuid: tempId,\n file,\n status: \"pending\" as const,\n progress: 0,\n category,\n previewUrl:\n category === \"image\" ? URL.createObjectURL(file) : undefined,\n };\n },\n );\n\n // Add to state immediately\n let currentFiles = [...files, ...newAttachments];\n onFilesChange(currentFiles);\n\n // Upload each file\n for (const attachment of newAttachments) {\n try {\n // Update status to uploading\n currentFiles = currentFiles.map((f: AttachmentFile) =>\n f.uuid === attachment.uuid\n ? { ...f, status: \"uploading\" as const, progress: 10 }\n : f,\n );\n onFilesChange(currentFiles);\n\n const realUuid = await uploadFile(attachment.file, attachment.uuid);\n\n // Update with real UUID and ready status\n currentFiles = currentFiles.map((f: AttachmentFile) =>\n f.uuid === attachment.uuid\n ? {\n ...f,\n uuid: realUuid,\n status: \"ready\" as const,\n progress: 100,\n hasThumbnail: f.category === \"image\",\n }\n : f,\n );\n onFilesChange(currentFiles);\n } catch (error) {\n console.error(\"Upload error:\", error);\n currentFiles = currentFiles.map((f: AttachmentFile) =>\n f.uuid === attachment.uuid\n ? {\n ...f,\n status: \"error\" as const,\n error:\n error instanceof Error ? error.message : \"Upload failed\",\n }\n : f,\n );\n onFilesChange(currentFiles);\n onError?.(`Failed to upload ${attachment.file.name}`);\n }\n }\n },\n [\n disabled,\n files,\n maxFiles,\n currentTotalSize,\n maxTotalSizeMB,\n onFilesChange,\n uploadFile,\n onError,\n ],\n );\n\n // Remove a file\n const handleRemove = useCallback(\n (uuid: string) => {\n const file = files.find((f) => f.uuid === uuid);\n if (file?.previewUrl) {\n URL.revokeObjectURL(file.previewUrl);\n }\n onFilesChange(files.filter((f) => f.uuid !== uuid));\n },\n [files, onFilesChange],\n );\n\n // Retry a failed upload\n const handleRetry = useCallback(\n async (uuid: string) => {\n const attachment = files.find((f) => f.uuid === uuid);\n if (!attachment || attachment.status !== \"error\") return;\n\n // Reset to pending\n let currentFiles = files.map((f: AttachmentFile) =>\n f.uuid === uuid\n ? { ...f, status: \"pending\" as const, progress: 0, error: undefined }\n : f,\n );\n onFilesChange(currentFiles);\n\n try {\n currentFiles = currentFiles.map((f: AttachmentFile) =>\n f.uuid === uuid\n ? { ...f, status: \"uploading\" as const, progress: 10 }\n : f,\n );\n onFilesChange(currentFiles);\n\n const realUuid = await uploadFile(attachment.file, uuid);\n\n currentFiles = currentFiles.map((f: AttachmentFile) =>\n f.uuid === uuid\n ? {\n ...f,\n uuid: realUuid,\n status: \"ready\" as const,\n progress: 100,\n hasThumbnail: f.category === \"image\",\n }\n : f,\n );\n onFilesChange(currentFiles);\n } catch (error) {\n console.error(\"Retry upload error:\", error);\n currentFiles = currentFiles.map((f: AttachmentFile) =>\n f.uuid === uuid\n ? {\n ...f,\n status: \"error\" as const,\n error:\n error instanceof Error ? error.message : \"Upload failed\",\n }\n : f,\n );\n onFilesChange(currentFiles);\n onError?.(`Failed to upload ${attachment.file.name}`);\n }\n },\n [files, onFilesChange, uploadFile, onError],\n );\n\n // Helper to check if the drag event contains files\n const hasDraggedFiles = useCallback((e: React.DragEvent): boolean => {\n if (e.dataTransfer.types) {\n for (const type of e.dataTransfer.types) {\n if (type === \"Files\") return true;\n }\n }\n return false;\n }, []);\n\n // Drag and drop handlers (standalone mode)\n const handleDragEnter = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (!hasDraggedFiles(e)) return;\n dragCounter.current++;\n if (!disabled && dragCounter.current === 1) {\n setIsDragging(true);\n }\n },\n [disabled, hasDraggedFiles],\n );\n\n const handleDragOver = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (hasDraggedFiles(e)) {\n e.dataTransfer.dropEffect = disabled ? \"none\" : \"copy\";\n }\n },\n [disabled, hasDraggedFiles],\n );\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (dragCounter.current > 0) {\n dragCounter.current--;\n if (dragCounter.current === 0) {\n setIsDragging(false);\n }\n }\n }, []);\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounter.current = 0;\n setIsDragging(false);\n if (disabled) return;\n const droppedFiles = Array.from(e.dataTransfer.files);\n if (droppedFiles.length > 0) {\n handleFiles(droppedFiles);\n }\n },\n [handleFiles, disabled],\n );\n\n const handleFileSelect = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const selectedFiles = e.target.files;\n if (selectedFiles) {\n handleFiles(Array.from(selectedFiles));\n }\n if (fileInputRef.current) {\n fileInputRef.current.value = \"\";\n }\n },\n [handleFiles],\n );\n\n const handleClick = useCallback(() => {\n if (!disabled) {\n fileInputRef.current?.click();\n }\n }, [disabled]);\n\n // Helper to check if dataTransfer contains files (cross-browser)\n const checkDataTransferHasFiles = useCallback(\n (dataTransfer: DataTransfer | null): boolean => {\n if (!dataTransfer?.types) return false;\n for (let i = 0; i < dataTransfer.types.length; i++) {\n if (dataTransfer.types[i] === \"Files\") return true;\n }\n return false;\n },\n [],\n );\n\n // Native event listeners for wrapper mode drag-drop\n useEffect(() => {\n if (!children || !dropZoneRef.current) return;\n\n const element = dropZoneRef.current;\n let enterCounter = 0;\n\n const handleDragEnterNative = (e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (!checkDataTransferHasFiles(e.dataTransfer)) return;\n enterCounter++;\n if (enterCounter === 1 && !disabled) {\n setIsDragging(true);\n }\n };\n\n const handleDragLeaveNative = (e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (!checkDataTransferHasFiles(e.dataTransfer)) return;\n enterCounter--;\n if (enterCounter <= 0) {\n enterCounter = 0;\n setIsDragging(false);\n }\n };\n\n const handleDragOverNative = (e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (\n checkDataTransferHasFiles(e.dataTransfer) &&\n !disabled &&\n e.dataTransfer\n ) {\n e.dataTransfer.dropEffect = \"copy\";\n }\n };\n\n const handleDropNative = (e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n enterCounter = 0;\n setIsDragging(false);\n if (disabled) return;\n const droppedFiles = e.dataTransfer?.files;\n if (droppedFiles && droppedFiles.length > 0) {\n handleFiles(Array.from(droppedFiles));\n }\n };\n\n element.addEventListener(\"dragenter\", handleDragEnterNative, true);\n element.addEventListener(\"dragleave\", handleDragLeaveNative, true);\n element.addEventListener(\"dragover\", handleDragOverNative, true);\n element.addEventListener(\"drop\", handleDropNative, true);\n\n return () => {\n element.removeEventListener(\"dragenter\", handleDragEnterNative, true);\n element.removeEventListener(\"dragleave\", handleDragLeaveNative, true);\n element.removeEventListener(\"dragover\", handleDragOverNative, true);\n element.removeEventListener(\"drop\", handleDropNative, true);\n };\n }, [children, disabled, handleFiles, checkDataTransferHasFiles]);\n\n // Reset drag state when disabled changes\n useEffect(() => {\n if (disabled) {\n dragCounter.current = 0;\n setIsDragging(false);\n }\n }, [disabled]);\n\n // Build accept string for file input\n const acceptTypes =\n accept ||\n Object.values(SUPPORTED_TYPES)\n .flatMap((t) => [...t.mimeTypes, ...t.extensions])\n .join(\",\");\n\n const hasFiles = files.length > 0;\n const isUploading = files.some((f) => f.status === \"uploading\");\n\n // --- Wrapper mode ---\n if (children) {\n return (\n <div\n ref={dropZoneRef}\n data-dropzone=\"wrapper\"\n className={cn(\"relative w-full h-full\", className)}\n style={{ minHeight: \"inherit\" }}\n >\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n accept={acceptTypes}\n onChange={handleFileSelect}\n className=\"hidden\"\n disabled={disabled}\n />\n {children}\n {isDragging && !disabled && (\n <div\n className=\"absolute inset-0 z-50 bg-primary/10 border-2 border-dashed border-primary rounded-xl flex flex-col items-center justify-center backdrop-blur-sm transition-opacity duration-200\"\n style={{ pointerEvents: \"none\" }}\n >\n <div className=\"bg-background/80 rounded-xl p-8 flex flex-col items-center shadow-lg\">\n <Upload className=\"h-12 w-12 text-primary mb-4 animate-bounce\" />\n <p className=\"text-lg font-medium text-primary\">\n Drop files here\n </p>\n <p className=\"text-sm text-muted-foreground mt-2\">\n Documents, images, or audio files\n </p>\n </div>\n </div>\n )}\n </div>\n );\n }\n\n // --- Standalone mode ---\n return (\n <div className={cn(\"w-full\", className)}>\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n accept={acceptTypes}\n onChange={handleFileSelect}\n className=\"hidden\"\n disabled={disabled}\n />\n\n {/* Drop zone */}\n <div\n onDragEnter={handleDragEnter}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onClick={handleClick}\n className={cn(\n \"relative rounded-lg border-2 border-dashed transition-all cursor-pointer\",\n \"flex flex-col items-center justify-center\",\n compact ? \"p-2 min-h-[60px]\" : \"p-4 min-h-[100px]\",\n isDragging && !disabled\n ? \"border-primary bg-primary/5\"\n : \"border-muted-foreground/25\",\n disabled\n ? \"opacity-50 cursor-not-allowed\"\n : \"hover:border-primary/50 hover:bg-muted/25\",\n )}\n >\n {isUploading ? (\n <Loader2\n className={cn(\n \"animate-spin text-muted-foreground\",\n compact ? \"h-5 w-5 mb-1\" : \"h-8 w-8 mb-2\",\n )}\n />\n ) : (\n <Upload\n className={cn(\n \"text-muted-foreground\",\n compact ? \"h-5 w-5 mb-1\" : \"h-8 w-8 mb-2\",\n )}\n />\n )}\n\n <p\n className={cn(\n \"font-medium text-center text-muted-foreground\",\n compact ? \"text-xs\" : \"text-sm\",\n )}\n >\n {isDragging\n ? \"Drop files here\"\n : isUploading\n ? \"Uploading...\"\n : \"Click to upload or drag and drop\"}\n </p>\n\n {!compact && (\n <p className=\"text-xs text-muted-foreground/70 text-center mt-1\">\n Documents, images, or audio files\n </p>\n )}\n </div>\n\n {/* File list */}\n {hasFiles && (\n <div className={cn(\"space-y-2\", compact ? \"mt-2\" : \"mt-3\")}>\n {files.map((attachment) => {\n const Icon = getCategoryIcon(attachment.category);\n const isError = attachment.status === \"error\";\n const isLoading =\n attachment.status === \"uploading\" ||\n attachment.status === \"processing\";\n\n return (\n <div\n key={attachment.uuid}\n className={cn(\n \"flex items-center gap-3 p-2 rounded-lg border\",\n isError\n ? \"border-destructive/50 bg-destructive/5\"\n : \"border-border bg-muted/25\",\n )}\n >\n {/* Preview or icon */}\n <div className=\"relative flex-shrink-0 w-10 h-10 rounded overflow-hidden bg-muted flex items-center justify-center\">\n {attachment.previewUrl ? (\n <img\n src={attachment.previewUrl}\n alt={attachment.file.name}\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <Icon className=\"h-5 w-5 text-muted-foreground\" />\n )}\n {isLoading && (\n <div className=\"absolute inset-0 bg-background/80 flex items-center justify-center\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n </div>\n )}\n </div>\n\n {/* File info */}\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium truncate\">\n {attachment.file.name}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {formatFileSize(attachment.file.size)}\n {isError && attachment.error && (\n <span className=\"text-destructive ml-2\">\n {attachment.error}\n </span>\n )}\n </p>\n </div>\n\n {/* Status indicator */}\n <div className=\"flex-shrink-0\">\n {isLoading ? (\n <span className=\"text-xs text-muted-foreground\">\n {attachment.progress}%\n </span>\n ) : attachment.status === \"ready\" ? (\n <span className=\"text-xs text-green-600\">Ready</span>\n ) : null}\n </div>\n\n {/* Retry button for failed uploads */}\n {isError && (\n <button\n type=\"button\"\n className=\"flex-shrink-0 h-8 w-8 inline-flex items-center justify-center rounded-md text-primary hover:bg-muted transition-colors\"\n onClick={(e) => {\n e.stopPropagation();\n handleRetry(attachment.uuid);\n }}\n title=\"Retry upload\"\n >\n <RotateCw className=\"h-4 w-4\" />\n </button>\n )}\n\n {/* Remove button */}\n <button\n type=\"button\"\n className=\"flex-shrink-0 h-8 w-8 inline-flex items-center justify-center rounded-md hover:bg-muted transition-colors disabled:opacity-50\"\n onClick={(e) => {\n e.stopPropagation();\n handleRemove(attachment.uuid);\n }}\n disabled={isLoading}\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n },\n);\n","\"use client\";\n\n/**\n * AskUserPrompt Component\n *\n * Displays when the agent calls ask_user to request user input.\n * Shows the question and optional choices, with an input field.\n *\n * Ported from: ai-saas-v2/src/extensions/agents/components/playground/internal-tools/AskUserPrompt.tsx\n *\n * @module @cadraos/sdk/chat\n */\n\nimport * as React from \"react\";\nimport { useCallback, useState } from \"react\";\nimport { CheckCircleIcon, MessageCircleIcon, SendIcon } from \"../../icons/index.js\";\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nfunction cn(...classes: (string | undefined | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface AskUserPromptProps {\n /** The question to display to the user */\n question: string;\n /** Optional predefined choices */\n options?: string[];\n /** Callback when user submits their response */\n onSubmit: (response: string) => void;\n /** Whether a response is required */\n required?: boolean;\n /** Whether the prompt is disabled (e.g., already responded) */\n disabled?: boolean;\n /** Current status */\n status?: \"waiting\" | \"submitted\" | \"processing\";\n /** Additional CSS classes */\n className?: string;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Input prompt for agent clarification requests\n *\n * @example\n * ```tsx\n * <AskUserPrompt\n * question=\"What format would you like the report in?\"\n * options={[\"PDF\", \"CSV\", \"Excel\"]}\n * onSubmit={(response) => handleClarification(response)}\n * />\n * ```\n */\nexport function AskUserPrompt({\n question,\n options,\n onSubmit,\n required = true,\n disabled = false,\n status = \"waiting\",\n className,\n}: AskUserPromptProps) {\n const [response, setResponse] = useState(\"\");\n const [selectedOption, setSelectedOption] = useState<string | null>(null);\n\n const handleSubmit = useCallback(() => {\n const finalResponse = selectedOption || response.trim();\n if (required && !finalResponse) return;\n onSubmit(finalResponse);\n }, [selectedOption, response, required, onSubmit]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleSubmit();\n }\n },\n [handleSubmit]\n );\n\n const handleOptionSelect = useCallback((option: string) => {\n setSelectedOption((prev) => (prev === option ? null : option));\n setResponse(\"\"); // Clear text input when option selected\n }, []);\n\n const isSubmitDisabled =\n disabled ||\n status !== \"waiting\" ||\n (required && !response.trim() && !selectedOption);\n\n return (\n <div\n className={cn(\n \"rounded-lg border p-4 space-y-3\",\n status === \"waiting\"\n ? \"border-blue-200 bg-blue-50/50 dark:border-blue-800 dark:bg-blue-950/20\"\n : \"border-green-200 bg-green-50/50 dark:border-green-800 dark:bg-green-950/20\",\n className\n )}\n >\n {/* Header */}\n <div className=\"flex items-center gap-2\">\n <MessageCircleIcon className=\"h-5 w-5 text-blue-600 dark:text-blue-400\" />\n <span className=\"font-medium text-blue-900 dark:text-blue-100\">\n Agent needs your input\n </span>\n <span\n className={cn(\n \"ml-auto text-xs px-2 py-1 rounded-full font-medium\",\n status === \"waiting\"\n ? \"bg-blue-100 text-blue-700 dark:bg-blue-900 dark:text-blue-300\"\n : \"bg-green-100 text-green-700 dark:bg-green-900 dark:text-green-300\"\n )}\n >\n {status === \"waiting\"\n ? \"Waiting\"\n : status === \"submitted\"\n ? \"Submitted\"\n : \"Processing\"}\n </span>\n </div>\n\n {/* Question */}\n <p className=\"text-sm text-gray-700 dark:text-gray-300 whitespace-pre-wrap\">\n {question}\n </p>\n\n {/* Options (if provided) */}\n {options && options.length > 0 && status === \"waiting\" && (\n <div className=\"flex flex-wrap gap-2\">\n {options.map((option, idx) => (\n <button\n key={idx}\n type=\"button\"\n onClick={() => handleOptionSelect(option)}\n disabled={disabled}\n className={cn(\n \"px-3 py-1.5 text-sm rounded-md border transition-all\",\n selectedOption === option\n ? \"bg-blue-600 text-white border-blue-600 hover:bg-blue-700\"\n : \"bg-white dark:bg-gray-800 border-gray-300 dark:border-gray-600 hover:bg-gray-50 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300\",\n disabled && \"opacity-50 cursor-not-allowed\"\n )}\n >\n {option}\n </button>\n ))}\n </div>\n )}\n\n {/* Input area (for open-ended or in addition to options) */}\n {status === \"waiting\" && (\n <div className=\"flex gap-2\">\n <textarea\n value={response}\n onChange={(e) => {\n setResponse(e.target.value);\n setSelectedOption(null); // Clear option selection when typing\n }}\n onKeyDown={handleKeyDown}\n placeholder={\n options?.length\n ? \"Or type a custom response...\"\n : \"Type your response...\"\n }\n className={cn(\n \"flex-1 min-h-[60px] px-3 py-2 text-sm resize-none rounded-md border\",\n \"border-gray-300 dark:border-gray-600\",\n \"bg-white dark:bg-gray-800\",\n \"text-gray-900 dark:text-gray-100\",\n \"placeholder-gray-500 dark:placeholder-gray-400\",\n \"focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\",\n disabled && \"opacity-50 cursor-not-allowed\"\n )}\n disabled={disabled}\n />\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitDisabled}\n className={cn(\n \"self-end px-4 py-2 rounded-md text-white transition-colors\",\n \"bg-blue-600 hover:bg-blue-700\",\n \"disabled:opacity-50 disabled:cursor-not-allowed\"\n )}\n >\n <SendIcon className=\"h-4 w-4\" />\n </button>\n </div>\n )}\n\n {/* Submitted state */}\n {status !== \"waiting\" && (\n <div className=\"flex items-center gap-2 text-sm text-green-700 dark:text-green-400\">\n <CheckCircleIcon className=\"h-4 w-4\" />\n <span>\n Response submitted:{\" \"}\n <span className=\"font-medium\">{selectedOption || response}</span>\n </span>\n </div>\n )}\n </div>\n );\n}\n\nexport default AskUserPrompt;\n","\"use client\";\n\n/**\n * MarkdownContent - Markdown rendering component for chat messages\n *\n * Renders markdown content with proper styling for:\n * - Headers\n * - Code blocks (with syntax highlighting placeholder)\n * - Tables\n * - Links (open in new tab)\n * - Lists\n * - GFM features (strikethrough, task lists)\n *\n * Ported from: ai-saas-v2/src/extensions/agents/components/playground/PlaygroundChat.tsx (inline)\n *\n * @module @cadraos/sdk/chat\n */\n\nimport { useMemo } from \"react\";\nimport type { Components } from \"react-markdown\";\nimport ReactMarkdown from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nfunction cn(...classes: (string | undefined | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface MarkdownContentProps {\n /** Markdown content to render */\n content: string;\n /** Additional CSS classes */\n className?: string;\n /** Custom React-Markdown component overrides (merged with defaults, user wins) */\n components?: Partial<Components>;\n /** Custom URL transform for React-Markdown (e.g., to preserve custom protocols like artifact:) */\n urlTransform?: (url: string) => string;\n /** Transform content string before rendering (e.g., strip certain patterns) */\n contentTransform?: (content: string) => string;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Renders markdown content with chat-appropriate styling\n *\n * @example\n * ```tsx\n * <MarkdownContent content=\"# Hello\\n\\nThis is **bold** text.\" />\n * ```\n */\nexport function MarkdownContent({\n content,\n className,\n components: customComponents,\n urlTransform,\n contentTransform,\n}: MarkdownContentProps) {\n // Apply content transform if provided\n const transformedContent = useMemo(\n () => (contentTransform ? contentTransform(content) : content),\n [content, contentTransform]\n );\n\n const defaultComponents: Partial<Components> = useMemo(\n () => ({\n // Headers\n h1: ({ children }) => (\n <h1 className=\"text-2xl font-bold mt-4 mb-2 first:mt-0\">{children}</h1>\n ),\n h2: ({ children }) => (\n <h2 className=\"text-xl font-bold mt-4 mb-2 first:mt-0\">{children}</h2>\n ),\n h3: ({ children }) => (\n <h3 className=\"text-lg font-semibold mt-3 mb-1 first:mt-0\">{children}</h3>\n ),\n h4: ({ children }) => (\n <h4 className=\"text-base font-semibold mt-2 mb-1 first:mt-0\">{children}</h4>\n ),\n\n // Paragraphs\n p: ({ children }) => (\n <p className=\"mb-2 last:mb-0 leading-relaxed\">{children}</p>\n ),\n\n // Lists\n ul: ({ children }) => (\n <ul className=\"list-disc list-inside mb-2 space-y-1\">{children}</ul>\n ),\n ol: ({ children }) => (\n <ol className=\"list-decimal list-inside mb-2 space-y-1\">{children}</ol>\n ),\n li: ({ children }) => (\n <li className=\"leading-relaxed\">{children}</li>\n ),\n\n // Links\n a: ({ href, children }) => (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-blue-600 hover:text-blue-800 dark:text-blue-400 dark:hover:text-blue-300 underline\"\n >\n {children}\n </a>\n ),\n\n // Tables\n table: ({ children }) => (\n <div className=\"overflow-x-auto my-2\">\n <table className=\"min-w-full divide-y divide-gray-200 dark:divide-gray-700 border border-gray-200 dark:border-gray-700 rounded-lg\">\n {children}\n </table>\n </div>\n ),\n thead: ({ children }) => (\n <thead className=\"bg-gray-50 dark:bg-gray-800\">{children}</thead>\n ),\n tbody: ({ children }) => (\n <tbody className=\"bg-white dark:bg-gray-900 divide-y divide-gray-200 dark:divide-gray-700\">\n {children}\n </tbody>\n ),\n tr: ({ children }) => <tr>{children}</tr>,\n th: ({ children }) => (\n <th className=\"px-3 py-2 text-left text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider\">\n {children}\n </th>\n ),\n td: ({ children }) => (\n <td className=\"px-3 py-2 text-sm text-gray-900 dark:text-gray-100 whitespace-nowrap\">\n {children}\n </td>\n ),\n\n // Blockquotes\n blockquote: ({ children }) => (\n <blockquote className=\"border-l-4 border-gray-300 dark:border-gray-600 pl-4 italic text-gray-600 dark:text-gray-400 my-2\">\n {children}\n </blockquote>\n ),\n\n // Horizontal rule\n hr: () => (\n <hr className=\"my-4 border-gray-200 dark:border-gray-700\" />\n ),\n\n // Strong and emphasis\n strong: ({ children }) => (\n <strong className=\"font-semibold\">{children}</strong>\n ),\n em: ({ children }) => (\n <em className=\"italic\">{children}</em>\n ),\n\n // Strikethrough (GFM)\n del: ({ children }) => (\n <del className=\"line-through text-gray-500 dark:text-gray-400\">\n {children}\n </del>\n ),\n\n // Code - inline and blocks\n code: ({ className: codeClassName, children, ...props }) => {\n // Check if it's a code block (has language class) or inline code\n const isCodeBlock = /language-(\\w+)/.exec(codeClassName || \"\");\n const language = isCodeBlock ? isCodeBlock[1] : null;\n\n if (isCodeBlock) {\n return (\n <div className=\"relative my-2\">\n {language && (\n <div className=\"absolute top-0 right-0 px-2 py-1 text-xs font-mono text-gray-500 dark:text-gray-400 bg-gray-100 dark:bg-gray-800 rounded-bl rounded-tr border-b border-l border-gray-200 dark:border-gray-700\">\n {language}\n </div>\n )}\n <pre className=\"bg-gray-100 dark:bg-gray-800 rounded-lg p-4 overflow-x-auto text-sm\">\n <code className={cn(\"font-mono\", codeClassName)} {...props}>\n {children}\n </code>\n </pre>\n </div>\n );\n }\n\n // Inline code\n return (\n <code\n className=\"bg-gray-100 dark:bg-gray-800 text-gray-800 dark:text-gray-200 px-1.5 py-0.5 rounded text-sm font-mono\"\n {...props}\n >\n {children}\n </code>\n );\n },\n\n // Pre element (for code blocks)\n pre: ({ children }) => (\n <>{children}</>\n ),\n\n // Images\n img: ({ src, alt }) => (\n <img\n src={src}\n alt={alt || \"\"}\n className=\"max-w-full h-auto rounded-lg my-2\"\n loading=\"lazy\"\n />\n ),\n\n // Task lists (GFM)\n input: ({ type, checked, disabled }) => {\n if (type === \"checkbox\") {\n return (\n <input\n type=\"checkbox\"\n checked={checked}\n disabled={disabled}\n readOnly\n className=\"mr-2 rounded border-gray-300 dark:border-gray-600\"\n />\n );\n }\n return <input type={type} />;\n },\n }),\n []\n );\n\n // Merge default components with custom overrides (custom wins)\n const mergedComponents = useMemo(\n () =>\n customComponents\n ? { ...defaultComponents, ...customComponents }\n : defaultComponents,\n [defaultComponents, customComponents]\n );\n\n return (\n <div className={cn(\"prose prose-sm dark:prose-invert max-w-none\", className)}>\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n components={mergedComponents}\n {...(urlTransform ? { urlTransform } : {})}\n >\n {transformedContent}\n </ReactMarkdown>\n </div>\n );\n}\n\nexport default MarkdownContent;\n","\"use client\";\n\n/**\n * ToolCallEntry - Tool call visualization component\n *\n * Displays tool calls with:\n * - Status indicators (pending, running, completed, failed)\n * - Collapsible input/output view\n * - Duration display\n * - Formatted tool names\n *\n * Ported from: ai-saas-v2/src/extensions/agents/components/playground/PlaygroundChat.tsx (inline)\n *\n * @module @cadraos/sdk/chat\n */\n\nimport { useMemo, useState } from \"react\";\nimport {\n AlertCircleIcon,\n CheckIcon,\n ChevronDownIcon,\n ChevronRightIcon,\n ClockIcon,\n LoadingSpinner,\n} from \"../icons/index.js\";\nimport type { ToolCall } from \"../types.js\";\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nfunction cn(...classes: (string | undefined | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n\n/**\n * Convert tool names from snake_case with prefixes to friendly Title Case\n *\n * Examples:\n * - \"skills_api_create_skill\" -> \"Create Skill\"\n * - \"tools_api_list_tools\" -> \"List Tools\"\n * - \"browse_web_browse_web_page\" -> \"Browse Page\"\n * - \"search_google\" -> \"Search Google\"\n * - \"notion_api_create_page\" -> \"Create Page\"\n */\nfunction formatToolName(toolName: string): string {\n if (!toolName) return toolName;\n\n // Common prefixes to remove (order matters - longer/more specific first)\n const prefixesToRemove = [\n \"skills_api_\",\n \"tools_api_\",\n \"tools_management_api_\",\n \"browse_web_browse_web_\",\n \"browse_web_browse_\",\n \"browse_web_\",\n \"notion_api_\",\n \"google_api_\",\n \"slack_api_\",\n \"github_api_\",\n \"search_api_\",\n \"file_system_\",\n \"code_execution_\",\n \"data_analysis_\",\n \"knowledge_base_\",\n \"memory_api_\",\n \"database_api_\",\n \"email_api_\",\n \"calendar_api_\",\n \"storage_api_\",\n \"api_\",\n ];\n\n let cleanName = toolName;\n\n // Remove known prefixes (can remove multiple)\n let foundPrefix = true;\n while (foundPrefix) {\n foundPrefix = false;\n for (const prefix of prefixesToRemove) {\n if (cleanName.toLowerCase().startsWith(prefix)) {\n cleanName = cleanName.slice(prefix.length);\n foundPrefix = true;\n break;\n }\n }\n }\n\n // Remove duplicate words\n const words = cleanName.split(\"_\");\n const uniqueWords: string[] = [];\n for (const word of words) {\n if (\n uniqueWords.length === 0 ||\n uniqueWords[uniqueWords.length - 1]?.toLowerCase() !== word.toLowerCase()\n ) {\n uniqueWords.push(word);\n }\n }\n\n // Convert to Title Case\n return uniqueWords\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(\" \");\n}\n\n/**\n * Format duration in a human-readable way\n */\nfunction formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n const seconds = (ms / 1000).toFixed(1);\n return `${seconds}s`;\n}\n\n/**\n * Truncate and format JSON for display\n */\nfunction formatJsonPreview(data: unknown, maxLength = 100): string {\n if (data === undefined || data === null) {\n return String(data);\n }\n try {\n const str = JSON.stringify(data, null, 2);\n if (str.length > maxLength) {\n return str.slice(0, maxLength) + \"...\";\n }\n return str;\n } catch {\n return String(data);\n }\n}\n\n/**\n * Extract image URLs from a tool result.\n *\n * Detects common patterns:\n * - { success: true, images: [{ url: \"...\" }] } (transformed image response)\n * - { images: [{ url: \"...\" }] }\n * - { url: \"...\" } (single image)\n * - String that is a URL ending in image extension\n * - JSON string containing any of the above\n */\ninterface ExtractedImage {\n url: string;\n thumbnailUrl?: string;\n prompt?: string;\n alt?: string;\n}\n\nfunction extractImagesFromResult(result: unknown): ExtractedImage[] {\n if (!result) return [];\n\n // If result is a string, try to parse as JSON first\n let data: unknown = result;\n if (typeof result === \"string\") {\n try {\n data = JSON.parse(result);\n } catch {\n // Check if it's a direct image URL\n if (/\\.(png|jpg|jpeg|gif|webp|svg|bmp)(\\?.*)?$/i.test(result) || result.startsWith(\"data:image/\")) {\n return [{ url: result }];\n }\n return [];\n }\n }\n\n if (typeof data !== \"object\" || data === null) return [];\n\n const obj = data as Record<string, unknown>;\n\n // Pattern: { images: [...] } or { success: true, images: [...] }\n if (Array.isArray(obj.images)) {\n return (obj.images as Array<Record<string, unknown>>)\n .filter((img) => typeof img.url === \"string\")\n .map((img) => ({\n url: img.url as string,\n thumbnailUrl: img.thumbnailUrl as string | undefined,\n prompt: img.prompt as string | undefined,\n alt: (img.alt as string) || (img.prompt as string) || undefined,\n }));\n }\n\n // Pattern: { url: \"...\" } (single image result)\n if (typeof obj.url === \"string\" && /\\.(png|jpg|jpeg|gif|webp|svg|bmp)(\\?.*)?$/i.test(obj.url)) {\n return [{ url: obj.url, alt: obj.alt as string | undefined }];\n }\n\n // Pattern: { imageUrl: \"...\" }\n if (typeof obj.imageUrl === \"string\") {\n return [{ url: obj.imageUrl as string, alt: obj.alt as string | undefined }];\n }\n\n return [];\n}\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface ToolCallEntryProps {\n /** Tool call data */\n toolCall: ToolCall;\n /** Additional CSS classes */\n className?: string;\n /** Whether to show the full JSON in expanded view */\n showFullJson?: boolean;\n /** Optional callback when an image is clicked. If provided, overrides default browser-open behavior. */\n onImageClick?: (image: { url: string; alt?: string; filename?: string }) => void;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Displays a single tool call with status and expandable details\n *\n * @example\n * ```tsx\n * <ToolCallEntry\n * toolCall={{\n * id: \"1\",\n * name: \"search_google\",\n * status: \"completed\",\n * args: { query: \"weather today\" },\n * result: { results: [...] },\n * durationMs: 1234,\n * }}\n * />\n * ```\n */\nexport function ToolCallEntry({\n toolCall,\n className,\n showFullJson = true,\n onImageClick,\n}: ToolCallEntryProps) {\n const [isExpanded, setIsExpanded] = useState(false);\n\n const formattedName = useMemo(\n () => formatToolName(toolCall.name),\n [toolCall.name]\n );\n\n // Extract images from tool result (if any)\n const resultImages = useMemo(\n () => (toolCall.status === \"completed\" && toolCall.result ? extractImagesFromResult(toolCall.result) : []),\n [toolCall.status, toolCall.result]\n );\n\n const hasImages = resultImages.length > 0;\n\n const statusIcon = useMemo(() => {\n switch (toolCall.status) {\n case \"pending\":\n return <ClockIcon className=\"h-4 w-4 text-gray-400\" />;\n case \"running\":\n return <LoadingSpinner className=\"h-4 w-4 text-blue-500\" />;\n case \"completed\":\n return <CheckIcon className=\"h-4 w-4 text-green-500\" />;\n case \"failed\":\n return <AlertCircleIcon className=\"h-4 w-4 text-red-500\" />;\n default:\n return null;\n }\n }, [toolCall.status]);\n\n const statusColor = useMemo(() => {\n switch (toolCall.status) {\n case \"pending\":\n return \"border-gray-200 dark:border-gray-700\";\n case \"running\":\n return \"border-blue-200 dark:border-blue-800 bg-blue-50/50 dark:bg-blue-950/20\";\n case \"completed\":\n return \"border-green-200 dark:border-green-800\";\n case \"failed\":\n return \"border-red-200 dark:border-red-800 bg-red-50/50 dark:bg-red-950/20\";\n default:\n return \"border-gray-200 dark:border-gray-700\";\n }\n }, [toolCall.status]);\n\n return (\n <div\n className={cn(\n \"rounded-lg border text-sm\",\n statusColor,\n className\n )}\n >\n {/* Header - always visible */}\n <button\n type=\"button\"\n onClick={() => setIsExpanded(!isExpanded)}\n className=\"w-full flex items-center gap-2 px-3 py-2 hover:bg-gray-50 dark:hover:bg-gray-800/50 transition-colors rounded-lg\"\n >\n {/* Expand/Collapse icon */}\n {isExpanded ? (\n <ChevronDownIcon className=\"h-4 w-4 text-gray-400 flex-shrink-0\" />\n ) : (\n <ChevronRightIcon className=\"h-4 w-4 text-gray-400 flex-shrink-0\" />\n )}\n\n {/* Status icon */}\n <span className=\"flex-shrink-0\">{statusIcon}</span>\n\n {/* Tool name */}\n <span className=\"font-medium text-gray-900 dark:text-gray-100 truncate\">\n {formattedName}\n </span>\n\n {/* Duration (if completed) */}\n {toolCall.status === \"completed\" && toolCall.durationMs !== undefined && (\n <span className=\"ml-auto text-xs text-gray-500 dark:text-gray-400 flex-shrink-0\">\n {formatDuration(toolCall.durationMs)}\n </span>\n )}\n\n {/* Error indicator */}\n {toolCall.status === \"failed\" && toolCall.error && (\n <span className=\"ml-auto text-xs text-red-600 dark:text-red-400 truncate max-w-[150px]\">\n {toolCall.error}\n </span>\n )}\n </button>\n\n {/* Images from tool result - always visible (not behind expand) */}\n {hasImages && (\n <div className=\"px-3 pb-2\">\n <div className={cn(\n \"grid gap-2\",\n resultImages.length === 1 ? \"grid-cols-1\" : \"grid-cols-2\"\n )}>\n {resultImages.map((img, idx) => {\n const altText = img.alt || img.prompt || `Generated image ${idx + 1}`;\n const imageElement = (\n <>\n <img\n src={img.thumbnailUrl || img.url}\n alt={altText}\n className=\"w-full h-auto max-h-[300px] object-contain bg-gray-50 dark:bg-gray-900\"\n loading=\"lazy\"\n />\n {img.prompt && (\n <div className=\"px-2 py-1 text-xs text-gray-500 dark:text-gray-400 truncate bg-gray-50 dark:bg-gray-800 border-t border-gray-200 dark:border-gray-700\">\n {img.prompt}\n </div>\n )}\n </>\n );\n\n if (onImageClick) {\n return (\n <button\n key={idx}\n type=\"button\"\n onClick={() => onImageClick({ url: img.url, alt: altText, filename: altText })}\n className=\"block rounded-lg overflow-hidden border border-gray-200 dark:border-gray-700 hover:border-blue-400 dark:hover:border-blue-600 transition-colors cursor-pointer text-left\"\n >\n {imageElement}\n </button>\n );\n }\n\n return (\n <a\n key={idx}\n href={img.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"block rounded-lg overflow-hidden border border-gray-200 dark:border-gray-700 hover:border-blue-400 dark:hover:border-blue-600 transition-colors\"\n >\n {imageElement}\n </a>\n );\n })}\n </div>\n </div>\n )}\n\n {/* Expanded content */}\n {isExpanded && (\n <div className=\"border-t border-gray-200 dark:border-gray-700 px-3 py-2 space-y-2\">\n {/* Input/Args */}\n {toolCall.args && Object.keys(toolCall.args).length > 0 && (\n <div>\n <div className=\"text-xs font-medium text-gray-500 dark:text-gray-400 mb-1\">\n Input\n </div>\n <pre className=\"bg-gray-100 dark:bg-gray-800 rounded p-2 text-xs overflow-x-auto font-mono text-gray-700 dark:text-gray-300\">\n {showFullJson\n ? JSON.stringify(toolCall.args, null, 2)\n : formatJsonPreview(toolCall.args, 200)}\n </pre>\n </div>\n )}\n\n {/* Output/Result */}\n {toolCall.status === \"completed\" && toolCall.result !== undefined && (\n <div>\n <div className=\"text-xs font-medium text-gray-500 dark:text-gray-400 mb-1\">\n Output\n </div>\n <pre className=\"bg-gray-100 dark:bg-gray-800 rounded p-2 text-xs overflow-x-auto font-mono text-gray-700 dark:text-gray-300 max-h-[200px]\">\n {showFullJson\n ? JSON.stringify(toolCall.result, null, 2)\n : formatJsonPreview(toolCall.result, 500)}\n </pre>\n </div>\n )}\n\n {/* Error details */}\n {toolCall.status === \"failed\" && toolCall.error && (\n <div>\n <div className=\"text-xs font-medium text-red-600 dark:text-red-400 mb-1\">\n Error\n </div>\n <pre className=\"bg-red-50 dark:bg-red-950/30 rounded p-2 text-xs overflow-x-auto font-mono text-red-700 dark:text-red-300\">\n {toolCall.error}\n </pre>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport default ToolCallEntry;\n","\"use client\";\n\n/**\n * ChatMessage - Individual message bubble component\n *\n * Displays a single message with:\n * - Role-based styling (user/assistant)\n * - Avatar\n * - Markdown content (for assistant)\n * - Attachments\n * - Tool calls\n * - Thinking blocks\n *\n * @module @cadraos/sdk/chat\n */\n\nimport { useMemo } from \"react\";\nimport { BotIcon, LoadingSpinner, UserIcon } from \"../icons/index.js\";\nimport type { ChatMessage as ChatMessageType } from \"../types.js\";\nimport { MarkdownContent } from \"./MarkdownContent.js\";\nimport { ToolCallEntry } from \"./ToolCallEntry.js\";\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nfunction cn(...classes: (string | undefined | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface ChatMessageProps {\n /** Message data */\n message: ChatMessageType;\n /** Whether to enable markdown rendering */\n enableMarkdown?: boolean;\n /** Whether to show tool calls */\n showToolCalls?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Custom markdown component overrides */\n markdownComponents?: Parameters<typeof import(\"./MarkdownContent.js\").MarkdownContent>[0][\"components\"];\n /** Custom URL transform for markdown */\n markdownUrlTransform?: (url: string) => string;\n /** Custom content transform for markdown */\n markdownContentTransform?: (content: string) => string;\n /** Optional callback when an image in a tool call result is clicked */\n onImageClick?: (image: { url: string; alt?: string; filename?: string }) => void;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Renders a single chat message with appropriate styling\n *\n * @example\n * ```tsx\n * <ChatMessage\n * message={{\n * id: \"1\",\n * role: \"assistant\",\n * content: \"Hello! How can I help?\",\n * timestamp: new Date(),\n * }}\n * enableMarkdown\n * showToolCalls\n * />\n * ```\n */\nexport function ChatMessage({\n message,\n enableMarkdown = true,\n showToolCalls = true,\n className,\n markdownComponents,\n markdownUrlTransform,\n markdownContentTransform,\n onImageClick,\n}: ChatMessageProps) {\n const isUser = message.role === \"user\";\n const isAssistant = message.role === \"assistant\";\n\n // Format timestamp\n const formattedTime = useMemo(() => {\n const date = message.timestamp instanceof Date ? message.timestamp : new Date(message.timestamp);\n return date.toLocaleTimeString([], { hour: \"2-digit\", minute: \"2-digit\" });\n }, [message.timestamp]);\n\n return (\n <div\n className={cn(\n \"flex gap-3 p-4\",\n isUser ? \"flex-row-reverse\" : \"flex-row\",\n className\n )}\n >\n {/* Avatar */}\n <div\n className={cn(\n \"flex-shrink-0 w-8 h-8 rounded-full flex items-center justify-center\",\n isUser\n ? \"bg-blue-500 text-white\"\n : \"bg-gray-200 dark:bg-gray-700 text-gray-600 dark:text-gray-300\"\n )}\n >\n {isUser ? (\n <UserIcon className=\"h-4 w-4\" />\n ) : (\n <BotIcon className=\"h-4 w-4\" />\n )}\n </div>\n\n {/* Message content */}\n <div\n className={cn(\n \"flex-1 min-w-0 space-y-2\",\n isUser ? \"text-right\" : \"text-left\"\n )}\n >\n {/* Role label and timestamp */}\n <div\n className={cn(\n \"flex items-center gap-2 text-xs text-gray-500 dark:text-gray-400\",\n isUser ? \"justify-end\" : \"justify-start\"\n )}\n >\n <span className=\"font-medium\">\n {isUser ? \"You\" : \"Assistant\"}\n </span>\n <span>{formattedTime}</span>\n {message.isStreaming && (\n <LoadingSpinner className=\"h-3 w-3\" />\n )}\n </div>\n\n {/* Thinking blocks (for extended thinking models) */}\n {message.thinkingBlocks && message.thinkingBlocks.length > 0 && (\n <div className=\"space-y-2\">\n {message.thinkingBlocks.map((block) => (\n <div\n key={block.id}\n className=\"bg-purple-50 dark:bg-purple-950/30 border border-purple-200 dark:border-purple-800 rounded-lg p-3 text-sm text-purple-800 dark:text-purple-200\"\n >\n <div className=\"text-xs font-medium text-purple-600 dark:text-purple-400 mb-1\">\n Thinking...\n </div>\n <div className=\"whitespace-pre-wrap\">{block.content}</div>\n </div>\n ))}\n </div>\n )}\n\n {/* Tool calls (rendered before text since they execute before the final response) */}\n {showToolCalls && message.toolCalls && message.toolCalls.length > 0 && (\n <div className=\"space-y-2\">\n {message.toolCalls.map((toolCall) => (\n <ToolCallEntry\n key={toolCall.id}\n toolCall={toolCall}\n onImageClick={onImageClick}\n />\n ))}\n </div>\n )}\n\n {/* Main message content (rendered after tool calls - text is the final response) */}\n {message.content && (\n <div\n className={cn(\n \"rounded-lg p-3\",\n isUser\n ? \"bg-blue-500 text-white\"\n : \"bg-gray-100 dark:bg-gray-800 text-gray-900 dark:text-gray-100\"\n )}\n >\n {isAssistant && enableMarkdown ? (\n <MarkdownContent\n content={message.content}\n components={markdownComponents}\n urlTransform={markdownUrlTransform}\n contentTransform={markdownContentTransform}\n />\n ) : (\n <p className=\"whitespace-pre-wrap\">{message.content}</p>\n )}\n </div>\n )}\n\n {/* Attachments (placeholder - would need AttachmentDisplay) */}\n {message.attachments && message.attachments.length > 0 && (\n <div className=\"flex flex-wrap gap-2\">\n {message.attachments.map((attachment) => (\n <div\n key={attachment.uuid}\n className=\"flex items-center gap-2 bg-gray-100 dark:bg-gray-800 rounded-lg px-3 py-2 text-sm\"\n >\n <span className=\"truncate max-w-[150px]\">\n {attachment.filename}\n </span>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nexport default ChatMessage;\n","\"use client\";\n\n/**\n * MessageList - Message rendering and scroll management component\n *\n * Features:\n * - Auto-scroll on new messages\n * - Welcome message when empty\n * - Loading state\n * - Streaming indicator\n *\n * @module @cadraos/sdk/chat\n */\n\nimport { useEffect, useRef } from \"react\";\nimport { LoadingSpinner } from \"../icons/index.js\";\nimport type { ChatMessage as ChatMessageType } from \"../types.js\";\nimport { ChatMessage } from \"./ChatMessage.js\";\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nfunction cn(...classes: (string | undefined | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface MessageListProps {\n /** Array of messages to display */\n messages: ChatMessageType[];\n /** Welcome message shown when chat is empty */\n welcomeMessage?: string;\n /**\n * Custom welcome UI rendered when chat is empty (no messages).\n * When provided, replaces the default centered text welcome message.\n * Takes precedence over `welcomeMessage` string prop.\n *\n * Can be a ReactNode or a render function receiving `{ sendMessage }`\n * to allow interactive elements (e.g., suggestion chips) to send messages.\n */\n renderWelcome?: React.ReactNode | ((props: { sendMessage: (text: string) => void }) => React.ReactNode);\n /** Whether a new message is loading */\n isLoading?: boolean;\n /** Whether the assistant is currently streaming a response */\n isStreaming?: boolean;\n /** Whether session history is being loaded */\n isLoadingHistory?: boolean;\n /** Whether to enable markdown rendering */\n enableMarkdown?: boolean;\n /** Whether to show tool calls */\n showToolCalls?: boolean;\n /** Additional CSS classes */\n className?: string;\n /** Custom markdown component overrides */\n markdownComponents?: import(\"./ChatMessage.js\").ChatMessageProps[\"markdownComponents\"];\n /** Custom URL transform for markdown */\n markdownUrlTransform?: (url: string) => string;\n /** Custom content transform for markdown */\n markdownContentTransform?: (content: string) => string;\n /** Optional callback when an image in a tool call result is clicked */\n onImageClick?: (image: { url: string; alt?: string; filename?: string }) => void;\n /**\n * Send message function passed from parent (AgentChat).\n * Used to forward to renderWelcome render function for suggestion chips.\n * @internal\n */\n sendMessage?: (text: string) => void;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Renders a scrollable list of chat messages with auto-scroll\n *\n * @example\n * ```tsx\n * <MessageList\n * messages={messages}\n * welcomeMessage=\"Hello! How can I help you today?\"\n * isLoading={isLoading}\n * isStreaming={isStreaming}\n * enableMarkdown\n * showToolCalls\n * />\n * ```\n */\nexport function MessageList({\n messages,\n welcomeMessage = \"Hello! How can I help you today?\",\n renderWelcome,\n isLoading = false,\n isStreaming = false,\n isLoadingHistory = false,\n enableMarkdown = true,\n showToolCalls = true,\n className,\n markdownComponents,\n markdownUrlTransform,\n markdownContentTransform,\n onImageClick,\n sendMessage,\n}: MessageListProps) {\n const scrollRef = useRef<HTMLDivElement>(null);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n\n // Auto-scroll to bottom when messages change or streaming\n useEffect(() => {\n if (messagesEndRef.current) {\n messagesEndRef.current.scrollIntoView({ behavior: \"smooth\" });\n }\n }, [messages, isStreaming]);\n\n return (\n <div\n ref={scrollRef}\n className={cn(\n \"flex-1 overflow-y-auto\",\n className\n )}\n >\n {/* Loading history indicator */}\n {isLoadingHistory && (\n <div className=\"flex items-center justify-center h-full p-8\">\n <div className=\"text-center text-gray-500 dark:text-gray-400\">\n <LoadingSpinner className=\"h-6 w-6 mx-auto mb-2\" />\n <p className=\"text-sm\">Loading conversation...</p>\n </div>\n </div>\n )}\n\n {/* Welcome message when empty */}\n {messages.length === 0 && !isLoading && !isLoadingHistory && (\n renderWelcome ? (\n <>{typeof renderWelcome === \"function\"\n ? renderWelcome({ sendMessage: sendMessage || (() => {}) })\n : renderWelcome}</>\n ) : (\n <div className=\"flex items-center justify-center h-full p-8\">\n <div className=\"text-center text-gray-500 dark:text-gray-400\">\n <p className=\"text-lg\">{welcomeMessage}</p>\n </div>\n </div>\n )\n )}\n\n {/* Message list */}\n <div className=\"divide-y divide-gray-100 dark:divide-gray-800\">\n {messages.map((message) => (\n <ChatMessage\n key={message.id}\n message={message}\n enableMarkdown={enableMarkdown}\n showToolCalls={showToolCalls}\n markdownComponents={markdownComponents}\n markdownUrlTransform={markdownUrlTransform}\n markdownContentTransform={markdownContentTransform}\n onImageClick={onImageClick}\n />\n ))}\n </div>\n\n {/* Loading indicator (waiting for response) */}\n {isLoading && !isStreaming && (\n <div className=\"flex items-center gap-3 p-4\">\n <div className=\"flex-shrink-0 w-8 h-8 rounded-full bg-gray-200 dark:bg-gray-700 flex items-center justify-center\">\n <LoadingSpinner className=\"h-4 w-4 text-gray-600 dark:text-gray-300\" />\n </div>\n <div className=\"text-sm text-gray-500 dark:text-gray-400\">\n Thinking...\n </div>\n </div>\n )}\n\n {/* Scroll anchor */}\n <div ref={messagesEndRef} />\n </div>\n );\n}\n\nexport default MessageList;\n","\"use client\";\n\n/**\n * AgentChat - Main chat component for AI SaaS SDK\n *\n * Drop-in chat interface for interacting with AI agents.\n * Composes all sub-components and integrates with useAgentChat hook.\n *\n * @module @cadraos/sdk/chat\n */\nimport { useCallback, useRef } from \"react\";\nimport type { ChatAdapter } from \"../adapters/types.js\";\nimport { useAgentChat } from \"../hooks/useAgentChat.js\";\nimport { useFileAttachments } from \"../hooks/useFileAttachments.js\";\nimport { AlertCircleIcon, XIcon } from \"../icons/index.js\";\nimport type { ChatError, ChatMessage, ClarificationData, ThemeMode } from \"../types.js\";\nimport { ChatContainer } from \"./ChatContainer.js\";\nimport { ChatInput } from \"./ChatInput.js\";\nimport { FileDropZone } from \"./FileDropZone.js\";\nimport type { FileDropZoneRef } from \"./FileDropZone.js\";\nimport { AskUserPrompt } from \"./internal-tools/AskUserPrompt.js\";\nimport { MessageList } from \"./MessageList.js\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface AgentChatProps {\n /**\n * The UUID of the agent to chat with.\n * Optional when teamId is provided (team execution routes to team's lead orchestrator).\n */\n agentId?: string;\n\n /** Optional team UUID for team-based execution (routes to team's lead orchestrator) */\n teamId?: string;\n\n /**\n * Session ID to resume an existing conversation\n * When provided, the component will load the session's chat history\n */\n sessionId?: string;\n\n /** Custom adapter (optional - uses context if not provided) */\n adapter?: ChatAdapter;\n\n /** Callback fired when a new message is added */\n onMessage?: (message: ChatMessage) => void;\n\n /** Callback fired when an error occurs */\n onError?: (error: ChatError) => void;\n\n /**\n * Callback fired when a new session is created\n * Called with the sessionId when starting a new chat (no existing sessionId)\n * Useful for updating external state like session lists\n */\n onSessionCreated?: (sessionId: string) => void;\n\n /** @deprecated Use onSessionCreated instead */\n onSessionStart?: (sessionId: string) => void;\n\n /** Callback fired when a tool is called */\n onToolCall?: (toolName: string, args: unknown) => void;\n\n /** Callback fired when a tool result is received */\n onToolResult?: (toolName: string, result: unknown, durationMs?: number) => void;\n\n /** Callback fired when clarification is needed */\n onClarification?: (data: ClarificationData) => void;\n\n /** Initial messages to populate the chat */\n initialMessages?: ChatMessage[];\n\n /** Placeholder text for the input */\n placeholder?: string;\n\n /** Welcome message shown when chat is empty */\n welcomeMessage?: string;\n\n /**\n * Custom welcome UI rendered when chat is empty (no messages).\n * When provided, replaces the default centered text welcome message.\n * Takes precedence over `welcomeMessage` string prop.\n *\n * Can be a ReactNode or a render function receiving `{ sendMessage }`\n * to allow interactive elements (e.g., suggestion chips) to send messages.\n */\n renderWelcome?: React.ReactNode | ((props: { sendMessage: (text: string) => void }) => React.ReactNode);\n\n /** Maximum height of the chat container */\n maxHeight?: string | number;\n\n /** Additional CSS class for the container */\n className?: string;\n\n /** Theme mode */\n theme?: ThemeMode;\n\n /** Enable file attachments */\n enableAttachments?: boolean;\n\n /** Enable markdown rendering */\n enableMarkdown?: boolean;\n\n /** Show tool call visualization */\n showToolCalls?: boolean;\n\n /** Custom markdown component overrides (e.g., for artifact rendering) */\n markdownComponents?: import(\"./MessageList.js\").MessageListProps[\"markdownComponents\"];\n /** Custom URL transform for markdown (e.g., to preserve artifact: protocol) */\n markdownUrlTransform?: (url: string) => string;\n /** Custom content transform for markdown */\n markdownContentTransform?: (content: string) => string;\n /** Optional callback when an image in a tool call result is clicked */\n onImageClick?: (image: { url: string; alt?: string; filename?: string }) => void;\n}\n\n// =============================================================================\n// ERROR BANNER COMPONENT\n// =============================================================================\n\ninterface ErrorBannerProps {\n error: ChatError;\n onRetry?: () => void;\n onDismiss?: () => void;\n}\n\nfunction ErrorBanner({ error, onRetry, onDismiss }: ErrorBannerProps) {\n return (\n <div className=\"flex items-center justify-between gap-3 px-4 py-3 bg-red-50 dark:bg-red-950/30 border-t border-red-200 dark:border-red-800 text-red-700 dark:text-red-300 text-sm\">\n <div className=\"flex items-center gap-2\">\n <AlertCircleIcon className=\"h-4 w-4 flex-shrink-0\" />\n <span className=\"truncate\">{error.message}</span>\n </div>\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n {error.retryable && onRetry && (\n <button\n onClick={onRetry}\n className=\"text-red-600 dark:text-red-400 hover:underline font-medium\"\n >\n Retry\n </button>\n )}\n {onDismiss && (\n <button\n onClick={onDismiss}\n className=\"p-1 hover:bg-red-100 dark:hover:bg-red-900/30 rounded\"\n aria-label=\"Dismiss error\"\n >\n <XIcon className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n </div>\n );\n}\n\n// =============================================================================\n// MAIN COMPONENT\n// =============================================================================\n\n/**\n * Complete chat interface for interacting with AI agents\n *\n * @example\n * ```tsx\n * // With ChatConfigProvider (recommended for API key users)\n * <ChatConfigProvider config={{ baseUrl: '...', apiKey: '...' }}>\n * <AgentChat\n * agentId=\"agent-uuid\"\n * enableAttachments\n * onMessage={(msg) => console.log('New message:', msg)}\n * />\n * </ChatConfigProvider>\n *\n * // With custom adapter\n * <AgentChat\n * agentId=\"agent-uuid\"\n * adapter={myCustomAdapter}\n * />\n * ```\n */\nexport function AgentChat({\n agentId,\n teamId,\n sessionId,\n adapter,\n onMessage,\n onError,\n onSessionCreated,\n onSessionStart,\n onToolCall,\n onToolResult,\n onClarification,\n initialMessages = [],\n placeholder = \"Type a message...\",\n welcomeMessage = \"Hello! How can I help you today?\",\n renderWelcome,\n maxHeight = \"600px\",\n className,\n theme = \"system\",\n enableAttachments = false,\n enableMarkdown = true,\n showToolCalls = true,\n markdownComponents,\n markdownUrlTransform,\n markdownContentTransform,\n onImageClick,\n}: AgentChatProps) {\n const {\n messages,\n isLoading,\n isStreaming,\n isLoadingHistory,\n error,\n sessionId: currentSessionId,\n clarification,\n sendMessage,\n respondToClarification,\n cancel,\n retry,\n clearError,\n } = useAgentChat({\n agentId,\n teamId,\n sessionId,\n adapter,\n initialMessages,\n onMessage,\n onError,\n onSessionCreated,\n onSessionStart,\n onToolCall,\n onToolResult,\n onClarification,\n });\n\n // File attachment support\n const dropZoneRef = useRef<FileDropZoneRef>(null);\n\n // Only create attachment hook when enabled and adapter is available\n // We use a stable no-op for the non-attachment case to satisfy hook rules\n const attachments = useFileAttachments({\n onUpload: enableAttachments && adapter\n ? async (_file, meta) => {\n const result = await adapter.getUploadUrl({\n sessionId: currentSessionId ?? \"\",\n ...meta,\n });\n return { uuid: result.attachmentUuid, uploadUrl: result.uploadUrl };\n }\n : async () => ({ uuid: \"\", uploadUrl: \"\" }),\n onConfirmUpload: enableAttachments && adapter\n ? (uuid) => adapter.confirmUpload(uuid)\n : undefined,\n onError: (msg) => {\n console.error(\"[AgentChat] Attachment error:\", msg);\n },\n });\n\n // Wrap sendMessage to include attachments\n const handleSend = useCallback(\n async (content: string) => {\n if (enableAttachments && attachments.hasReadyFiles) {\n const uuids = attachments.getReadyUuids();\n await sendMessage(content, { attachmentUuids: uuids });\n attachments.clear();\n } else {\n await sendMessage(content);\n }\n },\n [enableAttachments, attachments, sendMessage],\n );\n\n return (\n <ChatContainer maxHeight={maxHeight} className={className} theme={theme}>\n {/* Wrap content area with FileDropZone for drag-drop overlay when attachments enabled */}\n {enableAttachments ? (\n <FileDropZone\n ref={dropZoneRef}\n {...attachments.dropZoneProps}\n disabled={isLoading || !!clarification || isLoadingHistory}\n >\n <MessageList\n messages={messages}\n welcomeMessage={welcomeMessage}\n renderWelcome={renderWelcome}\n isLoading={isLoading}\n isStreaming={isStreaming}\n isLoadingHistory={isLoadingHistory}\n enableMarkdown={enableMarkdown}\n showToolCalls={showToolCalls}\n markdownComponents={markdownComponents}\n markdownUrlTransform={markdownUrlTransform}\n markdownContentTransform={markdownContentTransform}\n onImageClick={onImageClick}\n sendMessage={handleSend}\n />\n </FileDropZone>\n ) : (\n <MessageList\n messages={messages}\n welcomeMessage={welcomeMessage}\n renderWelcome={renderWelcome}\n isLoading={isLoading}\n isStreaming={isStreaming}\n isLoadingHistory={isLoadingHistory}\n enableMarkdown={enableMarkdown}\n showToolCalls={showToolCalls}\n markdownComponents={markdownComponents}\n markdownUrlTransform={markdownUrlTransform}\n markdownContentTransform={markdownContentTransform}\n onImageClick={onImageClick}\n sendMessage={handleSend}\n />\n )}\n\n {/* Clarification prompt */}\n {clarification && (\n <div className=\"border-t border-gray-200 dark:border-gray-700 p-4\">\n <AskUserPrompt\n question={clarification.question}\n options={clarification.suggestedOptions}\n onSubmit={respondToClarification}\n />\n </div>\n )}\n\n {/* Error banner */}\n {error && (\n <ErrorBanner error={error} onRetry={retry} onDismiss={clearError} />\n )}\n\n {/* Input area */}\n <ChatInput\n onSend={handleSend}\n onStop={isStreaming ? cancel : undefined}\n placeholder={placeholder}\n disabled={!!clarification || isLoadingHistory}\n isLoading={isLoading}\n enableAttachments={enableAttachments}\n attachments={enableAttachments ? attachments.files : undefined}\n onRemoveAttachment={enableAttachments ? attachments.removeFile : undefined}\n dropZoneRef={enableAttachments ? dropZoneRef : undefined}\n isUploadingAttachments={enableAttachments ? attachments.isUploading : undefined}\n />\n </ChatContainer>\n );\n}\n\nexport default AgentChat;\n","\"use client\";\n\n/**\n * TodoList Component\n *\n * Displays the agent's task list from todo_write tool.\n * Shows tasks with status indicators and progress.\n *\n * Ported from: ai-saas-v2/src/extensions/agents/components/playground/internal-tools/TodoList.tsx\n *\n * @module @cadraos/sdk/chat\n */\n\nimport { useMemo, useState } from \"react\";\nimport {\n CheckCircleIcon,\n ChevronDownIcon,\n ChevronRightIcon,\n CircleIcon,\n ListTodoIcon,\n LoadingSpinner,\n} from \"../../icons/index.js\";\nimport type { TodoItem } from \"../../types.js\";\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nfunction cn(...classes: (string | undefined | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface TodoListProps {\n /** List of todo items */\n todos: TodoItem[];\n /** Whether the list is collapsible */\n collapsible?: boolean;\n /** Default collapsed state */\n defaultCollapsed?: boolean;\n /** Custom title */\n title?: string;\n /** Additional CSS classes */\n className?: string;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Displays a task list with progress tracking\n *\n * @example\n * ```tsx\n * <TodoList\n * todos={[\n * { content: \"Research topic\", status: \"completed\", activeForm: \"Researching topic\" },\n * { content: \"Write outline\", status: \"in_progress\", activeForm: \"Writing outline\" },\n * { content: \"Draft document\", status: \"pending\", activeForm: \"Drafting document\" },\n * ]}\n * />\n * ```\n */\nexport function TodoList({\n todos,\n collapsible = true,\n defaultCollapsed = false,\n title = \"Task Progress\",\n className,\n}: TodoListProps) {\n const [isCollapsed, setIsCollapsed] = useState(defaultCollapsed);\n\n const stats = useMemo(() => {\n const total = todos.length;\n const completed = todos.filter((t) => t.status === \"completed\").length;\n const inProgress = todos.filter((t) => t.status === \"in_progress\").length;\n const pending = todos.filter((t) => t.status === \"pending\").length;\n const progress = total > 0 ? (completed / total) * 100 : 0;\n return { total, completed, inProgress, pending, progress };\n }, [todos]);\n\n // Find current task (in_progress)\n const currentTask = useMemo(\n () => todos.find((t) => t.status === \"in_progress\"),\n [todos]\n );\n\n if (todos.length === 0) {\n return null;\n }\n\n return (\n <div\n className={cn(\n \"rounded-lg border border-gray-200 dark:border-gray-700 overflow-hidden\",\n className\n )}\n >\n {/* Header */}\n <div\n className={cn(\n \"flex items-center gap-2 px-3 py-2 bg-gray-50 dark:bg-gray-800/50\",\n collapsible && \"cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-800\"\n )}\n onClick={collapsible ? () => setIsCollapsed(!isCollapsed) : undefined}\n >\n {collapsible &&\n (isCollapsed ? (\n <ChevronRightIcon className=\"h-4 w-4 text-gray-500\" />\n ) : (\n <ChevronDownIcon className=\"h-4 w-4 text-gray-500\" />\n ))}\n <ListTodoIcon className=\"h-4 w-4 text-gray-600 dark:text-gray-400\" />\n <span className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\n {title}\n </span>\n\n {/* Progress badge */}\n <span className=\"ml-auto text-xs px-2 py-1 rounded-full bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-gray-300 font-medium\">\n {stats.completed}/{stats.total}\n </span>\n </div>\n\n {/* Progress bar */}\n <div className=\"h-1 bg-gray-200 dark:bg-gray-700\">\n <div\n className=\"h-full bg-blue-500 transition-all duration-300\"\n style={{ width: `${stats.progress}%` }}\n />\n </div>\n\n {/* Current task indicator (always visible when collapsed) */}\n {currentTask && isCollapsed && (\n <div className=\"px-3 py-2 flex items-center gap-2 text-sm border-t border-gray-100 dark:border-gray-700\">\n <LoadingSpinner className=\"h-3.5 w-3.5 text-blue-500\" />\n <span className=\"text-gray-600 dark:text-gray-400 truncate\">\n {currentTask.activeForm}\n </span>\n </div>\n )}\n\n {/* Task list (collapsible) */}\n {!isCollapsed && (\n <ul className=\"divide-y divide-gray-100 dark:divide-gray-700\">\n {todos.map((todo, idx) => (\n <li\n key={idx}\n className={cn(\n \"px-3 py-2 flex items-start gap-2 text-sm\",\n todo.status === \"in_progress\" && \"bg-blue-50/50 dark:bg-blue-950/20\",\n todo.status === \"completed\" && \"opacity-60\"\n )}\n >\n {/* Status icon */}\n <div className=\"mt-0.5 flex-shrink-0\">\n {todo.status === \"completed\" ? (\n <CheckCircleIcon className=\"h-4 w-4 text-green-600 dark:text-green-500\" />\n ) : todo.status === \"in_progress\" ? (\n <LoadingSpinner className=\"h-4 w-4 text-blue-500\" />\n ) : (\n <CircleIcon className=\"h-4 w-4 text-gray-300 dark:text-gray-600\" />\n )}\n </div>\n\n {/* Task content */}\n <div className=\"flex-1 min-w-0\">\n <p\n className={cn(\n \"text-gray-700 dark:text-gray-300\",\n todo.status === \"completed\" && \"line-through\"\n )}\n >\n {todo.status === \"in_progress\" ? todo.activeForm : todo.content}\n </p>\n </div>\n\n {/* Status badge for in_progress */}\n {todo.status === \"in_progress\" && (\n <span className=\"text-xs px-2 py-0.5 rounded-full bg-blue-500 text-white font-medium flex-shrink-0\">\n Active\n </span>\n )}\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n}\n\nexport default TodoList;\n","\"use client\";\n\n/**\n * @cadraos/sdk/chat\n *\n * @deprecated This module is deprecated. Please migrate to @cadraos/react.\n *\n * Migration guide:\n * 1. Install: npm install @cadraos/react\n * 2. Replace imports:\n * - import { AgentChat } from '@cadraos/sdk/chat' -> import { CadraChat } from '@cadraos/react'\n * - import { ChatConfigProvider } from '@cadraos/sdk/chat' -> import { CadraProvider } from '@cadraos/react'\n * 3. Import styles: import '@cadraos/react/styles.css'\n *\n * For detailed migration instructions, see:\n * https://github.com/cadraos/cadra-sdk/blob/main/packages/react/MIGRATION.md\n *\n * @example Deprecated usage\n * ```tsx\n * // OLD (deprecated)\n * import { AgentChat, ChatConfigProvider } from '@cadraos/sdk/chat';\n *\n * <ChatConfigProvider config={{ ... }}>\n * <AgentChat agentId=\"...\" />\n * </ChatConfigProvider>\n * ```\n *\n * @example New usage\n * ```tsx\n * // NEW (recommended)\n * import '@cadraos/react/styles.css';\n * import { CadraCopilot } from '@cadraos/react';\n *\n * <CadraCopilot apiKey=\"cdr_live_xxx\" orgId={123} agentId=\"...\" />\n * ```\n *\n * @packageDocumentation\n */\n\n// =============================================================================\n// DEPRECATION WARNING\n// =============================================================================\n\nconst DEPRECATION_WARNING = `\n[@cadraos/sdk/chat] DEPRECATION WARNING\n\nThis module is deprecated and will be removed in a future version.\nPlease migrate to @cadraos/react for:\n- Simpler setup with CadraCopilot\n- Better security (header-based SSE auth)\n- Scoped CSS that won't conflict with your app\n\nMigration steps:\n1. npm install @cadraos/react\n2. import '@cadraos/react/styles.css'\n3. Replace <AgentChat> with <CadraCopilot> or <CadraChat>\n\nSee: https://github.com/cadraos/cadra-sdk/blob/main/packages/react/MIGRATION.md\n`;\n\nlet hasWarned = false;\n\nfunction showDeprecationWarning(): void {\n // Only warn once\n if (hasWarned) return;\n hasWarned = true;\n\n // Skip in production\n if (typeof process !== \"undefined\" && process.env?.NODE_ENV === \"production\") {\n return;\n }\n\n // Skip during SSR (no window)\n if (typeof window === \"undefined\") {\n return;\n }\n\n // Show warning\n console.warn(DEPRECATION_WARNING);\n}\n\n// Trigger warning on module load (client-side only)\nif (typeof window !== \"undefined\") {\n // Use setTimeout to not block module initialization\n setTimeout(showDeprecationWarning, 0);\n}\n\n// =============================================================================\n// MAIN COMPONENT\n// =============================================================================\n\n/**\n * @deprecated Use CadraChat from @cadraos/react instead.\n * @see https://github.com/cadraos/cadra-sdk/blob/main/packages/react/MIGRATION.md\n */\nexport { AgentChat } from \"./components/AgentChat.js\";\nexport type { AgentChatProps } from \"./components/AgentChat.js\";\n\n// =============================================================================\n// CONFIGURATION\n// =============================================================================\n\n/**\n * @deprecated Use CadraProvider from @cadraos/react instead.\n * @see https://github.com/cadraos/cadra-sdk/blob/main/packages/react/MIGRATION.md\n */\nexport {\n ChatConfigProvider,\n useChatConfig,\n useChatConfigOptional\n} from \"./context/ChatConfigContext.js\";\nexport type { ChatConfigProviderProps } from \"./context/ChatConfigContext.js\";\n\n// =============================================================================\n// ADAPTERS\n// =============================================================================\n\n/**\n * @deprecated Use the default adapter from @cadraos/react instead.\n * CadraProvider and CadraCopilot automatically create the adapter.\n * @see https://github.com/cadraos/cadra-sdk/blob/main/packages/react/MIGRATION.md\n */\nexport { createDefaultAdapter } from \"./adapters/default-adapter.js\";\nexport type { DefaultAdapterConfig } from \"./adapters/default-adapter.js\";\nexport type {\n Artifact,\n ChatAdapter,\n Execution,\n ExecutionResult,\n HistoryMessage,\n ListSessionsInput,\n SendMessageInput,\n SessionHistory,\n SessionList,\n SessionListItem,\n StartExecutionInput,\n UploadUrlInput,\n UploadUrlResult\n} from \"./adapters/types.js\";\n\n// =============================================================================\n// HOOKS\n// =============================================================================\n\n/**\n * @deprecated Use useChat or useAgentChat from @cadraos/react instead.\n * @see https://github.com/cadraos/cadra-sdk/blob/main/packages/react/MIGRATION.md\n */\nexport { useAgentChat } from \"./hooks/useAgentChat.js\";\nexport type { SendMessageOptions, UseAgentChatOptions, UseAgentChatResult } from \"./hooks/useAgentChat.js\";\n\n/**\n * @deprecated Use useExecutionStream from @cadraos/react instead.\n * @see https://github.com/cadraos/cadra-sdk/blob/main/packages/react/MIGRATION.md\n */\nexport { useExecutionStream } from \"./hooks/useExecutionStream.js\";\nexport type {\n UseExecutionStreamOptions,\n UseExecutionStreamResult\n} from \"./hooks/useExecutionStream.js\";\n\nexport { useFileAttachments } from \"./hooks/useFileAttachments.js\";\nexport type {\n UseFileAttachmentsOptions,\n UseFileAttachmentsResult\n} from \"./hooks/useFileAttachments.js\";\n\n// =============================================================================\n// SUB-COMPONENTS\n// =============================================================================\n\n/**\n * @deprecated Use ChatContainer from @cadraos/react instead.\n * @see https://github.com/cadraos/cadra-sdk/blob/main/packages/react/MIGRATION.md\n */\nexport { ChatContainer } from \"./components/ChatContainer.js\";\nexport type { ChatContainerProps } from \"./components/ChatContainer.js\";\n\n/**\n * @deprecated Use ChatInput from @cadraos/react instead.\n * @see https://github.com/cadraos/cadra-sdk/blob/main/packages/react/MIGRATION.md\n */\nexport { ChatInput } from \"./components/ChatInput.js\";\nexport type { ChatInputProps } from \"./components/ChatInput.js\";\n\n/**\n * @deprecated Use MessageList from @cadraos/react instead.\n * @see https://github.com/cadraos/cadra-sdk/blob/main/packages/react/MIGRATION.md\n */\nexport { MessageList } from \"./components/MessageList.js\";\nexport type { MessageListProps } from \"./components/MessageList.js\";\n\n/**\n * @deprecated Use ChatMessage from @cadraos/react instead.\n * @see https://github.com/cadraos/cadra-sdk/blob/main/packages/react/MIGRATION.md\n */\nexport { ChatMessage } from \"./components/ChatMessage.js\";\nexport type { ChatMessageProps } from \"./components/ChatMessage.js\";\n\n/**\n * @deprecated Use MarkdownContent from @cadraos/react instead.\n * @see https://github.com/cadraos/cadra-sdk/blob/main/packages/react/MIGRATION.md\n */\nexport { MarkdownContent } from \"./components/MarkdownContent.js\";\nexport type { MarkdownContentProps } from \"./components/MarkdownContent.js\";\n\n/**\n * @deprecated Use ToolCallEntry from @cadraos/react instead.\n * @see https://github.com/cadraos/cadra-sdk/blob/main/packages/react/MIGRATION.md\n */\nexport { ToolCallEntry } from \"./components/ToolCallEntry.js\";\nexport type { ToolCallEntryProps } from \"./components/ToolCallEntry.js\";\n\n// =============================================================================\n// INTERNAL TOOLS\n// =============================================================================\n\n/**\n * @deprecated Use AskUserPrompt from @cadraos/react instead.\n * @see https://github.com/cadraos/cadra-sdk/blob/main/packages/react/MIGRATION.md\n */\nexport { AskUserPrompt } from \"./components/internal-tools/AskUserPrompt.js\";\nexport type { AskUserPromptProps } from \"./components/internal-tools/AskUserPrompt.js\";\n\n/**\n * @deprecated Use TodoList from @cadraos/react instead.\n * @see https://github.com/cadraos/cadra-sdk/blob/main/packages/react/MIGRATION.md\n */\nexport { TodoList } from \"./components/internal-tools/TodoList.js\";\nexport type { TodoListProps } from \"./components/internal-tools/TodoList.js\";\n\n// =============================================================================\n// ICONS\n// =============================================================================\n\n/**\n * @deprecated Use icons from @cadraos/react instead.\n * @see https://github.com/cadraos/cadra-sdk/blob/main/packages/react/MIGRATION.md\n */\nexport {\n AlertCircleIcon,\n BotIcon,\n CheckCircleIcon,\n CheckIcon,\n ChevronDownIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n CircleIcon,\n ClockIcon,\n CodeIcon,\n CopyIcon,\n DatabaseIcon,\n DownloadIcon,\n ExternalLinkIcon,\n FileIcon,\n FileTextIcon,\n HelpCircleIcon,\n ImageIcon,\n ImagesIcon,\n ListTodoIcon,\n LoadingSpinner,\n Maximize2Icon,\n MessageCircleIcon,\n Minimize2Icon,\n PaperclipIcon,\n SendIcon,\n SparklesIcon,\n StopCircleIcon,\n UserIcon,\n XIcon,\n ZoomInIcon,\n ZoomOutIcon\n} from \"./icons/index.js\";\nexport type { IconProps } from \"./icons/index.js\";\n\n// =============================================================================\n// ATTACHMENTS\n// =============================================================================\n\nexport { FileDropZone } from \"./components/FileDropZone.js\";\nexport type { FileDropZoneProps, FileDropZoneRef } from \"./components/FileDropZone.js\";\n\nexport { compressImage } from \"./utils/compress-image.js\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type {\n AttachmentData,\n AttachmentFile,\n ChatError,\n ChatMessage as ChatMessageType,\n ClarificationData,\n ExecutionStreamEvent,\n ThemeMode,\n ThinkingBlock,\n TodoItem,\n ToolCall\n} from \"./types.js\";\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","../../src/chat/adapters/default-adapter.ts","../../src/chat/context/ChatConfigContext.tsx","../../src/chat/hooks/useExecutionStream.ts","../../src/chat/hooks/useAgentChat.ts","../../src/chat/utils/compress-image.ts","../../src/chat/hooks/useFileAttachments.ts","../../src/chat/icons/index.tsx","../../src/chat/components/ChatContainer.tsx","../../src/chat/components/ChatInput.tsx","../../src/chat/components/FileDropZone.tsx","../../src/chat/components/internal-tools/AskUserPrompt.tsx","../../src/chat/components/MarkdownContent.tsx","../../src/chat/components/ToolCallEntry.tsx","../../src/chat/components/ChatMessage.tsx","../../src/chat/components/MessageList.tsx","../../src/chat/components/AgentChat.tsx","../../src/chat/components/internal-tools/TodoList.tsx","../../src/chat/index.ts"],"names":["value","result","useRef","useEffect","useState","useCallback","options","useMemo","jsx","cn","jsxs","ImageIcon","FileIcon","formatFileSize","FileDropZone","Fragment"],"mappings":"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","file":"index.js","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 CadraError and include code, status, and optional details.\n */\n\n/**\n * Base error class for all SDK errors\n */\nexport class CadraError 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 = 'CadraError';\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 CadraError {\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 CadraError {\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 CadraError {\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 CadraError {\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 CadraError {\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 CadraError {\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 CadraError {\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 CadraError {\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 CadraError {\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): CadraError {\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 CadraError(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 // Simple concatenation — baseUrl is the origin (e.g., \"https://api.cadraos.com\"),\n // path already includes the full route (e.g., \"/api/v1/agents\").\n const base = this.config.baseUrl.replace(/\\/+$/, '');\n let url = `${base}${path}`;\n\n if (query) {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) {\n params.set(key, String(value));\n }\n }\n const qs = params.toString();\n if (qs) {\n url += `?${qs}`;\n }\n }\n\n return url;\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 { CadraError } 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 CadraError(\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 base = this.options.baseUrl.replace(/\\/+$/, '');\n const url = `${base}/api/v1/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 CadraError(\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, '/api/v1/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, '/api/v1/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 ExecuteToolDirectRequest,\n ExecuteToolDirectResponse,\n} from '../types/index.js';\n\n/**\n * Tools API class\n */\nexport class ToolsAPI extends BaseResourceAPI {\n constructor(http: HttpClient) {\n super(http, '/api/v1/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 * Execute a tool directly, bypassing the agent runtime.\n *\n * Enqueues the tool for async processing via BullMQ (no LLM, no ReAct loop).\n * Use SSE or polling with the returned executionId to get the result.\n *\n * @param request - Direct execution request\n * @returns Queued execution response with executionId for tracking\n *\n * @example\n * ```typescript\n * const result = await client.tools.executeDirect({\n * toolUuid: 'tool-uuid',\n * parameters: { prompt: 'Generate an image of a sunset' },\n * });\n * console.log(result.executionId); // Use for polling/SSE\n * console.log(result.status); // 'queued'\n * ```\n */\n async executeDirect(request: ExecuteToolDirectRequest): Promise<ExecuteToolDirectResponse> {\n const idempotencyKey = generateIdempotencyKey();\n return this.httpPost<ExecuteToolDirectResponse>('/execute-direct', request, { 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, '/api/v1/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, '/api/v1/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 * Cadra Client\n *\n * Main entry point for the SDK. Provides access to all resource APIs.\n *\n * @example\n * ```typescript\n * import { CadraClient } from '@cadraos/sdk';\n *\n * const client = new CadraClient({\n * apiKey: process.env.CADRA_API_KEY,\n * orgId: Number(process.env.CADRA_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.cadraos.com';\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 CadraClientOptionsApiKey {\n /** API key for authentication */\n apiKey: string;\n /** Organization ID */\n orgId: number;\n /** Base URL for API (default: https://api.cadraos.com) */\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 CadraClientOptionsToken {\n /** OAuth token for authentication */\n token: string;\n /** Organization ID */\n orgId: number;\n /** Base URL for API (default: https://api.cadraos.com) */\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 CadraClientOptionsTokenProvider {\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.cadraos.com) */\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 CadraClientOptions =\n | CadraClientOptionsApiKey\n | CadraClientOptionsToken\n | CadraClientOptionsTokenProvider;\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 CadraClient {\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 CadraClient({\n * apiKey: 'sk_...',\n * orgId: 123,\n * });\n *\n * // OAuth token authentication\n * const client = new CadraClient({\n * token: 'eyJ...',\n * orgId: 123,\n * });\n *\n * // Token provider (for automatic refresh)\n * const client = new CadraClient({\n * tokenProvider: async () => myAuth.getAccessToken(),\n * orgId: 123,\n * });\n * ```\n */\n constructor(options: CadraClientOptions) {\n // Validate options\n this.validateOptions(options);\n\n // Warn if baseUrl looks like it includes a path prefix (check path portion only)\n if (options.baseUrl) {\n try {\n const parsed = new URL(options.baseUrl);\n if (/\\/(api|v\\d)/.test(parsed.pathname)) {\n if (typeof process !== 'undefined' && process.env?.NODE_ENV !== 'production') {\n console.warn(\n '[CadraOS SDK] baseUrl should be the origin only (e.g., \"https://api.cadraos.com\" or \"http://localhost:3000\"). ' +\n 'The SDK automatically prepends \"/api/v1/\" to all requests. ' +\n `Received: \"${options.baseUrl}\"`\n );\n }\n }\n } catch {\n // Invalid URL — will be caught later during requests\n }\n }\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: CadraClientOptions): 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","/**\n * Default adapter for ChatAdapter — thin wrapper around CadraClient\n *\n * Uses the CadraClient for all operations, providing proper auth,\n * retries, and streaming support out of the box.\n *\n * @module @cadraos/sdk/chat\n */\n\nimport { fetchEventSource } from \"@microsoft/fetch-event-source\";\nimport { CadraClient } from \"../../client.js\";\nimport type { ExecutionStreamController } from \"../../streaming/stream-controller.js\";\nimport type {\n Artifact,\n ChatAdapter,\n Execution,\n ExecutionResult,\n ListSessionsInput,\n SendMessageInput,\n SessionHistory,\n SessionList,\n StartExecutionInput,\n StreamEvent,\n StreamSubscriptionCallbacks,\n UploadUrlInput,\n UploadUrlResult,\n} from \"./types.js\";\n\n// =============================================================================\n// CONFIGURATION\n// =============================================================================\n\n/**\n * Configuration for the default HTTP adapter\n */\nexport interface DefaultAdapterConfig {\n /**\n * Pre-constructed CadraClient (takes priority over individual options)\n */\n client?: CadraClient;\n\n /**\n * Base URL for the API\n * @example \"https://api.example.com/v1\"\n */\n baseUrl?: string;\n\n /**\n * API key for authentication\n */\n apiKey?: string;\n\n /**\n * OAuth token for authentication\n */\n token?: string;\n\n /**\n * Token provider callback for dynamic auth\n */\n tokenProvider?: () => Promise<string>;\n\n /**\n * Organization ID for multi-tenant access\n */\n orgId?: number;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Resolve or construct a CadraClient from config\n */\nfunction resolveClient(config: DefaultAdapterConfig): CadraClient {\n if (config.client) return config.client;\n\n if (!config.baseUrl) {\n throw new Error(\"DefaultAdapterConfig requires either 'client' or 'baseUrl'\");\n }\n if (config.orgId === undefined || config.orgId === null) {\n throw new Error(\"DefaultAdapterConfig requires 'orgId' when 'client' is not provided\");\n }\n\n if (config.apiKey) {\n return new CadraClient({\n apiKey: config.apiKey,\n orgId: config.orgId,\n baseUrl: config.baseUrl,\n });\n }\n if (config.token) {\n return new CadraClient({\n token: config.token,\n orgId: config.orgId,\n baseUrl: config.baseUrl,\n });\n }\n if (config.tokenProvider) {\n return new CadraClient({\n tokenProvider: config.tokenProvider,\n orgId: config.orgId,\n baseUrl: config.baseUrl,\n });\n }\n\n throw new Error(\n \"DefaultAdapterConfig requires 'apiKey', 'token', or 'tokenProvider' when 'client' is not provided\"\n );\n}\n\n/**\n * Get the base URL from the config (for raw fetch requests)\n */\nfunction resolveBaseUrl(config: DefaultAdapterConfig): string {\n if (config.baseUrl) return config.baseUrl;\n // Fallback — client was provided without baseUrl; use default\n return \"https://api.cadraos.com\";\n}\n\n/**\n * Build auth headers for raw fetch (attachments API)\n */\nasync function getAuthHeaders(\n config: DefaultAdapterConfig\n): Promise<Record<string, string>> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n if (config.apiKey) {\n headers[\"Authorization\"] = `Bearer ${config.apiKey}`;\n } else if (config.token) {\n headers[\"Authorization\"] = `Bearer ${config.token}`;\n } else if (config.tokenProvider) {\n const token = await config.tokenProvider();\n headers[\"Authorization\"] = `Bearer ${token}`;\n }\n\n if (config.orgId !== undefined) {\n headers[\"X-Org-Id\"] = String(config.orgId);\n }\n\n return headers;\n}\n\n/**\n * Raw fetch helper for attachment endpoints (CadraClient doesn't have AttachmentsAPI yet)\n */\nasync function rawRequest<T>(\n config: DefaultAdapterConfig,\n method: string,\n path: string,\n body?: unknown\n): Promise<T> {\n const baseUrl = resolveBaseUrl(config);\n const url = `${baseUrl}${path}`;\n const headers = await getAuthHeaders(config);\n\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n let errorMessage = `HTTP ${response.status}: ${response.statusText}`;\n try {\n const errorData = JSON.parse(errorText);\n if (errorData.message) errorMessage = errorData.message;\n if (errorData.error?.message) errorMessage = errorData.error.message;\n } catch {\n if (errorText) errorMessage = errorText;\n }\n throw new Error(errorMessage);\n }\n\n const text = await response.text();\n if (!text) return undefined as T;\n\n const parsed = JSON.parse(text);\n // Handle { success: true, data: ... } wrapper\n if (parsed && typeof parsed === \"object\" && \"success\" in parsed && parsed.success && \"data\" in parsed) {\n return parsed.data as T;\n }\n return parsed as T;\n}\n\n// =============================================================================\n// ADAPTER FACTORY\n// =============================================================================\n\n/**\n * Create a default adapter that wraps CadraClient\n *\n * @param config - Adapter configuration\n * @returns ChatAdapter implementation backed by CadraClient\n *\n * @example\n * ```typescript\n * // With individual options\n * const adapter = createDefaultAdapter({\n * baseUrl: 'https://api.example.com/v1',\n * apiKey: 'your-api-key',\n * orgId: 123,\n * });\n *\n * // With pre-constructed client\n * const adapter = createDefaultAdapter({ client: myClient });\n * ```\n */\nexport function createDefaultAdapter(config: DefaultAdapterConfig): ChatAdapter {\n const client = resolveClient(config);\n const baseUrl = resolveBaseUrl(config);\n\n return {\n // -------------------------------------------------------------------------\n // Execution Methods\n // -------------------------------------------------------------------------\n\n async startExecution(input: StartExecutionInput): Promise<ExecutionResult> {\n // Build tenant context - always include tenantOrgId so tool calls are\n // scoped to the correct tenant org, not cadra's internal org.\n const tenantContext = config.orgId ? { tenantOrgId: config.orgId } : {};\n\n if (input.sessionId) {\n // Continue existing session\n const result = await client.sessions.sendMessage(input.sessionId, {\n message: input.content,\n attachmentIds: input.attachmentUuids,\n context: tenantContext,\n });\n return {\n executionId: result.executionId,\n sessionId: result.sessionId ?? input.sessionId,\n };\n }\n\n // New execution\n // For team execution, the execute endpoint ignores the path agent ID\n // when teamUuid is present, so use teamId as fallback for the path param\n const pathId = input.agentId || input.teamId || '';\n const result = await client.agents.execute(pathId, {\n task: input.content,\n context: tenantContext,\n attachmentIds: input.attachmentUuids,\n teamUuid: input.teamId,\n });\n return {\n executionId: result.executionId,\n sessionId: result.sessionId ?? \"\",\n };\n },\n\n async sendMessage(input: SendMessageInput): Promise<ExecutionResult> {\n const result = await client.sessions.sendMessage(input.sessionId, {\n message: input.content,\n attachmentIds: input.attachmentUuids,\n // Always include tenantOrgId so follow-up messages use the correct\n // tenant org for tool calls (not cadra's internal org).\n context: config.orgId ? { tenantOrgId: config.orgId } : undefined,\n });\n return {\n executionId: result.executionId,\n sessionId: result.sessionId ?? input.sessionId,\n };\n },\n\n async cancelExecution(uuid: string): Promise<void> {\n await client.agents.cancelExecution(uuid);\n },\n\n async getExecution(uuid: string): Promise<Execution> {\n const exec = await client.agents.getExecution(uuid);\n return {\n uuid: exec.uuid,\n status: exec.status === \"queued\" ? \"pending\" : exec.status as Execution[\"status\"],\n result: exec.output,\n error: exec.error,\n };\n },\n\n // -------------------------------------------------------------------------\n // Attachment Methods (raw fetch — CadraClient has no AttachmentsAPI yet)\n // -------------------------------------------------------------------------\n\n async getUploadUrl(input: UploadUrlInput): Promise<UploadUrlResult> {\n return rawRequest<UploadUrlResult>(config, \"POST\", \"/api/v1/attachments/upload-url\", {\n sessionId: input.sessionId,\n filename: input.filename,\n mimeType: input.mimeType,\n size: input.size,\n });\n },\n\n async confirmUpload(uuid: string): Promise<void> {\n await rawRequest<void>(config, \"POST\", `/api/v1/attachments/${uuid}/confirm`);\n },\n\n async getDownloadUrl(uuid: string): Promise<string> {\n const result = await rawRequest<{ url: string }>(config, \"GET\", `/api/v1/attachments/${uuid}/download-url`);\n return result.url;\n },\n\n // -------------------------------------------------------------------------\n // Artifact Methods\n // -------------------------------------------------------------------------\n\n async getSessionArtifacts(sessionId: string): Promise<Artifact[]> {\n const result = await client.sessions.listArtifacts(sessionId);\n return (result.data ?? []).map((a: any) => ({\n uuid: a.uuid,\n type: a.type as Artifact[\"type\"],\n filename: a.filename,\n mimeType: a.mimeType,\n url: a.url,\n createdAt: a.createdAt,\n }));\n },\n\n // -------------------------------------------------------------------------\n // Session History Methods\n // -------------------------------------------------------------------------\n\n async getSessionHistory(sessionId: string): Promise<SessionHistory> {\n const history = await client.sessions.getHistory(sessionId);\n return {\n sessionId: history.session.id,\n agentId: history.session.agentUuid,\n messages: history.messages.map((m: any) => ({\n uuid: m.id,\n role: m.role as \"user\" | \"assistant\",\n content: m.content,\n timestamp: m.timestamp,\n })),\n createdAt: history.session.createdAt,\n updatedAt: history.session.lastMessageAt,\n };\n },\n\n // -------------------------------------------------------------------------\n // Session List Methods\n // -------------------------------------------------------------------------\n\n async listSessions(input: ListSessionsInput): Promise<SessionList> {\n const result = await client.sessions.list({\n agentUuid: input.agentId,\n limit: input.limit,\n offset: input.offset,\n });\n return {\n sessions: result.data.map((s: any) => ({\n id: s.id,\n agentId: s.agentUuid,\n createdAt: s.createdAt,\n lastMessageAt: s.lastMessageAt,\n messageCount: s.messageCount,\n lastUserMessage: s.lastUserMessage,\n })),\n total: result.pagination.total,\n hasMore: result.pagination.hasMore,\n };\n },\n\n // -------------------------------------------------------------------------\n // Stream Methods\n // -------------------------------------------------------------------------\n\n createStream(executionId: string, sessionId?: string): ExecutionStreamController {\n return client.agents.streamExecution(executionId, sessionId);\n },\n\n // -------------------------------------------------------------------------\n // SSE Stream URL (legacy backward compat)\n // -------------------------------------------------------------------------\n\n /**\n * @deprecated Use subscribeToStream() instead. getStreamUrl() exposes\n * API keys in URLs which are logged by browsers, proxies, and servers.\n */\n getStreamUrl(executionId: string): string {\n // Warn once per session in development mode\n if (typeof window !== \"undefined\" && process.env.NODE_ENV !== \"production\") {\n const warnKey = \"__cadra_getStreamUrl_deprecated__\";\n const win = window as unknown as Record<string, boolean>;\n if (!win[warnKey]) {\n win[warnKey] = true;\n console.warn(\n \"[CadraOS SDK] getStreamUrl() is deprecated. Use subscribeToStream() instead \" +\n \"which provides secure header-based auth. API keys in URLs are a security risk.\"\n );\n }\n }\n return `${baseUrl}/api/v1/agents/runs/${executionId}/stream`;\n },\n\n // -------------------------------------------------------------------------\n // Secure SSE Streaming (Recommended)\n // -------------------------------------------------------------------------\n\n subscribeToStream(\n executionId: string,\n callbacks: StreamSubscriptionCallbacks\n ): () => void {\n const abortController = new AbortController();\n const url = `${baseUrl}/api/v1/agents/runs/${executionId}/stream`;\n\n // Build auth headers\n const getHeaders = async (): Promise<Record<string, string>> => {\n const headers: Record<string, string> = {\n Accept: \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n };\n\n if (config.apiKey) {\n headers[\"Authorization\"] = `Bearer ${config.apiKey}`;\n } else if (config.token) {\n headers[\"Authorization\"] = `Bearer ${config.token}`;\n } else if (config.tokenProvider) {\n const token = await config.tokenProvider();\n headers[\"Authorization\"] = `Bearer ${token}`;\n }\n\n if (config.orgId !== undefined) {\n headers[\"X-Org-Id\"] = String(config.orgId);\n }\n\n return headers;\n };\n\n // Terminal event types that signal stream completion\n const terminalEvents = new Set([\"complete\", \"failed\", \"error\"]);\n\n // Start the SSE connection\n (async () => {\n try {\n const headers = await getHeaders();\n callbacks.onConnectionChange?.(true);\n\n await fetchEventSource(url, {\n method: \"GET\",\n headers,\n signal: abortController.signal,\n openWhenHidden: true, // Keep connection open even when tab is hidden\n\n onopen: async (response) => {\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`SSE connection failed: ${response.status} - ${errorText}`);\n }\n },\n\n onmessage: (ev) => {\n // Skip keepalive comments\n if (!ev.event || ev.event === \"\") {\n return;\n }\n\n let data: unknown;\n try {\n data = ev.data ? JSON.parse(ev.data) : {};\n } catch {\n data = ev.data;\n }\n\n const event: StreamEvent = {\n type: ev.event,\n id: ev.id,\n data,\n };\n\n callbacks.onEvent(event);\n\n // Check for terminal events\n if (terminalEvents.has(ev.event)) {\n callbacks.onComplete?.();\n abortController.abort();\n }\n },\n\n onerror: (err) => {\n callbacks.onConnectionChange?.(false);\n callbacks.onError?.(err instanceof Error ? err : new Error(String(err)));\n // Re-throw to stop retrying on fatal errors\n throw err;\n },\n\n onclose: () => {\n callbacks.onConnectionChange?.(false);\n },\n });\n } catch (err) {\n // Ignore abort errors\n if (err instanceof Error && err.name === \"AbortError\") {\n return;\n }\n callbacks.onConnectionChange?.(false);\n callbacks.onError?.(err instanceof Error ? err : new Error(String(err)));\n }\n })();\n\n // Return cleanup function\n return () => {\n abortController.abort();\n callbacks.onConnectionChange?.(false);\n };\n },\n };\n}\n","\"use client\";\n\n/**\n * ChatConfigContext - Configuration provider for SDK chat components\n *\n * Provides a default adapter via context so that AgentChat can be used\n * without explicitly passing an adapter prop.\n *\n * @module @cadraos/sdk/chat\n */\n\nimport * as React from \"react\";\nimport { createContext, useContext, useMemo } from \"react\";\nimport { createDefaultAdapter, type DefaultAdapterConfig } from \"../adapters/default-adapter.js\";\nimport type { ChatAdapter } from \"../adapters/types.js\";\n\n// =============================================================================\n// CONTEXT\n// =============================================================================\n\ninterface ChatConfigContextValue {\n /** The configured adapter instance */\n adapter: ChatAdapter;\n}\n\nconst ChatConfigContext = createContext<ChatConfigContextValue | null>(null);\n\n// =============================================================================\n// PROVIDER\n// =============================================================================\n\nexport interface ChatConfigProviderProps {\n /**\n * Configuration for the default HTTP adapter\n */\n config: DefaultAdapterConfig;\n /**\n * Child components\n */\n children: React.ReactNode;\n}\n\n/**\n * Provider component that configures the default adapter for all child AgentChat components\n *\n * @example\n * ```tsx\n * import { ChatConfigProvider, AgentChat } from '@cadraos/sdk/chat';\n *\n * function App() {\n * return (\n * <ChatConfigProvider config={{\n * baseUrl: 'https://api.example.com/api/v1/external',\n * apiKey: 'your-api-key',\n * orgId: 123,\n * }}>\n * <AgentChat agentId=\"agent-uuid\" />\n * </ChatConfigProvider>\n * );\n * }\n * ```\n */\nexport function ChatConfigProvider({ config, children }: ChatConfigProviderProps) {\n const adapter = useMemo(\n () => createDefaultAdapter(config),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [config.baseUrl, config.apiKey, config.token, config.tokenProvider, config.orgId, config.client]\n );\n\n const value = useMemo(() => ({ adapter }), [adapter]);\n\n return (\n <ChatConfigContext.Provider value={value}>\n {children}\n </ChatConfigContext.Provider>\n );\n}\n\n// =============================================================================\n// HOOK\n// =============================================================================\n\n/**\n * Hook to access the chat configuration from context\n *\n * @returns The chat configuration context value\n * @throws Error if used outside of ChatConfigProvider\n */\nexport function useChatConfig(): ChatConfigContextValue {\n const context = useContext(ChatConfigContext);\n if (!context) {\n throw new Error(\n \"useChatConfig must be used within ChatConfigProvider or provide adapter prop to AgentChat\"\n );\n }\n return context;\n}\n\n/**\n * Hook to optionally access the chat configuration from context\n *\n * @returns The chat configuration context value, or null if not available\n */\nexport function useChatConfigOptional(): ChatConfigContextValue | null {\n return useContext(ChatConfigContext);\n}\n","\"use client\";\n\n/**\n * useExecutionStream - Real-time SSE streaming hook for agent executions\n *\n * Connects to the SSE endpoint to receive real-time events from agent execution.\n * Falls back to polling if SSE connection fails or is unavailable.\n *\n * Ported from: ai-saas-v2/src/extensions/agents/hooks/useExecutionStream.ts\n *\n * @module @cadraos/sdk/chat\n */\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { ClarificationData, ExecutionStreamEvent } from \"../types.js\";\n\n// =============================================================================\n// CONFIGURATION (inline - no external dependencies)\n// =============================================================================\n\n/**\n * SSE Configuration constants\n * These replace SSE_CONFIG from ai-saas-v2\n */\nconst STREAM_CONFIG = {\n /** Maximum reconnection attempts before falling back to polling */\n maxReconnectAttempts: 5,\n /** Base reconnection delay in milliseconds (uses exponential backoff) */\n baseReconnectDelayMs: 1000,\n /** Maximum reconnection delay in milliseconds */\n maxReconnectDelayMs: 10000,\n /** Client-side activity timeout - should be 3x keepalive interval */\n clientActivityTimeoutMs: 45000,\n} as const;\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface UseExecutionStreamOptions {\n /** Execution ID to stream events for */\n executionId: string | undefined;\n /** Function to get stream URL - allows adapter pattern */\n getStreamUrl: (executionId: string) => string;\n /** Whether streaming is enabled */\n enabled?: boolean;\n /** Callback for all events */\n onEvent?: (event: ExecutionStreamEvent) => void;\n /** Callback for log events */\n onLog?: (log: NonNullable<ExecutionStreamEvent[\"data\"][\"log\"]>) => void;\n /** Callback when a tool is called */\n onToolCall?: (toolName: string, args: unknown) => void;\n /** Callback when a tool returns a result */\n onToolResult?: (toolName: string, result: unknown, durationMs: number) => void;\n /** Callback for progress updates */\n onProgress?: (data: {\n iteration?: number;\n tokenUsage?: { prompt: number; completion: number; total: number };\n cost?: number;\n }) => void;\n /** Callback when execution completes */\n onComplete?: () => void;\n /** Callback when an error occurs */\n onError?: (error: string) => void;\n /** Callback when agent needs clarification */\n onClarification?: (data: ClarificationData) => void;\n /** Callback when connection status changes */\n onConnectionChange?: (connected: boolean, usingFallback: boolean) => void;\n}\n\nexport interface UseExecutionStreamResult {\n /** Whether SSE is currently connected */\n isConnected: boolean;\n /** Whether using polling fallback */\n isUsingFallback: boolean;\n /** Connection error message if any */\n connectionError: string | null;\n /** Disconnect from the stream */\n disconnect: () => void;\n /** Reconnect to the stream */\n reconnect: () => void;\n}\n\n// =============================================================================\n// HOOK IMPLEMENTATION\n// =============================================================================\n\n/**\n * Hook for streaming agent execution events via SSE\n *\n * @deprecated Prefer using `adapter.createStream()` which provides\n * fetch-based SSE with auth headers, automatic reconnection, and\n * polling fallback. This hook is kept for backward compatibility\n * with adapters that only implement `getStreamUrl`.\n *\n * @example\n * ```typescript\n * const { isConnected, disconnect } = useExecutionStream({\n * executionId: currentExecutionId,\n * getStreamUrl: (id) => adapter.getStreamUrl(id),\n * onLog: (log) => console.log(log.message),\n * onComplete: () => console.log('Done!'),\n * });\n * ```\n */\nexport function useExecutionStream(\n options: UseExecutionStreamOptions\n): UseExecutionStreamResult {\n const {\n executionId,\n getStreamUrl,\n enabled = true,\n onEvent,\n onLog,\n onToolCall,\n onToolResult,\n onProgress,\n onComplete,\n onError,\n onClarification,\n onConnectionChange,\n } = options;\n\n const [isConnected, setIsConnected] = useState(false);\n const [isUsingFallback, setIsUsingFallback] = useState(false);\n const [connectionError, setConnectionError] = useState<string | null>(null);\n\n const eventSourceRef = useRef<EventSource | null>(null);\n const reconnectTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const activityTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const reconnectAttemptsRef = useRef(0);\n const seenEventIdsRef = useRef<Set<string>>(new Set());\n const isTerminatedRef = useRef(false);\n\n /**\n * Clean up EventSource connection\n */\n const cleanup = useCallback(() => {\n if (reconnectTimeoutRef.current) {\n clearTimeout(reconnectTimeoutRef.current);\n reconnectTimeoutRef.current = null;\n }\n if (activityTimeoutRef.current) {\n clearTimeout(activityTimeoutRef.current);\n activityTimeoutRef.current = null;\n }\n if (eventSourceRef.current) {\n eventSourceRef.current.close();\n eventSourceRef.current = null;\n }\n seenEventIdsRef.current.clear();\n setIsConnected(false);\n }, []);\n\n /**\n * Reset activity timeout - called when any event is received\n */\n const resetActivityTimeout = useCallback(() => {\n if (activityTimeoutRef.current) {\n clearTimeout(activityTimeoutRef.current);\n }\n if (isTerminatedRef.current) return;\n\n activityTimeoutRef.current = setTimeout(() => {\n if (eventSourceRef.current) {\n eventSourceRef.current.close();\n eventSourceRef.current = null;\n setIsConnected(false);\n }\n }, STREAM_CONFIG.clientActivityTimeoutMs);\n }, []);\n\n /**\n * Handle incoming SSE events\n */\n const handleEvent = useCallback(\n (event: MessageEvent) => {\n console.log('[useExecutionStream] Event received:', event.type, event.data);\n try {\n resetActivityTimeout();\n const parsed: ExecutionStreamEvent = JSON.parse(event.data);\n console.log('[useExecutionStream] Parsed event:', parsed.type, parsed);\n\n // Deduplicate by event ID\n if (parsed.id && seenEventIdsRef.current.has(parsed.id)) {\n return;\n }\n if (parsed.id) {\n seenEventIdsRef.current.add(parsed.id);\n // Limit Set size to prevent memory leaks\n if (seenEventIdsRef.current.size > 1000) {\n const idsArray = Array.from(seenEventIdsRef.current);\n seenEventIdsRef.current = new Set(idsArray.slice(-500));\n }\n }\n\n // Call generic event handler\n onEvent?.(parsed);\n\n // Handle specific event types\n const eventType = parsed.type;\n const data = parsed.data;\n\n switch (eventType) {\n case \"log\":\n if (data.log) {\n onLog?.(data.log);\n\n // Dispatch specific log type handlers\n if (data.log.logType === \"tool_call\") {\n const toolName = data.log.metadata?.toolName as string;\n const args = data.log.metadata?.inputs;\n if (toolName) {\n onToolCall?.(toolName, args);\n }\n } else if (data.log.logType === \"tool_result\") {\n const toolName = data.log.metadata?.toolName as string;\n const result = data.log.metadata?.output;\n const durationMs = data.log.durationMs ?? 0;\n if (toolName) {\n onToolResult?.(toolName, result, durationMs);\n }\n }\n }\n break;\n\n case \"step\":\n onProgress?.({\n iteration: data.iteration as number | undefined,\n tokenUsage: data.tokenUsage as { prompt: number; completion: number; total: number } | undefined,\n cost: data.cost as number | undefined,\n });\n break;\n\n case \"tool_call\":\n if (data.toolName) {\n onToolCall?.(data.toolName as string, data.args);\n }\n break;\n\n case \"complete\":\n isTerminatedRef.current = true;\n if (activityTimeoutRef.current) {\n clearTimeout(activityTimeoutRef.current);\n activityTimeoutRef.current = null;\n }\n onComplete?.();\n break;\n\n case \"error\":\n const errorMsg = data.error || \"Unknown error\";\n isTerminatedRef.current = true;\n if (activityTimeoutRef.current) {\n clearTimeout(activityTimeoutRef.current);\n activityTimeoutRef.current = null;\n }\n onError?.(errorMsg as string);\n break;\n\n case \"timeout\":\n if (data.retryable && reconnectAttemptsRef.current < STREAM_CONFIG.maxReconnectAttempts) {\n reconnectAttemptsRef.current++;\n const delay = Math.min(\n STREAM_CONFIG.baseReconnectDelayMs * Math.pow(2, reconnectAttemptsRef.current),\n STREAM_CONFIG.maxReconnectDelayMs\n );\n setConnectionError(\"Stream timeout, reconnecting...\");\n reconnectTimeoutRef.current = setTimeout(() => {\n setConnectionError(null);\n }, delay);\n } else {\n setConnectionError(\"Stream timeout, using polling\");\n setIsUsingFallback(true);\n onConnectionChange?.(false, true);\n onError?.(\"Stream connection timed out. Updates will continue via polling.\");\n }\n break;\n\n case \"info\":\n if (data.fallback === \"polling\") {\n setIsUsingFallback(true);\n onConnectionChange?.(true, true);\n }\n break;\n\n case \"connected\":\n case \"subscribed\":\n setIsConnected(true);\n setIsUsingFallback(data.redisAvailable === false);\n onConnectionChange?.(true, data.redisAvailable === false);\n break;\n\n case \"clarification\":\n if (data.question) {\n onClarification?.({\n question: data.question as string,\n reason: data.reason as string | undefined,\n suggestedOptions: data.suggestedOptions as string[] | undefined,\n });\n }\n break;\n }\n } catch {\n // Parse error - ignore malformed events\n }\n },\n [\n onEvent,\n onLog,\n onToolCall,\n onToolResult,\n onProgress,\n onComplete,\n onError,\n onClarification,\n onConnectionChange,\n resetActivityTimeout,\n ]\n );\n\n /**\n * Connect to SSE endpoint\n */\n const connect = useCallback(() => {\n console.log('[useExecutionStream] connect called', { executionId, enabled });\n\n if (!executionId || !enabled) {\n console.log('[useExecutionStream] Skipping - executionId or enabled is falsy');\n return;\n }\n\n cleanup();\n isTerminatedRef.current = false;\n\n const url = getStreamUrl(executionId);\n console.log('[useExecutionStream] Connecting to:', url);\n\n try {\n const eventSource = new EventSource(url, {\n withCredentials: true,\n });\n console.log('[useExecutionStream] EventSource created');\n\n eventSource.onopen = () => {\n console.log('[useExecutionStream] EventSource onopen');\n reconnectAttemptsRef.current = 0;\n setConnectionError(null);\n resetActivityTimeout();\n };\n\n eventSource.onerror = (err) => {\n console.log('[useExecutionStream] EventSource onerror', { readyState: eventSource.readyState, err });\n if (eventSource.readyState === EventSource.CLOSED) {\n setIsConnected(false);\n\n if (reconnectAttemptsRef.current < STREAM_CONFIG.maxReconnectAttempts) {\n reconnectAttemptsRef.current++;\n const delay = Math.min(\n STREAM_CONFIG.baseReconnectDelayMs * Math.pow(2, reconnectAttemptsRef.current),\n STREAM_CONFIG.maxReconnectDelayMs\n );\n\n reconnectTimeoutRef.current = setTimeout(() => {\n connect();\n }, delay);\n } else {\n setConnectionError(\"Connection failed, using polling\");\n setIsUsingFallback(true);\n onConnectionChange?.(false, true);\n }\n }\n };\n\n // Listen for specific named events\n const eventTypes = [\n \"connected\",\n \"subscribed\",\n \"log\",\n \"step\",\n \"tool_call\",\n \"complete\",\n \"error\",\n \"info\",\n \"timeout\",\n \"clarification\",\n ];\n\n for (const eventType of eventTypes) {\n eventSource.addEventListener(eventType, handleEvent);\n }\n\n // For any unnamed events (fallback)\n eventSource.onmessage = handleEvent;\n\n eventSourceRef.current = eventSource;\n } catch {\n setConnectionError(\"Failed to connect to stream\");\n setIsUsingFallback(true);\n onConnectionChange?.(false, true);\n }\n }, [executionId, enabled, getStreamUrl, cleanup, handleEvent, onConnectionChange, resetActivityTimeout]);\n\n /**\n * Disconnect from SSE\n */\n const disconnect = useCallback(() => {\n cleanup();\n }, [cleanup]);\n\n /**\n * Reconnect to SSE\n */\n const reconnect = useCallback(() => {\n reconnectAttemptsRef.current = 0;\n isTerminatedRef.current = false;\n setConnectionError(null);\n setIsUsingFallback(false);\n connect();\n }, [connect]);\n\n // Connect when executionId changes\n useEffect(() => {\n console.log('[useExecutionStream] useEffect triggered', { executionId, enabled });\n if (executionId && enabled) {\n console.log('[useExecutionStream] Calling connect()');\n connect();\n }\n\n return () => {\n cleanup();\n };\n }, [executionId, enabled, connect, cleanup]);\n\n return {\n isConnected,\n isUsingFallback,\n connectionError,\n disconnect,\n reconnect,\n };\n}\n","\"use client\";\n\n/**\n * useAgentChat - Main state management hook for the chat component\n *\n * Provides:\n * - Message state management\n * - Streaming via ExecutionStreamController (preferred) or legacy useExecutionStream\n * - Error handling\n * - Session management\n * - Adapter integration\n *\n * @module @cadraos/sdk/chat\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { ChatAdapter, HistoryMessage } from \"../adapters/types.js\";\nimport { useChatConfigOptional } from \"../context/ChatConfigContext.js\";\nimport type { ExecutionStreamController } from \"../../streaming/stream-controller.js\";\nimport type { ExecutionLog } from \"../../types/agents.js\";\nimport type {\n ChatError,\n ChatMessage,\n ClarificationData,\n ExecutionStreamEvent,\n ToolCall,\n} from \"../types.js\";\nimport { useExecutionStream } from \"./useExecutionStream.js\";\n\n// =============================================================================\n// SILENT META-TOOLS\n// =============================================================================\n// Meta-tools that should not produce visible entries in the chat UI.\n// These are internal polling/monitoring tools called repeatedly during\n// team execution that would otherwise flood the chat with spam.\n// =============================================================================\nconst SILENT_TOOL_NAMES = new Set([\n \"check_delegations\",\n]);\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Generate a unique ID for messages\n */\nfunction generateId(): string {\n return `msg-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n}\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface UseAgentChatOptions {\n /**\n * UUID of the agent to chat with.\n * Optional when teamId is provided (team execution routes to team's lead orchestrator).\n */\n agentId?: string;\n /** Optional team UUID for team-based execution (routes to team's lead orchestrator) */\n teamId?: string;\n /**\n * Session ID to resume an existing conversation\n * If provided, the hook will attempt to load the session history on mount\n */\n sessionId?: string;\n /** Custom adapter (optional - uses context if not provided) */\n adapter?: ChatAdapter;\n /** Initial messages to populate the chat */\n initialMessages?: ChatMessage[];\n /** Callback fired when a new message is added */\n onMessage?: (message: ChatMessage) => void;\n /** Callback fired when an error occurs */\n onError?: (error: ChatError) => void;\n /**\n * Callback fired when a new session is created\n * Called with the sessionId when starting a new chat (no existing sessionId)\n * Useful for updating external state like session lists\n */\n onSessionCreated?: (sessionId: string) => void;\n /** @deprecated Use onSessionCreated instead */\n onSessionStart?: (sessionId: string) => void;\n /** Callback fired when a tool is called */\n onToolCall?: (toolName: string, args: unknown) => void;\n /** Callback fired when a tool result is received */\n onToolResult?: (toolName: string, result: unknown, durationMs?: number) => void;\n /** Callback fired when clarification is needed */\n onClarification?: (data: ClarificationData) => void;\n}\n\n/**\n * Options for sendMessage\n */\nexport interface SendMessageOptions {\n /** UUIDs of attached files to include with the message */\n attachmentUuids?: string[];\n}\n\nexport interface UseAgentChatResult {\n /** Current messages in the chat */\n messages: ChatMessage[];\n /** Whether a message is being sent */\n isLoading: boolean;\n /** Whether the assistant is currently streaming */\n isStreaming: boolean;\n /** Whether session history is being loaded */\n isLoadingHistory: boolean;\n /** Current error if any */\n error: ChatError | null;\n /** Current session ID */\n sessionId: string | null;\n /** Current clarification request if any */\n clarification: ClarificationData | null;\n /** Send a message to the agent */\n sendMessage: (content: string, options?: SendMessageOptions) => Promise<void>;\n /** Respond to a clarification request */\n respondToClarification: (response: string) => Promise<void>;\n /** Cancel the current execution */\n cancel: () => Promise<void>;\n /** Retry the last failed message */\n retry: () => void;\n /** Clear the current error */\n clearError: () => void;\n /** Clear all messages and start a new session */\n clearMessages: () => void;\n /**\n * Load history for a specific session\n * @param sessionId - Session ID to load\n * @returns Promise that resolves when history is loaded\n */\n loadSession: (sessionId: string) => Promise<void>;\n}\n\n// =============================================================================\n// HOOK IMPLEMENTATION\n// =============================================================================\n\n/**\n * Convert a history message to a ChatMessage\n */\nfunction historyToMessage(historyMsg: HistoryMessage): ChatMessage {\n return {\n id: historyMsg.uuid,\n role: historyMsg.role,\n content: historyMsg.content,\n timestamp: new Date(historyMsg.timestamp),\n attachments: historyMsg.attachments?.map((a) => ({\n uuid: a.uuid,\n filename: a.filename,\n mimeType: a.mimeType,\n size: a.size,\n category: a.category,\n previewUrl: a.previewUrl,\n thumbnailUrl: a.thumbnailUrl,\n status: \"ready\" as const,\n })),\n toolCalls: historyMsg.toolCalls?.map((tc) => ({\n id: tc.id,\n name: tc.name,\n args: tc.args,\n result: tc.result,\n status: tc.status,\n durationMs: tc.durationMs,\n })),\n };\n}\n\n/**\n * Main hook for managing chat state and interactions\n *\n * @example\n * ```typescript\n * const {\n * messages,\n * isLoading,\n * isStreaming,\n * sendMessage,\n * error,\n * } = useAgentChat({\n * agentId: 'agent-uuid',\n * adapter: myAdapter,\n * onMessage: (msg) => console.log('New message:', msg),\n * });\n *\n * // Send a message\n * await sendMessage('Hello, agent!');\n * ```\n */\nexport function useAgentChat(options: UseAgentChatOptions): UseAgentChatResult {\n const {\n agentId,\n teamId,\n sessionId: initialSessionId,\n adapter: propsAdapter,\n initialMessages = [],\n onMessage,\n onError,\n onSessionCreated,\n onSessionStart, // Deprecated, but still supported\n onToolCall,\n onToolResult,\n onClarification,\n } = options;\n\n // Get adapter from props or context\n const contextConfig = useChatConfigOptional();\n const adapter = propsAdapter ?? contextConfig?.adapter;\n\n if (!adapter) {\n throw new Error(\n \"No adapter provided. Use ChatConfigProvider or pass adapter prop to AgentChat.\"\n );\n }\n\n // Determine if we should use the new stream controller path\n const useStreamController = !!adapter.createStream;\n\n // Store callback props in refs to avoid stale closures.\n // The stream controller captures event listeners at connection time.\n // If callback identities change after connection (e.g., due to parent\n // re-renders or useCallback dep changes), the captured closures become stale.\n // Using refs ensures we always invoke the latest callback.\n const onToolCallRef = useRef(onToolCall);\n const onToolResultRef = useRef(onToolResult);\n useEffect(() => { onToolCallRef.current = onToolCall; }, [onToolCall]);\n useEffect(() => { onToolResultRef.current = onToolResult; }, [onToolResult]);\n\n // State\n const [messages, setMessages] = useState<ChatMessage[]>(initialMessages);\n const [isLoading, setIsLoading] = useState(false);\n const [isLoadingHistory, setIsLoadingHistory] = useState(false);\n const [error, setError] = useState<ChatError | null>(null);\n const [currentSessionId, setCurrentSessionId] = useState<string | null>(initialSessionId ?? null);\n const [currentExecutionId, setCurrentExecutionId] = useState<string | null>(null);\n const [clarification, setClarification] = useState<ClarificationData | null>(null);\n // Track streaming state for the new stream controller path\n const [isStreamControllerConnected, setIsStreamControllerConnected] = useState(false);\n\n // Track if we've already loaded the initial session\n const hasLoadedInitialSession = useRef(false);\n // Track sessions created internally by sendMessage (to avoid loading history for them)\n const internallyCreatedSessionRef = useRef<string | null>(null);\n\n // Refs for streaming content\n const streamingContentRef = useRef<string>(\"\");\n const streamingMessageIdRef = useRef<string | null>(null);\n const pendingToolCallsRef = useRef<Map<string, ToolCall>>(new Map());\n const lastMessageContentRef = useRef<string>(\"\");\n // Track tool call IDs whose onToolResult callback has already been invoked\n // to prevent duplicate invocations from log + dedicated event paths\n const firedToolResultsRef = useRef<Set<string>>(new Set());\n\n // Stream controller ref for the new path\n const streamControllerRef = useRef<ExecutionStreamController | null>(null);\n\n /**\n * Update the streaming message content\n */\n const updateStreamingMessage = useCallback((content: string) => {\n if (!streamingMessageIdRef.current) return;\n\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === streamingMessageIdRef.current\n ? { ...msg, content, isStreaming: true }\n : msg\n )\n );\n }, []);\n\n /**\n * Add or update a tool call on the streaming message.\n *\n * When the streaming message ref is still active, updates target that message.\n * When the ref has been cleared (e.g., after 'complete' event finalized the message),\n * falls back to the last assistant message so late-arriving tool_result events\n * (common due to Redis cross-channel race conditions) still get applied.\n */\n const updateToolCall = useCallback((toolCall: ToolCall) => {\n setMessages((prev) => {\n // Determine target message: active streaming message, or last assistant message as fallback\n const targetId = streamingMessageIdRef.current\n ?? [...prev].reverse().find((m) => m.role === \"assistant\")?.id;\n\n if (!targetId) return prev;\n\n return prev.map((msg) => {\n if (msg.id !== targetId) return msg;\n\n const existingIndex = msg.toolCalls?.findIndex((tc) => tc.id === toolCall.id) ?? -1;\n\n if (existingIndex >= 0) {\n // Update existing tool call\n const newToolCalls = [...(msg.toolCalls ?? [])];\n newToolCalls[existingIndex] = toolCall;\n return { ...msg, toolCalls: newToolCalls };\n } else {\n // Add new tool call\n return {\n ...msg,\n toolCalls: [...(msg.toolCalls ?? []), toolCall],\n };\n }\n });\n });\n }, []);\n\n /**\n * Finalize the streaming message.\n * Transitions all remaining \"running\"/\"pending\" tool calls to the given\n * terminal status to prevent stuck spinners.\n */\n const finalizeStreamingMessage = useCallback((terminalStatus: \"completed\" | \"failed\" = \"completed\") => {\n if (!streamingMessageIdRef.current) return;\n\n setMessages((prev) =>\n prev.map((msg) => {\n if (msg.id !== streamingMessageIdRef.current) return msg;\n\n // Transition any still-running/pending tool calls to terminal status\n const updatedToolCalls = msg.toolCalls?.map((tc) =>\n tc.status === \"running\" || tc.status === \"pending\"\n ? { ...tc, status: terminalStatus }\n : tc\n );\n\n return { ...msg, isStreaming: false, toolCalls: updatedToolCalls };\n })\n );\n\n streamingMessageIdRef.current = null;\n streamingContentRef.current = \"\";\n pendingToolCallsRef.current.clear();\n firedToolResultsRef.current.clear();\n }, []);\n\n /**\n * Handle an ExecutionLog from the stream controller.\n * Maps ExecutionLog format to the same handling as legacy SSE log events.\n */\n const handleExecutionLog = useCallback(\n (log: ExecutionLog) => {\n console.log('[useAgentChat] handleExecutionLog:', log.type, log.metadata);\n\n switch (log.type) {\n // Primary handlers for ai-saas-api worker log types\n case \"llm_response\": {\n // Only use metadata.text — never fall back to log.title which is the\n // generic label \"LLM Response\" and should not appear in the chat.\n const llmText = (log.metadata?.text as string) || \"\";\n if (llmText) {\n streamingContentRef.current = llmText;\n updateStreamingMessage(llmText);\n }\n break;\n }\n\n case \"message\": {\n const role = log.metadata?.role as string;\n const content = log.metadata?.content as string;\n if (role === \"assistant\" && content) {\n streamingContentRef.current = content;\n updateStreamingMessage(content);\n }\n break;\n }\n\n case \"info\":\n case \"system\":\n console.log('[useAgentChat] Status:', log.type, log.title);\n break;\n\n case \"tool_call\": {\n const toolName = log.metadata?.toolName as string;\n // Skip silent meta-tools (e.g., check_delegations) to avoid UI spam\n if (SILENT_TOOL_NAMES.has(toolName)) break;\n\n const toolCallId = (log.metadata?.toolCallId as string) || `tool-${Date.now()}`;\n const args = log.metadata?.inputs as Record<string, unknown>;\n\n const newToolCall: ToolCall = {\n id: toolCallId,\n name: toolName,\n args,\n status: \"running\",\n };\n\n pendingToolCallsRef.current.set(toolCallId, newToolCall);\n updateToolCall(newToolCall);\n onToolCallRef.current?.(toolName, args);\n break;\n }\n\n case \"tool_result\": {\n const resultToolName = log.metadata?.toolName as string;\n // Skip silent meta-tools (e.g., check_delegations) to avoid UI spam\n if (SILENT_TOOL_NAMES.has(resultToolName)) break;\n\n const resultToolCallId = log.metadata?.toolCallId as string;\n const result = log.metadata?.output;\n const durationMs = log.durationMs;\n\n let matchedToolCall = resultToolCallId\n ? pendingToolCallsRef.current.get(resultToolCallId)\n : undefined;\n\n if (!matchedToolCall) {\n for (const [, tc] of pendingToolCallsRef.current) {\n if (tc.name === resultToolName && tc.status === \"running\") {\n matchedToolCall = tc;\n break;\n }\n }\n }\n\n if (matchedToolCall) {\n const completedToolCall: ToolCall = {\n ...matchedToolCall,\n result,\n status: \"completed\",\n durationMs,\n };\n updateToolCall(completedToolCall);\n pendingToolCallsRef.current.delete(matchedToolCall.id);\n } else if (resultToolCallId) {\n // Late-arriving tool_result after finalization cleared the pending map.\n // Create a synthetic completed tool call so updateToolCall can match\n // it against the existing message's toolCalls array by ID.\n const lateToolCall: ToolCall = {\n id: resultToolCallId,\n name: resultToolName || \"unknown\",\n args: {},\n result,\n status: \"completed\",\n durationMs,\n };\n updateToolCall(lateToolCall);\n }\n // Mark this toolCallId as having fired onToolResult to prevent\n // duplicate invocations from the dedicated toolResult event path\n if (resultToolCallId) {\n firedToolResultsRef.current.add(resultToolCallId);\n }\n onToolResultRef.current?.(resultToolName, result, durationMs);\n break;\n }\n\n default:\n console.log('[useAgentChat] Unhandled log type:', log.type, log);\n }\n },\n [updateStreamingMessage, updateToolCall]\n );\n\n /**\n * Handle stream log events (legacy SSE path)\n */\n const handleStreamLog = useCallback(\n (log: NonNullable<ExecutionStreamEvent[\"data\"][\"log\"]>) => {\n console.log('[useAgentChat] handleStreamLog:', log.logType, log.metadata);\n\n switch (log.logType) {\n case \"llm_response\": {\n // Only use metadata.text — never fall back to log.message which is the\n // generic label \"LLM Response\" and should not appear in the chat.\n const llmText = (log.metadata?.text as string) || \"\";\n if (llmText) {\n streamingContentRef.current = llmText;\n updateStreamingMessage(llmText);\n }\n break;\n }\n\n case \"message\": {\n const role = log.metadata?.role as string;\n const content = log.metadata?.content as string;\n if (role === \"assistant\" && content) {\n streamingContentRef.current = content;\n updateStreamingMessage(content);\n }\n break;\n }\n\n case \"info\":\n case \"system\":\n console.log('[useAgentChat] Status:', log.logType, log.message);\n break;\n\n case \"response_text\":\n case \"text_chunk\": {\n const text = (log.metadata?.text as string) || log.message || \"\";\n streamingContentRef.current += text;\n updateStreamingMessage(streamingContentRef.current);\n break;\n }\n\n case \"tool_call\": {\n const toolName = log.metadata?.toolName as string;\n // Skip silent meta-tools (e.g., check_delegations) to avoid UI spam\n if (SILENT_TOOL_NAMES.has(toolName)) break;\n\n const toolCallId = (log.metadata?.toolCallId as string) || `tool-${Date.now()}`;\n const args = log.metadata?.inputs as Record<string, unknown>;\n\n const newToolCall: ToolCall = {\n id: toolCallId,\n name: toolName,\n args,\n status: \"running\",\n };\n\n pendingToolCallsRef.current.set(toolCallId, newToolCall);\n updateToolCall(newToolCall);\n onToolCallRef.current?.(toolName, args);\n break;\n }\n\n case \"tool_result\": {\n const resultToolName = log.metadata?.toolName as string;\n // Skip silent meta-tools (e.g., check_delegations) to avoid UI spam\n if (SILENT_TOOL_NAMES.has(resultToolName)) break;\n\n const resultToolCallId = log.metadata?.toolCallId as string;\n const result = log.metadata?.output;\n const durationMs = log.durationMs;\n\n let matchedToolCall = resultToolCallId\n ? pendingToolCallsRef.current.get(resultToolCallId)\n : undefined;\n\n if (!matchedToolCall) {\n for (const [, tc] of pendingToolCallsRef.current) {\n if (tc.name === resultToolName && tc.status === \"running\") {\n matchedToolCall = tc;\n break;\n }\n }\n }\n\n if (matchedToolCall) {\n const completedToolCall: ToolCall = {\n ...matchedToolCall,\n result,\n status: \"completed\",\n durationMs,\n };\n updateToolCall(completedToolCall);\n pendingToolCallsRef.current.delete(matchedToolCall.id);\n } else if (resultToolCallId) {\n // Late-arriving tool_result after finalization cleared the pending map.\n // Create a synthetic completed tool call so updateToolCall can match\n // it against the existing message's toolCalls array by ID.\n const lateToolCall: ToolCall = {\n id: resultToolCallId,\n name: resultToolName || \"unknown\",\n args: {},\n result,\n status: \"completed\",\n durationMs,\n };\n updateToolCall(lateToolCall);\n }\n // Mark this toolCallId as having fired onToolResult to prevent\n // duplicate invocations from the dedicated toolResult event path\n if (resultToolCallId) {\n firedToolResultsRef.current.add(resultToolCallId);\n }\n onToolResultRef.current?.(resultToolName, result, durationMs);\n break;\n }\n\n case \"final_response\": {\n const finalText = (log.metadata?.response as string | undefined) || log.message || \"\";\n if (finalText && finalText !== streamingContentRef.current) {\n streamingContentRef.current = finalText;\n updateStreamingMessage(finalText);\n }\n break;\n }\n\n default:\n console.log('[useAgentChat] Unknown log type:', log.logType, log);\n }\n },\n [updateStreamingMessage, updateToolCall]\n );\n\n /**\n * Handle clarification events\n */\n const handleClarification = useCallback(\n (data: ClarificationData) => {\n setClarification(data);\n onClarification?.(data);\n },\n [onClarification]\n );\n\n /**\n * Handle completion\n */\n const handleComplete = useCallback(() => {\n console.log('[useAgentChat] handleComplete called');\n setIsLoading(false);\n setIsStreamControllerConnected(false);\n finalizeStreamingMessage();\n setCurrentExecutionId(null);\n // Clean up stream controller\n streamControllerRef.current = null;\n }, [finalizeStreamingMessage]);\n\n /**\n * Handle errors\n */\n const handleError = useCallback(\n (errorMsg: string) => {\n console.log('[useAgentChat] handleError called:', errorMsg);\n const chatError: ChatError = {\n code: \"EXECUTION_ERROR\",\n message: errorMsg,\n retryable: true,\n };\n\n setError(chatError);\n setIsLoading(false);\n setIsStreamControllerConnected(false);\n finalizeStreamingMessage(\"failed\");\n setCurrentExecutionId(null);\n // Clean up stream controller\n streamControllerRef.current = null;\n onError?.(chatError);\n },\n [finalizeStreamingMessage, onError]\n );\n\n // ==========================================================================\n // LEGACY SSE PATH (useExecutionStream) — only active when createStream is NOT available\n // ==========================================================================\n\n // Only pass executionId to useExecutionStream when NOT using the new stream controller\n const legacyExecutionId = useStreamController ? undefined : currentExecutionId;\n\n const { isConnected: legacyIsConnected, isUsingFallback, disconnect } = useExecutionStream({\n executionId: legacyExecutionId ?? undefined,\n getStreamUrl: adapter.getStreamUrl ?? (() => \"\"),\n enabled: !!legacyExecutionId,\n onLog: handleStreamLog,\n onClarification: handleClarification,\n onComplete: handleComplete,\n onError: handleError,\n });\n\n // =========================================================================\n // LEGACY POLLING FALLBACK (only for legacy SSE path)\n // =========================================================================\n const pollingIntervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const pollingExecutionIdRef = useRef<string | null>(null);\n\n const stopPolling = useCallback(() => {\n if (pollingIntervalRef.current) {\n clearInterval(pollingIntervalRef.current);\n pollingIntervalRef.current = null;\n }\n pollingExecutionIdRef.current = null;\n }, []);\n\n const startPolling = useCallback((executionId: string) => {\n if (pollingExecutionIdRef.current === executionId) return;\n\n stopPolling();\n pollingExecutionIdRef.current = executionId;\n\n console.log('[useAgentChat] Starting polling fallback for:', executionId);\n\n const poll = async () => {\n if (pollingExecutionIdRef.current !== executionId) return;\n\n try {\n const execution = await adapter.getExecution(executionId);\n\n if (execution.status === \"completed\") {\n console.log('[useAgentChat] Polling: execution completed');\n if (execution.result) {\n streamingContentRef.current = execution.result;\n updateStreamingMessage(execution.result);\n }\n stopPolling();\n handleComplete();\n } else if (execution.status === \"failed\") {\n console.log('[useAgentChat] Polling: execution failed');\n stopPolling();\n handleError(execution.error || \"Execution failed\");\n }\n } catch (err) {\n console.warn('[useAgentChat] Polling error (will retry):', err);\n }\n };\n\n poll();\n pollingIntervalRef.current = setInterval(poll, 2000);\n }, [adapter, stopPolling, updateStreamingMessage, handleComplete, handleError]);\n\n // Legacy polling activation when SSE falls back (only for legacy path)\n useEffect(() => {\n if (!useStreamController && isUsingFallback && currentExecutionId && isLoading) {\n console.log('[useAgentChat] SSE fallback detected, activating polling');\n startPolling(currentExecutionId);\n }\n }, [useStreamController, isUsingFallback, currentExecutionId, isLoading, startPolling]);\n\n // Legacy SSE timeout fallback\n const sseTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n if (!useStreamController && currentExecutionId && isLoading && !legacyIsConnected && !isUsingFallback) {\n sseTimeoutRef.current = setTimeout(() => {\n if (!legacyIsConnected && currentExecutionId && isLoading) {\n console.log('[useAgentChat] SSE connection timeout, activating polling fallback');\n startPolling(currentExecutionId);\n }\n }, 10000);\n }\n\n return () => {\n if (sseTimeoutRef.current) {\n clearTimeout(sseTimeoutRef.current);\n sseTimeoutRef.current = null;\n }\n };\n }, [useStreamController, currentExecutionId, isLoading, legacyIsConnected, isUsingFallback, startPolling]);\n\n // Clean up polling when execution completes\n useEffect(() => {\n if (!currentExecutionId) {\n stopPolling();\n }\n return () => {\n stopPolling();\n };\n }, [currentExecutionId, stopPolling]);\n\n // =========================================================================\n // STREAM CONTROLLER PATH — connect ExecutionStreamController\n // =========================================================================\n\n /**\n * Set up and connect an ExecutionStreamController for the given execution\n */\n const connectStreamController = useCallback(\n (executionId: string, sessionId?: string) => {\n if (!adapter.createStream) return;\n\n // Cancel any existing controller\n if (streamControllerRef.current) {\n streamControllerRef.current.cancel();\n streamControllerRef.current = null;\n }\n\n console.log('[useAgentChat] Creating stream controller for:', executionId);\n\n const controller = adapter.createStream(executionId, sessionId);\n streamControllerRef.current = controller;\n\n // Register event listeners\n controller.on('log', (log) => {\n handleExecutionLog(log);\n });\n\n // Dedicated tool_call/tool_result events from the stream controller.\n // These fire in addition to the log-based tool events. The log path\n // already handles tool_call/tool_result log types and calls onToolCall/\n // onToolResult, but the dedicated events provide a second delivery path\n // that is more reliable for team executions and cross-channel scenarios.\n // We track which toolCallIds have already been handled via log events\n // to avoid duplicate onToolCall/onToolResult invocations.\n controller.on('toolCall', (data) => {\n const toolCallId = data.toolCallId || `tool-${Date.now()}`;\n const toolName = data.toolName;\n\n // Skip silent meta-tools\n if (SILENT_TOOL_NAMES.has(toolName)) return;\n\n // Only process if not already handled by log event\n if (!pendingToolCallsRef.current.has(toolCallId)) {\n const newToolCall: ToolCall = {\n id: toolCallId,\n name: toolName,\n args: data.inputs,\n status: \"running\",\n };\n pendingToolCallsRef.current.set(toolCallId, newToolCall);\n updateToolCall(newToolCall);\n onToolCallRef.current?.(toolName, data.inputs);\n }\n });\n\n controller.on('toolResult', (data) => {\n const toolCallId = data.toolCallId;\n const toolName = data.toolName;\n\n // Skip silent meta-tools\n if (SILENT_TOOL_NAMES.has(toolName)) return;\n\n // Skip if onToolResult already fired for this toolCallId via log path\n if (firedToolResultsRef.current.has(toolCallId)) return;\n\n // Check if already completed via log event path\n const existing = pendingToolCallsRef.current.get(toolCallId);\n if (existing && existing.status === \"completed\") return;\n\n if (existing) {\n const completedToolCall: ToolCall = {\n ...existing,\n result: data.result,\n status: \"completed\",\n durationMs: data.durationMs,\n };\n updateToolCall(completedToolCall);\n pendingToolCallsRef.current.delete(toolCallId);\n } else {\n // Late-arriving or log-path missed this - create synthetic entry\n const lateToolCall: ToolCall = {\n id: toolCallId,\n name: toolName,\n args: {},\n result: data.result,\n status: \"completed\",\n durationMs: data.durationMs,\n };\n updateToolCall(lateToolCall);\n }\n firedToolResultsRef.current.add(toolCallId);\n onToolResultRef.current?.(toolName, data.result, data.durationMs);\n });\n\n controller.on('textDelta', (data) => {\n streamingContentRef.current += data.delta;\n updateStreamingMessage(streamingContentRef.current);\n });\n\n controller.on('paused', (data) => {\n handleClarification({\n question: data.question,\n reason: data.reason,\n suggestedOptions: data.options,\n });\n });\n\n controller.on('complete', ({ execution }) => {\n // Use execution output as the final message if no streaming text was captured\n if (execution?.output && !streamingContentRef.current) {\n streamingContentRef.current = execution.output;\n updateStreamingMessage(execution.output);\n }\n handleComplete();\n });\n\n controller.on('error', (errorEvent) => {\n handleError(errorEvent.error);\n });\n\n controller.on('connectionChange', (data) => {\n setIsStreamControllerConnected(data.connected);\n });\n\n // Connect\n controller.connect().catch((err) => {\n console.error('[useAgentChat] Stream controller connect error:', err);\n handleError(err instanceof Error ? err.message : \"Stream connection failed\");\n });\n\n setIsStreamControllerConnected(true);\n },\n [adapter, handleExecutionLog, updateStreamingMessage, updateToolCall, handleClarification, handleComplete, handleError]\n );\n\n // =========================================================================\n // SEND MESSAGE\n // =========================================================================\n\n const sendMessage = useCallback(\n async (content: string, options?: SendMessageOptions) => {\n if (!content.trim()) return;\n\n const attachmentUuids = options?.attachmentUuids;\n\n lastMessageContentRef.current = content;\n setIsLoading(true);\n setError(null);\n setClarification(null);\n\n // Add user message\n const userMessage: ChatMessage = {\n id: generateId(),\n role: \"user\",\n content: content.trim(),\n timestamp: new Date(),\n };\n\n setMessages((prev) => [...prev, userMessage]);\n onMessage?.(userMessage);\n\n // Add placeholder assistant message\n const assistantMessageId = generateId();\n const assistantMessage: ChatMessage = {\n id: assistantMessageId,\n role: \"assistant\",\n content: \"\",\n timestamp: new Date(),\n isStreaming: true,\n toolCalls: [],\n };\n\n setMessages((prev) => [...prev, assistantMessage]);\n streamingMessageIdRef.current = assistantMessageId;\n streamingContentRef.current = \"\";\n\n try {\n console.log('[useAgentChat] Starting execution...', { agentId, sessionId: currentSessionId });\n\n // Start execution via adapter\n const result = await adapter.startExecution({\n agentId,\n teamId,\n sessionId: currentSessionId ?? undefined,\n content: content.trim(),\n attachmentUuids,\n });\n\n console.log('[useAgentChat] Execution started:', result);\n\n // Update session ID if new\n if (!currentSessionId && result.sessionId) {\n internallyCreatedSessionRef.current = result.sessionId;\n setCurrentSessionId(result.sessionId);\n onSessionCreated?.(result.sessionId);\n onSessionStart?.(result.sessionId);\n }\n\n // Connect to stream\n if (useStreamController) {\n // New path: use ExecutionStreamController\n connectStreamController(result.executionId, result.sessionId || currentSessionId || undefined);\n setCurrentExecutionId(result.executionId);\n } else {\n // Legacy path: set executionId to trigger useExecutionStream\n console.log('[useAgentChat] Setting executionId:', result.executionId);\n setCurrentExecutionId(result.executionId);\n }\n } catch (err) {\n console.error('[useAgentChat] Error starting execution:', err);\n const errorMessage = err instanceof Error ? err.message : \"Failed to send message\";\n handleError(errorMessage);\n }\n },\n [\n agentId,\n teamId,\n currentSessionId,\n adapter,\n useStreamController,\n connectStreamController,\n onMessage,\n onSessionCreated,\n onSessionStart,\n handleError,\n ]\n );\n\n /**\n * Respond to a clarification request\n */\n const respondToClarification = useCallback(\n async (response: string) => {\n if (!clarification) return;\n\n setClarification(null);\n await sendMessage(response);\n },\n [clarification, sendMessage]\n );\n\n /**\n * Cancel the current execution\n */\n const cancel = useCallback(async () => {\n if (currentExecutionId) {\n try {\n await adapter.cancelExecution(currentExecutionId);\n } catch {\n // Ignore cancel errors\n }\n\n // Cancel stream controller if active\n if (streamControllerRef.current) {\n streamControllerRef.current.cancel();\n streamControllerRef.current = null;\n }\n\n // Disconnect legacy SSE\n disconnect();\n\n setIsLoading(false);\n setIsStreamControllerConnected(false);\n finalizeStreamingMessage();\n setCurrentExecutionId(null);\n }\n }, [currentExecutionId, adapter, disconnect, finalizeStreamingMessage]);\n\n /**\n * Retry the last failed message\n */\n const retry = useCallback(() => {\n if (lastMessageContentRef.current && error) {\n setError(null);\n sendMessage(lastMessageContentRef.current);\n }\n }, [error, sendMessage]);\n\n /**\n * Clear the current error\n */\n const clearError = useCallback(() => {\n setError(null);\n }, []);\n\n /**\n * Clear all messages and reset session\n */\n const clearMessages = useCallback(() => {\n setMessages([]);\n setCurrentSessionId(null);\n hasLoadedInitialSession.current = false;\n internallyCreatedSessionRef.current = null;\n }, []);\n\n /**\n * Load session history from the API.\n * Also fetches session artifacts (images) and injects them as tool calls\n * on assistant messages so they render inline in the chat feed.\n */\n const loadSession = useCallback(\n async (sessionId: string) => {\n // Check if adapter supports session history\n if (!adapter.getSessionHistory) {\n const loadError: ChatError = {\n code: \"UNSUPPORTED_OPERATION\",\n message: \"Session history loading is not supported by this adapter\",\n retryable: false,\n };\n setError(loadError);\n onError?.(loadError);\n return;\n }\n\n setIsLoadingHistory(true);\n setError(null);\n\n try {\n // Fetch history and artifacts in parallel\n const [history, artifacts] = await Promise.all([\n adapter.getSessionHistory(sessionId),\n adapter.getSessionArtifacts?.(sessionId).catch(() => []) ?? Promise.resolve([]),\n ]);\n\n // Convert history messages to ChatMessage format\n const loadedMessages = history.messages.map(historyToMessage);\n\n // Inject image artifacts as tool calls on the assistant messages that\n // generated them. Match each artifact to the closest preceding assistant\n // message using timestamps so they appear in chronological order.\n const imageArtifacts = artifacts.filter(\n (a) => a.type === \"image\" || a.mimeType?.startsWith(\"image/\")\n );\n\n if (imageArtifacts.length > 0) {\n // Build index of assistant message positions\n const assistantIndices: number[] = [];\n for (let i = 0; i < loadedMessages.length; i++) {\n if (loadedMessages[i]!.role === \"assistant\") {\n assistantIndices.push(i);\n }\n }\n\n if (assistantIndices.length > 0) {\n // Group artifacts by their target assistant message index\n const artifactsByMsgIdx = new Map<number, typeof imageArtifacts>();\n\n for (const artifact of imageArtifacts) {\n let targetIdx = assistantIndices[assistantIndices.length - 1]!; // fallback: last assistant msg\n\n if (artifact.createdAt) {\n const artifactTime = new Date(artifact.createdAt).getTime();\n\n for (let i = assistantIndices.length - 1; i >= 0; i--) {\n const msgIdx = assistantIndices[i]!;\n const msg = loadedMessages[msgIdx]!;\n const msgTime = msg.timestamp ? new Date(msg.timestamp).getTime() : 0;\n\n if (msgTime <= artifactTime) {\n targetIdx = msgIdx;\n break;\n }\n }\n }\n\n const existing = artifactsByMsgIdx.get(targetIdx) ?? [];\n existing.push(artifact);\n artifactsByMsgIdx.set(targetIdx, existing);\n }\n\n // Attach grouped artifacts as synthetic tool calls on their target messages\n for (const [msgIdx, msgArtifacts] of artifactsByMsgIdx) {\n const targetMsg = loadedMessages[msgIdx]!;\n const existingToolCalls = targetMsg.toolCalls ?? [];\n\n const imageToolCalls: ToolCall[] = msgArtifacts.map((artifact, i) => ({\n id: `history-artifact-${artifact.uuid}-${i}`,\n name: \"generate_image\",\n args: {},\n result: {\n success: true,\n images: [{ url: artifact.url }],\n },\n status: \"completed\" as const,\n }));\n\n loadedMessages[msgIdx] = {\n id: targetMsg.id,\n role: targetMsg.role,\n content: targetMsg.content,\n timestamp: targetMsg.timestamp,\n isStreaming: targetMsg.isStreaming,\n attachments: targetMsg.attachments,\n thinkingBlocks: targetMsg.thinkingBlocks,\n toolCalls: [...existingToolCalls, ...imageToolCalls],\n };\n }\n }\n }\n\n setMessages(loadedMessages);\n setCurrentSessionId(sessionId);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : \"Failed to load session history\";\n const loadError: ChatError = {\n code: \"LOAD_HISTORY_ERROR\",\n message: errorMessage,\n retryable: true,\n };\n setError(loadError);\n onError?.(loadError);\n } finally {\n setIsLoadingHistory(false);\n }\n },\n [adapter, onError]\n );\n\n /**\n * Load initial session if sessionId prop is provided.\n * Skip if the session was just created by sendMessage (avoids race condition\n * where parent feeds the new session ID back as a prop).\n */\n useEffect(() => {\n if (initialSessionId && !hasLoadedInitialSession.current) {\n // Skip loading history for sessions we just created internally\n if (internallyCreatedSessionRef.current === initialSessionId) {\n hasLoadedInitialSession.current = true;\n return;\n }\n hasLoadedInitialSession.current = true;\n loadSession(initialSessionId);\n }\n }, [initialSessionId, loadSession]);\n\n // Clean up stream controller on unmount\n useEffect(() => {\n return () => {\n if (streamControllerRef.current) {\n streamControllerRef.current.cancel();\n streamControllerRef.current = null;\n }\n };\n }, []);\n\n // Compute isStreaming — use stream controller connected state or legacy\n const isStreaming = useMemo(() => {\n if (useStreamController) {\n return !!currentExecutionId && isStreamControllerConnected;\n }\n return !!currentExecutionId && legacyIsConnected;\n }, [useStreamController, currentExecutionId, isStreamControllerConnected, legacyIsConnected]);\n\n return {\n messages,\n isLoading,\n isStreaming,\n isLoadingHistory,\n error,\n sessionId: currentSessionId,\n clarification,\n sendMessage,\n respondToClarification,\n cancel,\n retry,\n clearError,\n clearMessages,\n loadSession,\n };\n}\n","/**\n * Client-side image compression using Canvas API.\n *\n * Resizes images to max 1920px on longest side and iteratively\n * reduces JPEG/WebP quality to hit a ~150KB target size.\n * Skips SVGs, non-image files, and files already under the target.\n */\n\nconst DEFAULT_TARGET_SIZE_KB = 150;\nconst MAX_DIMENSION = 1920;\nconst QUALITY_START = 0.85;\nconst QUALITY_STEP = 0.05;\nconst QUALITY_MIN = 0.1;\n\n/**\n * Load a File as an HTMLImageElement via object URL.\n */\nfunction loadImage(file: File): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n const url = URL.createObjectURL(file);\n img.onload = () => {\n URL.revokeObjectURL(url);\n resolve(img);\n };\n img.onerror = () => {\n URL.revokeObjectURL(url);\n reject(new Error(`Failed to load image: ${file.name}`));\n };\n img.src = url;\n });\n}\n\n/**\n * Calculate scaled dimensions keeping aspect ratio, capped at MAX_DIMENSION.\n */\nfunction getScaledDimensions(\n width: number,\n height: number,\n maxDim: number\n): { width: number; height: number } {\n if (width <= maxDim && height <= maxDim) {\n return { width, height };\n }\n const ratio = Math.min(maxDim / width, maxDim / height);\n return {\n width: Math.round(width * ratio),\n height: Math.round(height * ratio),\n };\n}\n\n/**\n * Draw image to canvas at target dimensions and export as blob.\n */\nfunction canvasToBlob(\n img: HTMLImageElement,\n width: number,\n height: number,\n format: string,\n quality: number\n): Promise<Blob> {\n return new Promise((resolve, reject) => {\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n reject(new Error(\"Failed to get canvas 2d context\"));\n return;\n }\n\n ctx.drawImage(img, 0, 0, width, height);\n\n canvas.toBlob(\n (blob) => {\n if (!blob) {\n reject(new Error(\"Canvas toBlob returned null\"));\n return;\n }\n resolve(blob);\n },\n format,\n quality\n );\n });\n}\n\n/**\n * Check if browser supports WebP encoding via canvas.\n */\nlet webpSupported: boolean | null = null;\nfunction supportsWebP(): boolean {\n if (webpSupported !== null) return webpSupported;\n try {\n const canvas = document.createElement(\"canvas\");\n canvas.width = 1;\n canvas.height = 1;\n webpSupported = canvas.toDataURL(\"image/webp\").startsWith(\"data:image/webp\");\n } catch {\n webpSupported = false;\n }\n return webpSupported;\n}\n\n/**\n * Determine output format and file extension for compressed image.\n */\nfunction getOutputFormat(_originalType: string): { mime: string; ext: string } {\n // Prefer WebP if supported, fall back to JPEG\n if (supportsWebP()) {\n return { mime: \"image/webp\", ext: \".webp\" };\n }\n return { mime: \"image/jpeg\", ext: \".jpg\" };\n}\n\n/**\n * Replace file extension in a filename.\n */\nfunction replaceExtension(filename: string, newExt: string): string {\n const dotIndex = filename.lastIndexOf(\".\");\n if (dotIndex === -1) return filename + newExt;\n return filename.substring(0, dotIndex) + newExt;\n}\n\n/**\n * Compress an image file to approximately targetSizeKB using Canvas API.\n *\n * - Returns the original file if it's already under targetSizeKB\n * - Skips SVGs and non-image files (returns as-is)\n * - Resizes to max 1920px on longest side\n * - Iteratively reduces quality to approach target size\n *\n * @param file - The File to compress\n * @param targetSizeKB - Target output size in KB (default: 150)\n * @returns Compressed File, or the original if no compression needed\n */\nexport async function compressImage(\n file: File,\n targetSizeKB: number = DEFAULT_TARGET_SIZE_KB\n): Promise<File> {\n // Skip non-image files\n if (!file.type.startsWith(\"image/\")) {\n return file;\n }\n\n // Skip SVGs - they're vector and already small\n if (file.type === \"image/svg+xml\") {\n return file;\n }\n\n // Skip GIFs - canvas loses animation frames\n if (file.type === \"image/gif\") {\n return file;\n }\n\n const targetBytes = targetSizeKB * 1024;\n\n // Already under target, no compression needed\n if (file.size <= targetBytes) {\n return file;\n }\n\n const img = await loadImage(file);\n\n const { width, height } = getScaledDimensions(\n img.naturalWidth,\n img.naturalHeight,\n MAX_DIMENSION\n );\n\n const { mime, ext } = getOutputFormat(file.type);\n\n // Iteratively reduce quality to hit target size\n let quality = QUALITY_START;\n let blob: Blob | null = null;\n\n while (quality >= QUALITY_MIN) {\n blob = await canvasToBlob(img, width, height, mime, quality);\n\n if (blob.size <= targetBytes) {\n break;\n }\n\n quality -= QUALITY_STEP;\n }\n\n // If we exhausted quality iterations, use whatever we got (lowest quality)\n if (!blob) {\n blob = await canvasToBlob(img, width, height, mime, QUALITY_MIN);\n }\n\n // If compressed is actually larger than original, return original\n if (blob.size >= file.size) {\n return file;\n }\n\n const newFilename = replaceExtension(file.name, ext);\n\n return new File([blob], newFilename, {\n type: mime,\n lastModified: Date.now(),\n });\n}\n","\"use client\";\n\n/**\n * useFileAttachments - Standalone hook for managing file attachment lifecycle\n *\n * Manages AttachmentFile[] state and provides callback props that can be\n * spread directly onto FileDropZone. Works standalone (e.g., in slides RemixPanel)\n * or composed into AgentChat.\n *\n * @example\n * ```tsx\n * // Standalone usage with direct upload\n * const attachments = useFileAttachments({\n * onUpload: async (file, meta) => {\n * const res = await fetch('/api/upload', { method: 'POST', body: file });\n * const data = await res.json();\n * return { uuid: data.url, uploadUrl: '' };\n * },\n * });\n *\n * <FileDropZone {...attachments.dropZoneProps} compact accept=\"image/*\" />\n * const urls = attachments.getReadyUrls();\n * ```\n *\n * @example\n * ```tsx\n * // With Cadra adapter\n * const attachments = useFileAttachments({\n * onUpload: async (file, meta) => {\n * const result = await adapter.getUploadUrl({ sessionId, ...meta });\n * return { uuid: result.attachmentUuid, uploadUrl: result.uploadUrl };\n * },\n * onConfirmUpload: (uuid) => adapter.confirmUpload(uuid),\n * });\n *\n * sendMessage(content, { attachmentUuids: attachments.getReadyUuids() });\n * attachments.clear();\n * ```\n *\n * @module @cadraos/sdk/chat\n */\n\nimport { useCallback, useRef, useState } from \"react\";\nimport type { AttachmentFile } from \"../types.js\";\nimport type { FileDropZoneProps } from \"../components/FileDropZone.js\";\nimport { compressImage } from \"../utils/compress-image.js\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface UseFileAttachmentsOptions {\n /**\n * Upload handler called immediately when files are dropped/selected.\n * Return the UUID and a presigned upload URL.\n * If uploadUrl is empty, the S3 PUT step in FileDropZone is skipped\n * (useful for direct-upload patterns where the upload happens here).\n */\n onUpload: (\n file: File,\n metadata: { filename: string; mimeType: string; size: number },\n ) => Promise<{ uuid: string; uploadUrl: string }>;\n\n /** Optional confirm callback after S3 PUT succeeds */\n onConfirmUpload?: (uuid: string) => Promise<void>;\n\n /**\n * Deferred upload handler called during prepareForSubmit().\n * Use this for two-phase upload patterns where files are uploaded to local\n * storage on drop, but a second upload to an AI service happens on submit.\n *\n * Receives the file and localUuid (from onUpload) and should return\n * the AI service's attachment UUID.\n *\n * If not provided, prepareForSubmit() returns the UUIDs from onUpload as-is.\n */\n onSubmitUpload?: (\n file: File,\n localUuid: string,\n metadata: { filename: string; mimeType: string; size: number },\n ) => Promise<string>;\n\n /** Error handler */\n onError?: (message: string) => void;\n\n /** Maximum number of files (default: 10) */\n maxFiles?: number;\n\n /** Maximum total upload size in MB (default: 100) */\n maxTotalSizeMB?: number;\n}\n\nexport interface UseFileAttachmentsResult {\n /** Current attachment files */\n files: AttachmentFile[];\n\n /**\n * Props to spread onto FileDropZone.\n * Includes: files, onFilesChange, onUpload, onConfirmUpload, onError, maxFiles, maxTotalSizeMB\n */\n dropZoneProps: Pick<\n FileDropZoneProps,\n \"files\" | \"onFilesChange\" | \"onUpload\" | \"onConfirmUpload\" | \"onError\" | \"maxFiles\" | \"maxTotalSizeMB\"\n >;\n\n /** Remove a file by UUID */\n removeFile: (uuid: string) => void;\n\n /** Get UUIDs of ready (uploaded) attachments — for Cadra adapter pattern */\n getReadyUuids: () => string[];\n\n /** Get UUIDs of ready attachments as URLs — for direct-upload pattern where uuid IS the url */\n getReadyUrls: () => string[];\n\n /**\n * Two-phase submit: uploads ready files to the AI service via onSubmitUpload,\n * returns the AI service attachment UUIDs. Call this on Generate/Remix.\n * If onSubmitUpload is not configured, returns getReadyUuids().\n */\n prepareForSubmit: () => Promise<string[]>;\n\n /** Clear all attachments (revokes preview URLs) */\n clear: () => void;\n\n /** Whether any files are currently uploading */\n isUploading: boolean;\n\n /** Whether there are files ready to send */\n hasReadyFiles: boolean;\n\n /** Total number of files */\n fileCount: number;\n}\n\n// =============================================================================\n// HOOK IMPLEMENTATION\n// =============================================================================\n\nexport function useFileAttachments(\n options: UseFileAttachmentsOptions,\n): UseFileAttachmentsResult {\n const { onUpload, onConfirmUpload, onSubmitUpload, onError, maxFiles = 10, maxTotalSizeMB = 100 } = options;\n\n const [files, setFiles] = useState<AttachmentFile[]>([]);\n // Keep a ref in sync for synchronous reads (getReadyUuids, etc.)\n const filesRef = useRef<AttachmentFile[]>(files);\n filesRef.current = files;\n\n const onFilesChange = useCallback((newFiles: AttachmentFile[]) => {\n // Sync ref immediately so getReadyUrls/getReadyUuids always read\n // the latest state, even before React re-renders.\n filesRef.current = newFiles;\n setFiles(newFiles);\n }, []);\n\n const removeFile = useCallback((uuid: string) => {\n setFiles((prev) => {\n const file = prev.find((f) => f.uuid === uuid);\n if (file?.previewUrl) {\n URL.revokeObjectURL(file.previewUrl);\n }\n return prev.filter((f) => f.uuid !== uuid);\n });\n }, []);\n\n const getReadyUuids = useCallback((): string[] => {\n return filesRef.current\n .filter((f) => f.status === \"ready\")\n .map((f) => f.uuid);\n }, []);\n\n const getReadyUrls = useCallback((): string[] => {\n // In direct-upload patterns, uuid is the URL\n return filesRef.current\n .filter((f) => f.status === \"ready\")\n .map((f) => f.uuid);\n }, []);\n\n const prepareForSubmit = useCallback(async (): Promise<string[]> => {\n const readyFiles = filesRef.current.filter((f) => f.status === \"ready\");\n console.log(\"[useFileAttachments] prepareForSubmit - readyFiles:\", readyFiles.length, \"hasSubmitUpload:\", !!onSubmitUpload);\n if (readyFiles.length === 0) return [];\n\n // If no deferred upload handler, just return existing UUIDs\n if (!onSubmitUpload) {\n return readyFiles.map((f) => f.uuid);\n }\n\n // Compress images and upload each ready file to the AI service\n const aiUuids: string[] = [];\n for (const attachment of readyFiles) {\n try {\n // Compress images before sending to AI service (same as playground)\n let fileToSend = attachment.file;\n if (attachment.category === \"image\") {\n try {\n fileToSend = await compressImage(attachment.file);\n } catch {\n // Compression failed, use original\n }\n }\n console.log(\"[useFileAttachments] Uploading to AI service:\", attachment.file.name, \"localUuid:\", attachment.uuid.substring(0, 40));\n const aiUuid = await onSubmitUpload(\n fileToSend,\n attachment.uuid,\n { filename: fileToSend.name, mimeType: fileToSend.type, size: fileToSend.size },\n );\n console.log(\"[useFileAttachments] AI service returned UUID:\", aiUuid);\n aiUuids.push(aiUuid);\n } catch (err) {\n const msg = err instanceof Error ? err.message : \"Submit upload failed\";\n console.error(\"[useFileAttachments] Submit upload failed for:\", attachment.file.name, msg);\n onError?.(msg);\n }\n }\n console.log(\"[useFileAttachments] prepareForSubmit result:\", aiUuids);\n return aiUuids;\n }, [onSubmitUpload, onError]);\n\n const clear = useCallback(() => {\n // Revoke all preview URLs before clearing\n for (const file of filesRef.current) {\n if (file.previewUrl) {\n URL.revokeObjectURL(file.previewUrl);\n }\n }\n setFiles([]);\n }, []);\n\n const isUploading = files.some(\n (f) => f.status === \"uploading\" || f.status === \"pending\" || f.status === \"processing\",\n );\n\n const hasReadyFiles = files.some((f) => f.status === \"ready\");\n\n const dropZoneProps: UseFileAttachmentsResult[\"dropZoneProps\"] = {\n files,\n onFilesChange,\n onUpload,\n onConfirmUpload,\n onError,\n maxFiles,\n maxTotalSizeMB,\n };\n\n return {\n files,\n dropZoneProps,\n removeFile,\n getReadyUuids,\n getReadyUrls,\n prepareForSubmit,\n clear,\n isUploading,\n hasReadyFiles,\n fileCount: files.length,\n };\n}\n","\"use client\";\n\n/**\n * Built-in SVG icons for @cadraos/sdk/chat\n *\n * These replace lucide-react to avoid external dependencies and reduce bundle size.\n *\n * @module @cadraos/sdk/chat\n */\n\n// =============================================================================\n// HELPER\n// =============================================================================\n\nfunction cn(...classes: (string | undefined | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n\n// =============================================================================\n// ICON PROPS\n// =============================================================================\n\nexport interface IconProps {\n /** Additional CSS classes */\n className?: string;\n /** Accessibility label */\n \"aria-label\"?: string;\n}\n\n// =============================================================================\n// MESSAGING ICONS\n// =============================================================================\n\nexport function SendIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path d=\"M22 2L11 13M22 2l-7 20-4-9-9-4 20-7z\" />\n </svg>\n );\n}\n\nexport function MessageCircleIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path d=\"M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z\" />\n </svg>\n );\n}\n\n// =============================================================================\n// ACTION ICONS\n// =============================================================================\n\nexport function PaperclipIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path d=\"M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48\" />\n </svg>\n );\n}\n\nexport function XIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path d=\"M18 6L6 18M6 6l12 12\" />\n </svg>\n );\n}\n\nexport function CheckIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n\nexport function CheckCircleIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\" />\n <polyline points=\"22 4 12 14.01 9 11.01\" />\n </svg>\n );\n}\n\nexport function CopyIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n );\n}\n\n// =============================================================================\n// NAVIGATION ICONS\n// =============================================================================\n\nexport function ChevronDownIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n );\n}\n\nexport function ChevronRightIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n );\n}\n\nexport function ChevronLeftIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <polyline points=\"15 18 9 12 15 6\" />\n </svg>\n );\n}\n\n// =============================================================================\n// LOADING & STATUS ICONS\n// =============================================================================\n\nexport function LoadingSpinner({ className, ...props }: IconProps) {\n return (\n <svg\n className={cn(\"animate-spin\", className)}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n {...props}\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n strokeOpacity=\"0.25\"\n />\n <path\n d=\"M4 12a8 8 0 0 1 8-8\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nexport function AlertCircleIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n );\n}\n\nexport function CircleIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n </svg>\n );\n}\n\nexport function StopCircleIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <rect x=\"9\" y=\"9\" width=\"6\" height=\"6\" />\n </svg>\n );\n}\n\n// =============================================================================\n// FILE & MEDIA ICONS\n// =============================================================================\n\nexport function ImageIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\n <circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\" />\n <polyline points=\"21 15 16 10 5 21\" />\n </svg>\n );\n}\n\nexport function ImagesIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path d=\"M18 22H4a2 2 0 0 1-2-2V6\" />\n <path d=\"m22 13-1.296-1.296a2.41 2.41 0 0 0-3.408 0L11 18\" />\n <circle cx=\"12\" cy=\"8\" r=\"2\" />\n <rect x=\"6\" y=\"2\" width=\"16\" height=\"16\" rx=\"2\" />\n </svg>\n );\n}\n\nexport function FileIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n </svg>\n );\n}\n\nexport function FileTextIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\" />\n <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\" />\n <polyline points=\"10 9 9 9 8 9\" />\n </svg>\n );\n}\n\nexport function CodeIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <polyline points=\"16 18 22 12 16 6\" />\n <polyline points=\"8 6 2 12 8 18\" />\n </svg>\n );\n}\n\n// =============================================================================\n// VIEW ICONS\n// =============================================================================\n\nexport function ZoomInIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n <line x1=\"11\" y1=\"8\" x2=\"11\" y2=\"14\" />\n <line x1=\"8\" y1=\"11\" x2=\"14\" y2=\"11\" />\n </svg>\n );\n}\n\nexport function ZoomOutIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n <line x1=\"8\" y1=\"11\" x2=\"14\" y2=\"11\" />\n </svg>\n );\n}\n\nexport function DownloadIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"7 10 12 15 17 10\" />\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\" />\n </svg>\n );\n}\n\nexport function ExternalLinkIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\n <polyline points=\"15 3 21 3 21 9\" />\n <line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\" />\n </svg>\n );\n}\n\nexport function Minimize2Icon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <polyline points=\"4 14 10 14 10 20\" />\n <polyline points=\"20 10 14 10 14 4\" />\n <line x1=\"14\" y1=\"10\" x2=\"21\" y2=\"3\" />\n <line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\" />\n </svg>\n );\n}\n\nexport function Maximize2Icon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <polyline points=\"15 3 21 3 21 9\" />\n <polyline points=\"9 21 3 21 3 15\" />\n <line x1=\"21\" y1=\"3\" x2=\"14\" y2=\"10\" />\n <line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\" />\n </svg>\n );\n}\n\n// =============================================================================\n// ROLE ICONS\n// =============================================================================\n\nexport function BotIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <rect x=\"3\" y=\"11\" width=\"18\" height=\"10\" rx=\"2\" />\n <circle cx=\"12\" cy=\"5\" r=\"2\" />\n <path d=\"M12 7v4\" />\n <line x1=\"8\" y1=\"16\" x2=\"8\" y2=\"16\" />\n <line x1=\"16\" y1=\"16\" x2=\"16\" y2=\"16\" />\n </svg>\n );\n}\n\nexport function UserIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\" />\n <circle cx=\"12\" cy=\"7\" r=\"4\" />\n </svg>\n );\n}\n\nexport function SparklesIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path d=\"M12 3l1.5 4.5L18 9l-4.5 1.5L12 15l-1.5-4.5L6 9l4.5-1.5L12 3z\" />\n <path d=\"M5 19l.5 1.5L7 21l-1.5.5L5 23l-.5-1.5L3 21l1.5-.5L5 19z\" />\n <path d=\"M19 5l.5 1.5L21 7l-1.5.5L19 9l-.5-1.5L17 7l1.5-.5L19 5z\" />\n </svg>\n );\n}\n\n// =============================================================================\n// TASK ICONS\n// =============================================================================\n\nexport function ListTodoIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <rect x=\"3\" y=\"5\" width=\"6\" height=\"6\" rx=\"1\" />\n <path d=\"m3 17 2 2 4-4\" />\n <path d=\"M13 6h8\" />\n <path d=\"M13 12h8\" />\n <path d=\"M13 18h8\" />\n </svg>\n );\n}\n\nexport function HelpCircleIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n );\n}\n\nexport function DatabaseIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <ellipse cx=\"12\" cy=\"5\" rx=\"9\" ry=\"3\" />\n <path d=\"M21 12c0 1.66-4 3-9 3s-9-1.34-9-3\" />\n <path d=\"M3 5v14c0 1.66 4 3 9 3s9-1.34 9-3V5\" />\n </svg>\n );\n}\n\nexport function ClockIcon({ className, ...props }: IconProps) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <polyline points=\"12 6 12 12 16 14\" />\n </svg>\n );\n}\n","\"use client\";\n\n/**\n * ChatContainer - Layout container for the chat interface\n *\n * Provides:\n * - Flex column layout\n * - Theme support\n * - Max height constraint\n * - Border and rounded corners\n *\n * @module @cadraos/sdk/chat\n */\n\nimport * as React from \"react\";\nimport type { ThemeMode } from \"../types.js\";\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nfunction cn(...classes: (string | undefined | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface ChatContainerProps {\n /** Child components (MessageList, ChatInput, etc.) */\n children: React.ReactNode;\n /** Maximum height of the container */\n maxHeight?: string | number;\n /** Additional CSS classes */\n className?: string;\n /** Theme mode */\n theme?: ThemeMode;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Container component for the chat interface\n *\n * @example\n * ```tsx\n * <ChatContainer maxHeight=\"600px\" theme=\"dark\">\n * <MessageList messages={messages} />\n * <ChatInput onSend={handleSend} />\n * </ChatContainer>\n * ```\n */\nexport function ChatContainer({\n children,\n maxHeight = \"600px\",\n className,\n theme = \"system\",\n}: ChatContainerProps) {\n const maxHeightValue =\n typeof maxHeight === \"number\" ? `${maxHeight}px` : maxHeight;\n\n return (\n <div\n className={cn(\n \"flex flex-col bg-white dark:bg-gray-900 rounded-lg border border-gray-200 dark:border-gray-700 overflow-hidden\",\n className\n )}\n style={{ maxHeight: maxHeightValue }}\n data-theme={theme}\n >\n {children}\n </div>\n );\n}\n\nexport default ChatContainer;\n","\"use client\";\n\n/**\n * ChatInput - Message input component with attachment support\n *\n * Features:\n * - Auto-resizing textarea\n * - Enter to send (Shift+Enter for newline)\n * - Attachment button with paperclip icon (optional)\n * - Attachment chips/thumbnails above textarea\n * - Send button with loading state\n * - Disabled state during streaming\n *\n * @module @cadraos/sdk/chat\n */\n\nimport * as React from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { LoadingSpinner, PaperclipIcon, SendIcon, StopCircleIcon, XIcon } from \"../icons/index.js\";\nimport type { AttachmentFile } from \"../types.js\";\nimport type { FileDropZoneRef } from \"./FileDropZone.js\";\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nfunction cn(...classes: (string | undefined | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface ChatInputProps {\n /** Callback when user sends a message */\n onSend: (content: string) => void | Promise<void>;\n /** Callback when user requests to stop/cancel */\n onStop?: () => void;\n /** Placeholder text */\n placeholder?: string;\n /** Whether the input is disabled */\n disabled?: boolean;\n /** Whether currently sending/streaming */\n isLoading?: boolean;\n /** Whether to enable attachments */\n enableAttachments?: boolean;\n /** Current attachment files (when enableAttachments is true) */\n attachments?: AttachmentFile[];\n /** Callback to remove an attachment */\n onRemoveAttachment?: (uuid: string) => void;\n /** Ref to FileDropZone for triggering file dialog */\n dropZoneRef?: React.RefObject<FileDropZoneRef | null>;\n /** Whether attachments are currently uploading */\n isUploadingAttachments?: boolean;\n /** Additional CSS classes */\n className?: string;\n}\n\n// =============================================================================\n// ATTACHMENT CHIP COMPONENT\n// =============================================================================\n\ninterface AttachmentChipProps {\n attachment: AttachmentFile;\n onRemove: (uuid: string) => void;\n}\n\nfunction AttachmentChip({ attachment, onRemove }: AttachmentChipProps) {\n const isLoading =\n attachment.status === \"uploading\" ||\n attachment.status === \"pending\" ||\n attachment.status === \"processing\";\n const isError = attachment.status === \"error\" || attachment.status === \"failed\";\n\n return (\n <div\n className={cn(\n \"inline-flex items-center gap-1.5 px-2 py-1 rounded-md text-xs max-w-[180px]\",\n isError\n ? \"bg-red-100 dark:bg-red-900/30 text-red-700 dark:text-red-300 border border-red-200 dark:border-red-800\"\n : \"bg-gray-100 dark:bg-gray-700 text-gray-700 dark:text-gray-300 border border-gray-200 dark:border-gray-600\",\n )}\n >\n {/* Thumbnail for images */}\n {attachment.previewUrl && (\n <img\n src={attachment.previewUrl}\n alt=\"\"\n className=\"w-5 h-5 rounded object-cover flex-shrink-0\"\n />\n )}\n\n {/* Filename */}\n <span className=\"truncate\">{attachment.file.name}</span>\n\n {/* Size / status */}\n {isLoading ? (\n <LoadingSpinner className=\"h-3 w-3 flex-shrink-0\" />\n ) : isError ? (\n <span className=\"flex-shrink-0 text-red-500\" title={attachment.error}>!</span>\n ) : (\n <span className=\"flex-shrink-0 text-gray-400 dark:text-gray-500\">\n {formatFileSize(attachment.actualSize ?? attachment.file.size)}\n </span>\n )}\n\n {/* Remove button */}\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onRemove(attachment.uuid);\n }}\n className=\"flex-shrink-0 p-0.5 rounded hover:bg-gray-200 dark:hover:bg-gray-600 transition-colors\"\n aria-label={`Remove ${attachment.file.name}`}\n disabled={isLoading}\n >\n <XIcon className=\"h-3 w-3\" />\n </button>\n </div>\n );\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Input component for sending chat messages\n *\n * @example\n * ```tsx\n * <ChatInput\n * onSend={async (content) => {\n * await sendMessage(content);\n * }}\n * placeholder=\"Type a message...\"\n * disabled={isStreaming}\n * />\n * ```\n */\nexport function ChatInput({\n onSend,\n onStop,\n placeholder = \"Type a message...\",\n disabled = false,\n isLoading = false,\n enableAttachments = false,\n attachments = [],\n onRemoveAttachment,\n dropZoneRef,\n isUploadingAttachments = false,\n className,\n}: ChatInputProps) {\n const [content, setContent] = useState(\"\");\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n const hasAttachments = enableAttachments && attachments.length > 0;\n\n // Auto-resize textarea\n useEffect(() => {\n const textarea = textareaRef.current;\n if (textarea) {\n // Reset height to calculate new height\n textarea.style.height = \"auto\";\n // Set new height based on scroll height (max 200px)\n textarea.style.height = `${Math.min(textarea.scrollHeight, 200)}px`;\n }\n }, [content]);\n\n const handleSubmit = useCallback(async () => {\n const trimmedContent = content.trim();\n // Allow send with attachments but no text\n if ((!trimmedContent && !hasAttachments) || disabled || isLoading || isUploadingAttachments) return;\n\n setContent(\"\");\n await onSend(trimmedContent);\n }, [content, hasAttachments, disabled, isLoading, isUploadingAttachments, onSend]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n // Enter to send, Shift+Enter for newline\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleSubmit();\n }\n },\n [handleSubmit]\n );\n\n const handleStopClick = useCallback(() => {\n onStop?.();\n }, [onStop]);\n\n const handleAttachClick = useCallback(() => {\n dropZoneRef?.current?.openFileDialog();\n }, [dropZoneRef]);\n\n const canSend =\n (content.trim().length > 0 || hasAttachments) &&\n !disabled &&\n !isLoading &&\n !isUploadingAttachments;\n const showStopButton = isLoading && onStop;\n\n return (\n <div\n className={cn(\n \"border-t border-gray-200 dark:border-gray-700 p-4\",\n className\n )}\n >\n {/* Attachment chips */}\n {hasAttachments && (\n <div className=\"flex flex-wrap gap-1.5 mb-2\">\n {attachments.map((attachment) => (\n <AttachmentChip\n key={attachment.uuid}\n attachment={attachment}\n onRemove={onRemoveAttachment ?? (() => {})}\n />\n ))}\n </div>\n )}\n\n <div className=\"flex items-end gap-2\">\n {/* Attach button */}\n {enableAttachments && (\n <button\n type=\"button\"\n onClick={handleAttachClick}\n disabled={disabled || isLoading}\n className={cn(\n \"flex-shrink-0 p-3 rounded-lg transition-colors\",\n \"text-gray-500 dark:text-gray-400\",\n \"hover:bg-gray-100 dark:hover:bg-gray-700\",\n \"disabled:opacity-50 disabled:cursor-not-allowed\",\n \"focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2\"\n )}\n aria-label=\"Attach files\"\n title=\"Attach files\"\n >\n <PaperclipIcon className=\"h-5 w-5\" />\n </button>\n )}\n\n {/* Textarea */}\n <div className=\"flex-1 relative\">\n <textarea\n ref={textareaRef}\n value={content}\n onChange={(e) => setContent(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={\n hasAttachments && !content\n ? `${attachments.length} file${attachments.length > 1 ? \"s\" : \"\"} attached. Add a message or press Enter to send.`\n : placeholder\n }\n disabled={disabled}\n rows={1}\n className={cn(\n \"w-full resize-none rounded-lg border px-4 py-3 text-sm\",\n \"border-gray-300 dark:border-gray-600\",\n \"bg-white dark:bg-gray-800\",\n \"text-gray-900 dark:text-gray-100\",\n \"placeholder-gray-500 dark:placeholder-gray-400\",\n \"focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\",\n \"disabled:opacity-50 disabled:cursor-not-allowed\"\n )}\n style={{ minHeight: \"44px\", maxHeight: \"200px\" }}\n />\n </div>\n\n {/* Stop or Send button */}\n {showStopButton ? (\n <button\n type=\"button\"\n onClick={handleStopClick}\n className={cn(\n \"flex-shrink-0 p-3 rounded-lg transition-colors\",\n \"bg-red-500 text-white hover:bg-red-600\",\n \"focus:outline-none focus:ring-2 focus:ring-red-500 focus:ring-offset-2\"\n )}\n aria-label=\"Stop generation\"\n >\n <StopCircleIcon className=\"h-5 w-5\" />\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={!canSend}\n className={cn(\n \"flex-shrink-0 p-3 rounded-lg transition-colors\",\n canSend\n ? \"bg-blue-500 text-white hover:bg-blue-600\"\n : \"bg-gray-200 dark:bg-gray-700 text-gray-400 dark:text-gray-500\",\n \"disabled:cursor-not-allowed\",\n \"focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2\"\n )}\n aria-label=\"Send message\"\n >\n {isLoading ? (\n <LoadingSpinner className=\"h-5 w-5\" />\n ) : (\n <SendIcon className=\"h-5 w-5\" />\n )}\n </button>\n )}\n </div>\n\n {/* Helper text */}\n <p className=\"mt-2 text-xs text-gray-500 dark:text-gray-400\">\n Press Enter to send, Shift+Enter for new line\n </p>\n </div>\n );\n}\n\nexport default ChatInput;\n","\"use client\";\n\n/**\n * FileDropZone - Reusable file upload component with drag-and-drop\n *\n * Supports drag-and-drop file upload with visual feedback, file validation,\n * image compression, upload progress tracking, and thumbnail previews.\n *\n * Two modes:\n * - Standalone: renders a drop zone UI (default)\n * - Wrapper: wraps children with a drag-drop overlay (when children provided)\n *\n * @packageDocumentation\n */\n\nimport React, {\n useState,\n useCallback,\n useRef,\n useEffect,\n useImperativeHandle,\n forwardRef,\n} from \"react\";\nimport { compressImage } from \"../utils/compress-image.js\";\nimport type { AttachmentFile } from \"../types.js\";\n\n// =============================================================================\n// INLINE SVG ICONS (no lucide-react dependency)\n// =============================================================================\n\ninterface IconProps {\n className?: string;\n}\n\nfunction Upload({ className }: IconProps) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" /><polyline points=\"17 8 12 3 7 8\" /><line x1=\"12\" x2=\"12\" y1=\"3\" y2=\"15\" />\n </svg>\n );\n}\n\nfunction X({ className }: IconProps) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\n <path d=\"M18 6 6 18\" /><path d=\"m6 6 12 12\" />\n </svg>\n );\n}\n\nfunction FileText({ className }: IconProps) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\n <path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\" /><path d=\"M14 2v4a2 2 0 0 0 2 2h4\" /><line x1=\"16\" x2=\"8\" y1=\"13\" y2=\"13\" /><line x1=\"16\" x2=\"8\" y1=\"17\" y2=\"17\" /><line x1=\"10\" x2=\"8\" y1=\"9\" y2=\"9\" />\n </svg>\n );\n}\n\nfunction ImageIcon({ className }: IconProps) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" ry=\"2\" /><circle cx=\"9\" cy=\"9\" r=\"2\" /><path d=\"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\" />\n </svg>\n );\n}\n\nfunction Music({ className }: IconProps) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\n <path d=\"M9 18V5l12-2v13\" /><circle cx=\"6\" cy=\"18\" r=\"3\" /><circle cx=\"18\" cy=\"16\" r=\"3\" />\n </svg>\n );\n}\n\nfunction Loader2({ className }: IconProps) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n );\n}\n\nfunction FileIcon({ className }: IconProps) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\n <path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\" /><path d=\"M14 2v4a2 2 0 0 0 2 2h4\" />\n </svg>\n );\n}\n\nfunction RotateCw({ className }: IconProps) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}>\n <path d=\"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\" /><path d=\"M21 3v5h-5\" />\n </svg>\n );\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nfunction cn(...classes: (string | undefined | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface FileDropZoneProps {\n files: AttachmentFile[];\n onFilesChange: (files: AttachmentFile[]) => void;\n /** Upload a file. Return the UUID and presigned URL. If uploadUrl is empty, the S3 PUT step is skipped. */\n onUpload: (\n file: File,\n metadata: { filename: string; mimeType: string; size: number },\n ) => Promise<{ uuid: string; uploadUrl: string }>;\n /** Confirm the upload after S3 PUT succeeds */\n onConfirmUpload?: (uuid: string) => Promise<void>;\n /** Error callback instead of toast */\n onError?: (message: string) => void;\n maxFiles?: number;\n maxTotalSizeMB?: number;\n disabled?: boolean;\n className?: string;\n /** Restrict accepted file types, e.g. \"image/*\" */\n accept?: string;\n /** Compact mode for embedding in small panels */\n compact?: boolean;\n children?: React.ReactNode;\n}\n\n/** Ref interface for programmatic access to FileDropZone */\nexport interface FileDropZoneRef {\n /** Trigger the file selection dialog */\n openFileDialog: () => void;\n}\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\nconst SUPPORTED_TYPES = {\n document: {\n mimeTypes: [\n \"application/pdf\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \"application/msword\",\n \"text/plain\",\n \"text/markdown\",\n \"text/csv\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n \"application/vnd.ms-excel\",\n ],\n extensions: [\n \".pdf\",\n \".docx\",\n \".doc\",\n \".txt\",\n \".md\",\n \".csv\",\n \".xlsx\",\n \".xls\",\n ],\n maxSizeMB: 25,\n label: \"Documents\",\n },\n image: {\n mimeTypes: [\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n \"image/svg+xml\",\n ],\n extensions: [\".png\", \".jpg\", \".jpeg\", \".gif\", \".webp\", \".svg\"],\n maxSizeMB: 10,\n label: \"Images\",\n },\n audio: {\n mimeTypes: [\n \"audio/mpeg\",\n \"audio/wav\",\n \"audio/mp4\",\n \"audio/ogg\",\n \"audio/webm\",\n ],\n extensions: [\".mp3\", \".wav\", \".m4a\", \".ogg\", \".webm\"],\n maxSizeMB: 50,\n label: \"Audio\",\n },\n};\n\nconst MAX_FILES_PER_DROP = 10;\nconst MAX_TOTAL_SIZE_MB = 100;\n\n// =============================================================================\n// UTILITY FUNCTIONS\n// =============================================================================\n\nfunction categorizeFile(\n mimeType: string,\n): \"document\" | \"image\" | \"audio\" | null {\n for (const [category, config] of Object.entries(SUPPORTED_TYPES)) {\n if (config.mimeTypes.includes(mimeType)) {\n return category as \"document\" | \"image\" | \"audio\";\n }\n }\n return null;\n}\n\nfunction validateFile(file: File): {\n valid: boolean;\n error?: string;\n category?: \"document\" | \"image\" | \"audio\";\n} {\n const category = categorizeFile(file.type);\n\n if (!category) {\n return {\n valid: false,\n error: `Unsupported file type: ${file.type || file.name.split(\".\").pop()}`,\n };\n }\n\n const config = SUPPORTED_TYPES[category];\n const maxSizeBytes = config.maxSizeMB * 1024 * 1024;\n\n if (file.size > maxSizeBytes) {\n return {\n valid: false,\n error: `${file.name} exceeds ${config.maxSizeMB}MB limit for ${config.label.toLowerCase()}`,\n };\n }\n\n return { valid: true, category };\n}\n\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction getCategoryIcon(category: \"document\" | \"image\" | \"audio\") {\n switch (category) {\n case \"document\":\n return FileText;\n case \"image\":\n return ImageIcon;\n case \"audio\":\n return Music;\n default:\n return FileIcon;\n }\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\nexport const FileDropZone = forwardRef<FileDropZoneRef, FileDropZoneProps>(\n function FileDropZone(\n {\n onFilesChange,\n files,\n onUpload,\n onConfirmUpload,\n onError,\n maxFiles = MAX_FILES_PER_DROP,\n maxTotalSizeMB = MAX_TOTAL_SIZE_MB,\n disabled = false,\n className,\n accept,\n compact = false,\n children,\n },\n ref,\n ) {\n const [isDragging, setIsDragging] = useState(false);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const dropZoneRef = useRef<HTMLDivElement>(null);\n const dragCounter = useRef(0);\n\n // Expose openFileDialog method via ref\n useImperativeHandle(\n ref,\n () => ({\n openFileDialog: () => {\n if (!disabled) {\n fileInputRef.current?.click();\n }\n },\n }),\n [disabled],\n );\n\n // Calculate current total size\n const currentTotalSize = files.reduce((sum, f) => sum + f.file.size, 0);\n\n // Upload a single file\n const uploadFile = useCallback(\n async (file: File, _tempId: string) => {\n const result = await onUpload(file, {\n filename: file.name,\n mimeType: file.type,\n size: file.size,\n });\n\n // If uploadUrl is provided, do the S3 PUT\n if (result.uploadUrl) {\n const uploadResponse = await fetch(result.uploadUrl, {\n method: \"PUT\",\n body: file,\n headers: { \"Content-Type\": file.type },\n });\n if (!uploadResponse.ok) {\n throw new Error(`Upload failed: ${uploadResponse.statusText}`);\n }\n }\n\n // Confirm if callback provided\n if (onConfirmUpload) {\n await onConfirmUpload(result.uuid);\n }\n\n return result.uuid;\n },\n [onUpload, onConfirmUpload],\n );\n\n // Handle file validation and upload\n const handleFiles = useCallback(\n async (selectedFiles: File[]) => {\n if (disabled) return;\n\n // Validate total file count\n if (files.length + selectedFiles.length > maxFiles) {\n onError?.(`Maximum ${maxFiles} files allowed`);\n return;\n }\n\n // Validate and categorize files\n const validFiles: {\n file: File;\n category: \"document\" | \"image\" | \"audio\";\n }[] = [];\n let newTotalSize = currentTotalSize;\n\n for (const file of selectedFiles) {\n const validation = validateFile(file);\n\n if (!validation.valid) {\n onError?.(validation.error!);\n continue;\n }\n\n newTotalSize += file.size;\n if (newTotalSize > maxTotalSizeMB * 1024 * 1024) {\n onError?.(`Total upload size exceeds ${maxTotalSizeMB}MB`);\n break;\n }\n\n validFiles.push({ file, category: validation.category! });\n }\n\n if (validFiles.length === 0) return;\n\n // Compress images before upload\n const processedFiles: {\n file: File;\n category: \"document\" | \"image\" | \"audio\";\n }[] = [];\n for (const entry of validFiles) {\n if (entry.category === \"image\") {\n try {\n const compressed = await compressImage(entry.file);\n processedFiles.push({ file: compressed, category: entry.category });\n } catch (err) {\n console.warn(\"Image compression failed, using original:\", err);\n processedFiles.push(entry);\n }\n } else {\n processedFiles.push(entry);\n }\n }\n\n // Create attachment records\n const newAttachments: AttachmentFile[] = processedFiles.map(\n ({ file, category }) => {\n const tempId = `temp-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n return {\n uuid: tempId,\n file,\n status: \"pending\" as const,\n progress: 0,\n category,\n previewUrl:\n category === \"image\" ? URL.createObjectURL(file) : undefined,\n };\n },\n );\n\n // Add to state immediately\n let currentFiles = [...files, ...newAttachments];\n onFilesChange(currentFiles);\n\n // Upload each file\n for (const attachment of newAttachments) {\n try {\n // Update status to uploading\n currentFiles = currentFiles.map((f: AttachmentFile) =>\n f.uuid === attachment.uuid\n ? { ...f, status: \"uploading\" as const, progress: 10 }\n : f,\n );\n onFilesChange(currentFiles);\n\n const realUuid = await uploadFile(attachment.file, attachment.uuid);\n\n // Update with real UUID and ready status\n currentFiles = currentFiles.map((f: AttachmentFile) =>\n f.uuid === attachment.uuid\n ? {\n ...f,\n uuid: realUuid,\n status: \"ready\" as const,\n progress: 100,\n hasThumbnail: f.category === \"image\",\n }\n : f,\n );\n onFilesChange(currentFiles);\n } catch (error) {\n console.error(\"Upload error:\", error);\n currentFiles = currentFiles.map((f: AttachmentFile) =>\n f.uuid === attachment.uuid\n ? {\n ...f,\n status: \"error\" as const,\n error:\n error instanceof Error ? error.message : \"Upload failed\",\n }\n : f,\n );\n onFilesChange(currentFiles);\n onError?.(`Failed to upload ${attachment.file.name}`);\n }\n }\n },\n [\n disabled,\n files,\n maxFiles,\n currentTotalSize,\n maxTotalSizeMB,\n onFilesChange,\n uploadFile,\n onError,\n ],\n );\n\n // Remove a file\n const handleRemove = useCallback(\n (uuid: string) => {\n const file = files.find((f) => f.uuid === uuid);\n if (file?.previewUrl) {\n URL.revokeObjectURL(file.previewUrl);\n }\n onFilesChange(files.filter((f) => f.uuid !== uuid));\n },\n [files, onFilesChange],\n );\n\n // Retry a failed upload\n const handleRetry = useCallback(\n async (uuid: string) => {\n const attachment = files.find((f) => f.uuid === uuid);\n if (!attachment || attachment.status !== \"error\") return;\n\n // Reset to pending\n let currentFiles = files.map((f: AttachmentFile) =>\n f.uuid === uuid\n ? { ...f, status: \"pending\" as const, progress: 0, error: undefined }\n : f,\n );\n onFilesChange(currentFiles);\n\n try {\n currentFiles = currentFiles.map((f: AttachmentFile) =>\n f.uuid === uuid\n ? { ...f, status: \"uploading\" as const, progress: 10 }\n : f,\n );\n onFilesChange(currentFiles);\n\n const realUuid = await uploadFile(attachment.file, uuid);\n\n currentFiles = currentFiles.map((f: AttachmentFile) =>\n f.uuid === uuid\n ? {\n ...f,\n uuid: realUuid,\n status: \"ready\" as const,\n progress: 100,\n hasThumbnail: f.category === \"image\",\n }\n : f,\n );\n onFilesChange(currentFiles);\n } catch (error) {\n console.error(\"Retry upload error:\", error);\n currentFiles = currentFiles.map((f: AttachmentFile) =>\n f.uuid === uuid\n ? {\n ...f,\n status: \"error\" as const,\n error:\n error instanceof Error ? error.message : \"Upload failed\",\n }\n : f,\n );\n onFilesChange(currentFiles);\n onError?.(`Failed to upload ${attachment.file.name}`);\n }\n },\n [files, onFilesChange, uploadFile, onError],\n );\n\n // Helper to check if the drag event contains files\n const hasDraggedFiles = useCallback((e: React.DragEvent): boolean => {\n if (e.dataTransfer.types) {\n for (const type of e.dataTransfer.types) {\n if (type === \"Files\") return true;\n }\n }\n return false;\n }, []);\n\n // Drag and drop handlers (standalone mode)\n const handleDragEnter = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (!hasDraggedFiles(e)) return;\n dragCounter.current++;\n if (!disabled && dragCounter.current === 1) {\n setIsDragging(true);\n }\n },\n [disabled, hasDraggedFiles],\n );\n\n const handleDragOver = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (hasDraggedFiles(e)) {\n e.dataTransfer.dropEffect = disabled ? \"none\" : \"copy\";\n }\n },\n [disabled, hasDraggedFiles],\n );\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (dragCounter.current > 0) {\n dragCounter.current--;\n if (dragCounter.current === 0) {\n setIsDragging(false);\n }\n }\n }, []);\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounter.current = 0;\n setIsDragging(false);\n if (disabled) return;\n const droppedFiles = Array.from(e.dataTransfer.files);\n if (droppedFiles.length > 0) {\n handleFiles(droppedFiles);\n }\n },\n [handleFiles, disabled],\n );\n\n const handleFileSelect = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const selectedFiles = e.target.files;\n if (selectedFiles) {\n handleFiles(Array.from(selectedFiles));\n }\n if (fileInputRef.current) {\n fileInputRef.current.value = \"\";\n }\n },\n [handleFiles],\n );\n\n const handleClick = useCallback(() => {\n if (!disabled) {\n fileInputRef.current?.click();\n }\n }, [disabled]);\n\n // Helper to check if dataTransfer contains files (cross-browser)\n const checkDataTransferHasFiles = useCallback(\n (dataTransfer: DataTransfer | null): boolean => {\n if (!dataTransfer?.types) return false;\n for (let i = 0; i < dataTransfer.types.length; i++) {\n if (dataTransfer.types[i] === \"Files\") return true;\n }\n return false;\n },\n [],\n );\n\n // Native event listeners for wrapper mode drag-drop\n useEffect(() => {\n if (!children || !dropZoneRef.current) return;\n\n const element = dropZoneRef.current;\n let enterCounter = 0;\n\n const handleDragEnterNative = (e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (!checkDataTransferHasFiles(e.dataTransfer)) return;\n enterCounter++;\n if (enterCounter === 1 && !disabled) {\n setIsDragging(true);\n }\n };\n\n const handleDragLeaveNative = (e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (!checkDataTransferHasFiles(e.dataTransfer)) return;\n enterCounter--;\n if (enterCounter <= 0) {\n enterCounter = 0;\n setIsDragging(false);\n }\n };\n\n const handleDragOverNative = (e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (\n checkDataTransferHasFiles(e.dataTransfer) &&\n !disabled &&\n e.dataTransfer\n ) {\n e.dataTransfer.dropEffect = \"copy\";\n }\n };\n\n const handleDropNative = (e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n enterCounter = 0;\n setIsDragging(false);\n if (disabled) return;\n const droppedFiles = e.dataTransfer?.files;\n if (droppedFiles && droppedFiles.length > 0) {\n handleFiles(Array.from(droppedFiles));\n }\n };\n\n element.addEventListener(\"dragenter\", handleDragEnterNative, true);\n element.addEventListener(\"dragleave\", handleDragLeaveNative, true);\n element.addEventListener(\"dragover\", handleDragOverNative, true);\n element.addEventListener(\"drop\", handleDropNative, true);\n\n return () => {\n element.removeEventListener(\"dragenter\", handleDragEnterNative, true);\n element.removeEventListener(\"dragleave\", handleDragLeaveNative, true);\n element.removeEventListener(\"dragover\", handleDragOverNative, true);\n element.removeEventListener(\"drop\", handleDropNative, true);\n };\n }, [children, disabled, handleFiles, checkDataTransferHasFiles]);\n\n // Reset drag state when disabled changes\n useEffect(() => {\n if (disabled) {\n dragCounter.current = 0;\n setIsDragging(false);\n }\n }, [disabled]);\n\n // Build accept string for file input\n const acceptTypes =\n accept ||\n Object.values(SUPPORTED_TYPES)\n .flatMap((t) => [...t.mimeTypes, ...t.extensions])\n .join(\",\");\n\n const hasFiles = files.length > 0;\n const isUploading = files.some((f) => f.status === \"uploading\");\n\n // --- Wrapper mode ---\n if (children) {\n return (\n <div\n ref={dropZoneRef}\n data-dropzone=\"wrapper\"\n className={cn(\"relative w-full h-full\", className)}\n style={{ minHeight: \"inherit\" }}\n >\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n accept={acceptTypes}\n onChange={handleFileSelect}\n className=\"hidden\"\n disabled={disabled}\n />\n {children}\n {isDragging && !disabled && (\n <div\n className=\"absolute inset-0 z-50 bg-primary/10 border-2 border-dashed border-primary rounded-xl flex flex-col items-center justify-center backdrop-blur-sm transition-opacity duration-200\"\n style={{ pointerEvents: \"none\" }}\n >\n <div className=\"bg-background/80 rounded-xl p-8 flex flex-col items-center shadow-lg\">\n <Upload className=\"h-12 w-12 text-primary mb-4 animate-bounce\" />\n <p className=\"text-lg font-medium text-primary\">\n Drop files here\n </p>\n <p className=\"text-sm text-muted-foreground mt-2\">\n Documents, images, or audio files\n </p>\n </div>\n </div>\n )}\n </div>\n );\n }\n\n // --- Standalone mode ---\n return (\n <div className={cn(\"w-full\", className)}>\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n accept={acceptTypes}\n onChange={handleFileSelect}\n className=\"hidden\"\n disabled={disabled}\n />\n\n {/* Drop zone */}\n <div\n onDragEnter={handleDragEnter}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onClick={handleClick}\n className={cn(\n \"relative rounded-lg border-2 border-dashed transition-all cursor-pointer\",\n \"flex flex-col items-center justify-center\",\n compact ? \"p-2 min-h-[60px]\" : \"p-4 min-h-[100px]\",\n isDragging && !disabled\n ? \"border-primary bg-primary/5\"\n : \"border-muted-foreground/25\",\n disabled\n ? \"opacity-50 cursor-not-allowed\"\n : \"hover:border-primary/50 hover:bg-muted/25\",\n )}\n >\n {isUploading ? (\n <Loader2\n className={cn(\n \"animate-spin text-muted-foreground\",\n compact ? \"h-5 w-5 mb-1\" : \"h-8 w-8 mb-2\",\n )}\n />\n ) : (\n <Upload\n className={cn(\n \"text-muted-foreground\",\n compact ? \"h-5 w-5 mb-1\" : \"h-8 w-8 mb-2\",\n )}\n />\n )}\n\n <p\n className={cn(\n \"font-medium text-center text-muted-foreground\",\n compact ? \"text-xs\" : \"text-sm\",\n )}\n >\n {isDragging\n ? \"Drop files here\"\n : isUploading\n ? \"Uploading...\"\n : \"Click to upload or drag and drop\"}\n </p>\n\n {!compact && (\n <p className=\"text-xs text-muted-foreground/70 text-center mt-1\">\n Documents, images, or audio files\n </p>\n )}\n </div>\n\n {/* File list */}\n {hasFiles && (\n <div className={cn(\"space-y-2\", compact ? \"mt-2\" : \"mt-3\")}>\n {files.map((attachment) => {\n const Icon = getCategoryIcon(attachment.category);\n const isError = attachment.status === \"error\";\n const isLoading =\n attachment.status === \"uploading\" ||\n attachment.status === \"processing\";\n\n return (\n <div\n key={attachment.uuid}\n className={cn(\n \"flex items-center gap-3 p-2 rounded-lg border\",\n isError\n ? \"border-destructive/50 bg-destructive/5\"\n : \"border-border bg-muted/25\",\n )}\n >\n {/* Preview or icon */}\n <div className=\"relative flex-shrink-0 w-10 h-10 rounded overflow-hidden bg-muted flex items-center justify-center\">\n {attachment.previewUrl ? (\n <img\n src={attachment.previewUrl}\n alt={attachment.file.name}\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <Icon className=\"h-5 w-5 text-muted-foreground\" />\n )}\n {isLoading && (\n <div className=\"absolute inset-0 bg-background/80 flex items-center justify-center\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n </div>\n )}\n </div>\n\n {/* File info */}\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium truncate\">\n {attachment.file.name}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {formatFileSize(attachment.file.size)}\n {isError && attachment.error && (\n <span className=\"text-destructive ml-2\">\n {attachment.error}\n </span>\n )}\n </p>\n </div>\n\n {/* Status indicator */}\n <div className=\"flex-shrink-0\">\n {isLoading ? (\n <span className=\"text-xs text-muted-foreground\">\n {attachment.progress}%\n </span>\n ) : attachment.status === \"ready\" ? (\n <span className=\"text-xs text-green-600\">Ready</span>\n ) : null}\n </div>\n\n {/* Retry button for failed uploads */}\n {isError && (\n <button\n type=\"button\"\n className=\"flex-shrink-0 h-8 w-8 inline-flex items-center justify-center rounded-md text-primary hover:bg-muted transition-colors\"\n onClick={(e) => {\n e.stopPropagation();\n handleRetry(attachment.uuid);\n }}\n title=\"Retry upload\"\n >\n <RotateCw className=\"h-4 w-4\" />\n </button>\n )}\n\n {/* Remove button */}\n <button\n type=\"button\"\n className=\"flex-shrink-0 h-8 w-8 inline-flex items-center justify-center rounded-md hover:bg-muted transition-colors disabled:opacity-50\"\n onClick={(e) => {\n e.stopPropagation();\n handleRemove(attachment.uuid);\n }}\n disabled={isLoading}\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n },\n);\n","\"use client\";\n\n/**\n * AskUserPrompt Component\n *\n * Displays when the agent calls ask_user to request user input.\n * Shows the question and optional choices, with an input field.\n *\n * Ported from: ai-saas-v2/src/extensions/agents/components/playground/internal-tools/AskUserPrompt.tsx\n *\n * @module @cadraos/sdk/chat\n */\n\nimport * as React from \"react\";\nimport { useCallback, useState } from \"react\";\nimport { CheckCircleIcon, MessageCircleIcon, SendIcon } from \"../../icons/index.js\";\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nfunction cn(...classes: (string | undefined | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface AskUserPromptProps {\n /** The question to display to the user */\n question: string;\n /** Optional predefined choices */\n options?: string[];\n /** Callback when user submits their response */\n onSubmit: (response: string) => void;\n /** Whether a response is required */\n required?: boolean;\n /** Whether the prompt is disabled (e.g., already responded) */\n disabled?: boolean;\n /** Current status */\n status?: \"waiting\" | \"submitted\" | \"processing\";\n /** Additional CSS classes */\n className?: string;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Input prompt for agent clarification requests\n *\n * @example\n * ```tsx\n * <AskUserPrompt\n * question=\"What format would you like the report in?\"\n * options={[\"PDF\", \"CSV\", \"Excel\"]}\n * onSubmit={(response) => handleClarification(response)}\n * />\n * ```\n */\nexport function AskUserPrompt({\n question,\n options,\n onSubmit,\n required = true,\n disabled = false,\n status = \"waiting\",\n className,\n}: AskUserPromptProps) {\n const [response, setResponse] = useState(\"\");\n const [selectedOption, setSelectedOption] = useState<string | null>(null);\n\n const handleSubmit = useCallback(() => {\n const finalResponse = selectedOption || response.trim();\n if (required && !finalResponse) return;\n onSubmit(finalResponse);\n }, [selectedOption, response, required, onSubmit]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleSubmit();\n }\n },\n [handleSubmit]\n );\n\n const handleOptionSelect = useCallback((option: string) => {\n setSelectedOption((prev) => (prev === option ? null : option));\n setResponse(\"\"); // Clear text input when option selected\n }, []);\n\n const isSubmitDisabled =\n disabled ||\n status !== \"waiting\" ||\n (required && !response.trim() && !selectedOption);\n\n return (\n <div\n className={cn(\n \"rounded-lg border p-4 space-y-3\",\n status === \"waiting\"\n ? \"border-blue-200 bg-blue-50/50 dark:border-blue-800 dark:bg-blue-950/20\"\n : \"border-green-200 bg-green-50/50 dark:border-green-800 dark:bg-green-950/20\",\n className\n )}\n >\n {/* Header */}\n <div className=\"flex items-center gap-2\">\n <MessageCircleIcon className=\"h-5 w-5 text-blue-600 dark:text-blue-400\" />\n <span className=\"font-medium text-blue-900 dark:text-blue-100\">\n Agent needs your input\n </span>\n <span\n className={cn(\n \"ml-auto text-xs px-2 py-1 rounded-full font-medium\",\n status === \"waiting\"\n ? \"bg-blue-100 text-blue-700 dark:bg-blue-900 dark:text-blue-300\"\n : \"bg-green-100 text-green-700 dark:bg-green-900 dark:text-green-300\"\n )}\n >\n {status === \"waiting\"\n ? \"Waiting\"\n : status === \"submitted\"\n ? \"Submitted\"\n : \"Processing\"}\n </span>\n </div>\n\n {/* Question */}\n <p className=\"text-sm text-gray-700 dark:text-gray-300 whitespace-pre-wrap\">\n {question}\n </p>\n\n {/* Options (if provided) */}\n {options && options.length > 0 && status === \"waiting\" && (\n <div className=\"flex flex-wrap gap-2\">\n {options.map((option, idx) => (\n <button\n key={idx}\n type=\"button\"\n onClick={() => handleOptionSelect(option)}\n disabled={disabled}\n className={cn(\n \"px-3 py-1.5 text-sm rounded-md border transition-all\",\n selectedOption === option\n ? \"bg-blue-600 text-white border-blue-600 hover:bg-blue-700\"\n : \"bg-white dark:bg-gray-800 border-gray-300 dark:border-gray-600 hover:bg-gray-50 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300\",\n disabled && \"opacity-50 cursor-not-allowed\"\n )}\n >\n {option}\n </button>\n ))}\n </div>\n )}\n\n {/* Input area (for open-ended or in addition to options) */}\n {status === \"waiting\" && (\n <div className=\"flex gap-2\">\n <textarea\n value={response}\n onChange={(e) => {\n setResponse(e.target.value);\n setSelectedOption(null); // Clear option selection when typing\n }}\n onKeyDown={handleKeyDown}\n placeholder={\n options?.length\n ? \"Or type a custom response...\"\n : \"Type your response...\"\n }\n className={cn(\n \"flex-1 min-h-[60px] px-3 py-2 text-sm resize-none rounded-md border\",\n \"border-gray-300 dark:border-gray-600\",\n \"bg-white dark:bg-gray-800\",\n \"text-gray-900 dark:text-gray-100\",\n \"placeholder-gray-500 dark:placeholder-gray-400\",\n \"focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\",\n disabled && \"opacity-50 cursor-not-allowed\"\n )}\n disabled={disabled}\n />\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitDisabled}\n className={cn(\n \"self-end px-4 py-2 rounded-md text-white transition-colors\",\n \"bg-blue-600 hover:bg-blue-700\",\n \"disabled:opacity-50 disabled:cursor-not-allowed\"\n )}\n >\n <SendIcon className=\"h-4 w-4\" />\n </button>\n </div>\n )}\n\n {/* Submitted state */}\n {status !== \"waiting\" && (\n <div className=\"flex items-center gap-2 text-sm text-green-700 dark:text-green-400\">\n <CheckCircleIcon className=\"h-4 w-4\" />\n <span>\n Response submitted:{\" \"}\n <span className=\"font-medium\">{selectedOption || response}</span>\n </span>\n </div>\n )}\n </div>\n );\n}\n\nexport default AskUserPrompt;\n","\"use client\";\n\n/**\n * MarkdownContent - Markdown rendering component for chat messages\n *\n * Renders markdown content with proper styling for:\n * - Headers\n * - Code blocks (with syntax highlighting placeholder)\n * - Tables\n * - Links (open in new tab)\n * - Lists\n * - GFM features (strikethrough, task lists)\n *\n * Ported from: ai-saas-v2/src/extensions/agents/components/playground/PlaygroundChat.tsx (inline)\n *\n * @module @cadraos/sdk/chat\n */\n\nimport { useMemo } from \"react\";\nimport type { Components } from \"react-markdown\";\nimport ReactMarkdown from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nfunction cn(...classes: (string | undefined | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface MarkdownContentProps {\n /** Markdown content to render */\n content: string;\n /** Additional CSS classes */\n className?: string;\n /** Custom React-Markdown component overrides (merged with defaults, user wins) */\n components?: Partial<Components>;\n /** Custom URL transform for React-Markdown (e.g., to preserve custom protocols like artifact:) */\n urlTransform?: (url: string) => string;\n /** Transform content string before rendering (e.g., strip certain patterns) */\n contentTransform?: (content: string) => string;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Renders markdown content with chat-appropriate styling\n *\n * @example\n * ```tsx\n * <MarkdownContent content=\"# Hello\\n\\nThis is **bold** text.\" />\n * ```\n */\nexport function MarkdownContent({\n content,\n className,\n components: customComponents,\n urlTransform,\n contentTransform,\n}: MarkdownContentProps) {\n // Apply content transform if provided\n const transformedContent = useMemo(\n () => (contentTransform ? contentTransform(content) : content),\n [content, contentTransform]\n );\n\n const defaultComponents: Partial<Components> = useMemo(\n () => ({\n // Headers\n h1: ({ children }) => (\n <h1 className=\"text-2xl font-bold mt-4 mb-2 first:mt-0\">{children}</h1>\n ),\n h2: ({ children }) => (\n <h2 className=\"text-xl font-bold mt-4 mb-2 first:mt-0\">{children}</h2>\n ),\n h3: ({ children }) => (\n <h3 className=\"text-lg font-semibold mt-3 mb-1 first:mt-0\">{children}</h3>\n ),\n h4: ({ children }) => (\n <h4 className=\"text-base font-semibold mt-2 mb-1 first:mt-0\">{children}</h4>\n ),\n\n // Paragraphs\n p: ({ children }) => (\n <p className=\"mb-2 last:mb-0 leading-relaxed\">{children}</p>\n ),\n\n // Lists\n ul: ({ children }) => (\n <ul className=\"list-disc list-inside mb-2 space-y-1\">{children}</ul>\n ),\n ol: ({ children }) => (\n <ol className=\"list-decimal list-inside mb-2 space-y-1\">{children}</ol>\n ),\n li: ({ children }) => (\n <li className=\"leading-relaxed\">{children}</li>\n ),\n\n // Links\n a: ({ href, children }) => (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-blue-600 hover:text-blue-800 dark:text-blue-400 dark:hover:text-blue-300 underline\"\n >\n {children}\n </a>\n ),\n\n // Tables\n table: ({ children }) => (\n <div className=\"overflow-x-auto my-2\">\n <table className=\"min-w-full divide-y divide-gray-200 dark:divide-gray-700 border border-gray-200 dark:border-gray-700 rounded-lg\">\n {children}\n </table>\n </div>\n ),\n thead: ({ children }) => (\n <thead className=\"bg-gray-50 dark:bg-gray-800\">{children}</thead>\n ),\n tbody: ({ children }) => (\n <tbody className=\"bg-white dark:bg-gray-900 divide-y divide-gray-200 dark:divide-gray-700\">\n {children}\n </tbody>\n ),\n tr: ({ children }) => <tr>{children}</tr>,\n th: ({ children }) => (\n <th className=\"px-3 py-2 text-left text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider\">\n {children}\n </th>\n ),\n td: ({ children }) => (\n <td className=\"px-3 py-2 text-sm text-gray-900 dark:text-gray-100 whitespace-nowrap\">\n {children}\n </td>\n ),\n\n // Blockquotes\n blockquote: ({ children }) => (\n <blockquote className=\"border-l-4 border-gray-300 dark:border-gray-600 pl-4 italic text-gray-600 dark:text-gray-400 my-2\">\n {children}\n </blockquote>\n ),\n\n // Horizontal rule\n hr: () => (\n <hr className=\"my-4 border-gray-200 dark:border-gray-700\" />\n ),\n\n // Strong and emphasis\n strong: ({ children }) => (\n <strong className=\"font-semibold\">{children}</strong>\n ),\n em: ({ children }) => (\n <em className=\"italic\">{children}</em>\n ),\n\n // Strikethrough (GFM)\n del: ({ children }) => (\n <del className=\"line-through text-gray-500 dark:text-gray-400\">\n {children}\n </del>\n ),\n\n // Code - inline and blocks\n code: ({ className: codeClassName, children, ...props }) => {\n // Check if it's a code block (has language class) or inline code\n const isCodeBlock = /language-(\\w+)/.exec(codeClassName || \"\");\n const language = isCodeBlock ? isCodeBlock[1] : null;\n\n if (isCodeBlock) {\n return (\n <div className=\"relative my-2\">\n {language && (\n <div className=\"absolute top-0 right-0 px-2 py-1 text-xs font-mono text-gray-500 dark:text-gray-400 bg-gray-100 dark:bg-gray-800 rounded-bl rounded-tr border-b border-l border-gray-200 dark:border-gray-700\">\n {language}\n </div>\n )}\n <pre className=\"bg-gray-100 dark:bg-gray-800 rounded-lg p-4 overflow-x-auto text-sm\">\n <code className={cn(\"font-mono\", codeClassName)} {...props}>\n {children}\n </code>\n </pre>\n </div>\n );\n }\n\n // Inline code\n return (\n <code\n className=\"bg-gray-100 dark:bg-gray-800 text-gray-800 dark:text-gray-200 px-1.5 py-0.5 rounded text-sm font-mono\"\n {...props}\n >\n {children}\n </code>\n );\n },\n\n // Pre element (for code blocks)\n pre: ({ children }) => (\n <>{children}</>\n ),\n\n // Images\n img: ({ src, alt }) => (\n <img\n src={src}\n alt={alt || \"\"}\n className=\"max-w-full h-auto rounded-lg my-2\"\n loading=\"lazy\"\n />\n ),\n\n // Task lists (GFM)\n input: ({ type, checked, disabled }) => {\n if (type === \"checkbox\") {\n return (\n <input\n type=\"checkbox\"\n checked={checked}\n disabled={disabled}\n readOnly\n className=\"mr-2 rounded border-gray-300 dark:border-gray-600\"\n />\n );\n }\n return <input type={type} />;\n },\n }),\n []\n );\n\n // Merge default components with custom overrides (custom wins)\n const mergedComponents = useMemo(\n () =>\n customComponents\n ? { ...defaultComponents, ...customComponents }\n : defaultComponents,\n [defaultComponents, customComponents]\n );\n\n return (\n <div className={cn(\"prose prose-sm dark:prose-invert max-w-none\", className)}>\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n components={mergedComponents}\n {...(urlTransform ? { urlTransform } : {})}\n >\n {transformedContent}\n </ReactMarkdown>\n </div>\n );\n}\n\nexport default MarkdownContent;\n","\"use client\";\n\n/**\n * ToolCallEntry - Tool call visualization component\n *\n * Displays tool calls with:\n * - Status indicators (pending, running, completed, failed)\n * - Collapsible input/output view\n * - Duration display\n * - Formatted tool names\n *\n * Ported from: ai-saas-v2/src/extensions/agents/components/playground/PlaygroundChat.tsx (inline)\n *\n * @module @cadraos/sdk/chat\n */\n\nimport { useMemo, useState } from \"react\";\nimport {\n AlertCircleIcon,\n CheckIcon,\n ChevronDownIcon,\n ChevronRightIcon,\n ClockIcon,\n LoadingSpinner,\n} from \"../icons/index.js\";\nimport type { ToolCall } from \"../types.js\";\n\n// =============================================================================\n// INTERNAL TOOL DETECTION\n// =============================================================================\n\n/**\n * Tool name patterns for internal/orchestration tools that should be hidden\n * in compact verbosity mode. These are matched after stripping common prefixes\n * (e.g., `team_api_handoff_to_agent` → `handoff_to_agent`).\n */\nexport const INTERNAL_TOOL_NAMES = new Set([\n \"update_task_list\",\n \"create_task\",\n \"mark_task_complete\",\n \"handoff_to_agent\",\n \"delegate_to_agent\",\n \"delegate_task\",\n \"get_tool_info\",\n \"get_tools\",\n \"list_tools\",\n \"call_tool\",\n \"invoke_tool\",\n \"execute_tool\",\n \"check_task_status\",\n \"assign_task\",\n \"update_plan\",\n \"check_delegations\",\n]);\n\n/**\n * Check if a tool name is an internal/orchestration tool.\n * Strips common prefixes before matching (e.g., `team_api_handoff_to_agent` → matches `handoff_to_agent`).\n */\nexport function isInternalTool(toolName: string): boolean {\n if (!toolName) return false;\n\n // Direct match first\n const lower = toolName.toLowerCase();\n if (INTERNAL_TOOL_NAMES.has(lower)) return true;\n\n // Strip prefixes and try suffix matching\n // e.g., \"team_api_handoff_to_agent\" → try \"handoff_to_agent\"\n for (const internal of INTERNAL_TOOL_NAMES) {\n if (lower.endsWith(internal) && lower.length > internal.length) {\n const charBefore = lower[lower.length - internal.length - 1];\n if (charBefore === \"_\" || charBefore === \".\") return true;\n }\n }\n\n return false;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nfunction cn(...classes: (string | undefined | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n\n/**\n * Convert tool names from snake_case with prefixes to friendly Title Case\n *\n * Examples:\n * - \"skills_api_create_skill\" -> \"Create Skill\"\n * - \"tools_api_list_tools\" -> \"List Tools\"\n * - \"browse_web_browse_web_page\" -> \"Browse Page\"\n * - \"search_google\" -> \"Search Google\"\n * - \"notion_api_create_page\" -> \"Create Page\"\n */\nfunction formatToolName(toolName: string): string {\n if (!toolName) return toolName;\n\n // Common prefixes to remove (order matters - longer/more specific first)\n const prefixesToRemove = [\n \"skills_api_\",\n \"tools_api_\",\n \"tools_management_api_\",\n \"browse_web_browse_web_\",\n \"browse_web_browse_\",\n \"browse_web_\",\n \"notion_api_\",\n \"google_api_\",\n \"slack_api_\",\n \"github_api_\",\n \"search_api_\",\n \"file_system_\",\n \"code_execution_\",\n \"data_analysis_\",\n \"knowledge_base_\",\n \"memory_api_\",\n \"database_api_\",\n \"email_api_\",\n \"calendar_api_\",\n \"storage_api_\",\n \"api_\",\n ];\n\n let cleanName = toolName;\n\n // Remove known prefixes (can remove multiple)\n let foundPrefix = true;\n while (foundPrefix) {\n foundPrefix = false;\n for (const prefix of prefixesToRemove) {\n if (cleanName.toLowerCase().startsWith(prefix)) {\n cleanName = cleanName.slice(prefix.length);\n foundPrefix = true;\n break;\n }\n }\n }\n\n // Remove duplicate words\n const words = cleanName.split(\"_\");\n const uniqueWords: string[] = [];\n for (const word of words) {\n if (\n uniqueWords.length === 0 ||\n uniqueWords[uniqueWords.length - 1]?.toLowerCase() !== word.toLowerCase()\n ) {\n uniqueWords.push(word);\n }\n }\n\n // Convert to Title Case\n return uniqueWords\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(\" \");\n}\n\n/**\n * Format duration in a human-readable way\n */\nfunction formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n const seconds = (ms / 1000).toFixed(1);\n return `${seconds}s`;\n}\n\n/**\n * Truncate and format JSON for display\n */\nfunction formatJsonPreview(data: unknown, maxLength = 100): string {\n if (data === undefined || data === null) {\n return String(data);\n }\n try {\n const str = JSON.stringify(data, null, 2);\n if (str.length > maxLength) {\n return str.slice(0, maxLength) + \"...\";\n }\n return str;\n } catch {\n return String(data);\n }\n}\n\n/**\n * Extract image URLs from a tool result.\n *\n * Detects common patterns:\n * - { success: true, images: [{ url: \"...\" }] } (transformed image response)\n * - { images: [{ url: \"...\" }] }\n * - { url: \"...\" } (single image)\n * - String that is a URL ending in image extension\n * - JSON string containing any of the above\n */\ninterface ExtractedImage {\n url: string;\n thumbnailUrl?: string;\n prompt?: string;\n alt?: string;\n}\n\nfunction extractImagesFromResult(result: unknown): ExtractedImage[] {\n if (!result) return [];\n\n // If result is a string, try to parse as JSON first\n let data: unknown = result;\n if (typeof result === \"string\") {\n try {\n data = JSON.parse(result);\n } catch {\n // Check if it's a direct image URL\n if (/\\.(png|jpg|jpeg|gif|webp|svg|bmp)(\\?.*)?$/i.test(result) || result.startsWith(\"data:image/\")) {\n return [{ url: result }];\n }\n return [];\n }\n }\n\n if (typeof data !== \"object\" || data === null) return [];\n\n const obj = data as Record<string, unknown>;\n\n // Pattern: { images: [...] } or { success: true, images: [...] }\n if (Array.isArray(obj.images)) {\n return (obj.images as Array<Record<string, unknown>>)\n .filter((img) => typeof img.url === \"string\")\n .map((img) => ({\n url: img.url as string,\n thumbnailUrl: img.thumbnailUrl as string | undefined,\n prompt: img.prompt as string | undefined,\n alt: (img.alt as string) || (img.prompt as string) || undefined,\n }));\n }\n\n // Pattern: { url: \"...\" } (single image result)\n if (typeof obj.url === \"string\" && /\\.(png|jpg|jpeg|gif|webp|svg|bmp)(\\?.*)?$/i.test(obj.url)) {\n return [{ url: obj.url, alt: obj.alt as string | undefined }];\n }\n\n // Pattern: { imageUrl: \"...\" }\n if (typeof obj.imageUrl === \"string\") {\n return [{ url: obj.imageUrl as string, alt: obj.alt as string | undefined }];\n }\n\n return [];\n}\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface ToolCallEntryProps {\n /** Tool call data */\n toolCall: ToolCall;\n /** Additional CSS classes */\n className?: string;\n /** Whether to show the full JSON in expanded view */\n showFullJson?: boolean;\n /** Optional callback when an image is clicked. If provided, overrides default browser-open behavior. */\n onImageClick?: (image: { url: string; alt?: string; filename?: string }) => void;\n /** Render in compact single-line style (for completed tools in compact verbosity) */\n compact?: boolean;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Displays a single tool call with status and expandable details\n *\n * @example\n * ```tsx\n * <ToolCallEntry\n * toolCall={{\n * id: \"1\",\n * name: \"search_google\",\n * status: \"completed\",\n * args: { query: \"weather today\" },\n * result: { results: [...] },\n * durationMs: 1234,\n * }}\n * />\n * ```\n */\nexport function ToolCallEntry({\n toolCall,\n className,\n showFullJson = true,\n onImageClick,\n compact = false,\n}: ToolCallEntryProps) {\n const [isExpanded, setIsExpanded] = useState(false);\n\n const formattedName = useMemo(\n () => formatToolName(toolCall.name),\n [toolCall.name]\n );\n\n // Extract images from tool result (if any)\n const resultImages = useMemo(\n () => (toolCall.status === \"completed\" && toolCall.result ? extractImagesFromResult(toolCall.result) : []),\n [toolCall.status, toolCall.result]\n );\n\n const hasImages = resultImages.length > 0;\n\n const statusIcon = useMemo(() => {\n switch (toolCall.status) {\n case \"pending\":\n return <ClockIcon className=\"h-4 w-4 text-gray-400\" />;\n case \"running\":\n return <LoadingSpinner className=\"h-4 w-4 text-blue-500\" />;\n case \"completed\":\n return <CheckIcon className=\"h-4 w-4 text-green-500\" />;\n case \"failed\":\n return <AlertCircleIcon className=\"h-4 w-4 text-red-500\" />;\n default:\n return null;\n }\n }, [toolCall.status]);\n\n const statusColor = useMemo(() => {\n switch (toolCall.status) {\n case \"pending\":\n return \"border-gray-200 dark:border-gray-700\";\n case \"running\":\n return \"border-blue-200 dark:border-blue-800 bg-blue-50/50 dark:bg-blue-950/20\";\n case \"completed\":\n return \"border-green-200 dark:border-green-800\";\n case \"failed\":\n return \"border-red-200 dark:border-red-800 bg-red-50/50 dark:bg-red-950/20\";\n default:\n return \"border-gray-200 dark:border-gray-700\";\n }\n }, [toolCall.status]);\n\n // Compact mode: single-line display for completed tools\n if (compact && (toolCall.status === \"completed\" || toolCall.status === \"failed\")) {\n return (\n <div\n className={cn(\n \"inline-flex items-center gap-1.5 text-xs text-gray-500 dark:text-gray-400\",\n className\n )}\n >\n <span className=\"flex-shrink-0\">{statusIcon}</span>\n <span>{formattedName}</span>\n {toolCall.durationMs !== undefined && (\n <span className=\"text-gray-400 dark:text-gray-500\">\n {formatDuration(toolCall.durationMs)}\n </span>\n )}\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n \"rounded-lg border text-sm\",\n statusColor,\n className\n )}\n >\n {/* Header - always visible */}\n <button\n type=\"button\"\n onClick={() => setIsExpanded(!isExpanded)}\n className=\"w-full flex items-center gap-2 px-3 py-2 hover:bg-gray-50 dark:hover:bg-gray-800/50 transition-colors rounded-lg\"\n >\n {/* Expand/Collapse icon */}\n {isExpanded ? (\n <ChevronDownIcon className=\"h-4 w-4 text-gray-400 flex-shrink-0\" />\n ) : (\n <ChevronRightIcon className=\"h-4 w-4 text-gray-400 flex-shrink-0\" />\n )}\n\n {/* Status icon */}\n <span className=\"flex-shrink-0\">{statusIcon}</span>\n\n {/* Tool name */}\n <span className=\"font-medium text-gray-900 dark:text-gray-100 truncate\">\n {formattedName}\n </span>\n\n {/* Duration (if completed) */}\n {toolCall.status === \"completed\" && toolCall.durationMs !== undefined && (\n <span className=\"ml-auto text-xs text-gray-500 dark:text-gray-400 flex-shrink-0\">\n {formatDuration(toolCall.durationMs)}\n </span>\n )}\n\n {/* Error indicator */}\n {toolCall.status === \"failed\" && toolCall.error && (\n <span className=\"ml-auto text-xs text-red-600 dark:text-red-400 truncate max-w-[150px]\">\n {toolCall.error}\n </span>\n )}\n </button>\n\n {/* Images from tool result - always visible (not behind expand) */}\n {hasImages && (\n <div className=\"px-3 pb-2\">\n <div className={cn(\n \"grid gap-2\",\n resultImages.length === 1 ? \"grid-cols-1\" : \"grid-cols-2\"\n )}>\n {resultImages.map((img, idx) => {\n const altText = img.alt || img.prompt || `Generated image ${idx + 1}`;\n const imageElement = (\n <>\n <img\n src={img.thumbnailUrl || img.url}\n alt={altText}\n className=\"w-full h-auto max-h-[300px] object-contain bg-gray-50 dark:bg-gray-900\"\n loading=\"lazy\"\n />\n {img.prompt && (\n <div className=\"px-2 py-1 text-xs text-gray-500 dark:text-gray-400 truncate bg-gray-50 dark:bg-gray-800 border-t border-gray-200 dark:border-gray-700\">\n {img.prompt}\n </div>\n )}\n </>\n );\n\n if (onImageClick) {\n return (\n <button\n key={idx}\n type=\"button\"\n onClick={() => onImageClick({ url: img.url, alt: altText, filename: altText })}\n className=\"block rounded-lg overflow-hidden border border-gray-200 dark:border-gray-700 hover:border-blue-400 dark:hover:border-blue-600 transition-colors cursor-pointer text-left\"\n >\n {imageElement}\n </button>\n );\n }\n\n return (\n <a\n key={idx}\n href={img.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"block rounded-lg overflow-hidden border border-gray-200 dark:border-gray-700 hover:border-blue-400 dark:hover:border-blue-600 transition-colors\"\n >\n {imageElement}\n </a>\n );\n })}\n </div>\n </div>\n )}\n\n {/* Expanded content */}\n {isExpanded && (\n <div className=\"border-t border-gray-200 dark:border-gray-700 px-3 py-2 space-y-2\">\n {/* Input/Args */}\n {toolCall.args && Object.keys(toolCall.args).length > 0 && (\n <div>\n <div className=\"text-xs font-medium text-gray-500 dark:text-gray-400 mb-1\">\n Input\n </div>\n <pre className=\"bg-gray-100 dark:bg-gray-800 rounded p-2 text-xs overflow-x-auto font-mono text-gray-700 dark:text-gray-300\">\n {showFullJson\n ? JSON.stringify(toolCall.args, null, 2)\n : formatJsonPreview(toolCall.args, 200)}\n </pre>\n </div>\n )}\n\n {/* Output/Result */}\n {toolCall.status === \"completed\" && toolCall.result !== undefined && (\n <div>\n <div className=\"text-xs font-medium text-gray-500 dark:text-gray-400 mb-1\">\n Output\n </div>\n <pre className=\"bg-gray-100 dark:bg-gray-800 rounded p-2 text-xs overflow-x-auto font-mono text-gray-700 dark:text-gray-300 max-h-[200px]\">\n {showFullJson\n ? JSON.stringify(toolCall.result, null, 2)\n : formatJsonPreview(toolCall.result, 500)}\n </pre>\n </div>\n )}\n\n {/* Error details */}\n {toolCall.status === \"failed\" && toolCall.error && (\n <div>\n <div className=\"text-xs font-medium text-red-600 dark:text-red-400 mb-1\">\n Error\n </div>\n <pre className=\"bg-red-50 dark:bg-red-950/30 rounded p-2 text-xs overflow-x-auto font-mono text-red-700 dark:text-red-300\">\n {toolCall.error}\n </pre>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport default ToolCallEntry;\n","\"use client\";\n\n/**\n * ChatMessage - Individual message bubble component\n *\n * Displays a single message with:\n * - Role-based styling (user/assistant)\n * - Avatar\n * - Markdown content (for assistant)\n * - Attachments\n * - Tool calls\n * - Thinking blocks\n *\n * @module @cadraos/sdk/chat\n */\n\nimport { useMemo } from \"react\";\nimport { BotIcon, LoadingSpinner, UserIcon } from \"../icons/index.js\";\nimport type { ChatMessage as ChatMessageType, ToolCallVerbosity } from \"../types.js\";\nimport { MarkdownContent } from \"./MarkdownContent.js\";\nimport { isInternalTool, ToolCallEntry } from \"./ToolCallEntry.js\";\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nfunction cn(...classes: (string | undefined | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface ChatMessageProps {\n /** Message data */\n message: ChatMessageType;\n /** Whether to enable markdown rendering */\n enableMarkdown?: boolean;\n /** Whether to show tool calls */\n showToolCalls?: boolean;\n /** Tool call verbosity level (overrides showToolCalls when set) */\n toolCallVerbosity?: ToolCallVerbosity;\n /** Additional CSS classes */\n className?: string;\n /** Custom markdown component overrides */\n markdownComponents?: Parameters<typeof import(\"./MarkdownContent.js\").MarkdownContent>[0][\"components\"];\n /** Custom URL transform for markdown */\n markdownUrlTransform?: (url: string) => string;\n /** Custom content transform for markdown */\n markdownContentTransform?: (content: string) => string;\n /** Optional callback when an image in a tool call result is clicked */\n onImageClick?: (image: { url: string; alt?: string; filename?: string }) => void;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Renders a single chat message with appropriate styling\n *\n * @example\n * ```tsx\n * <ChatMessage\n * message={{\n * id: \"1\",\n * role: \"assistant\",\n * content: \"Hello! How can I help?\",\n * timestamp: new Date(),\n * }}\n * enableMarkdown\n * showToolCalls\n * />\n * ```\n */\nexport function ChatMessage({\n message,\n enableMarkdown = true,\n showToolCalls = true,\n toolCallVerbosity,\n className,\n markdownComponents,\n markdownUrlTransform,\n markdownContentTransform,\n onImageClick,\n}: ChatMessageProps) {\n const isUser = message.role === \"user\";\n const isAssistant = message.role === \"assistant\";\n\n // Format timestamp\n const formattedTime = useMemo(() => {\n const date = message.timestamp instanceof Date ? message.timestamp : new Date(message.timestamp);\n return date.toLocaleTimeString([], { hour: \"2-digit\", minute: \"2-digit\" });\n }, [message.timestamp]);\n\n return (\n <div\n className={cn(\n \"flex gap-3 p-4\",\n isUser ? \"flex-row-reverse\" : \"flex-row\",\n className\n )}\n >\n {/* Avatar */}\n <div\n className={cn(\n \"flex-shrink-0 w-8 h-8 rounded-full flex items-center justify-center\",\n isUser\n ? \"bg-blue-500 text-white\"\n : \"bg-gray-200 dark:bg-gray-700 text-gray-600 dark:text-gray-300\"\n )}\n >\n {isUser ? (\n <UserIcon className=\"h-4 w-4\" />\n ) : (\n <BotIcon className=\"h-4 w-4\" />\n )}\n </div>\n\n {/* Message content */}\n <div\n className={cn(\n \"flex-1 min-w-0 space-y-2\",\n isUser ? \"text-right\" : \"text-left\"\n )}\n >\n {/* Role label and timestamp */}\n <div\n className={cn(\n \"flex items-center gap-2 text-xs text-gray-500 dark:text-gray-400\",\n isUser ? \"justify-end\" : \"justify-start\"\n )}\n >\n <span className=\"font-medium\">\n {isUser ? \"You\" : \"Assistant\"}\n </span>\n <span>{formattedTime}</span>\n {message.isStreaming && (\n <LoadingSpinner className=\"h-3 w-3\" />\n )}\n </div>\n\n {/* Thinking blocks (for extended thinking models) */}\n {message.thinkingBlocks && message.thinkingBlocks.length > 0 && (\n <div className=\"space-y-2\">\n {message.thinkingBlocks.map((block) => (\n <div\n key={block.id}\n className=\"bg-purple-50 dark:bg-purple-950/30 border border-purple-200 dark:border-purple-800 rounded-lg p-3 text-sm text-purple-800 dark:text-purple-200\"\n >\n <div className=\"text-xs font-medium text-purple-600 dark:text-purple-400 mb-1\">\n Thinking...\n </div>\n <div className=\"whitespace-pre-wrap\">{block.content}</div>\n </div>\n ))}\n </div>\n )}\n\n {/* Tool calls (rendered before text since they execute before the final response) */}\n {showToolCalls && toolCallVerbosity !== \"hidden\" && message.toolCalls && message.toolCalls.length > 0 && (() => {\n const verbosity = toolCallVerbosity ?? \"verbose\";\n const filteredToolCalls = verbosity === \"compact\"\n ? message.toolCalls.filter((tc) => !isInternalTool(tc.name))\n : message.toolCalls;\n\n if (filteredToolCalls.length === 0) return null;\n\n // In compact mode, group completed tools in a compact row\n if (verbosity === \"compact\") {\n const runningTools = filteredToolCalls.filter((tc) => tc.status === \"pending\" || tc.status === \"running\");\n const doneTools = filteredToolCalls.filter((tc) => tc.status === \"completed\" || tc.status === \"failed\");\n\n return (\n <div className=\"space-y-2\">\n {/* Compact row for completed tools */}\n {doneTools.length > 0 && (\n <div className=\"flex flex-wrap gap-x-3 gap-y-1\">\n {doneTools.map((toolCall) => (\n <ToolCallEntry\n key={toolCall.id}\n toolCall={toolCall}\n onImageClick={onImageClick}\n compact\n />\n ))}\n </div>\n )}\n {/* Full cards for running/pending tools */}\n {runningTools.map((toolCall) => (\n <ToolCallEntry\n key={toolCall.id}\n toolCall={toolCall}\n onImageClick={onImageClick}\n />\n ))}\n </div>\n );\n }\n\n return (\n <div className=\"space-y-2\">\n {filteredToolCalls.map((toolCall) => (\n <ToolCallEntry\n key={toolCall.id}\n toolCall={toolCall}\n onImageClick={onImageClick}\n />\n ))}\n </div>\n );\n })()}\n\n {/* Main message content (rendered after tool calls - text is the final response) */}\n {message.content && (\n <div\n className={cn(\n \"rounded-lg p-3\",\n isUser\n ? \"bg-blue-500 text-white\"\n : \"bg-gray-100 dark:bg-gray-800 text-gray-900 dark:text-gray-100\"\n )}\n >\n {isAssistant && enableMarkdown ? (\n <MarkdownContent\n content={message.content}\n components={markdownComponents}\n urlTransform={markdownUrlTransform}\n contentTransform={markdownContentTransform}\n />\n ) : (\n <p className=\"whitespace-pre-wrap\">{message.content}</p>\n )}\n </div>\n )}\n\n {/* Attachments (placeholder - would need AttachmentDisplay) */}\n {message.attachments && message.attachments.length > 0 && (\n <div className=\"flex flex-wrap gap-2\">\n {message.attachments.map((attachment) => (\n <div\n key={attachment.uuid}\n className=\"flex items-center gap-2 bg-gray-100 dark:bg-gray-800 rounded-lg px-3 py-2 text-sm\"\n >\n <span className=\"truncate max-w-[150px]\">\n {attachment.filename}\n </span>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nexport default ChatMessage;\n","\"use client\";\n\n/**\n * MessageList - Message rendering and scroll management component\n *\n * Features:\n * - Auto-scroll on new messages\n * - Welcome message when empty\n * - Loading state\n * - Streaming indicator\n *\n * @module @cadraos/sdk/chat\n */\n\nimport { useEffect, useRef } from \"react\";\nimport { LoadingSpinner } from \"../icons/index.js\";\nimport type { ChatMessage as ChatMessageType, ToolCallVerbosity } from \"../types.js\";\nimport { ChatMessage } from \"./ChatMessage.js\";\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nfunction cn(...classes: (string | undefined | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface MessageListProps {\n /** Array of messages to display */\n messages: ChatMessageType[];\n /** Welcome message shown when chat is empty */\n welcomeMessage?: string;\n /**\n * Custom welcome UI rendered when chat is empty (no messages).\n * When provided, replaces the default centered text welcome message.\n * Takes precedence over `welcomeMessage` string prop.\n *\n * Can be a ReactNode or a render function receiving `{ sendMessage }`\n * to allow interactive elements (e.g., suggestion chips) to send messages.\n */\n renderWelcome?: React.ReactNode | ((props: { sendMessage: (text: string) => void }) => React.ReactNode);\n /** Whether a new message is loading */\n isLoading?: boolean;\n /** Whether the assistant is currently streaming a response */\n isStreaming?: boolean;\n /** Whether session history is being loaded */\n isLoadingHistory?: boolean;\n /** Whether to enable markdown rendering */\n enableMarkdown?: boolean;\n /** Whether to show tool calls */\n showToolCalls?: boolean;\n /** Tool call verbosity level */\n toolCallVerbosity?: ToolCallVerbosity;\n /** Additional CSS classes */\n className?: string;\n /** Custom markdown component overrides */\n markdownComponents?: import(\"./ChatMessage.js\").ChatMessageProps[\"markdownComponents\"];\n /** Custom URL transform for markdown */\n markdownUrlTransform?: (url: string) => string;\n /** Custom content transform for markdown */\n markdownContentTransform?: (content: string) => string;\n /** Optional callback when an image in a tool call result is clicked */\n onImageClick?: (image: { url: string; alt?: string; filename?: string }) => void;\n /**\n * Send message function passed from parent (AgentChat).\n * Used to forward to renderWelcome render function for suggestion chips.\n * @internal\n */\n sendMessage?: (text: string) => void;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Renders a scrollable list of chat messages with auto-scroll\n *\n * @example\n * ```tsx\n * <MessageList\n * messages={messages}\n * welcomeMessage=\"Hello! How can I help you today?\"\n * isLoading={isLoading}\n * isStreaming={isStreaming}\n * enableMarkdown\n * showToolCalls\n * />\n * ```\n */\nexport function MessageList({\n messages,\n welcomeMessage = \"Hello! How can I help you today?\",\n renderWelcome,\n isLoading = false,\n isStreaming = false,\n isLoadingHistory = false,\n enableMarkdown = true,\n showToolCalls = true,\n toolCallVerbosity,\n className,\n markdownComponents,\n markdownUrlTransform,\n markdownContentTransform,\n onImageClick,\n sendMessage,\n}: MessageListProps) {\n const scrollRef = useRef<HTMLDivElement>(null);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n\n // Auto-scroll to bottom when messages change or streaming\n useEffect(() => {\n if (messagesEndRef.current) {\n messagesEndRef.current.scrollIntoView({ behavior: \"smooth\" });\n }\n }, [messages, isStreaming]);\n\n return (\n <div\n ref={scrollRef}\n className={cn(\n \"flex-1 overflow-y-auto\",\n className\n )}\n >\n {/* Loading history indicator */}\n {isLoadingHistory && (\n <div className=\"flex items-center justify-center h-full p-8\">\n <div className=\"text-center text-gray-500 dark:text-gray-400\">\n <LoadingSpinner className=\"h-6 w-6 mx-auto mb-2\" />\n <p className=\"text-sm\">Loading conversation...</p>\n </div>\n </div>\n )}\n\n {/* Welcome message when empty */}\n {messages.length === 0 && !isLoading && !isLoadingHistory && (\n renderWelcome ? (\n <>{typeof renderWelcome === \"function\"\n ? renderWelcome({ sendMessage: sendMessage || (() => {}) })\n : renderWelcome}</>\n ) : (\n <div className=\"flex items-center justify-center h-full p-8\">\n <div className=\"text-center text-gray-500 dark:text-gray-400\">\n <p className=\"text-lg\">{welcomeMessage}</p>\n </div>\n </div>\n )\n )}\n\n {/* Message list */}\n <div className=\"divide-y divide-gray-100 dark:divide-gray-800\">\n {messages.map((message) => (\n <ChatMessage\n key={message.id}\n message={message}\n enableMarkdown={enableMarkdown}\n showToolCalls={showToolCalls}\n toolCallVerbosity={toolCallVerbosity}\n markdownComponents={markdownComponents}\n markdownUrlTransform={markdownUrlTransform}\n markdownContentTransform={markdownContentTransform}\n onImageClick={onImageClick}\n />\n ))}\n </div>\n\n {/* Loading indicator (waiting for response) */}\n {isLoading && !isStreaming && (\n <div className=\"flex items-center gap-3 p-4\">\n <div className=\"flex-shrink-0 w-8 h-8 rounded-full bg-gray-200 dark:bg-gray-700 flex items-center justify-center\">\n <LoadingSpinner className=\"h-4 w-4 text-gray-600 dark:text-gray-300\" />\n </div>\n <div className=\"text-sm text-gray-500 dark:text-gray-400\">\n Thinking...\n </div>\n </div>\n )}\n\n {/* Scroll anchor */}\n <div ref={messagesEndRef} />\n </div>\n );\n}\n\nexport default MessageList;\n","\"use client\";\n\n/**\n * AgentChat - Main chat component for AI SaaS SDK\n *\n * Drop-in chat interface for interacting with AI agents.\n * Composes all sub-components and integrates with useAgentChat hook.\n *\n * @module @cadraos/sdk/chat\n */\nimport { useCallback, useRef } from \"react\";\nimport type { ChatAdapter } from \"../adapters/types.js\";\nimport { useAgentChat } from \"../hooks/useAgentChat.js\";\nimport { useFileAttachments } from \"../hooks/useFileAttachments.js\";\nimport { AlertCircleIcon, XIcon } from \"../icons/index.js\";\nimport type { ChatError, ChatMessage, ClarificationData, ThemeMode, ToolCallVerbosity } from \"../types.js\";\nimport { ChatContainer } from \"./ChatContainer.js\";\nimport { ChatInput } from \"./ChatInput.js\";\nimport { FileDropZone } from \"./FileDropZone.js\";\nimport type { FileDropZoneRef } from \"./FileDropZone.js\";\nimport { AskUserPrompt } from \"./internal-tools/AskUserPrompt.js\";\nimport { MessageList } from \"./MessageList.js\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface AgentChatProps {\n /**\n * The UUID of the agent to chat with.\n * Optional when teamId is provided (team execution routes to team's lead orchestrator).\n */\n agentId?: string;\n\n /** Optional team UUID for team-based execution (routes to team's lead orchestrator) */\n teamId?: string;\n\n /**\n * Session ID to resume an existing conversation\n * When provided, the component will load the session's chat history\n */\n sessionId?: string;\n\n /** Custom adapter (optional - uses context if not provided) */\n adapter?: ChatAdapter;\n\n /** Callback fired when a new message is added */\n onMessage?: (message: ChatMessage) => void;\n\n /** Callback fired when an error occurs */\n onError?: (error: ChatError) => void;\n\n /**\n * Callback fired when a new session is created\n * Called with the sessionId when starting a new chat (no existing sessionId)\n * Useful for updating external state like session lists\n */\n onSessionCreated?: (sessionId: string) => void;\n\n /** @deprecated Use onSessionCreated instead */\n onSessionStart?: (sessionId: string) => void;\n\n /** Callback fired when a tool is called */\n onToolCall?: (toolName: string, args: unknown) => void;\n\n /** Callback fired when a tool result is received */\n onToolResult?: (toolName: string, result: unknown, durationMs?: number) => void;\n\n /** Callback fired when clarification is needed */\n onClarification?: (data: ClarificationData) => void;\n\n /** Initial messages to populate the chat */\n initialMessages?: ChatMessage[];\n\n /** Placeholder text for the input */\n placeholder?: string;\n\n /** Welcome message shown when chat is empty */\n welcomeMessage?: string;\n\n /**\n * Custom welcome UI rendered when chat is empty (no messages).\n * When provided, replaces the default centered text welcome message.\n * Takes precedence over `welcomeMessage` string prop.\n *\n * Can be a ReactNode or a render function receiving `{ sendMessage }`\n * to allow interactive elements (e.g., suggestion chips) to send messages.\n */\n renderWelcome?: React.ReactNode | ((props: { sendMessage: (text: string) => void }) => React.ReactNode);\n\n /** Maximum height of the chat container */\n maxHeight?: string | number;\n\n /** Additional CSS class for the container */\n className?: string;\n\n /** Theme mode */\n theme?: ThemeMode;\n\n /** Enable file attachments */\n enableAttachments?: boolean;\n\n /** Enable markdown rendering */\n enableMarkdown?: boolean;\n\n /** Show tool call visualization */\n showToolCalls?: boolean;\n\n /**\n * Tool call verbosity level\n *\n * - `\"compact\"` (default) — Hide internal tools, show user-facing tools in compact style when completed\n * - `\"verbose\"` — Show all tools including internal ones (debugging)\n * - `\"hidden\"` — Hide all tool calls\n *\n * When `showToolCalls={false}`, this is automatically set to `\"hidden\"`.\n */\n toolCallVerbosity?: ToolCallVerbosity;\n\n /** Custom markdown component overrides (e.g., for artifact rendering) */\n markdownComponents?: import(\"./MessageList.js\").MessageListProps[\"markdownComponents\"];\n /** Custom URL transform for markdown (e.g., to preserve artifact: protocol) */\n markdownUrlTransform?: (url: string) => string;\n /** Custom content transform for markdown */\n markdownContentTransform?: (content: string) => string;\n /** Optional callback when an image in a tool call result is clicked */\n onImageClick?: (image: { url: string; alt?: string; filename?: string }) => void;\n}\n\n// =============================================================================\n// ERROR BANNER COMPONENT\n// =============================================================================\n\ninterface ErrorBannerProps {\n error: ChatError;\n onRetry?: () => void;\n onDismiss?: () => void;\n}\n\nfunction ErrorBanner({ error, onRetry, onDismiss }: ErrorBannerProps) {\n return (\n <div className=\"flex items-center justify-between gap-3 px-4 py-3 bg-red-50 dark:bg-red-950/30 border-t border-red-200 dark:border-red-800 text-red-700 dark:text-red-300 text-sm\">\n <div className=\"flex items-center gap-2\">\n <AlertCircleIcon className=\"h-4 w-4 flex-shrink-0\" />\n <span className=\"truncate\">{error.message}</span>\n </div>\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n {error.retryable && onRetry && (\n <button\n onClick={onRetry}\n className=\"text-red-600 dark:text-red-400 hover:underline font-medium\"\n >\n Retry\n </button>\n )}\n {onDismiss && (\n <button\n onClick={onDismiss}\n className=\"p-1 hover:bg-red-100 dark:hover:bg-red-900/30 rounded\"\n aria-label=\"Dismiss error\"\n >\n <XIcon className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n </div>\n );\n}\n\n// =============================================================================\n// MAIN COMPONENT\n// =============================================================================\n\n/**\n * Complete chat interface for interacting with AI agents\n *\n * @example\n * ```tsx\n * // With ChatConfigProvider (recommended for API key users)\n * <ChatConfigProvider config={{ baseUrl: '...', apiKey: '...' }}>\n * <AgentChat\n * agentId=\"agent-uuid\"\n * enableAttachments\n * onMessage={(msg) => console.log('New message:', msg)}\n * />\n * </ChatConfigProvider>\n *\n * // With custom adapter\n * <AgentChat\n * agentId=\"agent-uuid\"\n * adapter={myCustomAdapter}\n * />\n * ```\n */\nexport function AgentChat({\n agentId,\n teamId,\n sessionId,\n adapter,\n onMessage,\n onError,\n onSessionCreated,\n onSessionStart,\n onToolCall,\n onToolResult,\n onClarification,\n initialMessages = [],\n placeholder = \"Type a message...\",\n welcomeMessage = \"Hello! How can I help you today?\",\n renderWelcome,\n maxHeight = \"600px\",\n className,\n theme = \"system\",\n enableAttachments = false,\n enableMarkdown = true,\n showToolCalls = true,\n toolCallVerbosity,\n markdownComponents,\n markdownUrlTransform,\n markdownContentTransform,\n onImageClick,\n}: AgentChatProps) {\n const {\n messages,\n isLoading,\n isStreaming,\n isLoadingHistory,\n error,\n sessionId: currentSessionId,\n clarification,\n sendMessage,\n respondToClarification,\n cancel,\n retry,\n clearError,\n } = useAgentChat({\n agentId,\n teamId,\n sessionId,\n adapter,\n initialMessages,\n onMessage,\n onError,\n onSessionCreated,\n onSessionStart,\n onToolCall,\n onToolResult,\n onClarification,\n });\n\n // Derive effective tool call verbosity\n const effectiveVerbosity: ToolCallVerbosity = showToolCalls === false\n ? \"hidden\"\n : toolCallVerbosity ?? \"compact\";\n\n // File attachment support\n const dropZoneRef = useRef<FileDropZoneRef>(null);\n\n // Only create attachment hook when enabled and adapter is available\n // We use a stable no-op for the non-attachment case to satisfy hook rules\n const attachments = useFileAttachments({\n onUpload: enableAttachments && adapter\n ? async (_file, meta) => {\n const result = await adapter.getUploadUrl({\n sessionId: currentSessionId ?? \"\",\n ...meta,\n });\n return { uuid: result.attachmentUuid, uploadUrl: result.uploadUrl };\n }\n : async () => ({ uuid: \"\", uploadUrl: \"\" }),\n onConfirmUpload: enableAttachments && adapter\n ? (uuid) => adapter.confirmUpload(uuid)\n : undefined,\n onError: (msg) => {\n console.error(\"[AgentChat] Attachment error:\", msg);\n },\n });\n\n // Wrap sendMessage to include attachments\n const handleSend = useCallback(\n async (content: string) => {\n if (enableAttachments && attachments.hasReadyFiles) {\n const uuids = attachments.getReadyUuids();\n await sendMessage(content, { attachmentUuids: uuids });\n attachments.clear();\n } else {\n await sendMessage(content);\n }\n },\n [enableAttachments, attachments, sendMessage],\n );\n\n return (\n <ChatContainer maxHeight={maxHeight} className={className} theme={theme}>\n {/* Wrap content area with FileDropZone for drag-drop overlay when attachments enabled */}\n {enableAttachments ? (\n <FileDropZone\n ref={dropZoneRef}\n {...attachments.dropZoneProps}\n disabled={isLoading || !!clarification || isLoadingHistory}\n >\n <MessageList\n messages={messages}\n welcomeMessage={welcomeMessage}\n renderWelcome={renderWelcome}\n isLoading={isLoading}\n isStreaming={isStreaming}\n isLoadingHistory={isLoadingHistory}\n enableMarkdown={enableMarkdown}\n showToolCalls={showToolCalls}\n toolCallVerbosity={effectiveVerbosity}\n markdownComponents={markdownComponents}\n markdownUrlTransform={markdownUrlTransform}\n markdownContentTransform={markdownContentTransform}\n onImageClick={onImageClick}\n sendMessage={handleSend}\n />\n </FileDropZone>\n ) : (\n <MessageList\n messages={messages}\n welcomeMessage={welcomeMessage}\n renderWelcome={renderWelcome}\n isLoading={isLoading}\n isStreaming={isStreaming}\n isLoadingHistory={isLoadingHistory}\n enableMarkdown={enableMarkdown}\n showToolCalls={showToolCalls}\n markdownComponents={markdownComponents}\n markdownUrlTransform={markdownUrlTransform}\n markdownContentTransform={markdownContentTransform}\n onImageClick={onImageClick}\n sendMessage={handleSend}\n />\n )}\n\n {/* Clarification prompt */}\n {clarification && (\n <div className=\"border-t border-gray-200 dark:border-gray-700 p-4\">\n <AskUserPrompt\n question={clarification.question}\n options={clarification.suggestedOptions}\n onSubmit={respondToClarification}\n />\n </div>\n )}\n\n {/* Error banner */}\n {error && (\n <ErrorBanner error={error} onRetry={retry} onDismiss={clearError} />\n )}\n\n {/* Input area */}\n <ChatInput\n onSend={handleSend}\n onStop={isStreaming ? cancel : undefined}\n placeholder={placeholder}\n disabled={!!clarification || isLoadingHistory}\n isLoading={isLoading}\n enableAttachments={enableAttachments}\n attachments={enableAttachments ? attachments.files : undefined}\n onRemoveAttachment={enableAttachments ? attachments.removeFile : undefined}\n dropZoneRef={enableAttachments ? dropZoneRef : undefined}\n isUploadingAttachments={enableAttachments ? attachments.isUploading : undefined}\n />\n </ChatContainer>\n );\n}\n\nexport default AgentChat;\n","\"use client\";\n\n/**\n * TodoList Component\n *\n * Displays the agent's task list from todo_write tool.\n * Shows tasks with status indicators and progress.\n *\n * Ported from: ai-saas-v2/src/extensions/agents/components/playground/internal-tools/TodoList.tsx\n *\n * @module @cadraos/sdk/chat\n */\n\nimport { useMemo, useState } from \"react\";\nimport {\n CheckCircleIcon,\n ChevronDownIcon,\n ChevronRightIcon,\n CircleIcon,\n ListTodoIcon,\n LoadingSpinner,\n} from \"../../icons/index.js\";\nimport type { TodoItem } from \"../../types.js\";\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nfunction cn(...classes: (string | undefined | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface TodoListProps {\n /** List of todo items */\n todos: TodoItem[];\n /** Whether the list is collapsible */\n collapsible?: boolean;\n /** Default collapsed state */\n defaultCollapsed?: boolean;\n /** Custom title */\n title?: string;\n /** Additional CSS classes */\n className?: string;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Displays a task list with progress tracking\n *\n * @example\n * ```tsx\n * <TodoList\n * todos={[\n * { content: \"Research topic\", status: \"completed\", activeForm: \"Researching topic\" },\n * { content: \"Write outline\", status: \"in_progress\", activeForm: \"Writing outline\" },\n * { content: \"Draft document\", status: \"pending\", activeForm: \"Drafting document\" },\n * ]}\n * />\n * ```\n */\nexport function TodoList({\n todos,\n collapsible = true,\n defaultCollapsed = false,\n title = \"Task Progress\",\n className,\n}: TodoListProps) {\n const [isCollapsed, setIsCollapsed] = useState(defaultCollapsed);\n\n const stats = useMemo(() => {\n const total = todos.length;\n const completed = todos.filter((t) => t.status === \"completed\").length;\n const inProgress = todos.filter((t) => t.status === \"in_progress\").length;\n const pending = todos.filter((t) => t.status === \"pending\").length;\n const progress = total > 0 ? (completed / total) * 100 : 0;\n return { total, completed, inProgress, pending, progress };\n }, [todos]);\n\n // Find current task (in_progress)\n const currentTask = useMemo(\n () => todos.find((t) => t.status === \"in_progress\"),\n [todos]\n );\n\n if (todos.length === 0) {\n return null;\n }\n\n return (\n <div\n className={cn(\n \"rounded-lg border border-gray-200 dark:border-gray-700 overflow-hidden\",\n className\n )}\n >\n {/* Header */}\n <div\n className={cn(\n \"flex items-center gap-2 px-3 py-2 bg-gray-50 dark:bg-gray-800/50\",\n collapsible && \"cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-800\"\n )}\n onClick={collapsible ? () => setIsCollapsed(!isCollapsed) : undefined}\n >\n {collapsible &&\n (isCollapsed ? (\n <ChevronRightIcon className=\"h-4 w-4 text-gray-500\" />\n ) : (\n <ChevronDownIcon className=\"h-4 w-4 text-gray-500\" />\n ))}\n <ListTodoIcon className=\"h-4 w-4 text-gray-600 dark:text-gray-400\" />\n <span className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\n {title}\n </span>\n\n {/* Progress badge */}\n <span className=\"ml-auto text-xs px-2 py-1 rounded-full bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-gray-300 font-medium\">\n {stats.completed}/{stats.total}\n </span>\n </div>\n\n {/* Progress bar */}\n <div className=\"h-1 bg-gray-200 dark:bg-gray-700\">\n <div\n className=\"h-full bg-blue-500 transition-all duration-300\"\n style={{ width: `${stats.progress}%` }}\n />\n </div>\n\n {/* Current task indicator (always visible when collapsed) */}\n {currentTask && isCollapsed && (\n <div className=\"px-3 py-2 flex items-center gap-2 text-sm border-t border-gray-100 dark:border-gray-700\">\n <LoadingSpinner className=\"h-3.5 w-3.5 text-blue-500\" />\n <span className=\"text-gray-600 dark:text-gray-400 truncate\">\n {currentTask.activeForm}\n </span>\n </div>\n )}\n\n {/* Task list (collapsible) */}\n {!isCollapsed && (\n <ul className=\"divide-y divide-gray-100 dark:divide-gray-700\">\n {todos.map((todo, idx) => (\n <li\n key={idx}\n className={cn(\n \"px-3 py-2 flex items-start gap-2 text-sm\",\n todo.status === \"in_progress\" && \"bg-blue-50/50 dark:bg-blue-950/20\",\n todo.status === \"completed\" && \"opacity-60\"\n )}\n >\n {/* Status icon */}\n <div className=\"mt-0.5 flex-shrink-0\">\n {todo.status === \"completed\" ? (\n <CheckCircleIcon className=\"h-4 w-4 text-green-600 dark:text-green-500\" />\n ) : todo.status === \"in_progress\" ? (\n <LoadingSpinner className=\"h-4 w-4 text-blue-500\" />\n ) : (\n <CircleIcon className=\"h-4 w-4 text-gray-300 dark:text-gray-600\" />\n )}\n </div>\n\n {/* Task content */}\n <div className=\"flex-1 min-w-0\">\n <p\n className={cn(\n \"text-gray-700 dark:text-gray-300\",\n todo.status === \"completed\" && \"line-through\"\n )}\n >\n {todo.status === \"in_progress\" ? todo.activeForm : todo.content}\n </p>\n </div>\n\n {/* Status badge for in_progress */}\n {todo.status === \"in_progress\" && (\n <span className=\"text-xs px-2 py-0.5 rounded-full bg-blue-500 text-white font-medium flex-shrink-0\">\n Active\n </span>\n )}\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n}\n\nexport default TodoList;\n","\"use client\";\n\n/**\n * @cadraos/sdk/chat\n *\n * @deprecated This module is deprecated. Please migrate to @cadraos/react.\n *\n * Migration guide:\n * 1. Install: npm install @cadraos/react\n * 2. Replace imports:\n * - import { AgentChat } from '@cadraos/sdk/chat' -> import { CadraChat } from '@cadraos/react'\n * - import { ChatConfigProvider } from '@cadraos/sdk/chat' -> import { CadraProvider } from '@cadraos/react'\n * 3. Import styles: import '@cadraos/react/styles.css'\n *\n * For detailed migration instructions, see:\n * https://github.com/cadraos/cadra-sdk/blob/main/packages/react/MIGRATION.md\n *\n * @example Deprecated usage\n * ```tsx\n * // OLD (deprecated)\n * import { AgentChat, ChatConfigProvider } from '@cadraos/sdk/chat';\n *\n * <ChatConfigProvider config={{ ... }}>\n * <AgentChat agentId=\"...\" />\n * </ChatConfigProvider>\n * ```\n *\n * @example New usage\n * ```tsx\n * // NEW (recommended)\n * import '@cadraos/react/styles.css';\n * import { CadraCopilot } from '@cadraos/react';\n *\n * <CadraCopilot apiKey=\"cdr_live_xxx\" orgId={123} agentId=\"...\" />\n * ```\n *\n * @packageDocumentation\n */\n\n// =============================================================================\n// DEPRECATION WARNING\n// =============================================================================\n\nconst DEPRECATION_WARNING = `\n[@cadraos/sdk/chat] DEPRECATION WARNING\n\nThis module is deprecated and will be removed in a future version.\nPlease migrate to @cadraos/react for:\n- Simpler setup with CadraCopilot\n- Better security (header-based SSE auth)\n- Scoped CSS that won't conflict with your app\n\nMigration steps:\n1. npm install @cadraos/react\n2. import '@cadraos/react/styles.css'\n3. Replace <AgentChat> with <CadraCopilot> or <CadraChat>\n\nSee: https://github.com/cadraos/cadra-sdk/blob/main/packages/react/MIGRATION.md\n`;\n\nlet hasWarned = false;\n\nfunction showDeprecationWarning(): void {\n // Only warn once\n if (hasWarned) return;\n hasWarned = true;\n\n // Skip in production\n if (typeof process !== \"undefined\" && process.env?.NODE_ENV === \"production\") {\n return;\n }\n\n // Skip during SSR (no window)\n if (typeof window === \"undefined\") {\n return;\n }\n\n // Show warning\n console.warn(DEPRECATION_WARNING);\n}\n\n// Trigger warning on module load (client-side only)\nif (typeof window !== \"undefined\") {\n // Use setTimeout to not block module initialization\n setTimeout(showDeprecationWarning, 0);\n}\n\n// =============================================================================\n// MAIN COMPONENT\n// =============================================================================\n\n/**\n * @deprecated Use CadraChat from @cadraos/react instead.\n * @see https://github.com/cadraos/cadra-sdk/blob/main/packages/react/MIGRATION.md\n */\nexport { AgentChat } from \"./components/AgentChat.js\";\nexport type { AgentChatProps } from \"./components/AgentChat.js\";\n\n// =============================================================================\n// CONFIGURATION\n// =============================================================================\n\n/**\n * @deprecated Use CadraProvider from @cadraos/react instead.\n * @see https://github.com/cadraos/cadra-sdk/blob/main/packages/react/MIGRATION.md\n */\nexport {\n ChatConfigProvider,\n useChatConfig,\n useChatConfigOptional\n} from \"./context/ChatConfigContext.js\";\nexport type { ChatConfigProviderProps } from \"./context/ChatConfigContext.js\";\n\n// =============================================================================\n// ADAPTERS\n// =============================================================================\n\n/**\n * @deprecated Use the default adapter from @cadraos/react instead.\n * CadraProvider and CadraCopilot automatically create the adapter.\n * @see https://github.com/cadraos/cadra-sdk/blob/main/packages/react/MIGRATION.md\n */\nexport { createDefaultAdapter } from \"./adapters/default-adapter.js\";\nexport type { DefaultAdapterConfig } from \"./adapters/default-adapter.js\";\nexport type {\n Artifact,\n ChatAdapter,\n Execution,\n ExecutionResult,\n HistoryMessage,\n ListSessionsInput,\n SendMessageInput,\n SessionHistory,\n SessionList,\n SessionListItem,\n StartExecutionInput,\n UploadUrlInput,\n UploadUrlResult\n} from \"./adapters/types.js\";\n\n// =============================================================================\n// HOOKS\n// =============================================================================\n\n/**\n * @deprecated Use useChat or useAgentChat from @cadraos/react instead.\n * @see https://github.com/cadraos/cadra-sdk/blob/main/packages/react/MIGRATION.md\n */\nexport { useAgentChat } from \"./hooks/useAgentChat.js\";\nexport type { SendMessageOptions, UseAgentChatOptions, UseAgentChatResult } from \"./hooks/useAgentChat.js\";\n\n/**\n * @deprecated Use useExecutionStream from @cadraos/react instead.\n * @see https://github.com/cadraos/cadra-sdk/blob/main/packages/react/MIGRATION.md\n */\nexport { useExecutionStream } from \"./hooks/useExecutionStream.js\";\nexport type {\n UseExecutionStreamOptions,\n UseExecutionStreamResult\n} from \"./hooks/useExecutionStream.js\";\n\nexport { useFileAttachments } from \"./hooks/useFileAttachments.js\";\nexport type {\n UseFileAttachmentsOptions,\n UseFileAttachmentsResult\n} from \"./hooks/useFileAttachments.js\";\n\n// =============================================================================\n// SUB-COMPONENTS\n// =============================================================================\n\n/**\n * @deprecated Use ChatContainer from @cadraos/react instead.\n * @see https://github.com/cadraos/cadra-sdk/blob/main/packages/react/MIGRATION.md\n */\nexport { ChatContainer } from \"./components/ChatContainer.js\";\nexport type { ChatContainerProps } from \"./components/ChatContainer.js\";\n\n/**\n * @deprecated Use ChatInput from @cadraos/react instead.\n * @see https://github.com/cadraos/cadra-sdk/blob/main/packages/react/MIGRATION.md\n */\nexport { ChatInput } from \"./components/ChatInput.js\";\nexport type { ChatInputProps } from \"./components/ChatInput.js\";\n\n/**\n * @deprecated Use MessageList from @cadraos/react instead.\n * @see https://github.com/cadraos/cadra-sdk/blob/main/packages/react/MIGRATION.md\n */\nexport { MessageList } from \"./components/MessageList.js\";\nexport type { MessageListProps } from \"./components/MessageList.js\";\n\n/**\n * @deprecated Use ChatMessage from @cadraos/react instead.\n * @see https://github.com/cadraos/cadra-sdk/blob/main/packages/react/MIGRATION.md\n */\nexport { ChatMessage } from \"./components/ChatMessage.js\";\nexport type { ChatMessageProps } from \"./components/ChatMessage.js\";\n\n/**\n * @deprecated Use MarkdownContent from @cadraos/react instead.\n * @see https://github.com/cadraos/cadra-sdk/blob/main/packages/react/MIGRATION.md\n */\nexport { MarkdownContent } from \"./components/MarkdownContent.js\";\nexport type { MarkdownContentProps } from \"./components/MarkdownContent.js\";\n\n/**\n * @deprecated Use ToolCallEntry from @cadraos/react instead.\n * @see https://github.com/cadraos/cadra-sdk/blob/main/packages/react/MIGRATION.md\n */\nexport { ToolCallEntry, isInternalTool, INTERNAL_TOOL_NAMES } from \"./components/ToolCallEntry.js\";\nexport type { ToolCallEntryProps } from \"./components/ToolCallEntry.js\";\n\n// =============================================================================\n// INTERNAL TOOLS\n// =============================================================================\n\n/**\n * @deprecated Use AskUserPrompt from @cadraos/react instead.\n * @see https://github.com/cadraos/cadra-sdk/blob/main/packages/react/MIGRATION.md\n */\nexport { AskUserPrompt } from \"./components/internal-tools/AskUserPrompt.js\";\nexport type { AskUserPromptProps } from \"./components/internal-tools/AskUserPrompt.js\";\n\n/**\n * @deprecated Use TodoList from @cadraos/react instead.\n * @see https://github.com/cadraos/cadra-sdk/blob/main/packages/react/MIGRATION.md\n */\nexport { TodoList } from \"./components/internal-tools/TodoList.js\";\nexport type { TodoListProps } from \"./components/internal-tools/TodoList.js\";\n\n// =============================================================================\n// ICONS\n// =============================================================================\n\n/**\n * @deprecated Use icons from @cadraos/react instead.\n * @see https://github.com/cadraos/cadra-sdk/blob/main/packages/react/MIGRATION.md\n */\nexport {\n AlertCircleIcon,\n BotIcon,\n CheckCircleIcon,\n CheckIcon,\n ChevronDownIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n CircleIcon,\n ClockIcon,\n CodeIcon,\n CopyIcon,\n DatabaseIcon,\n DownloadIcon,\n ExternalLinkIcon,\n FileIcon,\n FileTextIcon,\n HelpCircleIcon,\n ImageIcon,\n ImagesIcon,\n ListTodoIcon,\n LoadingSpinner,\n Maximize2Icon,\n MessageCircleIcon,\n Minimize2Icon,\n PaperclipIcon,\n SendIcon,\n SparklesIcon,\n StopCircleIcon,\n UserIcon,\n XIcon,\n ZoomInIcon,\n ZoomOutIcon\n} from \"./icons/index.js\";\nexport type { IconProps } from \"./icons/index.js\";\n\n// =============================================================================\n// ATTACHMENTS\n// =============================================================================\n\nexport { FileDropZone } from \"./components/FileDropZone.js\";\nexport type { FileDropZoneProps, FileDropZoneRef } from \"./components/FileDropZone.js\";\n\nexport { compressImage } from \"./utils/compress-image.js\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type {\n AttachmentData,\n AttachmentFile,\n ChatError,\n ChatMessage as ChatMessageType,\n ClarificationData,\n ExecutionStreamEvent,\n ThemeMode,\n ThinkingBlock,\n TodoItem,\n ToolCall,\n ToolCallVerbosity\n} from \"./types.js\";\n\n"]}
|