@cadraos/sdk 0.1.11-test → 0.1.13
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 +1209 -288
- package/dist/chat/index.cjs.map +1 -1
- package/dist/chat/index.d.cts +303 -39
- package/dist/chat/index.d.ts +303 -39
- package/dist/chat/index.js +1204 -289
- package/dist/chat/index.js.map +1 -1
- package/dist/index.cjs +52 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +52 -3
- package/dist/index.js.map +1 -1
- package/package.json +2 -6
- package/dist/chat/styles.css +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 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"]}
|
|
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/DelegationProgress.tsx","../../src/chat/components/ImageLightbox.tsx","../../src/chat/components/ImageGallery.tsx","../../src/chat/components/MarkdownContent.tsx","../../src/chat/components/ThinkingBlock.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"],"names":["value","result","useRef","useEffect","useState","useCallback","options","useMemo","jsx","cn","jsxs","ImageIcon","FileIcon","formatFileSize","FileDropZone","Fragment","formatDuration","extractImagesFromResult"],"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 * Default polling enabled state — polling fallback activates automatically\n * when SSE reconnection attempts are exhausted.\n */\nconst DEFAULT_POLLING_ENABLED = true;\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 /** Whether polling fallback is enabled (default: true) */\n pollingEnabled?: boolean;\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 pollingEnabled: boolean;\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 this.pollingEnabled = options.pollingEnabled ?? DEFAULT_POLLING_ENABLED;\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 and intermediate events\n case 'connected':\n case 'subscribed':\n case 'step':\n case 'step_complete':\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 // Before reconnecting SSE, check execution status to recover missed state.\n // This prevents missed events during the reconnection gap.\n await this.recoverState();\n\n // If state recovery found the execution is already done, don't reconnect\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 (if enabled)\n if (this.pollingEnabled) {\n this.status = 'fallback_polling';\n this.emit('connectionChange', { connected: false, usingFallback: true });\n this.startPolling();\n } else {\n // Polling disabled — emit error and close\n this.handleError({\n error: 'SSE connection failed and polling is disabled',\n errorCode: 'connection_failed',\n });\n }\n }\n }\n\n /**\n * Recover state by checking execution status.\n *\n * Called during reconnection to catch any events missed while SSE was down.\n * If the execution completed while disconnected, emits completion immediately.\n * Otherwise, emits any new logs that weren't seen via SSE.\n */\n private async recoverState(): Promise<void> {\n try {\n const execution = await this.options.getExecution(this.options.executionId);\n\n // Emit any logs we haven't seen yet\n if (execution.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\n // If execution completed while we were disconnected, handle it\n if (execution.status === 'completed') {\n this.stopPolling();\n this.handleComplete(execution as unknown as Record<string, unknown>);\n return;\n }\n\n 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 return;\n }\n\n } catch (err) {\n // State recovery is best-effort — continue with reconnection\n console.warn('[SDK:StreamController] State recovery failed (non-fatal):', err);\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 DelegationEvent,\n ExecutionStreamEvent,\n ImageData,\n ToolCall,\n} from \"../types.js\";\nimport { useExecutionStream } from \"./useExecutionStream.js\";\n\n// =============================================================================\n// DEV-ONLY LOGGING\n// =============================================================================\nconst __DEV__ = typeof process !== \"undefined\" && process.env?.NODE_ENV !== \"production\";\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 * Extract images from a tool result.\n * Handles 4 known patterns:\n * 1. { images: [{ url: \"...\" }] }\n * 2. { url: \"...\" } (single image with image extension)\n * 3. { imageUrl: \"...\" }\n * 4. JSON string containing any of the above\n */\nfunction extractImagesFromResult(result: unknown, sourceToolCallId?: string): ImageData[] {\n if (!result) return [];\n\n let data: unknown = result;\n if (typeof result === \"string\") {\n try {\n data = JSON.parse(result);\n } catch {\n if (/\\.(png|jpg|jpeg|gif|webp|svg|bmp)(\\?.*)?$/i.test(result) || result.startsWith(\"data:image/\")) {\n return [{ url: result, sourceToolCallId }];\n }\n return [];\n }\n }\n\n if (typeof data !== \"object\" || data === null) return [];\n const obj = data as Record<string, unknown>;\n\n // Pattern 1: { 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 alt: (img.alt as string) || (img.prompt as string) || undefined,\n filename: img.filename as string | undefined,\n sourceToolCallId,\n }));\n }\n\n // Pattern 2: { url: \"...\" } with image extension\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, sourceToolCallId }];\n }\n\n // Pattern 3: { imageUrl: \"...\" }\n if (typeof obj.imageUrl === \"string\") {\n return [{ url: obj.imageUrl as string, alt: obj.alt as string | undefined, sourceToolCallId }];\n }\n\n return [];\n}\n\n/**\n * Derive message.images[] from message.toolCalls[].\n * Single source of truth: images are always extracted from completed tool results.\n */\nfunction deriveImagesFromToolCalls(toolCalls: ToolCall[] | undefined): ImageData[] {\n if (!toolCalls) return [];\n const images: ImageData[] = [];\n for (const tc of toolCalls) {\n if (tc.status === \"completed\" && tc.result) {\n images.push(...extractImagesFromResult(tc.result, tc.id));\n }\n }\n return images;\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 /** Callback fired when a delegation event occurs (team execution) */\n onDelegation?: (event: DelegationEvent) => void;\n /**\n * Polling interval in milliseconds for the polling fallback.\n * Used when SSE connection fails and falls back to polling.\n * Default: 2000ms\n */\n pollingInterval?: number;\n /**\n * Whether polling fallback is enabled.\n * When false, SSE failure will result in an error instead of falling back to polling.\n * Default: true\n */\n pollingEnabled?: boolean;\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 /** Currently active delegation event (team execution) */\n activeDelegation: DelegationEvent | 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 pollingInterval,\n pollingEnabled,\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 // Guard: when true, ignore new tool_call events (finalization already ran)\n const finalizedRef = useRef(false);\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 // Delegation event tracking for team execution\n const pendingDelegationsRef = useRef<Map<string, DelegationEvent>>(new Map());\n\n // Delegation callback ref\n const onDelegationRef = useRef(options.onDelegation);\n useEffect(() => { onDelegationRef.current = options.onDelegation; }, [options.onDelegation]);\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 * Add or update a delegation event on the streaming/last-assistant message.\n */\n const addDelegationEvent = useCallback((delegation: DelegationEvent) => {\n setMessages((prev) => {\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 existing = msg.delegationEvents ?? [];\n\n if (delegation.type === \"delegation_completed\" && delegation.handoffId) {\n // Update matching started event\n const updatedEvents = existing.map((de) =>\n de.handoffId === delegation.handoffId\n ? { ...de, ...delegation, status: delegation.status ?? (\"completed\" as const) }\n : de\n );\n // If no match found, add as new\n const hasMatch = existing.some((de) => de.handoffId === delegation.handoffId);\n return {\n ...msg,\n delegationEvents: hasMatch ? updatedEvents : [...existing, delegation],\n };\n }\n\n return { ...msg, delegationEvents: [...existing, delegation] };\n });\n });\n }, []);\n\n /**\n * Re-derive message.images[] from toolCalls after a tool result update.\n */\n const updateMessageImages = useCallback(() => {\n setMessages((prev) => {\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 const images = deriveImagesFromToolCalls(msg.toolCalls);\n return images.length > 0 ? { ...msg, images } : msg;\n });\n });\n }, []);\n\n /**\n * Finalize the streaming message.\n *\n * Accepts optional `finalOutput` to atomically update content AND clear\n * `isStreaming` in a single `setMessages` call. This prevents a race condition\n * where two sequential setState calls would cause the second to miss the\n * streaming entry (the first already cleared `isStreaming`).\n *\n * Also performs content-based deduplication: if a non-streaming assistant\n * message with the same content already exists (e.g. from a polling path),\n * the streaming placeholder is removed instead of being finalized with\n * duplicate content.\n */\n const finalizeStreamingMessage = useCallback((finalOutput?: string) => {\n if (!streamingMessageIdRef.current) return;\n\n // Mark as finalized so late-arriving tool events are ignored\n finalizedRef.current = true;\n\n const streamMsgId = streamingMessageIdRef.current;\n\n setMessages((prev) => {\n // Determine the content to use for the finalized message\n const resolvedContent = finalOutput || streamingContentRef.current || \"\";\n\n // Content-based dedup: check if another non-streaming assistant message\n // already has this content (SSE + polling dual-path race)\n const duplicateExists = resolvedContent && prev.some(\n (msg) =>\n msg.id !== streamMsgId &&\n msg.role === \"assistant\" &&\n !msg.isStreaming &&\n msg.content === resolvedContent\n );\n\n if (duplicateExists) {\n // Remove the streaming placeholder — the content already exists\n return prev.filter((msg) => msg.id !== streamMsgId);\n }\n\n // Atomic update: set final content + clear isStreaming + transition\n // any still-running/pending tool calls to terminal status in one pass\n return prev.map((msg) => {\n if (msg.id !== streamMsgId) return msg;\n\n const updatedToolCalls = msg.toolCalls?.map((tc) =>\n tc.status === \"running\" || tc.status === \"pending\"\n ? { ...tc, status: \"completed\" as const }\n : tc\n );\n\n return {\n ...msg,\n content: resolvedContent || msg.content,\n isStreaming: false,\n toolCalls: updatedToolCalls,\n };\n });\n });\n\n streamingMessageIdRef.current = null;\n streamingContentRef.current = \"\";\n pendingToolCallsRef.current.clear();\n firedToolResultsRef.current.clear();\n pendingDelegationsRef.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 if (__DEV__) 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 \"delegation\": {\n // Delegation logs may contain started/completed metadata\n const delegationType = log.metadata?.delegationType as string;\n if (delegationType === \"started\" || delegationType === \"delegation_started\") {\n const delegation: DelegationEvent = {\n type: \"delegation_started\",\n handoffId: log.metadata?.handoffId as string,\n toAgent: (log.metadata?.targetAgentName as string) || (log.metadata?.targetAgentUuid as string),\n targetAgentUuid: log.metadata?.targetAgentUuid as string,\n taskPreview: log.metadata?.taskPreview as string,\n timestamp: new Date(log.timestamp || Date.now()),\n status: \"active\",\n };\n if (delegation.handoffId) {\n pendingDelegationsRef.current.set(delegation.handoffId, delegation);\n }\n addDelegationEvent(delegation);\n onDelegationRef.current?.(delegation);\n } else if (delegationType === \"completed\" || delegationType === \"delegation_completed\") {\n const delegation: DelegationEvent = {\n type: \"delegation_completed\",\n handoffId: log.metadata?.handoffId as string,\n resultPreview: log.metadata?.resultPreview as string,\n timestamp: new Date(log.timestamp || Date.now()),\n status: (log.metadata?.status as string) === \"failed\" ? \"failed\" : \"completed\",\n durationMs: log.durationMs,\n };\n if (delegation.handoffId) {\n pendingDelegationsRef.current.delete(delegation.handoffId);\n }\n addDelegationEvent(delegation);\n onDelegationRef.current?.(delegation);\n }\n break;\n }\n\n case \"info\":\n case \"system\":\n if (__DEV__) console.log('[useAgentChat] Status:', log.type, log.title);\n break;\n\n case \"tool_call\": {\n // Skip if execution already finalized (late-arriving events)\n if (finalizedRef.current) break;\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 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 if (resultToolCallId) {\n firedToolResultsRef.current.add(resultToolCallId);\n }\n onToolResultRef.current?.(resultToolName, result, durationMs);\n // Re-derive images from updated tool calls\n updateMessageImages();\n break;\n }\n\n default:\n if (__DEV__) console.log('[useAgentChat] Unhandled log type:', log.type, log);\n }\n },\n [updateStreamingMessage, updateToolCall, updateMessageImages, addDelegationEvent]\n );\n\n /**\n * Handle stream log events (legacy SSE path)\n */\n const handleStreamLog = useCallback(\n (log: NonNullable<ExecutionStreamEvent[\"data\"][\"log\"]>) => {\n if (__DEV__) 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 \"delegation_started\": {\n const delegation: DelegationEvent = {\n type: \"delegation_started\",\n handoffId: log.metadata?.handoffId as string,\n toAgent: (log.metadata?.targetAgentName as string) || (log.metadata?.targetAgentUuid as string),\n targetAgentUuid: log.metadata?.targetAgentUuid as string,\n taskPreview: log.metadata?.taskPreview as string,\n timestamp: new Date(log.timestamp || Date.now()),\n status: \"active\",\n };\n if (delegation.handoffId) {\n pendingDelegationsRef.current.set(delegation.handoffId, delegation);\n }\n addDelegationEvent(delegation);\n onDelegationRef.current?.(delegation);\n break;\n }\n\n case \"delegation_completed\": {\n const delegation: DelegationEvent = {\n type: \"delegation_completed\",\n handoffId: log.metadata?.handoffId as string,\n resultPreview: log.metadata?.resultPreview as string,\n timestamp: new Date(log.timestamp || Date.now()),\n status: (log.metadata?.status as string) === \"failed\" ? \"failed\" : \"completed\",\n durationMs: log.durationMs,\n };\n if (delegation.handoffId) {\n pendingDelegationsRef.current.delete(delegation.handoffId);\n }\n addDelegationEvent(delegation);\n onDelegationRef.current?.(delegation);\n break;\n }\n\n case \"info\":\n case \"system\":\n if (__DEV__) 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 // Skip if execution already finalized (late-arriving events)\n if (finalizedRef.current) break;\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 // Re-derive images from updated tool calls\n updateMessageImages();\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 if (__DEV__) console.log('[useAgentChat] Unknown log type:', log.logType, log);\n }\n },\n [updateStreamingMessage, updateToolCall, updateMessageImages, addDelegationEvent]\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 * Accepts optional `finalOutput` to pass through to `finalizeStreamingMessage`\n * for atomic content update + streaming state clear in a single setState call.\n */\n const completedRef = useRef(false);\n\n const handleComplete = useCallback((finalOutput?: string) => {\n // Guard against multiple complete events. The server may send 2-3 complete\n // events from different Redis channels for the same execution.\n // Only the first invocation with meaningful content should finalize the message.\n if (completedRef.current) {\n if (__DEV__) console.log('[useAgentChat] handleComplete: skipping duplicate complete');\n return;\n }\n completedRef.current = true;\n if (__DEV__) console.log('[useAgentChat] handleComplete called');\n setIsLoading(false);\n setIsStreamControllerConnected(false);\n finalizeStreamingMessage(finalOutput);\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 if (__DEV__) 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 if (__DEV__) 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 if (__DEV__) console.log('[useAgentChat] Polling: execution completed');\n stopPolling();\n // Pass output through handleComplete for atomic finalization + dedup\n handleComplete(execution.result || undefined);\n } else if (execution.status === \"failed\") {\n if (__DEV__) console.log('[useAgentChat] Polling: execution failed');\n stopPolling();\n handleError(execution.error || \"Execution failed\");\n }\n } catch (err) {\n if (__DEV__) console.warn('[useAgentChat] Polling error (will retry):', err);\n }\n };\n\n poll();\n pollingIntervalRef.current = setInterval(poll, pollingInterval ?? 2000);\n }, [adapter, stopPolling, handleComplete, handleError, pollingInterval]);\n\n // Legacy polling activation when SSE falls back (only for legacy path)\n useEffect(() => {\n if (!useStreamController && isUsingFallback && currentExecutionId && isLoading && pollingEnabled !== false) {\n if (__DEV__) console.log('[useAgentChat] SSE fallback detected, activating polling');\n startPolling(currentExecutionId);\n }\n }, [useStreamController, isUsingFallback, currentExecutionId, isLoading, startPolling, pollingEnabled]);\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 && pollingEnabled !== false) {\n sseTimeoutRef.current = setTimeout(() => {\n if (!legacyIsConnected && currentExecutionId && isLoading) {\n if (__DEV__) 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, pollingEnabled]);\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 if (__DEV__) 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 // Re-derive images from updated tool calls\n updateMessageImages();\n });\n\n controller.on('delegationStarted', (data) => {\n const delegation: DelegationEvent = {\n type: \"delegation_started\",\n handoffId: data.handoffId,\n toAgent: data.targetAgentName || data.targetAgentUuid,\n targetAgentUuid: data.targetAgentUuid,\n taskPreview: data.taskPreview,\n timestamp: new Date(data.timestamp),\n status: \"active\",\n };\n pendingDelegationsRef.current.set(data.handoffId, delegation);\n addDelegationEvent(delegation);\n onDelegationRef.current?.(delegation);\n });\n\n controller.on('delegationCompleted', (data) => {\n const delegation: DelegationEvent = {\n type: \"delegation_completed\",\n handoffId: data.handoffId,\n resultPreview: data.resultPreview,\n timestamp: new Date(data.timestamp),\n status: data.status === \"failed\" ? \"failed\" : \"completed\",\n durationMs: data.durationMs,\n };\n pendingDelegationsRef.current.delete(data.handoffId);\n addDelegationEvent(delegation);\n onDelegationRef.current?.(delegation);\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 // Pass execution output to handleComplete for atomic finalization.\n // handleComplete → finalizeStreamingMessage will atomically update\n // content + clear isStreaming in a single setState call, and also\n // perform content-based dedup against existing messages.\n const output = execution?.output || undefined;\n handleComplete(output);\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, updateMessageImages, addDelegationEvent, 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 completedRef.current = false;\n finalizedRef.current = false;\n\n try {\n if (__DEV__) 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 if (__DEV__) 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 if (__DEV__) 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 lastLoadedSessionRef.current = null;\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 session when initialSessionId prop changes.\n *\n * Guards against three scenarios:\n * 1. Parent echoes back a session that was just created internally by sendMessage\n * → skip reload (entries are already populated, reload causes empty state flash)\n * 2. Same session ID is passed again (no change) → skip reload\n * 3. A genuinely new external session ID → load it\n */\n const lastLoadedSessionRef = useRef<string | null>(null);\n\n useEffect(() => {\n if (!initialSessionId) return;\n\n // Skip if this session was just created internally by sendMessage\n if (internallyCreatedSessionRef.current === initialSessionId) {\n // Mark as \"loaded\" so we don't reload, but don't actually fetch\n lastLoadedSessionRef.current = initialSessionId;\n hasLoadedInitialSession.current = true;\n return;\n }\n\n // Skip if we already loaded this exact session\n if (lastLoadedSessionRef.current === initialSessionId && hasLoadedInitialSession.current) {\n return;\n }\n\n // Load the new external session\n lastLoadedSessionRef.current = initialSessionId;\n hasLoadedInitialSession.current = true;\n loadSession(initialSessionId);\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 // Compute active delegation (first \"active\" delegation across all messages)\n const activeDelegation = useMemo(() => {\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i]!;\n if (msg.delegationEvents) {\n const active = msg.delegationEvents.find((de) => de.status === \"active\");\n if (active) return active;\n }\n }\n return null;\n }, [messages]);\n\n return {\n messages,\n isLoading,\n isStreaming,\n isLoadingHistory,\n error,\n sessionId: currentSessionId,\n clarification,\n activeDelegation,\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 /**\n * Add an already-uploaded file (e.g., from artifact/output panel).\n * Creates a ready-state AttachmentFile without going through the upload flow.\n */\n addExternalFile: (opts: {\n uuid: string;\n filename: string;\n mimeType: string;\n size: number;\n category?: \"document\" | \"image\" | \"audio\";\n previewUrl?: string;\n }) => void;\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 addExternalFile = useCallback(\n (opts: {\n uuid: string;\n filename: string;\n mimeType: string;\n size: number;\n category?: \"document\" | \"image\" | \"audio\";\n previewUrl?: string;\n }) => {\n const category = opts.category || (opts.mimeType.startsWith(\"image/\") ? \"image\" : \"document\");\n // Create a minimal File object for type compatibility\n const placeholderFile = new File([], opts.filename, { type: opts.mimeType });\n const newAttachment: AttachmentFile = {\n uuid: opts.uuid,\n file: placeholderFile,\n status: \"ready\",\n progress: 100,\n category,\n previewUrl: opts.previewUrl,\n hasThumbnail: category === \"image\",\n actualSize: opts.size,\n };\n setFiles((prev) => [...prev, newAttachment]);\n },\n []\n );\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 addExternalFile,\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 /**\n * Maximum height of the container (only used in \"fixed\" layout).\n * Ignored when layout is \"fill\".\n */\n maxHeight?: string | number;\n /** Additional CSS classes */\n className?: string;\n /** Theme mode */\n theme?: ThemeMode;\n /**\n * Layout mode for the container.\n * - \"fixed\" (default): Uses maxHeight for a widget-style bounded container.\n * - \"fill\": Uses flex-1/min-h-0 to fill parent container. Ideal for full-page layouts.\n */\n layout?: \"fixed\" | \"fill\";\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 layout = \"fixed\",\n}: ChatContainerProps) {\n const maxHeightValue =\n typeof maxHeight === \"number\" ? `${maxHeight}px` : maxHeight;\n\n const isFill = layout === \"fill\";\n\n return (\n <div\n className={cn(\n \"cadra-chat-container flex flex-col overflow-hidden\",\n // Default colors use CSS custom properties with Tailwind fallbacks.\n // Consumers can override via CSS: --chat-bg, --chat-border, --chat-border-radius\n !isFill && \"rounded-lg border\",\n isFill && \"flex-1 min-h-0\",\n className\n )}\n style={{\n ...(!isFill ? { maxHeight: maxHeightValue } : undefined),\n // CSS custom properties for theming — consumers set these to override\n backgroundColor: \"var(--chat-bg, var(--background, #fff))\",\n borderColor: !isFill ? \"var(--chat-border, var(--border, #e5e7eb))\" : undefined,\n } as React.CSSProperties}\n data-theme={theme}\n data-layout={layout}\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 flex flex-col flex-1 min-h-0\", 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 * DelegationProgress - Team execution delegation indicator\n *\n * Shows orchestrator → specialist handoff progress with status badges.\n * Uses CSS classes only (no external UI dependencies).\n *\n * @module @cadraos/sdk/chat\n */\n\nimport { useMemo } from \"react\";\nimport { CheckCircleIcon, AlertCircleIcon, LoadingSpinner } from \"../icons/index.js\";\nimport type { DelegationEvent } from \"../types.js\";\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nfunction cn(...classes: (string | undefined | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(1)}s`;\n}\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface DelegationProgressProps {\n /** Delegation event data */\n event: DelegationEvent;\n /** Additional CSS classes */\n className?: string;\n}\n\nexport interface DelegationProgressListProps {\n /** Array of delegation events to display */\n events: DelegationEvent[];\n /** Additional CSS classes */\n className?: string;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Renders a single delegation progress indicator\n */\nexport function DelegationProgress({\n event,\n className,\n}: DelegationProgressProps) {\n const statusIcon = useMemo(() => {\n switch (event.status) {\n case \"active\":\n return <LoadingSpinner className=\"h-4 w-4 text-blue-500\" />;\n case \"completed\":\n return <CheckCircleIcon 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 <LoadingSpinner className=\"h-4 w-4 text-gray-400\" />;\n }\n }, [event.status]);\n\n const statusColor = useMemo(() => {\n switch (event.status) {\n case \"active\":\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 bg-green-50/50 dark:bg-green-950/20\";\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 }, [event.status]);\n\n return (\n <div\n className={cn(\n \"rounded-lg border text-sm px-3 py-2\",\n statusColor,\n className\n )}\n >\n <div className=\"flex items-center gap-2\">\n {statusIcon}\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-1.5\">\n {event.fromAgent && (\n <>\n <span className=\"font-medium text-gray-700 dark:text-gray-300 truncate\">\n {event.fromAgent}\n </span>\n <span className=\"text-gray-400 dark:text-gray-500 flex-shrink-0\">\n {\"\\u2192\"}\n </span>\n </>\n )}\n <span className=\"font-medium text-gray-900 dark:text-gray-100 truncate\">\n {event.toAgent || event.targetAgentUuid || \"Specialist\"}\n </span>\n </div>\n\n {event.taskPreview && event.status === \"active\" && (\n <p className=\"text-xs text-gray-500 dark:text-gray-400 truncate mt-0.5\">\n {event.taskPreview}\n </p>\n )}\n\n {event.resultPreview && event.status === \"completed\" && (\n <p className=\"text-xs text-green-600 dark:text-green-400 truncate mt-0.5\">\n {event.resultPreview}\n </p>\n )}\n </div>\n\n {event.durationMs !== undefined && event.status !== \"active\" && (\n <span className=\"text-xs text-gray-500 dark:text-gray-400 flex-shrink-0\">\n {formatDuration(event.durationMs)}\n </span>\n )}\n </div>\n </div>\n );\n}\n\n/**\n * Renders a list of delegation progress indicators\n */\nexport function DelegationProgressList({\n events,\n className,\n}: DelegationProgressListProps) {\n if (!events || events.length === 0) return null;\n\n return (\n <div className={cn(\"space-y-2\", className)}>\n {events.map((event, index) => (\n <DelegationProgress\n key={event.handoffId || `delegation-${index}`}\n event={event}\n />\n ))}\n </div>\n );\n}\n\nexport default DelegationProgress;\n","\"use client\";\n\n/**\n * ImageLightbox - Fullscreen image viewer with navigation\n *\n * Renders into its own DOM container appended directly to document.body\n * to escape Radix focus traps, Sheet overlays, and transformed parents.\n * Uses native DOM event listeners to ensure clicks always work.\n *\n * @module @cadraos/sdk/chat\n */\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n ChevronLeftIcon,\n ChevronRightIcon,\n DownloadIcon,\n XIcon,\n} from \"../icons/index.js\";\nimport type { ImageData } from \"../types.js\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface ImageLightboxProps {\n /** Array of images */\n images: ImageData[];\n /** Current image index */\n currentIndex: number;\n /** Close the lightbox */\n onClose: () => void;\n /** Navigate to previous image */\n onPrev: () => void;\n /** Navigate to next image */\n onNext: () => void;\n /** Additional CSS classes for the overlay */\n className?: string;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Fullscreen image viewer with prev/next navigation\n */\nexport function ImageLightbox({\n images,\n currentIndex,\n onClose,\n onPrev,\n onNext,\n className,\n}: ImageLightboxProps) {\n const currentImage = images[currentIndex];\n const hasMultiple = images.length > 1;\n\n // Create a dedicated DOM container that lives outside all Radix portals\n const [container, setContainer] = useState<HTMLDivElement | null>(null);\n useEffect(() => {\n const el = document.createElement(\"div\");\n el.id = \"cadra-lightbox-root\";\n el.style.position = \"fixed\";\n el.style.inset = \"0\";\n el.style.zIndex = \"999999\";\n el.style.pointerEvents = \"auto\";\n document.body.appendChild(el);\n setContainer(el);\n return () => {\n document.body.removeChild(el);\n };\n }, []);\n\n // Store callbacks in refs so native listeners always see latest\n const onCloseRef = useRef(onClose);\n const onPrevRef = useRef(onPrev);\n const onNextRef = useRef(onNext);\n onCloseRef.current = onClose;\n onPrevRef.current = onPrev;\n onNextRef.current = onNext;\n\n // Keyboard navigation via native listener\n useEffect(() => {\n function handleKeyDown(e: KeyboardEvent) {\n switch (e.key) {\n case \"Escape\":\n e.preventDefault();\n e.stopPropagation();\n onCloseRef.current();\n break;\n case \"ArrowLeft\":\n if (hasMultiple) onPrevRef.current();\n break;\n case \"ArrowRight\":\n if (hasMultiple) onNextRef.current();\n break;\n }\n }\n\n document.addEventListener(\"keydown\", handleKeyDown, true); // capture phase\n return () => document.removeEventListener(\"keydown\", handleKeyDown, true);\n }, [hasMultiple]);\n\n // Prevent body scroll while lightbox is open\n useEffect(() => {\n const originalOverflow = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = originalOverflow;\n };\n }, []);\n\n // Native click handler for backdrop close\n useEffect(() => {\n if (!container) return;\n function handleClick(e: MouseEvent) {\n // Only close if clicking the backdrop itself, not buttons/image\n const target = e.target as HTMLElement;\n if (target.dataset.lightboxBackdrop === \"true\") {\n e.preventDefault();\n e.stopPropagation();\n onCloseRef.current();\n }\n }\n container.addEventListener(\"click\", handleClick, true); // capture phase\n return () => container.removeEventListener(\"click\", handleClick, true);\n }, [container]);\n\n const handleDownload = useCallback(async () => {\n if (!currentImage) return;\n const filename = currentImage.filename || `image-${currentIndex + 1}`;\n try {\n // Fetch as blob to handle cross-origin URLs (S3 presigned URLs)\n const response = await fetch(currentImage.url);\n const blob = await response.blob();\n const blobUrl = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = blobUrl;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(blobUrl);\n } catch {\n // Fallback: open in new tab\n window.open(currentImage.url, \"_blank\");\n }\n }, [currentImage, currentIndex]);\n\n const handleClose = useCallback(() => {\n onCloseRef.current();\n }, []);\n\n if (!currentImage || !container) return null;\n\n return createPortal(\n <div\n data-lightbox-backdrop=\"true\"\n className={`absolute inset-0 flex items-center justify-center bg-black/90 ${className || \"\"}`}\n style={{ cursor: \"zoom-out\" }}\n >\n {/* Top bar */}\n <div\n className=\"absolute top-0 left-0 right-0 flex items-center justify-between p-4\"\n style={{ zIndex: 10 }}\n >\n <div className=\"text-white text-sm\">\n {hasMultiple && (\n <span>\n {currentIndex + 1} / {images.length}\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n handleDownload();\n }}\n className=\"p-2 rounded-full bg-white/10 hover:bg-white/20 text-white transition-colors\"\n style={{ cursor: \"pointer\", pointerEvents: \"auto\" }}\n aria-label=\"Download image\"\n >\n <DownloadIcon className=\"h-5 w-5\" />\n </button>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n handleClose();\n }}\n className=\"p-2 rounded-full bg-white/10 hover:bg-white/20 text-white transition-colors\"\n style={{ cursor: \"pointer\", pointerEvents: \"auto\" }}\n aria-label=\"Close lightbox\"\n >\n <XIcon className=\"h-5 w-5\" />\n </button>\n </div>\n </div>\n\n {/* Previous button */}\n {hasMultiple && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onPrev();\n }}\n className=\"absolute left-4 top-1/2 -translate-y-1/2 p-2 rounded-full bg-white/10 hover:bg-white/20 text-white transition-colors\"\n style={{ zIndex: 10, cursor: \"pointer\", pointerEvents: \"auto\" }}\n aria-label=\"Previous image\"\n >\n <ChevronLeftIcon className=\"h-6 w-6\" />\n </button>\n )}\n\n {/* Image */}\n <img\n src={currentImage.url}\n alt={currentImage.alt || `Image ${currentIndex + 1}`}\n className=\"max-w-[90vw] max-h-[85vh] object-contain select-none\"\n style={{ cursor: \"default\", pointerEvents: \"auto\" }}\n draggable={false}\n />\n\n {/* Next button */}\n {hasMultiple && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onNext();\n }}\n className=\"absolute right-4 top-1/2 -translate-y-1/2 p-2 rounded-full bg-white/10 hover:bg-white/20 text-white transition-colors\"\n style={{ zIndex: 10, cursor: \"pointer\", pointerEvents: \"auto\" }}\n aria-label=\"Next image\"\n >\n <ChevronRightIcon className=\"h-6 w-6\" />\n </button>\n )}\n\n {/* Caption */}\n {currentImage.alt && (\n <div\n className=\"absolute bottom-0 left-0 right-0 p-4 text-center\"\n style={{ zIndex: 10, pointerEvents: \"none\" }}\n >\n <p className=\"text-white text-sm bg-black/50 inline-block px-3 py-1 rounded-full\">\n {currentImage.alt}\n </p>\n </div>\n )}\n </div>,\n container\n );\n}\n\nexport default ImageLightbox;\n","\"use client\";\n\n/**\n * ImageGallery - Responsive image grid for tool result images\n *\n * Displays images from tool results in a responsive grid layout.\n * Supports click-to-open with optional external handler.\n * Uses CSS classes only (no external UI dependencies).\n *\n * @module @cadraos/sdk/chat\n */\n\nimport { useCallback, useState } from \"react\";\nimport type { ImageData } from \"../types.js\";\nimport { ImageLightbox } from \"./ImageLightbox.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 ImageGalleryProps {\n /** Array of images to display */\n images: ImageData[];\n /** Callback when an image is clicked. Overrides default lightbox behavior. */\n onImageClick?: (image: ImageData) => void;\n /** Additional CSS classes */\n className?: string;\n}\n\n// =============================================================================\n// IMAGE WITH LOADING\n// =============================================================================\n\ninterface ImageWithLoadingProps {\n src: string;\n alt: string;\n className?: string;\n onClick?: () => void;\n}\n\nfunction ImageWithLoading({ src, alt, className, onClick }: ImageWithLoadingProps) {\n const [isLoaded, setIsLoaded] = useState(false);\n const [hasError, setHasError] = useState(false);\n\n return (\n <div\n className={cn(\n \"relative overflow-hidden rounded-lg\",\n className\n )}\n >\n {/* Skeleton placeholder */}\n {!isLoaded && !hasError && (\n <div className=\"absolute inset-0 animate-pulse bg-gray-200 dark:bg-gray-700 rounded-lg\" />\n )}\n\n {/* Error state */}\n {hasError && (\n <div className=\"absolute inset-0 flex items-center justify-center text-gray-400 dark:text-gray-500 text-sm rounded-lg bg-gray-100 dark:bg-gray-800\">\n Failed to load\n </div>\n )}\n\n {/* Actual image */}\n <img\n src={src}\n alt={alt}\n loading=\"lazy\"\n className={cn(\n \"w-full h-auto max-h-[280px] object-cover rounded-lg shadow-sm transition-opacity duration-200\",\n isLoaded ? \"opacity-100\" : \"opacity-0\"\n )}\n onLoad={() => setIsLoaded(true)}\n onError={() => setHasError(true)}\n onClick={onClick}\n style={onClick ? { cursor: \"pointer\" } : undefined}\n />\n </div>\n );\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Renders images in a responsive grid with optional lightbox\n */\nexport function ImageGallery({\n images,\n onImageClick,\n className,\n}: ImageGalleryProps) {\n const [lightboxIndex, setLightboxIndex] = useState<number | null>(null);\n\n const handleImageClick = useCallback(\n (image: ImageData, index: number) => {\n if (onImageClick) {\n onImageClick(image);\n } else {\n setLightboxIndex(index);\n }\n },\n [onImageClick]\n );\n\n const handleLightboxClose = useCallback(() => {\n setLightboxIndex(null);\n }, []);\n\n const handleLightboxPrev = useCallback(() => {\n setLightboxIndex((prev) =>\n prev !== null ? (prev - 1 + images.length) % images.length : null\n );\n }, [images.length]);\n\n const handleLightboxNext = useCallback(() => {\n setLightboxIndex((prev) =>\n prev !== null ? (prev + 1) % images.length : null\n );\n }, [images.length]);\n\n if (!images || images.length === 0) return null;\n\n return (\n <>\n <div\n className={cn(\n \"grid gap-2\",\n images.length === 1\n ? \"grid-cols-1\"\n : images.length === 2\n ? \"grid-cols-2\"\n : \"grid-cols-2 sm:grid-cols-3\",\n className\n )}\n >\n {images.map((image, index) => (\n <button\n key={`${image.url}-${index}`}\n type=\"button\"\n onClick={() => handleImageClick(image, index)}\n className=\"block rounded-lg overflow-hidden transition-transform hover:scale-[1.02] text-left\"\n >\n <ImageWithLoading\n src={image.url}\n alt={image.alt || `Image ${index + 1}`}\n />\n </button>\n ))}\n </div>\n\n {/* Lightbox (only when not using external handler) */}\n {lightboxIndex !== null && !onImageClick && (\n <ImageLightbox\n images={images}\n currentIndex={lightboxIndex}\n onClose={handleLightboxClose}\n onPrev={handleLightboxPrev}\n onNext={handleLightboxNext}\n />\n )}\n </>\n );\n}\n\nexport default ImageGallery;\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-1.5 last:mb-0\">{children}</p>\n ),\n\n // Lists\n ul: ({ children }) => (\n <ul className=\"list-disc list-inside mb-1.5 last:mb-0\">{children}</ul>\n ),\n ol: ({ children }) => (\n <ol className=\"list-decimal list-inside mb-1.5 last:mb-0\">{children}</ol>\n ),\n li: ({ children }) => (\n <li className=\"\">{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(\"max-w-none text-sm leading-relaxed\", 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 * ThinkingBlock - Collapsible reasoning display component\n *\n * Shows model thinking/reasoning blocks with expand/collapse toggle.\n * Uses CSS classes only (no external UI dependencies).\n *\n * @module @cadraos/sdk/chat\n */\n\nimport { useState } from \"react\";\nimport { ChevronDownIcon, ChevronRightIcon, SparklesIcon } from \"../icons/index.js\";\nimport type { ThinkingBlock as ThinkingBlockType } 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 ThinkingBlockProps {\n /** Thinking block data */\n block: ThinkingBlockType;\n /** Whether the block starts expanded */\n defaultExpanded?: boolean;\n /** Additional CSS classes */\n className?: string;\n}\n\nexport interface ThinkingBlockListProps {\n /** Array of thinking blocks to display */\n blocks: ThinkingBlockType[];\n /** Whether blocks start expanded */\n defaultExpanded?: boolean;\n /** Additional CSS classes */\n className?: string;\n}\n\n// =============================================================================\n// COMPONENT\n// =============================================================================\n\n/**\n * Renders a single collapsible thinking/reasoning block\n */\nexport function ThinkingBlock({\n block,\n defaultExpanded = false,\n className,\n}: ThinkingBlockProps) {\n const [isExpanded, setIsExpanded] = useState(defaultExpanded);\n\n return (\n <div\n className={cn(\n \"rounded-lg border\",\n \"border-purple-200 dark:border-purple-800\",\n \"bg-purple-50/50 dark:bg-purple-950/20\",\n className\n )}\n >\n <button\n type=\"button\"\n onClick={() => setIsExpanded(!isExpanded)}\n className=\"w-full flex items-center gap-2 px-3 py-2 text-sm hover:bg-purple-100/50 dark:hover:bg-purple-900/30 transition-colors rounded-lg\"\n >\n {isExpanded ? (\n <ChevronDownIcon className=\"h-4 w-4 text-purple-400 flex-shrink-0\" />\n ) : (\n <ChevronRightIcon className=\"h-4 w-4 text-purple-400 flex-shrink-0\" />\n )}\n <SparklesIcon className=\"h-4 w-4 text-purple-500 flex-shrink-0\" />\n <span className=\"font-medium text-purple-700 dark:text-purple-300\">\n Thinking\n </span>\n </button>\n\n {isExpanded && (\n <div className=\"px-3 pb-3 border-t border-purple-200 dark:border-purple-800\">\n <div className=\"mt-2 text-sm text-purple-800 dark:text-purple-200 whitespace-pre-wrap font-mono leading-relaxed\">\n {block.content}\n </div>\n </div>\n )}\n </div>\n );\n}\n\n/**\n * Renders a list of thinking blocks\n */\nexport function ThinkingBlockList({\n blocks,\n defaultExpanded = false,\n className,\n}: ThinkingBlockListProps) {\n if (!blocks || blocks.length === 0) return null;\n\n return (\n <div className={cn(\"space-y-2\", className)}>\n {blocks.map((block) => (\n <ThinkingBlock\n key={block.id}\n block={block}\n defaultExpanded={defaultExpanded}\n />\n ))}\n </div>\n );\n}\n\nexport default ThinkingBlock;\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 { ImageData, ToolCall } from \"../types.js\";\nimport { ImageLightbox } from \"./ImageLightbox.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 \"activate_skill\",\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 // Handle dot-separated names (e.g., \"Create Ad Images.create Ad Images\")\n // Take the last segment as the most specific name, or first if they're duplicates\n if (toolName.includes(\".\")) {\n const segments = toolName.split(\".\");\n // Deduplicate: if segments are the same (case-insensitive), use first\n const uniqueSegments = segments.filter(\n (seg, idx) =>\n idx === 0 ||\n seg.toLowerCase().trim() !== segments[idx - 1]?.toLowerCase().trim()\n );\n // Use last unique segment (most specific), but if it's already Title Case, return it\n const bestSegment = uniqueSegments[uniqueSegments.length - 1]?.trim() || toolName;\n // If the segment already has spaces (pre-formatted), return as-is\n if (bestSegment.includes(\" \")) return bestSegment;\n // Otherwise, continue processing as snake_case\n return formatToolName(bestSegment);\n }\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\nexport function 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 const [lightboxIndex, setLightboxIndex] = useState<number | null>(null);\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 // Convert to ImageData for lightbox\n const lightboxImages: ImageData[] = useMemo(\n () => resultImages.map((img) => ({\n url: img.url,\n alt: img.alt || img.prompt,\n filename: img.alt || img.prompt,\n })),\n [resultImages]\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-3\">\n <div className={cn(\n \"grid gap-3\",\n resultImages.length === 1\n ? \"grid-cols-1 max-w-sm\"\n : resultImages.length === 2\n ? \"grid-cols-2\"\n : \"grid-cols-2 sm:grid-cols-3\"\n )}>\n {resultImages.map((img, idx) => {\n const altText = img.alt || img.prompt || `Generated image ${idx + 1}`;\n const imageElement = (\n <div className=\"group relative\">\n <img\n src={img.thumbnailUrl || img.url}\n alt={altText}\n className=\"w-full h-auto max-h-[280px] object-cover rounded-lg shadow-sm\"\n loading=\"lazy\"\n />\n {/* Hover overlay */}\n <div className=\"absolute inset-0 rounded-lg bg-black/0 group-hover:bg-black/10 dark:group-hover:bg-white/5 transition-colors\" />\n </div>\n );\n\n return (\n <button\n key={idx}\n type=\"button\"\n onClick={() => {\n if (onImageClick) {\n onImageClick({ url: img.url, alt: altText, filename: altText });\n } else {\n setLightboxIndex(idx);\n }\n }}\n className=\"block rounded-lg overflow-hidden cursor-pointer text-left transition-transform hover:scale-[1.02]\"\n >\n {imageElement}\n </button>\n );\n })}\n </div>\n\n {/* Lightbox for fullscreen image viewing */}\n {lightboxIndex !== null && !onImageClick && (\n <ImageLightbox\n images={lightboxImages}\n currentIndex={lightboxIndex}\n onClose={() => setLightboxIndex(null)}\n onPrev={() => setLightboxIndex((prev) =>\n prev !== null ? (prev - 1 + lightboxImages.length) % lightboxImages.length : null\n )}\n onNext={() => setLightboxIndex((prev) =>\n prev !== null ? (prev + 1) % lightboxImages.length : null\n )}\n />\n )}\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, useState } from \"react\";\nimport { BotIcon, LoadingSpinner, UserIcon } from \"../icons/index.js\";\nimport type { ChatMessage as ChatMessageType, ImageData, ToolCall, ToolCallVerbosity } from \"../types.js\";\nimport { DelegationProgressList } from \"./DelegationProgress.js\";\nimport { ImageGallery } from \"./ImageGallery.js\";\nimport { ImageLightbox } from \"./ImageLightbox.js\";\nimport { MarkdownContent } from \"./MarkdownContent.js\";\nimport { ThinkingBlockList } from \"./ThinkingBlock.js\";\nimport { extractImagesFromResult, 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\n/**\n * CSS custom properties supported by ChatMessage for theming:\n *\n * --chat-user-bg: User message bubble background (default: #3b82f6)\n * --chat-user-text: User message text color (default: white)\n * --chat-user-avatar-bg: User avatar background (default: #3b82f6)\n * --chat-user-avatar-text: User avatar text color (default: white)\n * --chat-assistant-bg: Assistant message bubble background (default: #f3f4f6)\n * --chat-assistant-text: Assistant message text color (default: #111827)\n * --chat-assistant-avatar-bg: Assistant avatar background (default: #e5e7eb)\n * --chat-assistant-avatar-text: Assistant avatar text color (default: #4b5563)\n * --chat-meta-text: Timestamp and metadata text color (default: #6b7280)\n *\n * Set these on a parent element (e.g., .cadra-chat-container) to theme the chat.\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 /** Show thinking blocks (default true) */\n showThinking?: boolean;\n /** Show delegation progress (default true) */\n showDelegation?: boolean;\n /** Show images from tool results (default true) */\n showImages?: boolean;\n /** Custom tool call rendering override */\n renderToolCall?: (\n toolCall: import(\"../types.js\").ToolCall,\n defaultRender: () => React.ReactNode\n ) => React.ReactNode;\n /**\n * Visual variant for the message layout.\n * - \"bubble\" (default): Chat bubble style with colored backgrounds and right-aligned user messages.\n * - \"flat\": Full-width flat layout (like Claude AI). Both roles left-aligned, no bubble backgrounds.\n */\n variant?: \"bubble\" | \"flat\";\n}\n\n// =============================================================================\n// TOOL CALL LIST (with grouping)\n// =============================================================================\n\n/**\n * Normalize a tool name for grouping purposes.\n * Strips prefixes, dots, and lowercases so that e.g.\n * \"create_ad_images\" and \"Create Ad Images.create_ad_images\" group together.\n */\nfunction normalizeToolNameForGrouping(name: string): string {\n // Take the last dot-separated segment (most specific)\n const lastSegment = name.includes(\".\") ? name.split(\".\").pop()! : name;\n return lastSegment.toLowerCase().replace(/[^a-z0-9]/g, \"\");\n}\n\n/**\n * Groups same-named tool calls together.\n * - In-progress calls are consolidated into a single card with count.\n * - Completed calls with images render in a shared gallery layout (not individual cards).\n */\ntype ToolCallGroup =\n | { type: \"single\"; toolCall: ToolCall }\n | { type: \"group\"; name: string; toolCalls: ToolCall[] };\n\nfunction groupToolCalls(toolCalls: ToolCall[]): ToolCallGroup[] {\n // Group ALL tool calls by normalized name\n const byNormalizedName = new Map<string, ToolCall[]>();\n const nameOrder: string[] = [];\n\n for (const tc of toolCalls) {\n const key = normalizeToolNameForGrouping(tc.name);\n if (!byNormalizedName.has(key)) {\n byNormalizedName.set(key, []);\n nameOrder.push(key);\n }\n byNormalizedName.get(key)!.push(tc);\n }\n\n const groups: ToolCallGroup[] = [];\n for (const key of nameOrder) {\n const calls = byNormalizedName.get(key)!;\n if (calls.length === 1) {\n groups.push({ type: \"single\", toolCall: calls[0]! });\n } else {\n groups.push({ type: \"group\", name: calls[0]!.name, toolCalls: calls });\n }\n }\n\n return groups;\n}\n\ninterface ToolCallListProps {\n toolCalls: ToolCall[];\n toolCallVerbosity: ToolCallVerbosity;\n onImageClick?: ChatMessageProps[\"onImageClick\"];\n renderToolCall?: ChatMessageProps[\"renderToolCall\"];\n}\n\nfunction ToolCallList({ toolCalls, toolCallVerbosity, onImageClick, renderToolCall }: ToolCallListProps) {\n // Filter internal tools in compact mode\n const visibleToolCalls = useMemo(() => {\n if (toolCallVerbosity !== \"compact\") return toolCalls;\n return toolCalls.filter((tc) => !isInternalTool(tc.name));\n }, [toolCalls, toolCallVerbosity]);\n\n const grouped = useMemo(() => groupToolCalls(visibleToolCalls), [visibleToolCalls]);\n\n return (\n <div className=\"space-y-2\">\n {grouped.map((group) => {\n if (group.type === \"single\") {\n const toolCall = group.toolCall;\n const defaultRender = () => (\n <ToolCallEntry\n key={toolCall.id}\n toolCall={toolCall}\n onImageClick={onImageClick}\n />\n );\n\n if (renderToolCall) {\n return (\n <div key={toolCall.id}>\n {renderToolCall(toolCall, defaultRender)}\n </div>\n );\n }\n\n return <div key={toolCall.id}>{defaultRender()}</div>;\n }\n\n // Grouped: multiple same-named tool calls\n const completed = group.toolCalls.filter((tc) => tc.status === \"completed\" || tc.status === \"failed\");\n const running = group.toolCalls.filter((tc) => tc.status !== \"completed\" && tc.status !== \"failed\");\n\n // Collect all images from completed tool calls\n const allImages = completed.flatMap((tc) =>\n tc.result ? extractImagesFromResult(tc.result) : []\n );\n const hasImages = allImages.length > 0;\n\n return (\n <div key={`group-${group.name}-${group.toolCalls[0]?.id}`} className=\"space-y-2\">\n {/* Consolidate running tool calls into a single card with count */}\n {running.length > 0 && running[0] && (\n <ToolCallEntry\n key={running[0].id}\n toolCall={{\n ...running[0],\n name: running.length > 1\n ? `${running[0].name} (${running.length})`\n : running[0].name,\n } as ToolCall}\n onImageClick={onImageClick}\n />\n )}\n\n {/* Render completed tool calls with images as a shared gallery */}\n {completed.length > 0 && hasImages && (\n <GroupedImageGallery\n images={allImages}\n completedCount={completed.length}\n onImageClick={onImageClick}\n />\n )}\n\n {/* Render completed tool calls WITHOUT images individually */}\n {completed.length > 0 && !hasImages && completed.map((tc) => {\n const defaultRender = () => (\n <ToolCallEntry key={tc.id} toolCall={tc} onImageClick={onImageClick} />\n );\n if (renderToolCall) {\n return <div key={tc.id}>{renderToolCall(tc, defaultRender)}</div>;\n }\n return <div key={tc.id}>{defaultRender()}</div>;\n })}\n </div>\n );\n })}\n </div>\n );\n}\n\n/**\n * Renders a grouped image gallery for multiple completed tool calls\n * that produced images. Shows images in a responsive grid instead of\n * separate full-width cards.\n */\nfunction GroupedImageGallery({\n images,\n completedCount,\n onImageClick,\n}: {\n images: { url: string; thumbnailUrl?: string; alt?: string; prompt?: string }[];\n completedCount: number;\n onImageClick?: ChatMessageProps[\"onImageClick\"];\n}) {\n const [lightboxIndex, setLightboxIndex] = useState<number | null>(null);\n\n const lightboxImages: ImageData[] = useMemo(\n () => images.map((img) => ({\n url: img.url,\n alt: img.alt || img.prompt,\n filename: img.alt || img.prompt,\n })),\n [images]\n );\n\n return (\n <div className=\"space-y-2\">\n {/* Compact status line */}\n <div className=\"flex items-center gap-2 text-xs text-gray-500 dark:text-gray-400 px-1\">\n <span className=\"h-4 w-4 flex items-center justify-center flex-shrink-0\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"h-4 w-4 text-green-500\"><polyline points=\"20 6 9 17 4 12\" /></svg>\n </span>\n <span>{completedCount} image{completedCount !== 1 ? \"s\" : \"\"} generated</span>\n </div>\n\n {/* Image grid */}\n <div className={cn(\n \"grid gap-3\",\n images.length === 1\n ? \"grid-cols-1 max-w-sm\"\n : images.length === 2\n ? \"grid-cols-2\"\n : \"grid-cols-2 sm:grid-cols-3\"\n )}>\n {images.map((img, idx) => {\n const altText = img.alt || img.prompt || `Generated image ${idx + 1}`;\n\n return (\n <button\n key={`${img.url}-${idx}`}\n type=\"button\"\n onClick={() => {\n if (onImageClick) {\n onImageClick({ url: img.url, alt: altText, filename: altText });\n } else {\n setLightboxIndex(idx);\n }\n }}\n className=\"block rounded-lg overflow-hidden cursor-pointer text-left transition-transform hover:scale-[1.02] group\"\n >\n <div className=\"relative\">\n <img\n src={img.thumbnailUrl || img.url}\n alt={altText}\n className=\"w-full h-auto max-h-[280px] object-cover rounded-lg shadow-sm\"\n loading=\"lazy\"\n />\n <div className=\"absolute inset-0 rounded-lg bg-black/0 group-hover:bg-black/10 dark:group-hover:bg-white/5 transition-colors\" />\n </div>\n </button>\n );\n })}\n </div>\n\n {/* Lightbox */}\n {lightboxIndex !== null && !onImageClick && (\n <ImageLightbox\n images={lightboxImages}\n currentIndex={lightboxIndex}\n onClose={() => setLightboxIndex(null)}\n onPrev={() => setLightboxIndex((prev) =>\n prev !== null ? (prev - 1 + lightboxImages.length) % lightboxImages.length : null\n )}\n onNext={() => setLightboxIndex((prev) =>\n prev !== null ? (prev + 1) % lightboxImages.length : null\n )}\n />\n )}\n </div>\n );\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 = \"compact\",\n className,\n markdownComponents,\n markdownUrlTransform,\n markdownContentTransform,\n onImageClick,\n showThinking = true,\n showDelegation = true,\n showImages = true,\n renderToolCall,\n variant = \"bubble\",\n}: ChatMessageProps) {\n const isUser = message.role === \"user\";\n const isAssistant = message.role === \"assistant\";\n const isFlat = variant === \"flat\";\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 \"cadra-chat-message flex gap-3\",\n isFlat ? \"py-5 px-4\" : \"p-4\",\n // Bubble: user messages right-aligned. Flat: always left-aligned.\n !isFlat && isUser ? \"flex-row-reverse\" : \"flex-row\",\n // Flat variant: subtle row background for user messages\n isFlat && isUser && \"chat-message-user-row\",\n className\n )}\n style={isFlat && isUser ? {\n backgroundColor: \"var(--chat-user-row-bg, rgba(128, 128, 128, 0.08))\",\n } as React.CSSProperties : undefined}\n data-role={message.role}\n >\n {/* Avatar */}\n <div\n className=\"flex-shrink-0 w-8 h-8 rounded-full flex items-center justify-center shadow-sm\"\n style={{\n backgroundColor: isUser\n ? \"var(--chat-user-avatar-bg, #3b82f6)\"\n : \"var(--chat-assistant-avatar-bg, #e5e7eb)\",\n color: isUser\n ? \"var(--chat-user-avatar-text, #fff)\"\n : \"var(--chat-assistant-avatar-text, #4b5563)\",\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\",\n isFlat ? \"pt-0.5\" : \"space-y-2\",\n !isFlat && 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\",\n isFlat ? \"mb-1.5\" : \"\",\n !isFlat && isUser ? \"justify-end\" : \"justify-start\"\n )}\n style={{ color: \"var(--chat-meta-text, #6b7280)\" }}\n >\n <span className=\"font-medium\" style={{ color: \"var(--chat-label-text, inherit)\" }}>\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 {showThinking && message.thinkingBlocks && message.thinkingBlocks.length > 0 && (\n <ThinkingBlockList blocks={message.thinkingBlocks} />\n )}\n\n {/* Delegation progress (team execution) */}\n {showDelegation && message.delegationEvents && message.delegationEvents.length > 0 && (\n <DelegationProgressList events={message.delegationEvents} />\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 <ToolCallList\n toolCalls={message.toolCalls}\n toolCallVerbosity={toolCallVerbosity}\n onImageClick={onImageClick}\n renderToolCall={renderToolCall}\n />\n )}\n\n {/* Message-level images (from tool results) — only show when tool calls are hidden,\n since ToolCallEntry already renders images inline with context */}\n {showImages && !showToolCalls && message.images && message.images.length > 0 && (\n <ImageGallery\n images={message.images}\n onImageClick={onImageClick ? (img) => onImageClick({ url: img.url, alt: img.alt, filename: img.filename }) : undefined}\n />\n )}\n\n {/* Main message content */}\n {message.content && (\n isFlat ? (\n // Flat variant: no bubble, just text with theme-aware color\n <div\n className={cn(\"text-sm break-words\", !(isAssistant && enableMarkdown) && \"whitespace-pre-wrap\")}\n style={{ color: \"var(--chat-content-text, inherit)\" }}\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 // Bubble variant: colored bubble backgrounds\n <div\n className=\"rounded-lg p-3\"\n style={{\n backgroundColor: isUser\n ? \"var(--chat-user-bg, #3b82f6)\"\n : \"var(--chat-assistant-bg, #f3f4f6)\",\n color: isUser\n ? \"var(--chat-user-text, #fff)\"\n : \"var(--chat-assistant-text, #111827)\",\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\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 rounded-lg px-3 py-2 text-sm\"\n style={{ backgroundColor: \"var(--chat-assistant-bg, #f3f4f6)\" }}\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 /** Show thinking blocks (default true) */\n showThinking?: boolean;\n /** Show delegation progress (default true) */\n showDelegation?: boolean;\n /** Show images from tool results (default true) */\n showImages?: boolean;\n /** Custom message rendering override */\n renderMessage?: (\n message: ChatMessageType,\n defaultRender: () => React.ReactNode\n ) => React.ReactNode;\n /** Custom tool call rendering override */\n renderToolCall?: (\n toolCall: import(\"../types.js\").ToolCall,\n defaultRender: () => React.ReactNode\n ) => React.ReactNode;\n /**\n * Visual variant for message rendering.\n * - \"bubble\" (default): Chat bubble style with colored backgrounds.\n * - \"flat\": Full-width flat layout (like Claude AI).\n */\n messageVariant?: \"bubble\" | \"flat\";\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 showThinking = true,\n showDelegation = true,\n showImages = true,\n renderMessage,\n renderToolCall,\n messageVariant = \"bubble\",\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 const defaultRender = () => (\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 showThinking={showThinking}\n showDelegation={showDelegation}\n showImages={showImages}\n renderToolCall={renderToolCall}\n variant={messageVariant}\n />\n );\n\n if (renderMessage) {\n return (\n <div key={message.id}>\n {renderMessage(message, defaultRender)}\n </div>\n );\n }\n\n return defaultRender();\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, useEffect, 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 (only used in \"fixed\" layout) */\n maxHeight?: string | number;\n\n /** Additional CSS class for the container */\n className?: string;\n\n /** Theme mode */\n theme?: ThemeMode;\n\n /**\n * Layout mode for the chat container.\n * - \"fixed\" (default): Widget-style with maxHeight constraint.\n * - \"fill\": Fills parent flex container. Use for full-page layouts.\n */\n layout?: \"fixed\" | \"fill\";\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 // Extension props (STORY-005)\n // =========================================================================\n\n /** Hide the default chat header when true */\n hideHeader?: boolean;\n\n /** Render slot above the chat input (e.g., config pills, action buttons) */\n renderAboveInput?: () => React.ReactNode;\n\n /** Render slot below the message list (e.g., image carousel) */\n renderBelowMessages?: () => React.ReactNode;\n\n /**\n * Custom message rendering override.\n * Receives the message and a defaultRender function for selective override.\n */\n renderMessage?: (\n message: import(\"../types.js\").ChatMessage,\n defaultRender: () => React.ReactNode\n ) => React.ReactNode;\n\n /**\n * Custom tool call rendering override.\n * Receives the tool call and a defaultRender function for selective override.\n */\n renderToolCall?: (\n toolCall: import(\"../types.js\").ToolCall,\n defaultRender: () => React.ReactNode\n ) => React.ReactNode;\n\n /**\n * Visual variant for message rendering.\n * - \"bubble\" (default): Chat bubble style with colored backgrounds.\n * - \"flat\": Full-width flat layout (like Claude AI).\n */\n messageVariant?: \"bubble\" | \"flat\";\n\n /** Show thinking blocks (default true) */\n showThinking?: boolean;\n\n /** Show delegation progress (default true) */\n showDelegation?: boolean;\n\n /** Show images from tool results (default true) */\n showImages?: boolean;\n\n /** Polling interval in ms (default 2000) */\n pollingInterval?: number;\n\n /** Enable polling fallback (default true) */\n pollingEnabled?: boolean;\n\n /** Callback fired when a delegation event occurs */\n onDelegation?: (event: import(\"../types.js\").DelegationEvent) => void;\n\n /**\n * Callback ref that receives the attachment API when attachments are enabled.\n * Use this to programmatically add files from outside the chat (e.g., from an artifacts panel).\n */\n onAttachmentsReady?: (api: {\n addExternalFile: (opts: {\n uuid: string;\n filename: string;\n mimeType: string;\n size: number;\n category?: \"document\" | \"image\" | \"audio\";\n previewUrl?: string;\n }) => void;\n }) => 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 layout = \"fixed\",\n enableAttachments = false,\n enableMarkdown = true,\n showToolCalls = true,\n toolCallVerbosity,\n markdownComponents,\n markdownUrlTransform,\n markdownContentTransform,\n onImageClick,\n // Extension props\n hideHeader,\n renderAboveInput,\n renderBelowMessages,\n renderMessage,\n renderToolCall,\n messageVariant = \"bubble\",\n showThinking = true,\n showDelegation = true,\n showImages = true,\n pollingInterval,\n pollingEnabled,\n onDelegation,\n onAttachmentsReady,\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 onDelegation,\n pollingInterval,\n pollingEnabled,\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 // Expose attachment API to parent via callback\n useEffect(() => {\n if (enableAttachments && onAttachmentsReady) {\n onAttachmentsReady({ addExternalFile: attachments.addExternalFile });\n }\n }, [enableAttachments, onAttachmentsReady, attachments.addExternalFile]);\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 // Common MessageList props\n const messageListProps = {\n messages,\n welcomeMessage: hideHeader ? undefined : welcomeMessage,\n renderWelcome: hideHeader ? undefined : renderWelcome,\n isLoading,\n isStreaming,\n isLoadingHistory,\n enableMarkdown,\n showToolCalls,\n toolCallVerbosity: effectiveVerbosity,\n markdownComponents,\n markdownUrlTransform,\n markdownContentTransform,\n onImageClick,\n showThinking,\n showDelegation,\n showImages,\n renderMessage,\n renderToolCall,\n messageVariant,\n sendMessage: handleSend,\n };\n\n const chatContent = (\n <>\n <MessageList {...messageListProps} />\n\n {renderBelowMessages?.()}\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 {/* Render above input slot (e.g., config pills) */}\n {renderAboveInput?.()}\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 </>\n );\n\n return (\n <ChatContainer maxHeight={maxHeight} className={className} theme={theme} layout={layout}>\n {enableAttachments ? (\n <FileDropZone\n ref={dropZoneRef}\n {...attachments.dropZoneProps}\n disabled={isLoading || !!clarification || isLoadingHistory}\n >\n {chatContent}\n </FileDropZone>\n ) : (\n chatContent\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"]}
|