@cadraos/sdk 0.3.15 → 0.3.16-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chat/index.cjs +200 -0
- package/dist/chat/index.cjs.map +1 -1
- package/dist/chat/index.d.cts +149 -1
- package/dist/chat/index.d.ts +149 -1
- package/dist/chat/index.js +198 -1
- package/dist/chat/index.js.map +1 -1
- package/dist/index.cjs +59 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +112 -1
- package/dist/index.d.ts +112 -1
- package/dist/index.js +57 -1
- package/dist/index.js.map +1 -1
- package/dist/kanban/index.cjs +56 -0
- package/dist/kanban/index.cjs.map +1 -1
- package/dist/kanban/index.d.cts +100 -0
- package/dist/kanban/index.d.ts +100 -0
- package/dist/kanban/index.js +56 -0
- package/dist/kanban/index.js.map +1 -1
- package/dist/teams/index.cjs +56 -0
- package/dist/teams/index.cjs.map +1 -1
- package/dist/teams/index.d.cts +100 -0
- package/dist/teams/index.d.ts +100 -0
- package/dist/teams/index.js +56 -0
- package/dist/teams/index.js.map +1 -1
- package/package.json +1 -1
package/dist/chat/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/resources/base.ts","../../src/errors/sdk-errors.ts","../../src/errors/ai-function-errors.ts","../../src/utils/retry.ts","../../src/utils/http.ts","../../src/streaming/sse-client.ts","../../src/streaming/extract-images.ts","../../src/streaming/poll-policy.ts","../../src/streaming/stream-controller.ts","../../src/streaming/collect-images.ts","../../src/utils/api-paths.ts","../../src/resources/agents.ts","../../src/resources/skills.ts","../../src/resources/tools.ts","../../src/resources/artifacts.ts","../../src/resources/attachments.ts","../../src/resources/sessions.ts","../../src/resources/kanban.ts","../../src/resources/teams.ts","../../src/resources/remote-agents.ts","../../src/resources/remote-runners.ts","../../src/resources/ai-functions.ts","../../src/client.ts","../../src/chat/adapters/default-adapter.ts","../../src/chat/context/ChatConfigContext.tsx","../../src/chat/hooks/useExecutionStream.ts","../../src/chat/utils/toolOutcome.ts","../../src/chat/hooks/history-cache.ts","../../src/chat/utils/contentBlocks.ts","../../src/chat/utils/applyEvent.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/utils/elapsed.ts","../../src/chat/components/ToolCallEntry.tsx","../../src/chat/components/ChatMessage.tsx","../../src/chat/components/MessageList.tsx","../../src/chat/components/AgentChat.tsx","../../src/chat/hooks/useImageStream.ts","../../src/chat/components/internal-tools/TodoList.tsx"],"names":["value","result","fetchEventSource","createContext","useMemo","jsx","useContext","useState","useRef","useCallback","useEffect","generateExecutionId","deriveImagesFromToolCalls","options","jsxs","cn","ImageIcon","FileIcon","formatFileSize","forwardRef","FileDropZone","useImperativeHandle","Fragment","createPortal","ReactMarkdown","remarkGfm","formatDuration","extractImagesFromResult"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Base Resource API\n *\n * Abstract base class for all resource APIs.\n * Provides common HTTP methods and path handling.\n */\n\nimport type { HttpClient } from '../utils/http.js';\nimport type { ListOptions, PaginatedResponse } from '../types/index.js';\n\n/**\n * Base Resource API class\n */\nexport abstract class BaseResourceAPI {\n protected readonly http: HttpClient;\n protected readonly basePath: string;\n\n constructor(http: HttpClient, basePath: string) {\n this.http = http;\n this.basePath = basePath;\n }\n\n /**\n * Build query parameters from list options\n */\n protected buildListQuery(options?: ListOptions): Record<string, string | number | boolean | undefined> {\n if (!options) return {};\n\n return {\n limit: options.limit,\n offset: options.offset,\n sort: options.sort,\n order: options.order,\n };\n }\n\n /**\n * HTTP GET request helper\n */\n protected async httpGet<T>(\n path: string,\n query?: Record<string, string | number | boolean | undefined>\n ): Promise<T> {\n return this.http.get<T>(`${this.basePath}${path}`, query);\n }\n\n /**\n * HTTP POST request helper\n */\n protected async httpPost<T>(\n path: string,\n body?: unknown,\n options?: { idempotencyKey?: string; skipRetry?: boolean; timeoutMs?: number }\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; skipRetry?: boolean }\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 * The server's own `error.code` exactly as sent on the wire (e.g.\n * `FUNCTION_NOT_PUBLISHED`, `DUPLICATE_REQUEST`, `VARIABLE_TYPE`).\n * Populated by `parseApiError` for EVERY status. `code` keeps its historic\n * per-class values (`conflict`, `server_error`, `validation_error`, …) for\n * compatibility; branch on `serverCode` when you need the precise reason.\n */\n serverCode?: 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 const serverCode =\n typeof errorBody?.error?.code === 'string' ? errorBody.error.code : undefined;\n\n const error = buildApiError(status, message, code, details, requestId);\n if (serverCode !== undefined) error.serverCode = serverCode;\n return error;\n}\n\nfunction buildApiError(\n status: number,\n message: string,\n code: string,\n details: Record<string, unknown> | undefined,\n requestId: string | undefined\n): CadraError {\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 * AI function errors (p93 AIF-010, specs §9 + D27c).\n *\n * All extend the existing hierarchy so `instanceof CadraError` (and, where it\n * applies, `ConflictError` / `ValidationError`) keeps working.\n */\n\nimport type { AiFunctionParameterIssue } from '../types/ai-functions.js';\nimport { CadraError, ConflictError, ValidationError } from './sdk-errors.js';\n\n/**\n * 409 `DUPLICATE_REQUEST`: a run with the same idempotency key already exists.\n * No provider call was made. A retry after `abandoned` or a failure needs a NEW key.\n */\nexport class AiFunctionDuplicateError extends ConflictError {\n /** The existing run's execution id. */\n readonly executionId?: string;\n /** The existing run's status (`running`, a terminal status, or `abandoned`). */\n readonly runStatus?: string;\n\n constructor(\n message: string,\n details?: Record<string, unknown>,\n requestId?: string\n ) {\n super(message, details, requestId);\n this.name = 'AiFunctionDuplicateError';\n this.serverCode = 'DUPLICATE_REQUEST';\n this.executionId = typeof details?.executionId === 'string' ? details.executionId : undefined;\n this.runStatus = typeof details?.status === 'string' ? details.status : undefined;\n }\n}\n\n/**\n * The provider answered 2xx and the run WAS metered, but the output then failed\n * (`OUTPUT_INVALID`, `DELIVERY_FAILED` — `details.charged: true`). Never retry\n * automatically: a retry is a second paid call.\n */\nexport class AiFunctionChargedError extends CadraError {\n constructor(source: CadraError) {\n super(source.message, source.code, source.status, source.details, source.requestId);\n this.name = 'AiFunctionChargedError';\n this.serverCode = source.serverCode;\n }\n}\n\n/**\n * The client-side parameter check failed (D27c). No run request was sent.\n * Also a `ValidationError`, with one `errors[]` entry per issue.\n */\nexport class AiFunctionParameterError extends ValidationError {\n readonly functionKey: string;\n readonly issues: AiFunctionParameterIssue[];\n\n constructor(functionKey: string, issues: AiFunctionParameterIssue[]) {\n super(\n `Invalid parameters for AI function \"${functionKey}\": ` +\n issues.map((i) => `${i.name} (${i.code})`).join(', '),\n issues.map((i) => ({ field: i.name, message: i.code })),\n { functionKey, issues }\n );\n this.name = 'AiFunctionParameterError';\n this.functionKey = functionKey;\n this.issues = issues;\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 /** Optional fetch implementation — inject `expo/fetch` for React Native streaming. Defaults to global fetch. */\n fetch?: typeof fetch;\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 * Per-request timeout in milliseconds. Overrides the client-wide\n * `config.timeout` for this call only (p93 AIF-010: a paid AI-function run\n * waits for the server's route ceiling while every other call keeps the\n * 30 s default).\n */\n timeoutMs?: number;\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 /** The client-wide request timeout (ms) this client was configured with. */\n get timeoutMs(): number {\n return this.config.timeout;\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 timeoutMs = options.timeoutMs ?? this.config.timeout;\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const doFetch = this.config.fetch ?? fetch;\n const response = await doFetch(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 ${options.timeoutMs ?? 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; timeoutMs?: number }\n ): Promise<T> {\n return this.request<T>({\n method: 'POST',\n path,\n body,\n idempotencyKey: options?.idempotencyKey,\n skipRetry: options?.skipRetry,\n timeoutMs: options?.timeoutMs,\n });\n }\n\n /**\n * PATCH request\n */\n async patch<T>(\n path: string,\n body?: unknown,\n options?: { idempotencyKey?: string; skipRetry?: boolean }\n ): Promise<T> {\n return this.request<T>({\n method: 'PATCH',\n path,\n body,\n idempotencyKey: options?.idempotencyKey,\n skipRetry: options?.skipRetry,\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/**\n * Generate an RFC-4122 v4 UUID for a client-prepared executionId.\n *\n * The `Idempotency-Key` HEADER is opaque, but cadra-web dedupes a duplicate\n * remote dispatch on the body `executionId` (a UUID). So to make the SDK's\n * automatic retries idempotent end-to-end, execute() must send a STABLE\n * executionId — not just the header. Prefers the platform `crypto.randomUUID()`\n * (modern browsers, Node 19+); falls back to a Math.random v4 only so the SDK\n * never hard-fails in unusual environments (the server accepts any valid UUID).\n */\nexport function generateExecutionId(): string {\n const g =\n typeof globalThis !== 'undefined'\n ? (globalThis as { crypto?: { randomUUID?: () => string } })\n : undefined;\n if (g?.crypto?.randomUUID) {\n return g.crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\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 /** Optional fetch implementation — inject `expo/fetch` for React Native streaming. Defaults to global fetch. */\n fetch?: typeof fetch;\n /**\n * Last event id seen on a previous connection. Sent as `Last-Event-ID` so the\n * server can replay only what was missed instead of the whole backlog. The\n * controller dedupes by event id regardless, so this is an optimisation, not\n * a correctness requirement.\n */\n lastEventId?: string | null;\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 doFetch = this.config.fetch ?? fetch;\n const response = await doFetch(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 ...(this.config.lastEventId ? { 'Last-Event-ID': this.config.lastEventId } : {}),\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 * Image extraction utilities\n *\n * Pure, environment-agnostic functions for pulling image URLs out of agent\n * tool results and execution outputs. Works in Node and the browser, no\n * React or DOM dependencies.\n *\n * Used by:\n * - ExecutionStreamController — derives 'image' events from tool_result events\n * so any consumer can subscribe to images as they're generated.\n * - useAgentChat — renders image artifacts inline in chat messages.\n * - Server-side workers (Node) — persist images progressively without React.\n *\n * Recognised result shapes (in priority order):\n * 1. { images: [{ url, thumbnailUrl?, filename?, mimeType?, dimensions?, prompt? }, ...] }\n * Emitted by cadra-api's response-transformer for create_ad_images, edit_image,\n * and any tool that produces image artifacts.\n * 2. { url: '...png' } — single image with image extension.\n * 3. { imageUrl: '...' } — alternate single-image shape.\n * 4. JSON string wrapping any of the above (with optional ```json fence).\n * 5. Bare image URL string or data: URL.\n */\n\n/**\n * Image extracted from a tool result or execution output.\n *\n * Shape is a superset of historical chat ImageData — all extra fields are\n * optional, so existing chat consumers keep working unchanged.\n */\nexport interface ImageData {\n /** Full-size image URL (https) */\n url: string;\n /** Optional thumbnail URL (smaller, for chat / preview display) */\n thumbnailUrl?: string;\n /** Original filename */\n filename?: string;\n /** MIME type (e.g. image/png) */\n mimeType?: string;\n /** Alt text — falls back to the agent's prompt if no explicit alt was provided */\n alt?: string;\n /** Image width in pixels */\n width?: number;\n /** Image height in pixels */\n height?: number;\n /** ID of the tool call that produced this image (when extracted from a tool_result) */\n sourceToolCallId?: string;\n /** Execution UUID this image came from (when extracted via the streaming pipeline) */\n executionId?: string;\n}\n\n/**\n * Optional context applied to every extracted image.\n * Use this to attach the originating tool-call and execution IDs.\n */\nexport interface ExtractContext {\n sourceToolCallId?: string;\n executionId?: string;\n}\n\nconst IMAGE_EXT_RE = /\\.(png|jpg|jpeg|gif|webp|svg|bmp)(\\?.*)?$/i;\n\n/**\n * Extract images from a single tool result.\n *\n * @param result The tool result. May be an object, an already-parsed value,\n * or a JSON / URL string.\n * @param ctx Optional sourceToolCallId / executionId to attach to each\n * extracted image.\n */\nexport function extractImagesFromResult(\n result: unknown,\n ctx: ExtractContext = {}\n): ImageData[] {\n if (!result) return [];\n\n let data: unknown = result;\n\n if (typeof result === 'string') {\n // Bare image URL or data: URL? treat as a single image.\n if (IMAGE_EXT_RE.test(result) || result.startsWith('data:image/')) {\n return [{ url: normalizeUrl(result), sourceToolCallId: ctx.sourceToolCallId, executionId: ctx.executionId }];\n }\n // Otherwise try to parse as JSON (possibly wrapped in a code fence).\n const fence = result.match(/```(?:json)?\\s*\\n?([\\s\\S]*?)\\n?```/);\n const jsonStr = fence?.[1] ?? result;\n try {\n data = JSON.parse(jsonStr.trim());\n } catch {\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: [...] } — preferred (cadra-api ResponseTransformer)\n if (Array.isArray(obj.images)) {\n return (obj.images as Array<Record<string, unknown>>)\n .filter((img) => img && typeof img.url === 'string')\n .map((img) => mapImage(img, ctx));\n }\n\n // Pattern 2: { url: \"...png\" }\n if (typeof obj.url === 'string' && IMAGE_EXT_RE.test(obj.url)) {\n return [mapImage(obj, ctx)];\n }\n\n // Pattern 3: { imageUrl: \"...\" }\n if (typeof obj.imageUrl === 'string') {\n return [{\n url: normalizeUrl(obj.imageUrl),\n thumbnailUrl: typeof obj.thumbnailUrl === 'string' ? normalizeUrl(obj.thumbnailUrl) : undefined,\n alt: (obj.alt as string) || (obj.prompt as string) || undefined,\n sourceToolCallId: ctx.sourceToolCallId,\n executionId: ctx.executionId,\n }];\n }\n\n return [];\n}\n\n/**\n * Extract images from a final execution output.\n *\n * Execution outputs are often JSON strings, sometimes wrapped in a markdown\n * `json` code fence. This helper unwraps + parses + delegates to\n * extractImagesFromResult.\n *\n * Use this when an execution has already completed and you have its\n * `output` field — for live executions, prefer subscribing to the\n * stream's `image` event.\n */\nexport function extractImagesFromExecutionOutput(\n output: unknown,\n ctx: ExtractContext = {}\n): ImageData[] {\n let parsed: unknown = output;\n\n if (typeof output === 'string') {\n const fence = output.match(/```(?:json)?\\s*\\n?([\\s\\S]*?)\\n?```/);\n const jsonStr = fence?.[1] ?? output;\n try {\n parsed = JSON.parse(jsonStr.trim());\n } catch {\n // Not JSON — try the bare-URL / data-URL fallbacks via extractImagesFromResult.\n return extractImagesFromResult(output, ctx);\n }\n }\n\n return extractImagesFromResult(parsed, ctx);\n}\n\n/**\n * Aggregate images from a list of completed tool calls.\n *\n * Used by chat-style consumers that maintain an ordered list of tool calls\n * and want a single source of truth for the displayed image list.\n */\nexport function deriveImagesFromToolCalls<\n T extends { id?: string; status?: string; result?: unknown }\n>(toolCalls: T[] | undefined, ctx: Omit<ExtractContext, 'sourceToolCallId'> = {}): 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, { ...ctx, sourceToolCallId: tc.id }));\n }\n }\n return images;\n}\n\n// =============================================================================\n// INTERNAL\n// =============================================================================\n\nfunction mapImage(img: Record<string, unknown>, ctx: ExtractContext): ImageData {\n const dims = img.dimensions as Record<string, unknown> | undefined;\n return {\n url: normalizeUrl(img.url as string),\n thumbnailUrl: typeof img.thumbnailUrl === 'string' ? normalizeUrl(img.thumbnailUrl) : undefined,\n filename: img.filename as string | undefined,\n mimeType: img.mimeType as string | undefined,\n alt: (img.alt as string) || (img.prompt as string) || undefined,\n width: typeof dims?.width === 'number' ? (dims.width as number) : (img.width as number | undefined),\n height: typeof dims?.height === 'number' ? (dims.height as number) : (img.height as number | undefined),\n sourceToolCallId: ctx.sourceToolCallId,\n executionId: ctx.executionId,\n };\n}\n\n/**\n * Cadra agents sometimes emit `LINK://` URLs to defeat auto-link rendering\n * in chat UIs. Convert those back to https for downstream consumers.\n */\nfunction normalizeUrl(url: string): string {\n if (url.startsWith('LINK://')) return url.replace('LINK://', 'https://');\n return url;\n}\n","/**\n * Poll Policy\n *\n * Backpressure helpers for the SSE fallback polling loop.\n *\n * The fallback loop talks to an API key that is shared with every other feature\n * on the same key. A loop that ignores 429 does not just fail itself — it burns\n * the shared quota and takes unrelated features down with it. These helpers give\n * the loop the two things it needs to be a good citizen: a structural way to\n * recognise \"the server told me to stop\", and a delay schedule that grows when\n * the loop is failing or learning nothing.\n *\n * Everything here is pure and synchronous so the loop's timing can be asserted\n * under fake timers.\n */\n\n/** Delay a rate-limited loop waits when the server named no reset (ms). */\nexport const UNNAMED_RATE_LIMIT_WAIT_MS = 60_000;\n\ntype Dict = Record<string, unknown>;\n\nfunction asDict(value: unknown): Dict | null {\n return typeof value === 'object' && value !== null ? (value as Dict) : null;\n}\n\n/** Error codes different layers use for the same 429 condition. */\nconst RATE_LIMIT_CODES = new Set([\n 'rate_limit_error',\n 'rate_limited',\n 'rate_limit_exceeded',\n 'too_many_requests',\n]);\n\n/**\n * Is this error a rate limit (429)?\n *\n * Detected STRUCTURALLY — by status/code/name — never with `instanceof`.\n * Consumers link this package rather than depending on a single installed copy,\n * so a `RateLimitError` thrown by their copy of the SDK is not `instanceof` our\n * copy's class. Identity checks silently return false across that boundary,\n * which is exactly how a 429 ends up looking like a transient blip.\n */\nexport function isRateLimited(error: unknown): boolean {\n if (typeof error === 'string') return /\\b429\\b/.test(error);\n\n const err = asDict(error);\n if (!err) return false;\n\n for (const key of ['status', 'statusCode', 'httpStatus', 'code']) {\n if (err[key] === 429 || err[key] === '429') return true;\n }\n\n const response = asDict(err.response);\n if (response && (response.status === 429 || response.statusCode === 429)) return true;\n\n if (typeof err.code === 'string' && RATE_LIMIT_CODES.has(err.code.toLowerCase())) return true;\n if (err.name === 'RateLimitError') return true;\n\n const message = typeof err.message === 'string' ? err.message : '';\n return /\\b429\\b/.test(message)\n || /rate[\\s_-]?limit/i.test(message)\n || /too many requests/i.test(message);\n}\n\n/**\n * Read a header off whatever shape carries it — a `Headers` instance, a plain\n * object, or a lower/mixed-case bag.\n */\nfunction readHeader(bag: unknown, name: string): string | null {\n if (bag === null || bag === undefined) return null;\n\n const getter = (bag as { get?: unknown }).get;\n if (typeof getter === 'function') {\n try {\n const value = (getter as (n: string) => unknown).call(bag, name);\n if (value !== null && value !== undefined) return String(value);\n } catch {\n // Not Headers-like after all — fall through to the plain-object scan.\n }\n }\n\n const dict = asDict(bag);\n if (!dict) return null;\n const wanted = name.toLowerCase();\n for (const [key, value] of Object.entries(dict)) {\n if (key.toLowerCase() === wanted && value !== null && value !== undefined) {\n return String(value);\n }\n }\n return null;\n}\n\n/**\n * Parse a `Retry-After`-style value into milliseconds.\n * Accepts a delta in seconds (number or numeric string) or an HTTP-date.\n */\nfunction parseRetryAfter(raw: unknown, now: number): number | null {\n if (raw === null || raw === undefined) return null;\n\n if (typeof raw === 'number') {\n return Number.isFinite(raw) && raw >= 0 ? raw * 1000 : null;\n }\n if (typeof raw !== 'string') return null;\n\n const trimmed = raw.trim();\n if (trimmed === '') return null;\n if (/^\\d+(\\.\\d+)?$/.test(trimmed)) return Number(trimmed) * 1000;\n\n const at = Date.parse(trimmed);\n return Number.isNaN(at) ? null : Math.max(0, at - now);\n}\n\n/**\n * Parse an `X-RateLimit-Reset`-style value into milliseconds from now.\n * Accepts epoch seconds, epoch milliseconds, an ISO date, or a plain delta in\n * seconds — every one of which appears in the wild under this header name.\n */\nfunction parseResetAt(raw: unknown, now: number): number | null {\n if (raw === null || raw === undefined) return null;\n\n const numeric = typeof raw === 'number'\n ? raw\n : typeof raw === 'string' && /^\\d+(\\.\\d+)?$/.test(raw.trim())\n ? Number(raw.trim())\n : null;\n\n if (numeric !== null) {\n if (!Number.isFinite(numeric) || numeric < 0) return null;\n // Epoch milliseconds (~1.7e12) vs epoch seconds (~1.7e9) vs a small delta.\n if (numeric > 1e11) return Math.max(0, numeric - now);\n if (numeric > 1e9) return Math.max(0, numeric * 1000 - now);\n return numeric * 1000;\n }\n\n if (typeof raw !== 'string') return null;\n const at = Date.parse(raw.trim());\n return Number.isNaN(at) ? null : Math.max(0, at - now);\n}\n\n/**\n * How long the server asked us to wait, in milliseconds, or `null` if it said\n * nothing usable.\n *\n * Checked in order of authority: the SDK's own `RateLimitError.retryAfter`\n * (seconds) first, then the error envelope's details, then the raw\n * `Retry-After` / `X-RateLimit-Reset` headers the API actually sets.\n */\nexport function getRetryAfterMs(error: unknown, now: number = Date.now()): number | null {\n const err = asDict(error);\n if (!err) return null;\n\n const details = asDict(err.details);\n const response = asDict(err.response);\n const body = asDict(err.body) ?? asDict(response?.data);\n const bodyError = asDict(body?.error);\n const bodyDetails = asDict(bodyError?.details) ?? asDict(body?.details);\n\n // Already-in-milliseconds fields win outright — no unit guessing.\n for (const source of [err, details, bodyDetails]) {\n const ms = source?.retryAfterMs;\n if (typeof ms === 'number' && Number.isFinite(ms) && ms >= 0) return ms;\n }\n\n // `retryAfter` is seconds everywhere it appears in this stack.\n for (const source of [err, details, bodyDetails, bodyError]) {\n const parsed = parseRetryAfter(source?.retryAfter, now);\n if (parsed !== null) return parsed;\n }\n\n const headerBags = [err.headers, response?.headers, details?.headers, body?.headers];\n for (const bag of headerBags) {\n const parsed = parseRetryAfter(readHeader(bag, 'retry-after'), now);\n if (parsed !== null) return parsed;\n }\n\n for (const source of [details, bodyDetails, err]) {\n for (const key of ['resetAt', 'reset', 'rateLimitReset']) {\n const parsed = parseResetAt(source?.[key], now);\n if (parsed !== null) return parsed;\n }\n }\n\n for (const bag of headerBags) {\n for (const header of ['x-ratelimit-reset', 'ratelimit-reset']) {\n const parsed = parseResetAt(readHeader(bag, header), now);\n if (parsed !== null) return parsed;\n }\n }\n\n return null;\n}\n\n/**\n * The HTTP status carried by an error, however the thrower spelled it.\n */\nexport function getHttpStatus(error: unknown): number | null {\n const err = asDict(error);\n if (!err) return null;\n\n for (const key of ['status', 'statusCode', 'httpStatus']) {\n const value = err[key];\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n if (typeof value === 'string' && /^\\d{3}$/.test(value)) return Number(value);\n }\n\n const response = asDict(err.response);\n for (const key of ['status', 'statusCode']) {\n const value = response?.[key];\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n }\n\n return null;\n}\n\n/**\n * A 4xx that will not fix itself by asking again.\n *\n * Mirrors the SSE side's \"any 4xx is terminal\" rule, with two carve-outs:\n * 429 is backpressure (wait, don't quit) and 408 is a timeout (transient).\n * A 404 lands here — which is what a wrong path looks like, and previously it\n * was swallowed by a blanket catch and retried until the tab closed.\n */\nexport function isTerminalClientError(error: unknown): boolean {\n const status = getHttpStatus(error);\n if (status === null) return false;\n return status >= 400 && status < 500 && status !== 429 && status !== 408;\n}\n\n/** Growth applied to the delay after a failed poll. */\nexport const FAILURE_GROWTH_FACTOR = 2;\n\n/** Growth applied to the delay after a poll that learned nothing new. */\nexport const IDLE_GROWTH_FACTOR = 1.5;\n\n/**\n * Next delay after a poll that failed for a reason other than rate limiting.\n * Exponential, capped.\n */\nexport function nextFailureDelayMs(currentMs: number, maxMs: number): number {\n return Math.min(Math.max(currentMs, 1) * FAILURE_GROWTH_FACTOR, maxMs);\n}\n\n/**\n * Next delay after a successful poll that observed nothing new — no new logs\n * and no status change. This is the incident's exact shape: an execution that\n * finished long ago, polled at full rate for the lifetime of the tab. Decaying\n * toward the ceiling makes an idle tab cheap without making an active one slow.\n */\nexport function nextIdleDelayMs(currentMs: number, maxMs: number): number {\n return Math.min(Math.ceil(Math.max(currentMs, 1) * IDLE_GROWTH_FACTOR), maxMs);\n}\n\n/**\n * Add positive-only jitter so tabs that fell back together do not re-converge\n * into a synchronised wave. Positive-only matters: jitter must never shorten a\n * delay below what the server asked for.\n */\nexport function applyJitter(delayMs: number, ratio: number, random: () => number = Math.random): number {\n if (ratio <= 0) return delayMs;\n return Math.round(delayMs * (1 + random() * ratio));\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 { extractImagesFromResult } from './extract-images.js';\nimport {\n isRateLimited,\n getRetryAfterMs,\n nextFailureDelayMs,\n nextIdleDelayMs,\n applyJitter,\n isTerminalClientError,\n getHttpStatus,\n UNNAMED_RATE_LIMIT_WAIT_MS,\n} from './poll-policy.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 *\n * `pollingIntervalMs` is deliberately 5000, not the 2000 it used to be. The\n * pressure is AGGREGATE — many concurrent executions in fallback, not one\n * runaway tab — so what matters is polls-per-execution across the fleet. On the\n * observed distribution (519 executions/24h in one org, mean 146s), a 2s cadence\n * costs ~73 requests per mean-length run; if those runs fall back, that alone\n * exceeds a 1000/hour key's entire daily budget. At 5s it is ~29, which fits\n * with headroom, while a median-length run still gets ~7 updates. Going slower\n * still (10s) would leave a median run with 3 updates and the user waiting up to\n * 10s past completion — a bad trade, because in fallback polling is the ONLY\n * channel the session has.\n *\n * 5s is a floor, not a period: the loop backs off from here toward\n * `pollingMaxIntervalMs` whenever it fails or learns nothing (see poll-policy),\n * so the cadence stays responsive exactly while there is something to report.\n */\nconst DEFAULT_STREAMING_CONFIG: StreamingConfig = {\n maxReconnectAttempts: 5,\n reconnectBaseDelayMs: 1000,\n reconnectMaxDelayMs: 10000,\n // NOTE (unchanged, deliberately): this watchdog force-disconnects a HEALTHY\n // SSE connection after 30s of silence and routes it through the same\n // handleConnectionError path as a real transport failure. Ordinary LLM\n // latency exceeds 30s routinely, so it fires against working streams — that\n // is what drives sessions into the polling fallback in the first place. The\n // fix is a server-side SSE heartbeat, not a bigger number here; raising this\n // is a guess against a moving target. Everything below only bounds what the\n // fallback costs once it has been entered.\n activityTimeoutMs: 30000,\n pollingIntervalMs: 5000,\n pollingMaxIntervalMs: 30000,\n pollingMaxConsecutiveFailures: 10,\n pollingMaxConsecutiveRateLimits: 3,\n pollingMaxConsecutiveClientErrors: 3,\n pollingMaxDurationMs: 1800000,\n pollingMaxRetryAfterMs: 300000,\n pollingJitterRatio: 0.1,\n sseRetryIntervalMs: 60000,\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 /** Optional fetch implementation — inject `expo/fetch` for React Native streaming. Defaults to global fetch. */\n fetch?: typeof fetch;\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 finalExecution: AgentExecution | null = null;\n private finalError: ErrorEvent | null = null;\n\n // --- Fallback polling state ---\n // A self-rescheduling timeout, not setInterval: the delay has to change\n // between ticks (that is what backoff IS), and a timeout chain also cannot\n // stack overlapping requests the way a fixed interval does when the API is\n // slow to answer.\n private pollTimeoutId: ReturnType<typeof setTimeout> | null = null;\n private pollDelayMs = 0;\n private pollConsecutiveFailures = 0;\n private pollConsecutiveRateLimits = 0;\n private pollConsecutiveClientErrors = 0;\n /** When the loop last observed anything new — the clock the give-up bound runs on. */\n private pollLastProgressAt = 0;\n private pollInFlight = false;\n private lastPolledStatus: string | null = null;\n private sseRetryTimeoutId: ReturnType<typeof setTimeout> | null = null;\n private sseRetryInFlight = false;\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 image: Array<(data: StreamEventMap['image']) => 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 narration: Array<(data: StreamEventMap['narration']) => 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 image: [],\n plan: [],\n paused: [],\n started: [],\n progress: [],\n taskListUpdate: [],\n delegationStarted: [],\n delegationCompleted: [],\n textDelta: [],\n narration: [],\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 // Resolved fallback-poll settings. Read through `??` rather than off the\n // spread config so an explicit `undefined` in a caller's partial config still\n // lands on the default instead of NaN-ing the arithmetic.\n private get pollBaseIntervalMs(): number {\n return this.config.pollingIntervalMs ?? DEFAULT_STREAMING_CONFIG.pollingIntervalMs;\n }\n private get pollMaxIntervalMs(): number {\n return Math.max(\n this.config.pollingMaxIntervalMs ?? DEFAULT_STREAMING_CONFIG.pollingMaxIntervalMs!,\n this.pollBaseIntervalMs\n );\n }\n private get pollMaxConsecutiveFailures(): number {\n return this.config.pollingMaxConsecutiveFailures ?? DEFAULT_STREAMING_CONFIG.pollingMaxConsecutiveFailures!;\n }\n private get pollMaxConsecutiveRateLimits(): number {\n return this.config.pollingMaxConsecutiveRateLimits ?? DEFAULT_STREAMING_CONFIG.pollingMaxConsecutiveRateLimits!;\n }\n private get pollMaxConsecutiveClientErrors(): number {\n return this.config.pollingMaxConsecutiveClientErrors ?? DEFAULT_STREAMING_CONFIG.pollingMaxConsecutiveClientErrors!;\n }\n private get pollMaxDurationMs(): number {\n return this.config.pollingMaxDurationMs ?? DEFAULT_STREAMING_CONFIG.pollingMaxDurationMs!;\n }\n private get pollMaxRetryAfterMs(): number {\n return this.config.pollingMaxRetryAfterMs ?? DEFAULT_STREAMING_CONFIG.pollingMaxRetryAfterMs!;\n }\n private get pollJitterRatio(): number {\n return this.config.pollingJitterRatio ?? DEFAULT_STREAMING_CONFIG.pollingJitterRatio!;\n }\n private get sseRetryIntervalMs(): number {\n return this.config.sseRetryIntervalMs ?? DEFAULT_STREAMING_CONFIG.sseRetryIntervalMs!;\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 // Never leave a previous client subscribed. Reconnects and the fallback's\n // periodic SSE re-attempt both land here, and two live SSEClients on one\n // execution means every event arrives twice.\n if (this.sseClient) {\n this.sseClient.disconnect();\n this.sseClient = null;\n }\n\n // Callbacks are gated on `client` still being the current one. A replaced\n // client's teardown emits one last onConnectionChange(false) as its stream\n // unwinds; without this gate that stale report lands after the replacement\n // has already reported connected, and stale events would be injected too.\n const client: SSEClient = new SSEClient({\n url,\n authHeader: `Bearer ${authToken}`,\n orgId: this.options.orgId,\n fetch: this.options.fetch,\n // Resume from where this session left off. On a first connect this is\n // null and the header is omitted.\n lastEventId: this._lastEventId,\n onEvent: (event) => {\n if (this.sseClient !== client) return;\n this.handleEvent(event);\n },\n onError: (error) => {\n if (this.sseClient !== client) return;\n console.error('[SDK:StreamController] SSE error:', error);\n this.handleConnectionError(error);\n },\n onConnectionChange: (connected) => {\n if (this.sseClient !== client) return;\n console.log('[SDK:StreamController] SSE connection change:', connected);\n if (connected) {\n // The single place a live SSE stream is observed — so the single\n // place the fallback loop is retired. Whether this connection came\n // from connect(), the reconnect ladder, or the fallback's periodic\n // re-attempt, polling must not survive alongside a working stream.\n this.status = 'connected';\n this.reconnectAttempts = 0;\n this.stopPolling();\n this.resetActivityTimeout();\n }\n this.emit('connectionChange', {\n connected,\n usingFallback: this.status === 'fallback_polling',\n });\n },\n });\n\n this.sseClient = client;\n\n try {\n // Resolves when the stream ENDS, not when it opens — the open is reported\n // through onConnectionChange above.\n await client.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 // Pass through forwarded-from flag (set by cadra-api's\n // subscribeAndForwardEvents on sub-agent events). Wire field\n // is `_forwardedFrom` at the top of event.data.\n forwardedFrom: (event.data as Record<string, unknown>)._forwardedFrom as string | 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 // Pass through forwarded-from flag (set by cadra-api's\n // subscribeAndForwardEvents on sub-agent events). Wire field\n // is `_forwardedFrom` per redis-manager.ts:232.\n forwardedFrom: (event.data as Record<string, unknown>)._forwardedFrom as string | undefined,\n // CAD-87 S1-001 EventIdentity → (execId, seq) reducer dedup (S1-003).\n sourceExecutionId: (data.sourceExecutionId as string) ?? (data.executionId as string | undefined),\n seq: data.seq as number | undefined,\n });\n break;\n\n case 'tool_result': {\n // Fix: Handle undefined toolName gracefully (defensive coding)\n const toolCallId = (data.toolCallId as string) || `tool-result-${Date.now()}`;\n const toolName = (data.toolName as string) || 'Unknown Tool';\n this.emit('toolResult', {\n toolCallId,\n toolName,\n result: data.result,\n durationMs: data.durationMs as number ?? 0,\n // CAD-243: pass the producer's failure verdict through.\n ...(data.isError === true ? { isError: true } : {}),\n ...(typeof data.status === 'string' ? { status: data.status } : {}),\n ...(typeof data.error === 'string' ? { error: data.error } : {}),\n forwardedFrom: (event.data as Record<string, unknown>)._forwardedFrom as string | undefined,\n // CAD-87 S1-001 EventIdentity → (execId, seq) reducer dedup (S1-003).\n sourceExecutionId: (data.sourceExecutionId as string) ?? (data.executionId as string | undefined),\n seq: data.seq as number | undefined,\n });\n\n // Derived event: emit one `image` per image found in the result.\n // Lets any consumer (chat UI, server worker) react to images progressively\n // without parsing tool results themselves.\n const images = extractImagesFromResult(data.result, {\n sourceToolCallId: toolCallId,\n executionId: this.options.executionId,\n });\n for (const img of images) {\n this.emit('image', {\n ...img,\n executionId: this.options.executionId,\n sourceToolCallId: toolCallId,\n toolName,\n });\n }\n break;\n }\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 // Forwarded specialist activity → rolling line attribution. Wire\n // fields `_forwardedFrom` / `_subagentName` sit at event.data top level.\n forwardedFrom: (event.data as Record<string, unknown>)._forwardedFrom as string | undefined,\n subagentName: (event.data as Record<string, unknown>)._subagentName as string | 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 // Forwarded specialist status → rolling line attribution.\n forwardedFrom: (event.data as Record<string, unknown>)._forwardedFrom as string | undefined,\n subagentName: (event.data as Record<string, unknown>)._subagentName 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 forwardedFrom: (event.data as Record<string, unknown>)._forwardedFrom as string | undefined,\n // CAD-87 S1-001 EventIdentity → (execId, seq) reducer dedup (S1-003).\n sourceExecutionId: (data.sourceExecutionId as string) ?? (data.executionId as string | undefined),\n seq: data.seq as number | undefined,\n });\n break;\n\n // Handle narration event - clean per-step narration sentence (CAD\n // forwarded-narration). Native events (no forwardedFrom) mirror the\n // parent's own text_delta and are ignored by the chat hook; FORWARDED\n // events carry a specialist's narration during a handoff (its text_delta\n // is intentionally not forwarded) tagged `_subagentName`.\n case 'narration':\n this.emit('narration', {\n text: data.text as string,\n executionId: data.executionId as string | undefined,\n forwardedFrom: (event.data as Record<string, unknown>)._forwardedFrom as string | undefined,\n subagentName: (event.data as Record<string, unknown>)._subagentName as string | undefined,\n iteration: data.iteration as number | undefined,\n timestamp: (data.timestamp as string) || new Date().toISOString(),\n // CAD-87 S1-001 EventIdentity → (execId, seq) reducer dedup (S1-003).\n // The FORWARDED specialist narration keeps the CHILD's sourceExecutionId\n // + seq (preserved through the forward), so its resume replay dedups too.\n sourceExecutionId: (data.sourceExecutionId as string) ?? (data.executionId as string | undefined),\n seq: data.seq as number | undefined,\n // CAD-87 S1-002: the producer role — the reducer renders a native\n // `terminal_answer` as the answer (text), not a narration block.\n role: data.role as StreamEventMap['narration']['role'],\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 // Any terminal observation retires the fallback loop, no matter which path\n // observed it (SSE, state recovery, or a poll tick).\n this.stopPolling();\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 this.stopPolling();\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 // Permanent (4xx) failures won't fix themselves — auth rejected, bad/expired\n // run id, missing scope. Retrying floods the server and leaks connections\n // (each retry holds a privileged-DB connection on the stream route). Treat\n // any 4xx as terminal: stop, surface the error, and close.\n const msg = error instanceof Error ? error.message : String(error);\n if (/\\b4\\d\\d\\b/.test(msg) || /INVALID_API_KEY|INVALID_REQUEST/.test(msg)) {\n // Tear down the SSE then surface a terminal error (no reconnect).\n if (this.sseClient) {\n this.sseClient.disconnect();\n this.sseClient = null;\n }\n this.handleError({ error: msg, errorCode: 'stream_unrecoverable' });\n return;\n }\n\n // Already in fallback: the poll loop plus its periodic SSE re-attempt own\n // recovery from here. Re-entering the reconnect ladder would spawn a second\n // poll loop and a second connectionChange storm for every failed re-attempt.\n if (this.status === 'fallback_polling') {\n this.startPolling(); // no-op when the loop is already running\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 * Idempotent — calling it while a loop is already running is a no-op, so no\n * path can end up with two loops racing the same execution.\n */\n private startPolling(): void {\n if (this.pollTimeoutId !== null || this.pollInFlight) {\n return;\n }\n\n this.pollLastProgressAt = Date.now();\n this.pollDelayMs = this.pollBaseIntervalMs;\n this.pollConsecutiveFailures = 0;\n this.pollConsecutiveRateLimits = 0;\n this.pollConsecutiveClientErrors = 0;\n this.lastPolledStatus = null;\n\n // SSE is down; the activity watchdog has nothing left to watch and would\n // only re-enter handleConnectionError on a timer.\n this.stopActivityTimeout();\n\n this.scheduleSSERetry();\n this.schedulePoll(this.pollDelayMs);\n }\n\n /**\n * Queue the next poll tick.\n */\n private schedulePoll(delayMs: number): void {\n if (this.status !== 'fallback_polling') {\n return;\n }\n this.pollTimeoutId = setTimeout(() => {\n this.pollTimeoutId = null;\n void this.runPoll();\n }, Math.max(0, Math.round(delayMs)));\n }\n\n /**\n * One poll tick: fetch state, emit what is new, then decide how long to wait\n * before the next one — or whether there should be a next one at all.\n */\n private async runPoll(): Promise<void> {\n if (this.status !== 'fallback_polling') {\n return;\n }\n\n // The give-up bound, measured from the last thing the loop LEARNED rather\n // than from when it started. A loop still delivering logs is doing its job\n // and gets to keep going; a loop re-reading the same unchanged state has\n // proven it will not learn anything, and surfacing an error beats outliving\n // the tab. (The incident's session last did anything at 11:05 and was still\n // polling at 11:20 — squarely this branch.)\n if (Date.now() - this.pollLastProgressAt >= this.pollMaxDurationMs) {\n this.failPolling(\n `Streaming fallback gave up: no execution progress for ${Math.round(this.pollMaxDurationMs / 1000)}s`,\n 'polling_timeout'\n );\n return;\n }\n\n this.pollInFlight = true;\n try {\n const execution = await this.options.getExecution(this.options.executionId);\n\n this.pollConsecutiveFailures = 0;\n this.pollConsecutiveRateLimits = 0;\n this.pollConsecutiveClientErrors = 0;\n\n // Emit new logs\n let sawNewInfo = false;\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 sawNewInfo = true;\n }\n }\n if (execution.status !== this.lastPolledStatus) {\n this.lastPolledStatus = execution.status;\n sawNewInfo = true;\n }\n if (sawNewInfo) {\n this.pollLastProgressAt = Date.now();\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 return;\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 // Active execution keeps the fast cadence; an idle one decays toward the\n // ceiling so a forgotten tab costs a request every 30s, not every 2s.\n this.pollDelayMs = sawNewInfo\n ? this.pollBaseIntervalMs\n : nextIdleDelayMs(this.pollDelayMs, this.pollMaxIntervalMs);\n } catch (error) {\n if (!this.handlePollError(error)) {\n return; // handlePollError already terminated the loop\n }\n } finally {\n this.pollInFlight = false;\n }\n\n this.schedulePoll(applyJitter(this.pollDelayMs, this.pollJitterRatio));\n }\n\n /**\n * Apply backpressure for a failed poll.\n *\n * @returns `true` to keep polling (with `pollDelayMs` updated), `false` when\n * the loop has been terminated.\n */\n private handlePollError(error: unknown): boolean {\n const retryAfterMs = getRetryAfterMs(error);\n const rateLimited = isRateLimited(error) || retryAfterMs !== null;\n\n if (rateLimited) {\n this.pollConsecutiveRateLimits++;\n console.warn(\n '[SDK:StreamController] Poll rate-limited',\n retryAfterMs !== null ? `(server asked for ${Math.round(retryAfterMs / 1000)}s)` : '(no reset named)'\n );\n\n // A reset this far out is not something to sit on holding a stream open.\n if (retryAfterMs !== null && retryAfterMs > this.pollMaxRetryAfterMs) {\n this.failPolling(\n `Rate limited: the API asked for ${Math.round(retryAfterMs / 1000)}s, longer than this stream will wait`,\n 'rate_limited'\n );\n return false;\n }\n\n // 429 is not transient noise — it means the quota window is spent. Probing\n // it further starves every other feature sharing the key, which is the\n // collateral damage that made this worth fixing in the first place.\n if (this.pollConsecutiveRateLimits >= this.pollMaxConsecutiveRateLimits) {\n this.failPolling(\n 'Rate limited by the API; stopped the streaming fallback rather than keep spending the key quota',\n 'rate_limited'\n );\n return false;\n }\n\n // Never sooner than the server said. When it named nothing, assume a\n // window measured in minutes — retrying inside one is pure waste.\n // Deliberately NOT clamped by pollMaxIntervalMs: the server's number wins.\n this.pollDelayMs = Math.max(retryAfterMs ?? UNNAMED_RATE_LIMIT_WAIT_MS, this.pollDelayMs);\n return true;\n }\n\n // A 4xx will not fix itself by asking again — wrong path, dead run id,\n // rejected auth, missing scope. Mirrors the SSE side's terminal-4xx rule,\n // but with a small tolerance rather than instant death: a poll issued\n // immediately after dispatch can legitimately 404 before the execution row\n // is readable. Blanket catch-and-continue meant a permanently wrong URL\n // (which is what the bare `/executions/{id}` path was) looked exactly like\n // a transient blip, forever.\n if (isTerminalClientError(error)) {\n this.pollConsecutiveClientErrors++;\n const status = getHttpStatus(error);\n console.warn(\n `[SDK:StreamController] Poll got HTTP ${status} (${this.pollConsecutiveClientErrors}/${this.pollMaxConsecutiveClientErrors})`\n );\n if (this.pollConsecutiveClientErrors >= this.pollMaxConsecutiveClientErrors) {\n this.failPolling(\n `Execution status endpoint returned HTTP ${status} ${this.pollConsecutiveClientErrors} times — cannot track this run`,\n 'polling_unrecoverable'\n );\n return false;\n }\n this.pollDelayMs = nextFailureDelayMs(this.pollDelayMs, this.pollMaxIntervalMs);\n return true;\n }\n\n this.pollConsecutiveFailures++;\n console.warn(\n `[SDK:StreamController] Poll failed (${this.pollConsecutiveFailures}/${this.pollMaxConsecutiveFailures}):`,\n error\n );\n\n if (this.pollConsecutiveFailures >= this.pollMaxConsecutiveFailures) {\n this.failPolling(\n `Streaming fallback failed ${this.pollConsecutiveFailures} times in a row`,\n 'polling_failed'\n );\n return false;\n }\n\n this.pollDelayMs = nextFailureDelayMs(this.pollDelayMs, this.pollMaxIntervalMs);\n return true;\n }\n\n /**\n * Terminate the fallback loop and surface the reason.\n */\n private failPolling(error: string, errorCode: string): void {\n this.stopPolling();\n this.handleError({ error, errorCode });\n }\n\n /**\n * Stop polling, including the periodic SSE re-attempt that belongs to it.\n */\n private stopPolling(): void {\n if (this.pollTimeoutId !== null) {\n clearTimeout(this.pollTimeoutId);\n this.pollTimeoutId = null;\n }\n if (this.sseRetryTimeoutId !== null) {\n clearTimeout(this.sseRetryTimeoutId);\n this.sseRetryTimeoutId = null;\n }\n }\n\n /**\n * Queue the next attempt to get the real stream back.\n */\n private scheduleSSERetry(): void {\n if (this.sseRetryTimeoutId !== null || this.status !== 'fallback_polling') {\n return;\n }\n this.sseRetryTimeoutId = setTimeout(() => {\n this.sseRetryTimeoutId = null;\n this.attemptSSERecovery();\n }, this.sseRetryIntervalMs);\n }\n\n /**\n * Re-attempt SSE from inside the fallback, so a transient outage costs the\n * session a few polls rather than its stream for the lifetime of the tab.\n *\n * Success is NOT observed here: `SSEClient.connect()` resolves when the\n * stream ENDS, not when it opens. The open is observed by\n * `onConnectionChange(true)`, which flips status and stops this loop. The\n * promise below only tells us the attempt is over so the next one can be\n * queued.\n */\n private attemptSSERecovery(): void {\n if (this.status !== 'fallback_polling') {\n return;\n }\n if (this.sseRetryInFlight) {\n this.scheduleSSERetry();\n return;\n }\n\n this.sseRetryInFlight = true;\n void this.connectSSE()\n .catch(() => {\n // Still down — the poll loop keeps carrying the session.\n })\n .finally(() => {\n this.sseRetryInFlight = false;\n this.scheduleSSERetry();\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 * Collect images from an execution stream.\n *\n * Awaitable wrapper around ExecutionStreamController that:\n * - Subscribes to `image` events and accumulates them in arrival order.\n * - On `complete`, falls back to parsing `execution.output` for any images\n * that didn't arrive via streaming (older agents, missed events on reconnect).\n * - Returns a Promise<{ images, output, executionId }> that resolves on\n * `complete` or rejects on `error`.\n *\n * Optional callbacks let the caller react progressively as images arrive\n * (e.g. persist to a DB, push to React state, log to disk) without having\n * to wait for the final result.\n *\n * Works in Node and the browser — the controller is environment-agnostic.\n */\n\nimport type { ExecutionStreamController } from './stream-controller.js';\nimport { extractImagesFromExecutionOutput, type ImageData } from './extract-images.js';\nimport type { ImageEvent } from '../types/streaming.js';\n\n/**\n * Options for collectImagesFromStream / streamImages / streamImagesFromExecution.\n */\nexport interface CollectImagesOptions {\n /**\n * Callback fired once per image as it arrives. Receives the full ImageEvent\n * (including executionId, sourceToolCallId, toolName).\n *\n * Returning a Promise is allowed but not awaited — collection does not\n * block on the callback. If you need ordering guarantees (e.g. sequential\n * DB inserts), serialise inside the callback yourself.\n */\n onImage?: (image: ImageEvent) => void | Promise<void>;\n\n /**\n * Callback fired once when the execution completes. Receives the same\n * value the returned Promise resolves with.\n */\n onComplete?: (result: StreamImagesResult) => void;\n\n /**\n * Callback fired if the execution errors. The returned Promise also rejects.\n */\n onError?: (error: Error) => void;\n\n /**\n * AbortSignal. When aborted: cancels the stream and rejects the Promise.\n */\n signal?: AbortSignal;\n}\n\n/**\n * Result of a streamImages / collectImagesFromStream call.\n */\nexport interface StreamImagesResult {\n /** All images collected, in arrival order */\n images: ImageData[];\n /** The agent's final execution output (raw — may be a JSON string) */\n output: unknown;\n /** The execution UUID */\n executionId: string;\n}\n\n/**\n * Collect images from an already-created stream controller.\n *\n * The caller is responsible for calling `stream.connect()` — this helper\n * only attaches listeners and awaits completion.\n *\n * Most callers should use the higher-level `client.agents.streamImages()` or\n * `client.agents.streamImagesFromExecution()` instead, which handle the\n * connect step too.\n */\nexport async function collectImagesFromStream(\n stream: ExecutionStreamController,\n options: CollectImagesOptions = {}\n): Promise<StreamImagesResult> {\n const { onImage, onComplete, onError, signal } = options;\n\n const images: ImageData[] = [];\n const seenUrls = new Set<string>();\n\n if (signal?.aborted) {\n stream.cancel();\n throw new Error('Aborted');\n }\n\n return new Promise<StreamImagesResult>((resolve, reject) => {\n let settled = false;\n\n const settleResolve = (result: StreamImagesResult): void => {\n if (settled) return;\n settled = true;\n try {\n onComplete?.(result);\n } catch (err) {\n // Don't let consumer callbacks break the Promise contract.\n // Fire-and-forget — they can still see errors via onError.\n // eslint-disable-next-line no-console\n console.error('[SDK:collectImages] onComplete threw:', err);\n }\n resolve(result);\n };\n\n const settleReject = (err: Error): void => {\n if (settled) return;\n settled = true;\n try {\n onError?.(err);\n } catch (cbErr) {\n // eslint-disable-next-line no-console\n console.error('[SDK:collectImages] onError threw:', cbErr);\n }\n reject(err);\n };\n\n stream.on('image', (img) => {\n if (seenUrls.has(img.url)) return;\n seenUrls.add(img.url);\n images.push(img);\n try {\n const ret = onImage?.(img);\n if (ret && typeof (ret as Promise<void>).catch === 'function') {\n (ret as Promise<void>).catch((err) => {\n // eslint-disable-next-line no-console\n console.error('[SDK:collectImages] onImage rejected:', err);\n });\n }\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error('[SDK:collectImages] onImage threw:', err);\n }\n });\n\n stream.on('error', (err) => {\n settleReject(new Error(err.error || 'Stream error'));\n });\n\n stream.on('complete', ({ execution }) => {\n // Fallback: backfill from execution.output if streaming didn't surface\n // any images (older agents, non-streaming tool paths, missed events).\n if (images.length === 0 && execution.output) {\n const fromOutput = extractImagesFromExecutionOutput(execution.output, {\n executionId: stream.executionId,\n });\n for (const img of fromOutput) {\n if (seenUrls.has(img.url)) continue;\n seenUrls.add(img.url);\n images.push(img);\n // Also fire onImage so progressive consumers see fallback images.\n try {\n onImage?.({\n ...img,\n executionId: stream.executionId,\n sourceToolCallId: img.sourceToolCallId ?? '',\n toolName: '',\n });\n } catch {\n // ignore\n }\n }\n }\n\n settleResolve({\n images: [...images],\n output: execution.output,\n executionId: stream.executionId,\n });\n });\n\n if (signal) {\n signal.addEventListener(\n 'abort',\n () => {\n stream.cancel();\n settleReject(new Error('Aborted'));\n },\n { once: true }\n );\n }\n });\n}\n","/**\n * API paths for TOP-LEVEL resources\n *\n * `BaseResourceAPI.httpGet/httpPost/...` prefix a resource's own `basePath`\n * (e.g. `/api/v1/agents`), which is right for sub-resources but wrong for\n * resources that live at the root of the API. Those call `this.http.*`\n * directly — and every place that did so had dropped the `/api/v1` prefix\n * entirely, producing requests that resolve on NO host:\n *\n * - cadra-web (what every chat/copilot consumer passes as `baseUrl`) serves\n * `/api/v1/executions/{id}`. A bare `/executions/{id}` falls through to the\n * Next.js page router and returns 404 HTML — it never reaches `withApiAuth`,\n * so it is invisible to auth, quota and logging alike.\n * - cadra-api mounts the equivalent Fastify route under `/internal/v1`, behind\n * the web↔api internal key that SDK consumers do not hold. Its public\n * `/api/v1` surface carries only the session routes.\n *\n * Centralised here so the prefix is stated once instead of being re-typed (and\n * re-dropped) at each call site.\n */\n\n/** Root of the versioned public API. */\nexport const API_V1 = '/api/v1';\n\n/** Executions are a top-level resource, NOT a sub-resource of agents. */\nexport const EXECUTION_PATH = `${API_V1}/executions`;\n\n/** `GET /api/v1/executions/{id}` — execution status, output and logs. */\nexport function executionPath(executionId: string): string {\n return `${EXECUTION_PATH}/${executionId}`;\n}\n\n/** `POST /api/v1/executions/{id}/cancel` — request cancellation. */\nexport function executionCancelPath(executionId: string): string {\n return `${EXECUTION_PATH}/${executionId}/cancel`;\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';\nimport {\n collectImagesFromStream,\n type CollectImagesOptions,\n type StreamImagesResult,\n} from '../streaming/collect-images.js';\nimport { executionPath, executionCancelPath } from '../utils/api-paths.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, executionId, options }\n // This matches cadra-web's sdkFormatSchema which preserves teamUuid.\n //\n // `executionId`, when present, is a client-prepared UUID v4 (P25 — Action 5).\n // cadra-web's executions router accepts it (validated as UUID) and uses it\n // as the new execution row's UUID so the SDK can pre-open SSE.\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 ...(input.executionId ? { executionId: input.executionId } : {}),\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 fetch: config.fetch,\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 fetch: config.fetch,\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 /**\n * Stream image generation — kicks off an execution and resolves with all\n * images once the agent completes, while firing per-image callbacks as\n * each one arrives.\n *\n * Use this for one-shot image generation from agents whose primary output\n * is images (`create_ad_images`, `edit_image`, etc.). Works in Node and\n * the browser.\n *\n * @example\n * ```typescript\n * // Server-side: persist each image as it arrives, then return creative IDs\n * const { images, executionId } = await client.agents.streamImages(\n * batchAgentUuid,\n * { task: 'Generate 4 ads for new product launch', attachmentIds },\n * { onImage: async (img) => { await persist(img); } }\n * );\n * ```\n *\n * @example\n * ```typescript\n * // Browser-side: progressive UI without polling\n * const result = await client.agents.streamImages(uuid, input, {\n * onImage: (img) => setImages((prev) => [...prev, img]),\n * signal: abortController.signal,\n * });\n * ```\n */\n async streamImages(\n uuid: string,\n input: ExecuteInput,\n options?: CollectImagesOptions\n ): Promise<StreamImagesResult> {\n const stream = await this.stream(uuid, input);\n const collectionPromise = collectImagesFromStream(stream, options);\n // Connect AFTER collectImagesFromStream attaches listeners to avoid race.\n stream.connect().catch(() => {\n // connectionError surfaces via the stream's 'error' event; the\n // collection promise will reject through that path. Swallow here so\n // we don't trigger unhandled-rejection.\n });\n return collectionPromise;\n }\n\n /**\n * Connect to an already-started execution, stream image events, and\n * resolve with the collected images on completion.\n *\n * Useful when execution is started elsewhere (e.g. via tRPC mutation\n * that returns `executionId`) and the consumer wants to wait for images.\n *\n * @example\n * ```typescript\n * // After a tRPC mutation returns { executionId }\n * const { images } = await client.agents.streamImagesFromExecution(executionId, {\n * onImage: (img) => appendToUI(img),\n * });\n * ```\n */\n async streamImagesFromExecution(\n executionId: string,\n options?: CollectImagesOptions & { sessionId?: string }\n ): Promise<StreamImagesResult> {\n const { sessionId, ...collectOptions } = options ?? {};\n const stream = this.streamExecution(executionId, sessionId);\n const collectionPromise = collectImagesFromStream(stream, collectOptions);\n stream.connect().catch(() => {\n // see streamImages — error path reaches the promise via 'error' event\n });\n return collectionPromise;\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 // Executions are a TOP-LEVEL resource (`/api/v1/executions/...`), not a\n // sub-resource of `/api/v1/agents`, so this cannot go through `httpGet`\n // (which would prefix this resource's basePath). It still needs the\n // `/api/v1` prefix: a bare `/executions/{id}` resolves on NO host — on\n // cadra-web it lands on the Next page router (404 HTML, never reaching\n // auth), and on cadra-api the equivalent route is mounted under\n // `/internal/v1` behind the internal key. See EXECUTION_PATH.\n return this.http.get<AgentExecution>(executionPath(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 executionCancelPath(executionId),\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 /** Optional fetch implementation — inject `expo/fetch` for React Native streaming. Defaults to global fetch. */\n fetch?: typeof fetch;\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 // KNOWN BROKEN (not fixed here — no verified target route): this bare\n // path drops the `/api/v1` prefix and resolves on no host. Unlike the\n // execution endpoints, cadra-web exposes no public skill-execution route to\n // point it at, so correcting it needs a server-side route first.\n // See utils/api-paths.ts.\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 // KNOWN BROKEN (not fixed here — no verified target route): this bare\n // path drops the `/api/v1` prefix and resolves on no host. Unlike the\n // execution endpoints, cadra-web exposes no public tool-execution route to\n // point it at, so correcting it needs a server-side route first.\n // See utils/api-paths.ts.\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 // KNOWN BROKEN (not fixed here — no verified target route): this bare\n // path drops the `/api/v1` prefix and resolves on no host. Unlike the\n // execution endpoints, cadra-web exposes no public artifacts-by-execution route to\n // point it at, so correcting it needs a server-side route first.\n // See utils/api-paths.ts.\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 // KNOWN BROKEN — same missing `/api/v1` prefix as listArtifacts above.\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 * Attachments Resource API\n *\n * Provides attachment operations for uploading files (images, documents)\n * that can be referenced in agent executions via attachmentIds.\n *\n * - Upload flow: getUploadUrl() → PUT to presigned URL → confirm()\n * - Download: getDownloadUrl()\n */\n\nimport { BaseResourceAPI } from './base.js';\n\n/**\n * Input for requesting a presigned upload URL\n */\nexport interface AttachmentUploadUrlInput {\n /** Original filename */\n filename: string;\n /** MIME type of the file */\n mimeType: string;\n /** File size in bytes */\n size: number;\n}\n\n/**\n * Response from requesting an upload URL\n */\nexport interface AttachmentUploadUrlResponse {\n /** UUID assigned to the attachment */\n attachmentUuid: string;\n /** Presigned S3 PUT URL for uploading the file */\n uploadUrl: string;\n /** ISO timestamp when the upload URL expires */\n expiresAt?: string;\n}\n\n/**\n * Attachments API class\n */\nexport class AttachmentsAPI extends BaseResourceAPI {\n constructor(http: import('../utils/http.js').HttpClient) {\n super(http, '/api/v1/attachments');\n }\n\n /**\n * Get a presigned URL for uploading a file\n *\n * After receiving the URL, upload the file directly to S3 using a PUT request,\n * then call confirm() to mark it as ready.\n *\n * @param input - File metadata (filename, mimeType, size)\n * @returns Presigned upload URL and attachment UUID\n *\n * @example\n * ```typescript\n * // 1. Get presigned URL\n * const { attachmentUuid, uploadUrl } = await client.attachments.getUploadUrl({\n * filename: 'photo.jpg',\n * mimeType: 'image/jpeg',\n * size: 102400,\n * });\n *\n * // 2. Upload file to S3\n * await fetch(uploadUrl, { method: 'PUT', body: fileBuffer });\n *\n * // 3. Confirm upload\n * await client.attachments.confirm(attachmentUuid);\n *\n * // 4. Use in execution\n * await client.agents.execute('agent-uuid', {\n * task: 'Describe this image',\n * attachmentIds: [attachmentUuid],\n * });\n * ```\n */\n async getUploadUrl(input: AttachmentUploadUrlInput): Promise<AttachmentUploadUrlResponse> {\n return this.httpPost<AttachmentUploadUrlResponse>('/upload-url', {\n filename: input.filename,\n mimeType: input.mimeType,\n size: input.size,\n });\n }\n\n /**\n * Confirm that a file upload has completed\n *\n * Must be called after successfully uploading the file to the presigned URL.\n *\n * @param uuid - Attachment UUID returned from getUploadUrl()\n */\n async confirm(uuid: string): Promise<void> {\n await this.httpPost<void>(`/${uuid}/confirm`);\n }\n\n /**\n * Get a download URL for an attachment\n *\n * @param uuid - Attachment UUID\n * @returns Presigned download URL\n */\n async getDownloadUrl(uuid: string): Promise<string> {\n const result = await this.httpGet<{ url: string }>(`/${uuid}/download-url`);\n return result.url;\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';\nimport { executionPath } from '../utils/api-paths.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 // Optional client-prepared execution UUID v4 (P25 — Action 5).\n ...(input.executionId ? { executionId: input.executionId } : {}),\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 fetch: config.fetch,\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>(executionPath(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 * Kanban Resource API\n *\n * Provides the org-scoped board operations against `/api/v1/kanban/*`:\n * - Board: getBoard()\n * - Cards: listCards(), createCard(), getCard(), transitionCard()\n * - Run: streamCardRun() — reuses the EXISTING execution-stream controller\n * keyed on the card's executionId (no bespoke kanban stream).\n *\n * Mirrors `SessionsAPI` / `AgentsAPI` resource shape and is wired onto\n * `CadraClient` as `client.kanban`.\n *\n * @module @cadraos/sdk\n */\n\nimport { BaseResourceAPI } from './base.js';\nimport type { HttpClient } from '../utils/http.js';\nimport { generateIdempotencyKey } from '../utils/http.js';\nimport type { ExecutionStreamController } from '../streaming/stream-controller.js';\nimport { createExecutionStreamController } from '../streaming/stream-controller.js';\nimport type { StreamConfig } from './agents.js';\nimport type { AgentExecution } from '../types/agents.js';\nimport type {\n CardList,\n CreateCardInput,\n KanbanBoard,\n KanbanCard,\n KanbanHandlerType,\n KanbanLane,\n KanbanRunSummary,\n KanbanTransition,\n ListCardsInput,\n TransitionCardInput,\n} from '../kanban/types.js';\nimport { executionPath } from '../utils/api-paths.js';\n\n// ---------------------------------------------------------------------------\n// API → SDK mappers\n//\n// The `/api/v1/kanban/*` endpoints return a richer wire envelope than the flat\n// SDK types the hook/components consume: lanes are nested under `lifecycle`,\n// cards use `currentLane`/`uuid`, and lane fields are snake_cased. These\n// mappers adapt the wire shape to the public `KanbanBoard`/`KanbanCard`\n// contract. Without them the board renders \"No lanes configured\" (the raw\n// envelope has no top-level `.lanes`) and cards land in undefined lanes.\n// ---------------------------------------------------------------------------\n\ninterface RawLane {\n id?: string;\n key: string;\n name: string;\n handler?: { handler_type?: string; agent_ref?: string } | null;\n is_initial?: boolean;\n is_terminal?: boolean;\n}\n\ninterface RawTransition {\n id: string;\n from_lane_id: string;\n to_lane_id: string;\n manual_allowed?: boolean;\n}\n\ninterface RawBoardResponse {\n board: { id: number; uuid: string; orgId: number };\n lifecycle?: {\n id: number;\n uuid: string;\n slug: string;\n name: string;\n version: number;\n lanes?: RawLane[];\n transitions?: RawTransition[];\n };\n}\n\ninterface RawCard {\n id: number;\n uuid: string;\n currentLane: string;\n title: string;\n description?: string | null;\n type?: string | null;\n sharedContext?: Record<string, unknown> | null;\n executionId?: string | null;\n /** Run status of the linked execution (board listing) — drives card animation. */\n runStatus?: string | null;\n createdAt?: string | null;\n updatedAt?: string | null;\n}\n\nfunction mapLane(l: RawLane, index: number): KanbanLane {\n return {\n key: l.key,\n label: l.name,\n order: index,\n handler: l.handler\n ? {\n type: (l.handler.handler_type ?? 'cadra_agent') as KanbanHandlerType,\n agentRef: l.handler.agent_ref,\n }\n : undefined,\n terminal: l.is_terminal ?? false,\n initial: l.is_initial ?? false,\n };\n}\n\nfunction mapTransition(t: RawTransition): KanbanTransition {\n return {\n id: t.id,\n fromLane: t.from_lane_id,\n toLane: t.to_lane_id,\n manualAllowed: t.manual_allowed ?? false,\n };\n}\n\n/** Normalize a raw execution status string onto the board's KanbanRunStatus. */\nfunction mapExecStatus(s?: string | null): KanbanRunSummary['status'] {\n switch ((s ?? '').toLowerCase()) {\n case 'running':\n case 'in_progress':\n case 'processing':\n return 'running';\n case 'queued':\n case 'pending':\n case 'created':\n return 'pending';\n case 'completed':\n case 'success':\n case 'succeeded':\n return 'completed';\n case 'failed':\n case 'error':\n return 'failed';\n case 'cancelled':\n case 'canceled':\n return 'cancelled';\n default:\n return 'pending';\n }\n}\n\nfunction mapBoard(data: RawBoardResponse): KanbanBoard {\n return {\n id: data.board.uuid,\n orgId: data.board.orgId,\n lifecycleId: data.lifecycle?.uuid,\n lifecycleVersion: data.lifecycle?.version,\n name: data.lifecycle?.name,\n lanes: (data.lifecycle?.lanes ?? []).map(mapLane),\n transitions: (data.lifecycle?.transitions ?? []).map(mapTransition),\n };\n}\n\nfunction mapCard(c: RawCard, run?: KanbanRunSummary): KanbanCard {\n return {\n // The `/cards/:id` + `/cards/:id/transition` routes key on the integer PK\n // (`Number(id)`), so the card handle the board passes back MUST be that id,\n // not the uuid (a uuid → `Number(uuid)` = NaN → \"Invalid card id\").\n id: String(c.id),\n boardId: '',\n lane: c.currentLane,\n title: c.title,\n description: c.description ?? undefined,\n type: c.type ?? undefined,\n sharedContext: c.sharedContext ?? undefined,\n // Streaming key: the run-stream route (/api/v1/agents/runs/{id}/stream)\n // validates a UUID. Prefer the run summary's execution UUID; the raw card's\n // executionId is now the execution UUID too (board + card routes return it).\n executionId: run?.executionId ?? c.executionId ?? undefined,\n // Board-listing cards carry only `runStatus` (no full run summary). Synthesize\n // a minimal run so the card can render its \"agent working\" animation without\n // a detail fetch. getCard supplies the full `run` (takes precedence).\n run:\n run ??\n (c.runStatus\n ? {\n executionId: c.executionId ?? '',\n status: mapExecStatus(c.runStatus),\n }\n : undefined),\n createdAt: c.createdAt ?? undefined,\n updatedAt: c.updatedAt ?? undefined,\n };\n}\n\n/**\n * Kanban API class.\n */\nexport class KanbanAPI extends BaseResourceAPI {\n constructor(http: HttpClient, private readonly getStreamConfig: () => StreamConfig) {\n super(http, '/api/v1/kanban');\n }\n\n // ===== BOARD =====\n\n /**\n * Get the current org's board (lanes in declared order). Auto-provisions\n * the board server-side on first access.\n *\n * @returns The board with its lanes.\n *\n * @example\n * ```typescript\n * const board = await client.kanban.getBoard();\n * console.log(board.lanes.map((l) => l.label));\n * ```\n */\n async getBoard(): Promise<KanbanBoard> {\n const data = await this.httpGet<RawBoardResponse>('/boards/current');\n return mapBoard(data);\n }\n\n // ===== CARDS =====\n\n /**\n * List cards on the board (optionally filtered by lane/type).\n *\n * @param input - Optional list filters.\n * @returns The card list.\n */\n async listCards(input?: ListCardsInput): Promise<CardList> {\n const query: Record<string, string | number | boolean | undefined> = {\n lane: input?.lane,\n type: input?.type,\n limit: input?.limit,\n offset: input?.offset,\n };\n const data = await this.httpGet<{ cards: RawCard[]; total?: number }>(\n '/cards',\n query\n );\n return { cards: (data.cards ?? []).map((c) => mapCard(c)), total: data.total };\n }\n\n /**\n * Create a card. The server engine places it in the initial lane and fires\n * the lane's handler.\n *\n * @param input - Card creation input.\n * @returns The created card.\n */\n async createCard(input: CreateCardInput): Promise<KanbanCard> {\n const idempotencyKey = generateIdempotencyKey();\n const data = await this.httpPost<{ card: RawCard }>(\n '/cards',\n {\n title: input.title,\n type: input.type,\n description: input.description,\n sharedContext: input.sharedContext,\n lane: input.lane,\n },\n // Card creation is NON-idempotent and dispatches an agent run; a client\n // retry (e.g. on a slow create) would create a DUPLICATE card + a second\n // agent run (token waste). The server does not honor Idempotency-Key, so\n // never auto-retry this mutation.\n { idempotencyKey, skipRetry: true }\n );\n return mapCard(data.card);\n }\n\n /**\n * Get a single card by id, including its current run (`executionId` + run\n * summary) so the live run can be streamed.\n *\n * @param cardId - Card UUID.\n * @returns The card with its current/last run.\n */\n async getCard(cardId: string): Promise<KanbanCard> {\n // cadra-web returns the run as { executionId: <integer PK>, executionUuid,\n // status, error }. The SDK's KanbanRunSummary.executionId is the UUID that\n // drives the stream, so normalize executionUuid -> executionId here.\n const data = await this.httpGet<{\n card: RawCard;\n run?: {\n executionId?: number | string;\n executionUuid?: string;\n status?: KanbanRunSummary['status'];\n output?: string;\n error?: string | null;\n } | null;\n }>(`/cards/${cardId}`);\n const run: KanbanRunSummary | undefined = data.run\n ? {\n executionId:\n data.run.executionUuid ?? String(data.run.executionId ?? ''),\n status: data.run.status ?? 'pending',\n output: data.run.output,\n error: data.run.error ?? undefined,\n }\n : undefined;\n return mapCard(data.card, run);\n }\n\n /**\n * Patch a card's mutable fields (title/description/sharedContext). Maps the\n * `{ card: RawCard }` response back to a `KanbanCard`.\n *\n * @param cardId - Card id (the integer PK string the routes key on).\n * @param patch - The fields to update (all optional).\n * @returns The updated card.\n */\n async updateCard(\n cardId: string,\n patch: {\n title?: string;\n description?: string;\n sharedContext?: Record<string, unknown>;\n }\n ): Promise<KanbanCard> {\n // Non-idempotent-ish but safe; skipRetry to stay consistent with create.\n const data = await this.httpPatch<{ card: RawCard }>(\n `/cards/${cardId}`,\n patch,\n { skipRetry: true }\n );\n return mapCard(data.card);\n }\n\n /**\n * Manually transition a card to another lane (validated by the server\n * engine).\n *\n * @param input - Transition input.\n * @returns The updated card.\n */\n async transitionCard(input: TransitionCardInput): Promise<KanbanCard> {\n const idempotencyKey = generateIdempotencyKey();\n const data = await this.httpPost<{\n card: { uuid: string; currentLane: string; executionId?: string | null } | null;\n newLane?: string;\n }>(\n `/cards/${input.cardId}/transition`,\n {\n // The cadra-web route reads `toLane` (not `targetLane`). When omitted,\n // the engine auto-advances single-edge lanes.\n toLane: input.targetLane,\n contextPatch: input.contextPatch,\n },\n // Non-idempotent state change — don't auto-retry (a retry could\n // double-advance or re-fire a lane handler).\n { idempotencyKey, skipRetry: true }\n );\n // The transition endpoint returns a minimal card; surface the updated lane\n // (callers typically refetch the board/cards after a transition).\n return {\n id: data.card?.uuid ?? input.cardId,\n boardId: '',\n lane: data.card?.currentLane ?? data.newLane ?? input.targetLane ?? '',\n title: '',\n executionId: data.card?.executionId ?? undefined,\n };\n }\n\n // ===== RUN (reuses the existing execution-stream controller) =====\n\n /**\n * Get the card's current run as an execution. Thin convenience over the\n * existing agents/runs surface, used for polling fallback in the run view.\n *\n * @param executionId - The card's execution UUID.\n * @returns Execution details.\n */\n async getCardRun(executionId: string): Promise<AgentExecution> {\n return this.http.get<AgentExecution>(executionPath(executionId));\n }\n\n /**\n * Create a stream controller for a card's run, keyed on the card's\n * `executionId`.\n *\n * This reuses the SAME `ExecutionStreamController` the chat/agents modules\n * use against `GET /api/v1/agents/runs/{executionId}/stream` — automatic\n * reconnection, polling fallback, event dedup, and state recovery. There is\n * NO bespoke kanban stream (design.md §4.3).\n *\n * IMPORTANT: Do NOT call `.connect()` here — the caller must register\n * event listeners with `.on()` FIRST, then call `.connect()` (same contract\n * as `AgentsAPI.streamExecution`).\n *\n * @param executionId - The card's execution UUID.\n * @returns A stream controller.\n */\n streamCardRun(executionId: string): ExecutionStreamController {\n const config = this.getStreamConfig();\n return createExecutionStreamController({\n executionId,\n baseUrl: config.baseUrl,\n // The stream controller sends `Bearer <apiKey>`. Board consumers (yobo\n // copilot) construct the client with `token` (not `apiKey`), so fall back\n // to the token here — otherwise the SSE request sends `Bearer undefined`\n // and the stream route (withApiAuth) rejects it with INVALID_API_KEY.\n apiKey: config.apiKey ?? config.token,\n tokenProvider: config.tokenProvider,\n orgId: config.orgId,\n getExecution: (id) => this.getCardRun(id),\n });\n }\n}\n","/**\n * Teams Resource API\n *\n * Provides team-related operations:\n * - List: list(), get()\n */\n\nimport { BaseResourceAPI } from './base.js';\nimport type { ListOptions, PaginatedResponse } from '../types/index.js';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/** Agent classification within a team */\nexport type TeamAgentType = 'ORCHESTRATOR' | 'SPECIALIST';\n\n/** Agent operational status */\nexport type TeamAgentStatus = 'ACTIVE' | 'IDLE' | 'BUSY' | 'OFFLINE' | 'DRAFT';\n\n/** Agent summary within a team member entry */\nexport interface TeamMemberAgent {\n uuid: string;\n name: string;\n agentType: TeamAgentType;\n roleTemplate: string | null;\n status: TeamAgentStatus;\n description?: string | null;\n}\n\n/**\n * STORY-014 (CAD-70): TeamMemberRef discriminated union.\n *\n * A team member reference is either:\n * - cadra_agent — a native Cadra agent (resolved by agentUuid)\n * - remote_agent — a remote external agent (resolved by remoteAgentUuid)\n *\n * The discriminator is `memberType` — IDENTICAL to TeamMemberData.memberType and\n * cadra-api's SpecialistAgentInfo.memberType / the cadra-web specialists route, so\n * this union narrows the same shape the runtime actually produces (not a separate\n * `type`-keyed config dialect).\n *\n * MVP: remote_agent is always a LEAF/specialist. The orchestrator/lead is always a\n * native cadra_agent (teams.leadAgentId); leaf-only is enforced structurally in\n * cadra-api (a remote dispatch only ever routes to RemoteExecutionBroker and never\n * constructs a native AgentRuntime), not by a runtime flag.\n */\nexport type TeamMemberRef =\n | { memberType: 'cadra_agent'; agentUuid: string }\n | { memberType: 'remote_agent'; remoteAgentUuid: string };\n\n/** A team member with their agent details */\nexport interface TeamMemberData {\n id: number | string;\n isLead: boolean;\n agent: TeamMemberAgent;\n /**\n * STORY-014: Member type discriminator.\n * - 'cadra_agent' — native Cadra agent (default, backward-compatible)\n * - 'remote_agent' — remote external agent; remoteAgentUuid identifies the record\n */\n memberType?: 'cadra_agent' | 'remote_agent';\n /**\n * STORY-014: UUID of the remote_agents record (cadra-web).\n * Set when memberType === 'remote_agent'.\n */\n remoteAgentUuid?: string;\n}\n\n/** Lead agent summary */\nexport interface TeamLeadAgentData {\n uuid: string;\n name: string;\n agentType: TeamAgentType;\n status: TeamAgentStatus;\n}\n\n/** Team detail returned by the API */\nexport interface Team {\n uuid: string;\n name: string;\n description?: string | null;\n isActive: boolean;\n leadAgent: TeamLeadAgentData | null;\n members: TeamMemberData[];\n}\n\n/** List options for teams */\nexport interface TeamListOptions extends ListOptions {\n /** Filter by active status */\n isActive?: boolean;\n}\n\n// =============================================================================\n// API CLASS\n// =============================================================================\n\n/**\n * Teams API class\n */\nexport class TeamsAPI extends BaseResourceAPI {\n constructor(http: import('../utils/http.js').HttpClient) {\n super(http, '/api/v1/teams');\n }\n\n /**\n * List all teams in the organization\n */\n async list(options?: TeamListOptions): Promise<PaginatedResponse<Team>> {\n const query: Record<string, string | number | boolean | undefined> = {\n ...this.buildListQuery(options),\n isActive: options?.isActive,\n };\n return this.httpGet<PaginatedResponse<Team>>('', query);\n }\n\n /**\n * Get a single team by UUID\n *\n * @param uuid - Team UUID\n * @param includeMembers - Whether to include team members (default: true)\n */\n async get(uuid: string, includeMembers = true): Promise<Team> {\n return this.httpGet<Team>(`/${uuid}`, { includeMembers });\n }\n}\n","/**\n * Remote Agents Resource API\n *\n * Provides operations for remote agent management and execution:\n * - List: list(), get()\n * - Manage: create(), update(), delete(), deploy()\n * - Execute: execute(), stream()\n */\n\nimport { BaseResourceAPI } from './base.js';\nimport type { HttpClient } from '../utils/http.js';\nimport { generateIdempotencyKey, generateExecutionId } from '../utils/http.js';\nimport type {\n RemoteAgent,\n RemoteAgentListOptions,\n RemoteAgentCreateInput,\n RemoteAgentUpdateInput,\n RemoteAgentExecuteResponse,\n} from '../types/remote-agents.js';\nimport type { PaginatedResponse, ExecuteInput } from '../types/index.js';\nimport type { ExecutionStreamController } from '../streaming/stream-controller.js';\nimport { createExecutionStreamController } from '../streaming/stream-controller.js';\nimport type { AgentExecution } from '../types/agents.js';\nimport type { StreamConfig } from './agents.js';\nimport { executionPath } from '../utils/api-paths.js';\n\n/**\n * Remote Agents API class\n */\nexport class RemoteAgentsAPI extends BaseResourceAPI {\n constructor(http: HttpClient, private readonly getStreamConfig: () => StreamConfig) {\n super(http, '/api/v1/remote-agents');\n }\n\n /**\n * List all remote agents in the organization\n *\n * @param options - List options (pagination, filtering)\n * @returns Paginated list of remote agents\n *\n * @example\n * ```typescript\n * const { data: agents, pagination } = await client.remoteAgents.list({ status: 'active' });\n * ```\n */\n async list(options?: RemoteAgentListOptions): Promise<PaginatedResponse<RemoteAgent>> {\n const query: Record<string, string | number | boolean | undefined> = {\n ...this.buildListQuery(options),\n status: options?.status,\n adapterType: options?.adapterType,\n };\n return this.httpGet<PaginatedResponse<RemoteAgent>>('', query);\n }\n\n /**\n * Get a single remote agent by UUID\n *\n * @param uuid - Remote agent UUID\n * @returns Remote agent details\n */\n async get(uuid: string): Promise<RemoteAgent> {\n return this.httpGet<RemoteAgent>(`/${uuid}`);\n }\n\n /**\n * Create a new remote agent\n *\n * @param data - Remote agent creation input\n * @returns Created remote agent\n */\n async create(data: RemoteAgentCreateInput): Promise<RemoteAgent> {\n return this.httpPost<RemoteAgent>('', data);\n }\n\n /**\n * Update a remote agent\n *\n * @param uuid - Remote agent UUID\n * @param data - Fields to update\n * @returns Updated remote agent\n */\n async update(uuid: string, data: RemoteAgentUpdateInput): Promise<RemoteAgent> {\n return this.httpPatch<RemoteAgent>(`/${uuid}`, data);\n }\n\n /**\n * Delete a remote agent\n *\n * @param uuid - Remote agent UUID\n * @returns Success response\n */\n async delete(uuid: string): Promise<{ success: boolean }> {\n return this.httpDelete<{ success: boolean }>(`/${uuid}`);\n }\n\n /**\n * Deploy a remote agent (make it available for execution)\n *\n * @param uuid - Remote agent UUID\n * @returns Updated remote agent with deployed visibility\n */\n async deploy(uuid: string): Promise<RemoteAgent> {\n return this.httpPost<RemoteAgent>(`/${uuid}/deploy`);\n }\n\n /**\n * Start a remote agent execution (async)\n *\n * Returns immediately with executionId and streamUrl.\n * Use stream() for real-time updates.\n *\n * @param uuid - Remote agent UUID\n * @param input - Execution input (task, context, options)\n * @returns Execution ID and stream URL\n *\n * @example\n * ```typescript\n * const { executionId, streamUrl } = await client.remoteAgents.execute('agent-uuid', {\n * task: 'Process the uploaded dataset',\n * });\n * ```\n */\n async execute(uuid: string, input: ExecuteInput): Promise<RemoteAgentExecuteResponse> {\n // STORY-017: mirror AgentsAPI.execute — an idempotency key + a client-prepared\n // executionId make remote dispatch safe under HttpClient's automatic retries\n // (a timeout/5xx after the server already enqueued must not double-dispatch\n // remote runner work).\n const idempotencyKey = input.options?.idempotencyKey ?? generateIdempotencyKey();\n // STORY-017 (re-review): cadra-web dedupes a duplicate dispatch on the BODY\n // executionId, not the idempotency-key header. Default a stable client UUID so\n // the SDK's automatic retries hit the same row instead of double-dispatching.\n const executionId = input.executionId ?? generateExecutionId();\n return this.httpPost<RemoteAgentExecuteResponse>(\n `/${uuid}/execute`,\n {\n task: input.task,\n context: input.context ?? {},\n attachmentIds: input.attachmentIds,\n options: input.options,\n // Review #10: forward sessionId so multi-turn remote sessions are possible.\n // The cadra-web execute route's Zod schema already accepts sessionId.\n ...(input.sessionId ? { sessionId: input.sessionId } : {}),\n executionId,\n },\n { idempotencyKey }\n );\n }\n\n /**\n * Stream a remote agent execution\n *\n * Returns a StreamController for real-time event handling.\n * IMPORTANT: Do NOT call connect() inside this method — caller must register\n * listeners first, THEN call connect().\n *\n * @param uuid - Remote agent UUID\n * @param input - Execution input\n * @returns Stream controller (caller must call connect() after registering listeners)\n *\n * @example\n * ```typescript\n * const stream = await client.remoteAgents.stream('agent-uuid', {\n * task: 'Process the dataset',\n * });\n *\n * stream.on('log', (log) => console.log(log.title));\n * stream.on('complete', ({ execution }) => console.log(execution.output));\n *\n * await stream.connect();\n * const result = await stream.wait();\n * ```\n */\n async stream(uuid: string, input: ExecuteInput): Promise<ExecutionStreamController> {\n const { executionId } = await this.execute(uuid, input);\n\n const config = this.getStreamConfig();\n const controller = createExecutionStreamController({\n executionId,\n baseUrl: config.baseUrl,\n apiKey: config.apiKey,\n tokenProvider: config.tokenProvider,\n orgId: config.orgId,\n getExecution: (id) => this.http.get<AgentExecution>(executionPath(id)),\n });\n\n // DO NOT call connect() here - caller registers listeners first, then connects\n return controller;\n }\n}\n","/**\n * Remote Runners Resource API\n *\n * Provides operations for remote runner management:\n * - List: list()\n */\n\nimport { BaseResourceAPI } from './base.js';\nimport type {\n RemoteRunner,\n RemoteRunnerListOptions,\n} from '../types/remote-agents.js';\nimport type { PaginatedResponse } from '../types/index.js';\n\n/**\n * Remote Runners API class\n */\nexport class RemoteRunnersAPI extends BaseResourceAPI {\n constructor(http: import('../utils/http.js').HttpClient) {\n super(http, '/api/v1/remote-runners');\n }\n\n /**\n * List all remote runners in the organization\n *\n * @param options - List options (pagination, filtering)\n * @returns Paginated list of remote runners\n *\n * @example\n * ```typescript\n * const { data: runners, pagination } = await client.remoteRunners.list({ status: 'connected' });\n * ```\n */\n async list(options?: RemoteRunnerListOptions): Promise<PaginatedResponse<RemoteRunner>> {\n const query: Record<string, string | number | boolean | undefined> = {\n ...this.buildListQuery(options),\n status: options?.status,\n };\n return this.httpGet<PaginatedResponse<RemoteRunner>>('', query);\n }\n}\n","/**\n * AI Functions API (p93 AIF-010 — specs §9, D27).\n *\n * @example\n * ```typescript\n * // Discover what the org can call, and with which parameters\n * const functions = await client.aiFunctions.list();\n * const fn = await client.aiFunctions.get('summarise_ticket');\n *\n * // Call it — parameters are checked against the live version before sending\n * const result = await client.aiFunctions.run('summarise_ticket', { ticket_text: '…' });\n * if (result.output.type === 'text') console.log(result.output.text);\n * ```\n */\n\nimport {\n AiFunctionChargedError,\n AiFunctionDuplicateError,\n AiFunctionParameterError,\n CadraError,\n} from '../errors/index.js';\nimport type {\n AiFunctionDescriptor,\n AiFunctionParameter,\n AiFunctionParameterIssue,\n AiFunctionRef,\n AiFunctionRun,\n AiFunctionRunOptions,\n AiFunctionRunResult,\n AiFunctionRunShorthandOptions,\n AiFunctionVariables,\n} from '../types/ai-functions.js';\nimport { generateExecutionId, type HttpClient } from '../utils/http.js';\nimport { BaseResourceAPI } from './base.js';\n\n/**\n * How long the client waits for a paid run. It tracks cadra-web\n * `AI_FUNCTION_ROUTE_MAX_MS` (300 s, the Vercel `maxDuration` of the run\n * routes) plus 10 s, so the server always answers first — with the result or\n * with its own `failed_timeout` — and the client never abandons a run the\n * server is still finishing. A larger client-wide `timeout` wins.\n * (Was 60 s, from the old p93 D6 route budget.)\n */\nexport const AI_FUNCTION_RUN_TIMEOUT_MS = 310_000;\n\n/** Descriptors used by the client-side check are cached per client for 60 s (D27c). */\nexport const AI_FUNCTION_DESCRIPTOR_TTL_MS = 60_000;\n\ninterface DescriptorCacheEntry {\n descriptor: AiFunctionDescriptor;\n expiresAt: number;\n}\n\n/**\n * Check `variables` against a descriptor's parameters (D27c). Returns the issues,\n * in parameter order, then unknown names. Empty array = OK.\n */\nexport function checkAiFunctionParameters(\n parameters: AiFunctionParameter[],\n variables: AiFunctionVariables\n): AiFunctionParameterIssue[] {\n const issues: AiFunctionParameterIssue[] = [];\n const declared = new Set<string>();\n\n for (const p of parameters) {\n declared.add(p.name);\n const has = Object.prototype.hasOwnProperty.call(variables, p.name);\n const value = has ? variables[p.name] : undefined;\n\n if (value === undefined || value === null) {\n if (p.required) issues.push({ name: p.name, code: 'missing' });\n continue;\n }\n\n switch (p.type) {\n case 'number':\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n issues.push({ name: p.name, code: 'type' });\n }\n break;\n case 'boolean':\n if (typeof value !== 'boolean') issues.push({ name: p.name, code: 'type' });\n break;\n case 'enum':\n if (typeof value !== 'string') issues.push({ name: p.name, code: 'type' });\n else if (p.options && !p.options.includes(value)) {\n issues.push({ name: p.name, code: 'option' });\n }\n break;\n case 'string':\n case 'text':\n if (typeof value !== 'string') issues.push({ name: p.name, code: 'type' });\n else if (typeof p.maxLength === 'number' && value.length > p.maxLength) {\n issues.push({ name: p.name, code: 'too_long' });\n }\n break;\n case 'image':\n if (typeof value !== 'string') issues.push({ name: p.name, code: 'type' });\n break;\n default:\n // Unknown future type — leave it to the server (the authority).\n break;\n }\n }\n\n for (const name of Object.keys(variables)) {\n if (!declared.has(name)) issues.push({ name, code: 'unknown' });\n }\n\n return issues;\n}\n\n/**\n * AI Functions API\n */\nexport class AiFunctionsAPI extends BaseResourceAPI {\n private readonly descriptorCache = new Map<string, DescriptorCacheEntry>();\n\n constructor(http: HttpClient) {\n super(http, '/api/v1/ai-functions');\n }\n\n /**\n * List the functions this org can call — the index (D27a). Each entry carries\n * the live version's typed parameters; never prompt text.\n */\n async list(): Promise<AiFunctionDescriptor[]> {\n const data = await this.httpGet<{ functions?: AiFunctionDescriptor[] } | AiFunctionDescriptor[]>('');\n const functions = Array.isArray(data) ? data : (data?.functions ?? []);\n for (const d of functions) this.cacheDescriptor(d);\n return functions;\n }\n\n /**\n * Get one function's descriptor by key (D27a).\n * `NotFoundError` (`FUNCTION_NOT_FOUND`) / `ConflictError` (`FUNCTION_NOT_PUBLISHED`).\n */\n async get(functionKey: string): Promise<AiFunctionDescriptor> {\n const data = await this.httpGet<AiFunctionDescriptor | { function: AiFunctionDescriptor }>(\n `/${encodeURIComponent(functionKey)}`\n );\n const descriptor =\n data && typeof data === 'object' && 'function' in data && !('functionKey' in data)\n ? data.function\n : (data as AiFunctionDescriptor);\n this.cacheDescriptor(descriptor, functionKey);\n return descriptor;\n }\n\n /**\n * Read one of this org's own runs (safe projection, §6.5).\n */\n async getRun(executionId: string): Promise<AiFunctionRun> {\n return this.httpGet<AiFunctionRun>(`/runs/${encodeURIComponent(executionId)}`);\n }\n\n /** Forget cached descriptors (one key, or all). */\n clearDescriptorCache(functionKey?: string): void {\n if (functionKey) this.descriptorCache.delete(functionKey);\n else this.descriptorCache.clear();\n }\n\n /**\n * Run an AI function — one paid provider call.\n *\n * - `run('function_key', parameters, opts?)` — shorthand for `{ functionKey }`.\n * - `run({ functionKey | promptUuid | slot }, { variables, version?, idempotencyKey?, params?, validate? })`.\n *\n * For a `functionKey` ref without a pinned `version`, parameters are checked\n * against the live version first (D27c); a problem throws\n * `AiFunctionParameterError` and NO run request is sent. Paid runs are never\n * auto-retried; an idempotency key is generated when omitted.\n *\n * @throws AiFunctionParameterError — client-side check failed (nothing sent)\n * @throws AiFunctionDuplicateError — 409 `DUPLICATE_REQUEST`\n * @throws AiFunctionChargedError — the run was metered but its output failed (`details.charged`)\n */\n async run<TOutput = unknown>(\n functionKey: string,\n parameters: AiFunctionVariables,\n opts?: AiFunctionRunShorthandOptions\n ): Promise<AiFunctionRunResult<TOutput>>;\n async run<TOutput = unknown>(\n ref: AiFunctionRef,\n options: AiFunctionRunOptions\n ): Promise<AiFunctionRunResult<TOutput>>;\n async run<TOutput = unknown>(\n refOrKey: AiFunctionRef | string,\n parametersOrOptions: AiFunctionVariables | AiFunctionRunOptions,\n shorthandOpts?: AiFunctionRunShorthandOptions\n ): Promise<AiFunctionRunResult<TOutput>> {\n let ref: AiFunctionRef;\n let options: AiFunctionRunOptions;\n if (typeof refOrKey === 'string') {\n ref = { functionKey: refOrKey };\n options = { ...(shorthandOpts ?? {}), variables: parametersOrOptions as AiFunctionVariables };\n } else {\n ref = refOrKey;\n options = parametersOrOptions as AiFunctionRunOptions;\n }\n const variables = options.variables ?? {};\n\n const functionKey = 'functionKey' in ref ? ref.functionKey : undefined;\n const shouldCheck =\n functionKey !== undefined && options.version === undefined && options.validate !== false;\n\n if (shouldCheck) {\n const descriptor = await this.getCachedDescriptor(functionKey);\n const issues = checkAiFunctionParameters(descriptor.parameters, variables);\n if (issues.length > 0) {\n throw new AiFunctionParameterError(functionKey, issues);\n }\n }\n\n const body = {\n ref,\n variables,\n version: options.version,\n idempotencyKey: options.idempotencyKey ?? generateExecutionId(),\n params: options.params,\n };\n\n try {\n return await this.httpPost<AiFunctionRunResult<TOutput>>('/run', body, {\n skipRetry: true,\n timeoutMs: Math.max(AI_FUNCTION_RUN_TIMEOUT_MS, this.http.timeoutMs ?? 0),\n });\n } catch (error) {\n throw this.mapRunError(error, functionKey);\n }\n }\n\n // ── internals ──────────────────────────────────────────────────────────────\n\n private cacheDescriptor(descriptor: AiFunctionDescriptor | undefined, key?: string): void {\n if (!descriptor || typeof descriptor !== 'object') return;\n const cacheKey = key ?? descriptor.functionKey;\n if (!cacheKey) return;\n this.descriptorCache.set(cacheKey, {\n descriptor,\n expiresAt: Date.now() + AI_FUNCTION_DESCRIPTOR_TTL_MS,\n });\n }\n\n private async getCachedDescriptor(functionKey: string): Promise<AiFunctionDescriptor> {\n const hit = this.descriptorCache.get(functionKey);\n if (hit && hit.expiresAt > Date.now()) return hit.descriptor;\n return this.get(functionKey);\n }\n\n private mapRunError(error: unknown, functionKey: string | undefined): unknown {\n if (!(error instanceof CadraError)) return error;\n\n if (error.serverCode === 'DUPLICATE_REQUEST') {\n return new AiFunctionDuplicateError(error.message, error.details, error.requestId);\n }\n if (error.details?.charged === true) {\n return new AiFunctionChargedError(error);\n }\n // The server disagreed with our (cached) view of the parameters: the live\n // version probably changed. Drop the descriptor so the next run re-reads it.\n if (functionKey && error.serverCode?.startsWith('VARIABLE_')) {\n this.descriptorCache.delete(functionKey);\n }\n return error;\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, AiFunctionsAPI, ArtifactsAPI, AttachmentsAPI, KanbanAPI, RemoteAgentsAPI, RemoteRunnersAPI, SessionsAPI, SkillsAPI, TeamsAPI, 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 /** Optional fetch implementation — inject `expo/fetch` for React Native streaming. Defaults to global fetch. */\n fetch?: typeof fetch;\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 /** Optional fetch implementation — inject `expo/fetch` for React Native streaming. Defaults to global fetch. */\n fetch?: typeof fetch;\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 /** Optional fetch implementation — inject `expo/fetch` for React Native streaming. Defaults to global fetch. */\n fetch?: typeof fetch;\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 fetch?: typeof fetch;\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 * Attachment operations (upload, confirm, download)\n */\n readonly attachments: AttachmentsAPI;\n\n /**\n * Session operations (list, get, create, message, delete)\n */\n readonly sessions: SessionsAPI;\n\n /**\n * Team operations (list, get)\n */\n readonly teams: TeamsAPI;\n\n /**\n * Kanban operations (board, cards, transitions, card-run stream)\n */\n readonly kanban: KanbanAPI;\n\n /**\n * Remote agent operations (list, get, create, update, delete, deploy, execute, stream)\n */\n readonly remoteAgents: RemoteAgentsAPI;\n\n /**\n * Remote runner operations (list)\n */\n readonly remoteRunners: RemoteRunnersAPI;\n\n /**\n * AI function operations (list, get, run, getRun) — p93\n */\n readonly aiFunctions: AiFunctionsAPI;\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 fetch: options.fetch,\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 fetch: this.config.fetch,\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 fetch: this.config.fetch,\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.attachments = new AttachmentsAPI(this.httpClient);\n this.sessions = new SessionsAPI(this.httpClient, getStreamConfig);\n this.teams = new TeamsAPI(this.httpClient);\n this.kanban = new KanbanAPI(this.httpClient, getStreamConfig);\n this.remoteAgents = new RemoteAgentsAPI(this.httpClient, getStreamConfig);\n this.remoteRunners = new RemoteRunnersAPI(this.httpClient);\n this.aiFunctions = new AiFunctionsAPI(this.httpClient);\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// SSE STREAM RETRY (degrade-don't-detonate)\n// =============================================================================\n\n/**\n * Total time to keep retrying a not-yet-ready run stream before surfacing an\n * error. The chat mints the runId client-side and opens the SSE stream in\n * parallel with the POST that creates the run, so the server's ownership gate\n * can briefly return 404 (\"Agent run not found\") until the run row is visible\n * under cold-start load. Retrying — instead of throwing a terminal banner —\n * lets the stream connect once the row lands.\n */\nconst STREAM_RETRY_WINDOW_MS = 30_000;\n/** Delay between reconnect attempts while a run is not yet ready. */\nconst STREAM_RETRY_DELAY_MS = 500;\n\n/** Stream isn't ready yet (run row not visible) — safe to retry. */\nclass RetriableStreamError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"RetriableStreamError\";\n }\n}\n\n/** Stream failed for a non-transient reason (auth, 4xx/5xx) — stop retrying. */\nclass FatalStreamError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"FatalStreamError\";\n }\n}\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 SSE stream URLs)\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// 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 // P25 — Action 5: forward client-prepared execution UUID.\n executionId: input.executionId,\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 // P25 — Action 5: forward client-prepared execution UUID so cadra-web\n // uses our pre-generated ID instead of minting its own. The caller\n // (useAgentChat.sendMessage) has already opened SSE against this ID\n // in parallel with this HTTP call.\n executionId: input.executionId,\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 // P25 — Action 5: forward client-prepared execution UUID.\n executionId: input.executionId,\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 (delegates to CadraClient.attachments)\n // -------------------------------------------------------------------------\n\n async getUploadUrl(input: UploadUrlInput): Promise<UploadUrlResult> {\n const result = await client.attachments.getUploadUrl({\n filename: input.filename,\n mimeType: input.mimeType,\n size: input.size,\n });\n return {\n attachmentUuid: result.attachmentUuid,\n uploadUrl: result.uploadUrl,\n };\n },\n\n async confirmUpload(uuid: string): Promise<void> {\n await client.attachments.confirm(uuid);\n },\n\n async getDownloadUrl(uuid: string): Promise<string> {\n return client.attachments.getDownloadUrl(uuid);\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 ...(a.thumbnailUrl ? { thumbnailUrl: a.thumbnailUrl } : {}),\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 // Pass through toolCalls so the chat hook can rebuild tool-call UI\n // (e.g. strategy/campaign cards) for historical sessions. Server\n // pairs tool_call + tool_result execution logs into this shape.\n toolCalls: Array.isArray(m.toolCalls)\n ? m.toolCalls.map((tc: any) => ({\n id: String(tc.id),\n name: String(tc.name),\n args: tc.args,\n result: tc.result,\n status: tc.status as\n | \"pending\"\n | \"running\"\n | \"completed\"\n | \"failed\",\n durationMs:\n typeof tc.durationMs === \"number\" ? tc.durationMs : undefined,\n }))\n : undefined,\n // Pass through reconstructed content blocks (text + tool_call refs)\n // so narrated turns replay their interleaved narration on reload. (Fix 2.)\n contentBlocks: Array.isArray(m.contentBlocks) ? m.contentBlocks : undefined,\n })),\n createdAt: history.session.createdAt,\n updatedAt: history.session.lastMessageAt,\n // Resume support: the in-flight execution to reconnect to on reopen.\n activeExecution: (history as { activeExecution?: { id: string; status: string } })\n .activeExecution,\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 // When this subscription began — bounds the not-ready (404) retry loop.\n const connectStartedAt = Date.now();\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 callbacks.onConnectionChange?.(true);\n return;\n }\n const errorText = await response.text().catch(() => \"\");\n // 404 = create/connect race: the runId was minted client-side and\n // this stream opened in parallel with the POST that creates the\n // run, so the server ownership gate can't see the row yet. Retry\n // rather than detonate a terminal \"SSE connection failed: 404\"\n // banner — the stream connects once the row lands.\n if (response.status === 404) {\n throw new RetriableStreamError(\n `run ${executionId} not ready yet (404)`\n );\n }\n throw new FatalStreamError(\n `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 // An abort is intentional teardown — never retry it.\n if (err instanceof Error && err.name === \"AbortError\") {\n throw err;\n }\n callbacks.onConnectionChange?.(false);\n const fatal = err instanceof FatalStreamError;\n const exhausted =\n Date.now() - connectStartedAt >= STREAM_RETRY_WINDOW_MS;\n if (fatal || exhausted) {\n // Surfaced once by the outer catch; throwing stops retrying.\n throw err;\n }\n // Retriable (run-not-ready 404 race or a transient drop):\n // reconnect after a short delay without alarming the UI.\n return STREAM_RETRY_DELAY_MS;\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 /**\n * Callback for progress updates.\n *\n * Fires for `step`, `progress`, `status_update`, and `started` SSE events.\n * `currentStep` is a human-readable label (e.g. \"Loading agent…\", \"Thinking…\")\n * carried by worker init events and used to render a \"thinking pill\" in the\n * empty assistant bubble before any text tokens arrive. See P25 — Action 1.\n */\n onProgress?: (data: {\n iteration?: number;\n tokenUsage?: { prompt: number; completion: number; total: number };\n cost?: number;\n /** Latest human-readable label describing what the agent is doing */\n currentStep?: string;\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 // P25 — Action 1: forward worker-published progress / status_update /\n // started events so the chat hook can populate the streaming\n // message's `currentStep` thinking pill while waiting for the first\n // text_delta. These events were previously silently dropped on the\n // legacy path.\n case \"progress\":\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 currentStep: data.currentStep as string | undefined,\n });\n break;\n\n case \"status_update\":\n onProgress?.({\n // `status_update` events from cadra-api carry the label as\n // `message` (mapped to `progress.currentStep` by the controller).\n // Mirror that here for the legacy path.\n currentStep: (data.currentStep as string | undefined)\n ?? (data.message as string | undefined),\n });\n break;\n\n case \"started\":\n onProgress?.({\n currentStep: data.currentStep as string | 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","/**\n * CAD-243 — decide whether a tool result is a SUCCESS or a FAILURE.\n *\n * Every tool_result handler in useAgentChat used to hard-code\n * `status: \"completed\"`, so a failed tool rendered as a green chip. This is the\n * one place that reads the failure signals a tool result can carry:\n *\n * - producer verdict on the dedicated `tool_result` event: `isError: true` /\n * `status: \"failed\"` (cadra-api, thrown tool calls);\n * - LogCollector `tool_result` log metadata: `success: false` (envelope\n * failure) or `payloadFailure: true` (success envelope, failure payload);\n * - the result payload itself: `{ success: false }` / `{ isError: true }`\n * (older producers, tools that return a failure instead of throwing).\n *\n * Deliberately narrow: an empty or unusual result is a success. Only explicit\n * failure signals count.\n */\n\nexport interface ToolOutcomeInput {\n result?: unknown;\n isError?: unknown;\n status?: unknown;\n success?: unknown;\n payloadFailure?: unknown;\n error?: unknown;\n}\n\nexport interface ToolOutcome {\n status: \"completed\" | \"failed\";\n /** Human-readable error text, only for a failed outcome. */\n error?: string;\n}\n\nconst MAX_ERROR_CHARS = 500;\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction errorFrom(value: unknown): string | undefined {\n if (typeof value === \"string\" && value.trim()) return value;\n const rec = asRecord(value);\n if (rec && typeof rec.message === \"string\" && rec.message.trim()) return rec.message;\n return undefined;\n}\n\nfunction isFailurePayload(result: unknown): boolean {\n const rec = asRecord(result);\n if (!rec) return false;\n return rec.success === false || rec.isError === true;\n}\n\nfunction cap(text: string): string {\n return text.length > MAX_ERROR_CHARS ? `${text.slice(0, MAX_ERROR_CHARS)}…` : text;\n}\n\nexport function resolveToolOutcome(input: ToolOutcomeInput): ToolOutcome {\n const failed =\n input.isError === true ||\n input.status === \"failed\" ||\n input.success === false ||\n input.payloadFailure === true ||\n isFailurePayload(input.result);\n if (!failed) return { status: \"completed\" };\n const error =\n errorFrom(input.error) ?? errorFrom(asRecord(input.result)?.error) ?? \"Tool call failed\";\n return { status: \"failed\", error: cap(error) };\n}\n","/**\n * Session-history cache (Fix 3 — instant chat reopen).\n *\n * Consumers like yobo remount `<AgentChat>` on every navigation back into a\n * session, so a hook-instance cache cannot survive — the cache must live at\n * module scope, mirroring React Query's global QueryClient (which is what\n * makes the cadra-web playground's history load feel instant).\n *\n * `useAgentChat.loadSession` paints from this cache synchronously on a hit\n * (instant), and only hits the network when the entry is missing or stale.\n * When a turn settles, the live message list is written back here so that\n * reopening \"the chat I was just in\" is instant rather than a full fetch.\n *\n * `now` is injectable on every entry point so freshness logic is deterministic\n * in tests without fake timers or Date.now mocking.\n */\nimport type { ChatMessage } from \"../types.js\";\n\n/** Default freshness window — matches the playground's 10s React Query staleTime. */\nexport const DEFAULT_HISTORY_STALE_MS = 10_000;\n\ninterface CacheEntry {\n messages: ChatMessage[];\n fetchedAt: number;\n}\n\nconst cache = new Map<string, CacheEntry>();\n\nexport interface CachedHistoryLookup {\n /** The cached messages — safe to paint immediately. */\n messages: ChatMessage[];\n /** true when within `staleMs`: the caller may skip the network refetch entirely. */\n isFresh: boolean;\n}\n\n/**\n * Look up cached history for a session. Returns `null` on a miss. On a hit the\n * messages are always returned (paint them immediately); `isFresh` tells the\n * caller whether a background revalidation is still needed.\n */\nexport function getCachedHistory(\n sessionId: string,\n staleMs: number = DEFAULT_HISTORY_STALE_MS,\n now: number = Date.now(),\n): CachedHistoryLookup | null {\n const entry = cache.get(sessionId);\n if (!entry) return null;\n return {\n messages: entry.messages,\n isFresh: now - entry.fetchedAt < staleMs,\n };\n}\n\n/** Store (or refresh) the cached history for a session. */\nexport function setCachedHistory(\n sessionId: string,\n messages: ChatMessage[],\n now: number = Date.now(),\n): void {\n cache.set(sessionId, { messages, fetchedAt: now });\n}\n\n/** Drop a single session's cached history (e.g. after an explicit refresh). */\nexport function invalidateCachedHistory(sessionId: string): void {\n cache.delete(sessionId);\n}\n\n/** Clear the entire cache (test hook; also useful on logout/org switch). */\nexport function clearHistoryCache(): void {\n cache.clear();\n}\n","/**\n * Pure helpers for accumulating ordered content blocks during streaming.\n *\n * Used by useAgentChat across all SSE event paths (delta text, snapshot\n * text, tool_call, orphan tool_result) to maintain a single ordered\n * sequence of text segments and tool call references on ChatMessage.\n *\n * All helpers return new arrays — never mutate the input. This preserves\n * React state immutability for downstream setState consumers.\n */\n\nimport type { ContentBlock } from \"../types.js\";\n\n/**\n * Append a text delta to the content blocks array.\n *\n * - Empty delta → returns input unchanged.\n * - Last block is text → extends its content.\n * - Last block is tool_call (or array empty) → opens a new text block.\n *\n * Use for delta SSE paths only (textDelta, response_text, text_chunk).\n * For full-content snapshot paths (llm_response, message,\n * final_response divergent), use `replaceTextSnapshot` instead.\n */\nexport function appendTextDelta(\n blocks: ContentBlock[],\n delta: string\n): ContentBlock[] {\n if (!delta) return blocks;\n const last = blocks[blocks.length - 1];\n if (last?.type === \"text\") {\n const next = blocks.slice(0, -1);\n next.push({ type: \"text\", content: last.content + delta });\n return next;\n }\n return [...blocks, { type: \"text\", content: delta }];\n}\n\n/**\n * Replace the open text block with a full snapshot.\n *\n * Use for SSE event types that emit the FULL current content rather\n * than an incremental delta — `llm_response`, `message`, divergent\n * `final_response`. Wiring `appendTextDelta` to these paths would\n * duplicate content.\n *\n * - Tail is text → replace its content with the snapshot.\n * - Tail is tool_call (or array empty) → open a new text block with\n * the snapshot.\n */\nexport function replaceTextSnapshot(\n blocks: ContentBlock[],\n fullText: string\n): ContentBlock[] {\n const last = blocks[blocks.length - 1];\n if (last?.type === \"text\") {\n const next = blocks.slice(0, -1);\n next.push({ type: \"text\", content: fullText });\n return next;\n }\n return [...blocks, { type: \"text\", content: fullText }];\n}\n\n/**\n * Append a forwarded-narration block (CAD forwarded-narration).\n *\n * Each forwarded specialist narration sentence is its OWN block, attributed to\n * `subagentName`. Never merges into the preceding text block (that would put\n * sub-agent text into `content` and trip `looksLikePlanJson`). Tail-dedups an\n * identical consecutive narration (same content + subagent) so buffer replay\n * or a duplicate publish doesn't double it.\n */\nexport function appendNarrationBlock(\n blocks: ContentBlock[],\n content: string,\n subagentName?: string\n): ContentBlock[] {\n if (!content) return blocks;\n const last = blocks[blocks.length - 1];\n if (\n last?.type === \"narration\" &&\n last.content === content &&\n last.subagentName === subagentName\n ) {\n return blocks;\n }\n return [...blocks, { type: \"narration\", content, subagentName }];\n}\n\n/**\n * Solidify the trailing live streaming-text block into a persistent NATIVE\n * narration block (manus rolling-narration UX).\n *\n * cadra-api emits, per step, BOTH a raw `text_delta` firehose (which streams\n * into a \"live\" text block via {@link appendTextDelta}) AND a discrete, gated\n * `narration` event carrying the same sentence, cleaned. To avoid rendering the\n * sentence twice, the arriving native narration REPLACES the live text block it\n * was streaming into, converting it in place to a `narration` block (no\n * `subagentName` — it's the agent's own line).\n *\n * The step's text block is NOT always the tail: the SAME step's `tool_call`\n * (e.g. update_task_list) is frequently appended AFTER the text but BEFORE the\n * step-finish `narration` event, so the tail is a tool_call. We therefore search\n * BACKWARD for the LAST `text` block and replace THAT (in place, preserving\n * order), rather than only checking the tail — otherwise a step with both text\n * and a tool call renders the sentence twice (a text block + a duplicate\n * narration block). Per-step narration fires in order, and each step's text\n * block is solidified by its own narration before the next, so the last text\n * block is always the current step's line.\n *\n * - A `text` block exists (anywhere near the tail) → replace it in place.\n * - No `text` block, identical native narration at the tail → no-op (replay).\n * - No `text` block at all → append a fresh native narration block.\n *\n * Deliberately does NOT touch `state.content`: the raw text_delta accumulation\n * stays intact for finalization, the `looksLikePlanJson` gate, and history.\n * Short final sentences that never cross the narration gate (<50 chars) are\n * never solidified — their text block survives as the fallback render.\n */\nexport function solidifyTrailingTextAsNarration(\n blocks: ContentBlock[],\n content: string\n): ContentBlock[] {\n if (!content) return blocks;\n // Search backward for the last live text block (the current step's streamed\n // text) — it may sit behind this step's tool_call blocks.\n for (let i = blocks.length - 1; i >= 0; i--) {\n if (blocks[i]!.type === \"text\") {\n const next = blocks.slice();\n next[i] = { type: \"narration\", content };\n return next;\n }\n }\n // No live text to convert. Replay / duplicate-publish guard: identical native\n // narration already present at the tail → no-op.\n const last = blocks[blocks.length - 1];\n if (\n last?.type === \"narration\" &&\n last.content === content &&\n last.subagentName === undefined\n ) {\n return blocks;\n }\n // Nothing to convert (tool_call tail, attributed narration, or empty) →\n // append a fresh native narration block (forwarded-less specialist edge).\n return [...blocks, { type: \"narration\", content }];\n}\n\n/**\n * Keep the trailing live streaming-text block as the TERMINAL ANSWER `text`\n * block (CAD-87 S1-002 — role `terminal_answer`).\n *\n * The closing answer is streamed via `text_delta` into a live `text` block AND\n * (like every gated step) re-emitted as a `narration` event. Unlike an\n * intermediate step, the terminal answer must render as the answer document —\n * a `text` block — NOT be solidified into a `narration` block (which is what the\n * SDK did before it read the role, quirk #2). So this is the terminal-answer\n * counterpart of {@link solidifyTrailingTextAsNarration}: it finds the last live\n * `text` block (the streamed answer) and LEAVES it as text.\n *\n * - Trailing (backward-nearest) `text` block already holds the answer → no-op.\n * - A `text` block holds different content → replace it with the answer text.\n * - No `text` block at all (e.g. a narration-only replay with no live text) →\n * append the answer as a fresh `text` block.\n *\n * Like the narration solidify, this never touches `state.content` (the raw\n * text_delta accumulation stays intact for finalization / history).\n */\nexport function solidifyTrailingTextAsAnswer(\n blocks: ContentBlock[],\n content: string\n): ContentBlock[] {\n if (!content) return blocks;\n for (let i = blocks.length - 1; i >= 0; i--) {\n if (blocks[i]!.type === \"text\") {\n const b = blocks[i] as { type: \"text\"; content: string };\n if (b.content === content) return blocks; // already the answer text\n const next = blocks.slice();\n next[i] = { type: \"text\", content };\n return next;\n }\n }\n // No live text to keep (replay / duplicate-publish guard): identical answer\n // text already at the tail → no-op; otherwise append it as a fresh text block.\n const last = blocks[blocks.length - 1];\n if (last?.type === \"text\" && last.content === content) return blocks;\n return [...blocks, { type: \"text\", content }];\n}\n\n/**\n * Append a tool_call reference block.\n *\n * Idempotent against the tail: if the last block already references\n * this toolCallId, returns the input unchanged. The primary cross-path\n * dedup mechanism in useAgentChat is `seenToolBlockIdsRef: Set<string>`\n * (since tool_call events from log + dedicated paths can interleave\n * with text deltas, defeating tail-only checks). This tail-idempotency\n * is defense-in-depth.\n */\nexport function appendToolCallBlock(\n blocks: ContentBlock[],\n toolCallId: string\n): ContentBlock[] {\n const last = blocks[blocks.length - 1];\n if (last?.type === \"tool_call\" && last.toolCallId === toolCallId) {\n return blocks;\n }\n return [...blocks, { type: \"tool_call\", toolCallId }];\n}\n","/**\n * Pure event-to-state dispatch for content block accumulation.\n *\n * Shared by:\n * - `useAgentChat.ts` handlers — every SSE event is normalized into a\n * `NormalizedEvent` and dispatched through `applyEvent` so production\n * wiring is exercised by test fixtures.\n * - Hook-level fixture tests — `simulate(events)` reduces over the same\n * `applyEvent` function production calls. Branch-misrouting bugs in\n * production show up in tests because both call the same dispatch.\n *\n * Keep this module pure: no React, no refs, no IO. State is a plain\n * value passed in, new state is returned.\n */\n\nimport type { ContentBlock, ToolCall } from \"../types.js\";\nimport type { EventRole } from \"../../types/streaming.js\";\nimport {\n appendTextDelta,\n appendNarrationBlock,\n appendToolCallBlock,\n replaceTextSnapshot,\n solidifyTrailingTextAsNarration,\n solidifyTrailingTextAsAnswer,\n} from \"./contentBlocks.js\";\n\nexport interface ProjectionState {\n blocks: ContentBlock[];\n seenToolBlockIds: Set<string>;\n toolCalls: Map<string, ToolCall>;\n content: string;\n /**\n * CAD-87 S1-003: the `(execId, seq)` dedup ledger. cadra-api stamps a\n * monotonic per-execution `seq` (+ source id) on every published event\n * (S1-001); this set records the keys already applied so a byte-identical\n * REPLAY (the isolated narration buffer re-read on resume) is DROPPED instead\n * of re-appending each pre-pause narration (\"the lump\"). Optional so older\n * `ProjectionState` literals stay valid and un-stamped streams keep today's\n * behavior (see {@link applyEvent}).\n */\n seenEventKeys?: Set<string>;\n}\n\n/**\n * Producer-stamped event identity (CAD-87 S1-001). Carried on every\n * {@link NormalizedEvent} so {@link applyEvent} can dedup a replayed event by\n * `(execId, seq)`. Both are optional: when absent (older producer), dedup is a\n * no-op and the reducer falls back to today's behavior.\n */\nexport interface NormalizedEventIdentity {\n /** Source execution id (event.sourceExecutionId / executionId; child on a\n * forwarded event). */\n execId?: string;\n /** Monotonic per-source sequence stamped by the producer. */\n seq?: number;\n}\n\n/**\n * Normalized event kinds. Raw SSE event handlers translate to these\n * before dispatching. Names reflect semantic intent, not the original\n * event-type string.\n */\nexport type NormalizedEvent = (\n | { kind: \"text_delta\"; delta: string }\n | { kind: \"text_snapshot\"; text: string }\n | { kind: \"text_snapshot_divergent\"; text: string }\n | { kind: \"narration\"; text: string; subagentName?: string; forwarded?: boolean; role?: EventRole }\n | { kind: \"tool_call\"; id: string; name: string; args?: Record<string, unknown> }\n | {\n kind: \"tool_result\";\n id: string;\n result?: unknown;\n durationMs?: number;\n toolName?: string;\n /** CAD-243: terminal status (default \"completed\"); \"failed\" renders red. */\n status?: \"completed\" | \"failed\";\n /** CAD-243: error text for a failed call. */\n error?: string;\n }\n | { kind: \"terminate\" }\n) & NormalizedEventIdentity;\n\n/**\n * Build a ProjectionState seeded from an existing (partially-rendered) assistant\n * message, so a RESUMED stream appends to what's already there instead of\n * wiping it. Used when reopening a session whose latest execution is still\n * in-flight (stream resume): the loaded message carries the narration/tool\n * blocks produced so far; future events continue from this point.\n */\nexport function projectionFromMessage(\n msg: {\n content?: string;\n contentBlocks?: ContentBlock[];\n toolCalls?: ToolCall[];\n },\n /**\n * CAD-87 S1-003: the `(execId, seq)` dedup ledger from the PRE-resume\n * projection. Carried forward so a warm resume / in-flight reconnect still\n * drops the narration-buffer replay (blocks alone don't carry seq). Absent on\n * a cold reopen (empty) — the existing tail-dedup remains the fallback there.\n */\n priorSeenEventKeys?: ReadonlySet<string>\n): ProjectionState {\n const blocks: ContentBlock[] = msg.contentBlocks ? [...msg.contentBlocks] : [];\n const seenToolBlockIds = new Set<string>();\n for (const b of blocks) {\n if (b.type === \"tool_call\") seenToolBlockIds.add(b.toolCallId);\n }\n const toolCalls = new Map<string, ToolCall>();\n for (const tc of msg.toolCalls ?? []) toolCalls.set(tc.id, tc);\n return {\n blocks,\n seenToolBlockIds,\n toolCalls,\n content: msg.content ?? \"\",\n seenEventKeys: new Set(priorSeenEventKeys ?? []),\n };\n}\n\n/**\n * CAD-87 S1-003: `(execId, seq)` dedup wrapper around {@link applyEventInner}.\n *\n * cadra-api stamps a monotonic per-execution `seq` on every published event\n * (S1-001). An event whose `(execId, seq)` was already applied is DROPPED — the\n * byte-identical isolated-narration-buffer replay on resume carries the ORIGINAL\n * seq, so it no longer re-appends each pre-pause narration (\"the lump\"). Robust\n * to older producers: when `seq`/`execId` is absent the key is null and the\n * event dispatches unchanged (today's behavior).\n */\nexport function applyEvent(\n state: ProjectionState,\n event: NormalizedEvent\n): ProjectionState {\n const key =\n event.seq !== undefined && event.execId\n ? `${event.execId}:${event.seq}`\n : null;\n if (key && state.seenEventKeys?.has(key)) {\n // Already applied — a replay / duplicate publish. Drop it idempotently.\n return state;\n }\n const next = applyEventInner(state, event);\n if (!key) return next;\n // Record the identity so a later replay of the SAME (execId, seq) is dropped.\n const seenEventKeys = new Set(state.seenEventKeys ?? []);\n seenEventKeys.add(key);\n return { ...next, seenEventKeys };\n}\n\nfunction applyEventInner(\n state: ProjectionState,\n event: NormalizedEvent\n): ProjectionState {\n switch (event.kind) {\n case \"text_delta\":\n return {\n ...state,\n blocks: appendTextDelta(state.blocks, event.delta),\n content: state.content + event.delta,\n };\n\n case \"text_snapshot\":\n case \"text_snapshot_divergent\":\n // Exact match: no-op. Snapshot already in sync.\n if (event.text === state.content) {\n return state;\n }\n // Prefix extension: Vercel AI SDK multi-step `streamText` produces\n // `llm_response` log events with CUMULATIVE text after each step\n // (step1_text + step2_text). The deltas already gave us step1_text\n // as one block plus step2_text as another. If we replaceTextSnapshot\n // with cumulative text, we'd push it as a NEW block (tail is tool)\n // — user sees step1 text twice (correct first block + duplicate\n // cumulative third block under tools). Treat as a delta of just\n // the new tail content.\n if (state.content && event.text.startsWith(state.content)) {\n const newTail = event.text.slice(state.content.length);\n if (!newTail.trim()) {\n // Only whitespace added — update content but skip block change\n return { ...state, content: event.text };\n }\n return {\n ...state,\n blocks: appendTextDelta(state.blocks, newTail),\n content: event.text,\n };\n }\n // Genuine divergent / replace case\n return {\n ...state,\n blocks: replaceTextSnapshot(state.blocks, event.text),\n content: event.text,\n };\n\n case \"narration\":\n // Manus rolling-narration UX. Every flavour leaves `content` untouched (so\n // narration can never merge into the parent's text and trip the consumer's\n // looksLikePlanJson gate):\n //\n // • FORWARDED specialist narration — a sub-agent's own line during a\n // handoff (its raw text_delta is NOT forwarded to the parent, so\n // there is no trailing live text to dedup against). Append a separate,\n // `subagentName`-attributed block. A forwarded event is never the\n // PARENT's terminal answer, so role is irrelevant here.\n //\n // • NATIVE `terminal_answer` (CAD-87 S1-002) — the closing answer\n // document. It was ALSO streamed via text_delta into the trailing live\n // text block; KEEP that block as `text` (the answer) instead of\n // solidifying it into a narration block. This retires slice-1 quirk #2\n // (the SDK never read `isFinalAnswer`; the final answer used to render\n // as narration). Compat: an un-roled stream never hits this branch and\n // keeps the solidify behavior below.\n //\n // • NATIVE intermediate narration (`user_visible_progress` or no role) —\n // the agent's own gated per-step sentence, also streamed via\n // text_delta. SOLIDIFY that trailing text block in place (text →\n // narration) to dedup.\n if (event.forwarded) {\n return {\n ...state,\n blocks: appendNarrationBlock(state.blocks, event.text, event.subagentName),\n };\n }\n if (event.role === \"terminal_answer\") {\n return {\n ...state,\n blocks: solidifyTrailingTextAsAnswer(state.blocks, event.text),\n };\n }\n return {\n ...state,\n blocks: solidifyTrailingTextAsNarration(state.blocks, event.text),\n };\n\n case \"tool_call\": {\n const blocks = state.seenToolBlockIds.has(event.id)\n ? state.blocks\n : appendToolCallBlock(state.blocks, event.id);\n const seen = new Set(state.seenToolBlockIds);\n seen.add(event.id);\n const toolCalls = new Map(state.toolCalls);\n toolCalls.set(event.id, {\n id: event.id,\n name: event.name,\n args: event.args ?? {},\n status: \"running\",\n startedAt: Date.now(),\n });\n return { ...state, blocks, seenToolBlockIds: seen, toolCalls };\n }\n\n case \"tool_result\": {\n const tc = state.toolCalls.get(event.id);\n const toolCalls = new Map(state.toolCalls);\n if (tc) {\n toolCalls.set(event.id, {\n ...tc,\n status: event.status ?? \"completed\",\n result: event.result,\n durationMs: event.durationMs,\n ...(event.error !== undefined ? { error: event.error } : {}),\n });\n return { ...state, toolCalls };\n }\n // Orphan: synthesize the finished tool + append block (if not seen)\n toolCalls.set(event.id, {\n id: event.id,\n name: event.toolName ?? \"unknown\",\n args: {},\n result: event.result,\n status: event.status ?? \"completed\",\n durationMs: event.durationMs,\n ...(event.error !== undefined ? { error: event.error } : {}),\n });\n if (state.seenToolBlockIds.has(event.id)) {\n return { ...state, toolCalls };\n }\n const seen = new Set(state.seenToolBlockIds);\n seen.add(event.id);\n return {\n ...state,\n toolCalls,\n seenToolBlockIds: seen,\n blocks: appendToolCallBlock(state.blocks, event.id),\n };\n }\n\n case \"terminate\": {\n const toolCalls = new Map(state.toolCalls);\n for (const [id, tc] of toolCalls) {\n if (tc.status === \"running\" || tc.status === \"pending\") {\n toolCalls.set(id, { ...tc, status: \"completed\" });\n }\n }\n return { ...state, toolCalls };\n }\n }\n}\n\n/**\n * Whether a projected event should RESET/HIDE the rolling-narration pill\n * (`currentStep`) — the manus rolling-line phase logic.\n *\n * - Text arrival (`text_delta` / snapshots) HIDES the pill: the streaming text\n * is itself the live indicator.\n * - A `narration` sentence is a PHASE BOUNDARY that resets the rolling line; the\n * next `progress` event re-populates it during the silent wait that follows.\n * - `tool_call` / `tool_result` / `terminate` leave the pill alone so it keeps\n * rolling while work happens (otherwise it would flicker off on every chip).\n *\n * `useAgentChat.dispatchProjection` calls this to decide whether to clear\n * `currentStep`; keeping it here makes the phase decision pure + unit-testable.\n */\nexport function eventClearsRollingStep(event: NormalizedEvent): boolean {\n return (\n event.kind === \"text_delta\" ||\n event.kind === \"text_snapshot\" ||\n event.kind === \"text_snapshot_divergent\" ||\n event.kind === \"narration\"\n );\n}\n\nexport function initialState(): ProjectionState {\n return {\n blocks: [],\n seenToolBlockIds: new Set(),\n toolCalls: new Map(),\n content: \"\",\n seenEventKeys: new Set(),\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 {\n deriveImagesFromToolCalls as sharedDeriveImagesFromToolCalls,\n} from \"../../streaming/extract-images.js\";\nimport {\n isRateLimited,\n getRetryAfterMs,\n nextFailureDelayMs,\n nextIdleDelayMs,\n applyJitter,\n UNNAMED_RATE_LIMIT_WAIT_MS,\n} from \"../../streaming/poll-policy.js\";\nimport type { ExecutionLog } from \"../../types/agents.js\";\nimport type {\n ChatError,\n ChatMessage,\n ClarificationData,\n ContentBlock,\n CurrentStep,\n DelegationEvent,\n ExecutionStreamEvent,\n ImageData,\n ToolCall,\n} from \"../types.js\";\nimport { useExecutionStream } from \"./useExecutionStream.js\";\nimport { resolveToolOutcome } from \"../utils/toolOutcome.js\";\nimport {\n getCachedHistory,\n setCachedHistory,\n DEFAULT_HISTORY_STALE_MS,\n} from \"./history-cache.js\";\nimport {\n applyEvent,\n eventClearsRollingStep,\n initialState as initialProjectionState,\n projectionFromMessage,\n type NormalizedEvent,\n type ProjectionState,\n} from \"../utils/applyEvent.js\";\n\n// =============================================================================\n// DEV-ONLY LOGGING\n// =============================================================================\nconst __DEV__ = typeof process !== \"undefined\" && process.env?.NODE_ENV !== \"production\";\n\n// =============================================================================\n// LEGACY POLLING FALLBACK BUDGET\n// =============================================================================\n// Mirrors the ExecutionStreamController fallback policy. The old loop polled a\n// fixed 2s forever — ~1,800 requests/hour from a single open tab, more than a\n// 1,000/hour API key grants, which exhausted the key and 429'd unrelated\n// features sharing it.\n// =============================================================================\n/** Base delay between fallback polls (ms). A floor, not a fixed period. */\nconst LEGACY_POLL_BASE_INTERVAL_MS = 5_000;\n/** Ceiling the delay backs off to when failing or idle (ms). */\nconst LEGACY_POLL_MAX_INTERVAL_MS = 30_000;\n/** Consecutive non-429 failures before the loop gives up. */\nconst LEGACY_POLL_MAX_FAILURES = 10;\n/** Consecutive 429s before the loop gives up rather than keep spending quota. */\nconst LEGACY_POLL_MAX_RATE_LIMITS = 3;\n/** How long the loop may learn nothing before giving up (ms). */\nconst LEGACY_POLL_MAX_IDLE_MS = 1_800_000;\n/** Longest server-named Retry-After the loop will sit out (ms). */\nconst LEGACY_POLL_MAX_RETRY_AFTER_MS = 300_000;\n/** Positive-only jitter so tabs that fall back together do not re-converge. */\nconst LEGACY_POLL_JITTER_RATIO = 0.1;\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// =============================================================================\n/**\n * Internal/orchestration tools that should never appear in the chat UI.\n * These are silenced at the hook level — they never enter the message state.\n * This is more reliable than render-level filtering in ToolCallList, which\n * only works in \"compact\" verbosity mode.\n */\nconst SILENT_TOOL_NAMES = new Set([\n \"check_delegations\",\n]);\n\n/**\n * Some forwarded events from cadra-api arrive with a UUID (typically the\n * sub-agent execution UUID) set as `toolName` instead of a real tool name.\n * These render as ugly raw-UUID cards in the chat. Filter them out — the\n * underlying handoff/delegation is already represented by a proper\n * handoff_to_agent tool call or a delegation event, so dropping these avoids\n * duplication without losing information.\n */\nconst UUID_REGEX =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nfunction isUuidLikeToolName(name: string | undefined): boolean {\n if (!name) return false;\n return UUID_REGEX.test(name.trim());\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Default optimistic \"currentStep\" label seeded on the streaming placeholder\n * the instant `sendMessage` adds it to the message list. Overwritten by the\n * first real `progress` / `status_update` event, then cleared by the first\n * `text_delta`. Guarantees the user always has something to render within\n * a frame of submitting, regardless of network / backend latency.\n *\n * See P25 (agent execution speed) — Action 2.\n */\nconst DEFAULT_INITIAL_STEP_LABEL = \"Got it. Working on this…\";\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 * Generate a UUID v4 for client-prepared execution IDs.\n *\n * Used by `sendMessage` to mint the executionId synchronously *before*\n * calling `adapter.startExecution`. This lets us open the SSE stream in\n * parallel with the HTTP execute call, removing the 250–1000 ms enqueue\n * round-trip from the perceived-TTFT critical path. See P25 — Action 5.\n *\n * Prefers the platform `crypto.randomUUID()` (available in modern browsers\n * and Node 19+). Falls back to a Math.random-based v4 if missing — this\n * fallback is only present so the SDK doesn't hard-fail in unusual\n * environments; the server still accepts whatever UUID we send.\n */\nfunction generateExecutionId(): string {\n const g = (typeof globalThis !== \"undefined\" ? (globalThis as { crypto?: { randomUUID?: () => string } }) : undefined);\n if (g?.crypto?.randomUUID) {\n return g.crypto.randomUUID();\n }\n // RFC 4122 v4 fallback\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * Derive message.images[] from message.toolCalls[].\n * Single source of truth: images are always extracted from completed tool results.\n *\n * Delegates to the shared `streaming/extract-images.ts` util so non-chat\n * consumers (Node workers, ExecutionStreamController) use the same logic.\n */\nfunction deriveImagesFromToolCalls(toolCalls: ToolCall[] | undefined): ImageData[] {\n return sharedDeriveImagesFromToolCalls(toolCalls);\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 * Freshness window (ms) for the module-level session-history cache.\n * Within this window a reopened session paints from cache with no network\n * fetch; past it, the cached messages are painted immediately and a silent\n * background revalidation runs. Mirrors the playground's React Query\n * staleTime. Default: 10000ms. Set to 0 to always revalidate.\n */\n historyStaleMs?: number;\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 // Fix 2: rehydrate the interleaved narration so a reloaded turn renders\n // via the same contentBlocks path as the live stream (text + tool refs in\n // order), not just the collapsed final output.\n contentBlocks: historyMsg.contentBlocks,\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 historyStaleMs = DEFAULT_HISTORY_STALE_MS,\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\n // Projection state for ordered contentBlocks (text + tool_call refs).\n // Drives the new interleaved render path in ChatMessage.tsx. Updated\n // via shared `applyEvent` dispatch so production wiring is exercised\n // by hook fixture tests in useAgentChat.contentBlocks.test.ts.\n const projectionRef = useRef<ProjectionState>(initialProjectionState());\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 * `currentStep` (the rolling-narration pill) is managed EXPLICITLY, not\n * derived from `content` length. In the manus rolling-narration UX the pill\n * must be able to re-appear AFTER text has landed (during the silent wait\n * between narration blocks). So this setter only clears the pill when\n * `clearStep` is passed — i.e. when NEW TEXT is landing (text_delta /\n * llm_response) or a narration sentence has just solidified (phase boundary).\n * Tool-call / tool-result projection updates must NOT clear it, or the\n * rolling line would flicker off on every chip.\n */\n const updateStreamingMessage = useCallback(\n (content: string, blocks?: ContentBlock[], clearStep?: boolean) => {\n if (!streamingMessageIdRef.current) return;\n\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === streamingMessageIdRef.current\n ? {\n ...msg,\n content,\n ...(blocks !== undefined ? { contentBlocks: blocks } : {}),\n isStreaming: true,\n ...(clearStep ? { currentStep: undefined } : {}),\n }\n : msg\n )\n );\n },\n []\n );\n\n /**\n * Dispatch a normalized event through `applyEvent` and flush the new\n * projection state to React. Used by every SSE event handler that\n * affects contentBlocks or content. Production calls this so the same\n * dispatch tested in useAgentChat.contentBlocks.test.ts runs in real\n * traffic.\n */\n const dispatchProjection = useCallback((event: NormalizedEvent) => {\n const next = applyEvent(projectionRef.current, event);\n projectionRef.current = next;\n streamingContentRef.current = next.content;\n // Text arrival hides the rolling pill (the streaming text is now the live\n // indicator); a narration event is a phase boundary that resets the rolling\n // line (the NEXT progress event re-populates it). Tool-call / tool-result\n // projection updates leave the pill alone so it keeps rolling during work.\n updateStreamingMessage(next.content, next.blocks, eventClearsRollingStep(event));\n }, [updateStreamingMessage]);\n\n /**\n * Update the streaming message's `currentStep` (the rolling-narration pill).\n *\n * Called from `progress` / `status_update` / `started` events. In the manus\n * rolling-narration UX this SETS the label even after text has already\n * streamed — the pill is the \"current activity\" line that rolls during the\n * silent wait between narration blocks (fed, in team mode, by the specialist's\n * FORWARDED progress). Text arrival (dispatchProjection) and narration phase\n * boundaries clear it; this handler re-populates it.\n */\n const setStreamingMessageStep = useCallback((step: CurrentStep) => {\n if (!streamingMessageIdRef.current) return;\n\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === streamingMessageIdRef.current\n ? { ...msg, currentStep: step }\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 // PREFER the locally-streamed text (text_delta accumulator) over `finalOutput`\n // from the execution_complete payload. The streamed text is the authoritative\n // live transcript; the persisted execution.output may be truncated, stale, or\n // empty due to a race between the complete event and the DB persistence step\n // (Vercel AI SDK's streamText emits text deltas in real time but agent-runtime\n // assembles `output` from result.text after the stream loop ends).\n const resolvedContent = streamingContentRef.current || finalOutput || \"\";\n\n // Content-based dedup: check if another non-streaming assistant message\n // already has this content (SSE + polling dual-path race).\n //\n // CAD-243: only THIS turn (messages after the user message that started\n // it) can hold such a duplicate. Scanning the whole thread deleted a\n // legitimate answer that repeated an earlier turn word for word — the\n // common case after a failed tool, whose answer (\"Gmail isn't enabled on\n // this account…\") is identical on every retry — so the new turn showed\n // nothing at all.\n const streamIdx = prev.findIndex((msg) => msg.id === streamMsgId);\n let turnStart = 0;\n for (let i = streamIdx - 1; i >= 0; i--) {\n if (prev[i]!.role === \"user\") {\n turnStart = i + 1;\n break;\n }\n }\n const duplicateExists = resolvedContent && prev.some(\n (msg, idx) =>\n idx >= turnStart &&\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 projectionRef.current = initialProjectionState();\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 // Forwarded sub-agent text-related log events would overwrite the\n // parent's contentBlocks/content with sub-agent payload (e.g., a\n // sub-agent's JSON plan triggers Yobo's `looksLikePlanJson` gate\n // and hides the parent's narration). Skip text-dispatch for those.\n // Tool/delegation events still flow through — sub-agent tool chips\n // need to render on the parent's message.\n const isForwarded = !!log.forwardedFrom;\n const isTextEvent = log.type === \"llm_response\" || log.type === \"message\";\n if (isForwarded && isTextEvent) {\n if (__DEV__) console.log('[useAgentChat] Skipping forwarded text log from sub-agent', log.forwardedFrom, log.type);\n return;\n }\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 // cadra-api emits per-step `llm_response` text (just the current\n // step's text, not cumulative). For contentBlocks we trust the\n // text_delta events — they're authoritative and give us proper\n // per-step text blocks in arrival order. Dispatching a snapshot\n // here would clobber state.content (lose prior steps) and break\n // subsequent prefix-dedup logic. Only update legacy msg.content\n // for backwards-compat consumers that read `message.content`.\n streamingContentRef.current = llmText;\n updateStreamingMessage(llmText, undefined, true);\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 // Same reasoning as llm_response — trust deltas for blocks,\n // only update legacy msg.content here.\n streamingContentRef.current = content;\n updateStreamingMessage(content, undefined, true);\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) || isUuidLikeToolName(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 startedAt: Date.now(),\n };\n\n pendingToolCallsRef.current.set(toolCallId, newToolCall);\n updateToolCall(newToolCall);\n dispatchProjection({\n kind: 'tool_call',\n id: toolCallId,\n name: toolName,\n args,\n });\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) || isUuidLikeToolName(resultToolName)) break;\n\n const resultToolCallId = log.metadata?.toolCallId as string;\n const result = log.metadata?.output;\n const durationMs = log.durationMs;\n // CAD-243: a failed tool (log `success:false` / failure payload) is\n // FAILED, not a green \"completed\".\n const outcome = resolveToolOutcome({\n result,\n success: log.metadata?.success,\n payloadFailure: log.metadata?.payloadFailure,\n isError: log.metadata?.isError,\n error: log.metadata?.error,\n });\n const outcomeFields = {\n status: outcome.status,\n ...(outcome.error ? { error: outcome.error } : {}),\n };\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 ...outcomeFields,\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 ...outcomeFields,\n durationMs,\n };\n updateToolCall(lateToolCall);\n }\n if (resultToolCallId) {\n dispatchProjection({\n kind: 'tool_result',\n id: resultToolCallId,\n toolName: resultToolName,\n result,\n durationMs,\n ...outcomeFields,\n });\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 // Per-step snapshot — trust text_delta for contentBlocks.\n // Only update legacy msg.content for backwards-compat consumers.\n // (Snapshot dispatch would clobber accumulated state.content\n // and break prefix-dedup for subsequent steps.)\n streamingContentRef.current = llmText;\n updateStreamingMessage(llmText, undefined, true);\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 // Same reasoning as llm_response — trust deltas, only update\n // legacy msg.content.\n streamingContentRef.current = content;\n updateStreamingMessage(content, undefined, true);\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 if (text) {\n dispatchProjection({ kind: 'text_delta', delta: text });\n }\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) || isUuidLikeToolName(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 startedAt: Date.now(),\n };\n\n pendingToolCallsRef.current.set(toolCallId, newToolCall);\n updateToolCall(newToolCall);\n dispatchProjection({\n kind: 'tool_call',\n id: toolCallId,\n name: toolName,\n args,\n });\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) || isUuidLikeToolName(resultToolName)) break;\n\n const resultToolCallId = log.metadata?.toolCallId as string;\n const result = log.metadata?.output;\n const durationMs = log.durationMs;\n // CAD-243: a failed tool (log `success:false` / failure payload) is\n // FAILED, not a green \"completed\".\n const outcome = resolveToolOutcome({\n result,\n success: log.metadata?.success,\n payloadFailure: log.metadata?.payloadFailure,\n isError: log.metadata?.isError,\n error: log.metadata?.error,\n });\n const outcomeFields = {\n status: outcome.status,\n ...(outcome.error ? { error: outcome.error } : {}),\n };\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 ...outcomeFields,\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 ...outcomeFields,\n durationMs,\n };\n updateToolCall(lateToolCall);\n }\n // Update contentBlocks projection — matched path updates tool\n // state in-place; orphan path appends a tool block (gated by\n // seenToolBlockIds inside applyEvent).\n if (resultToolCallId) {\n dispatchProjection({\n kind: 'tool_result',\n id: resultToolCallId,\n toolName: resultToolName,\n result,\n durationMs,\n ...outcomeFields,\n });\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 // Divergent: server-corrected final differs from streamed\n // deltas. Sync blocks so they don't render stale text.\n dispatchProjection({ kind: 'text_snapshot_divergent', text: 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 // P25 — Action 1: render `progress` / `status_update` / `started`\n // labels in the streaming bubble's thinking pill.\n onProgress: (data) => {\n if (data.currentStep) {\n setStreamingMessageStep({\n label: data.currentStep,\n updatedAt: Date.now(),\n });\n }\n },\n });\n\n // =========================================================================\n // LEGACY POLLING FALLBACK (only for legacy SSE path)\n // =========================================================================\n // A self-rescheduling timeout rather than a fixed interval — the delay has to\n // change between ticks so this loop can honour a 429 and back off. Same policy\n // as the stream controller's fallback (see streaming/poll-policy.ts): one open\n // tab must not be able to spend an API key's whole hourly quota and 429 every\n // other feature sharing it.\n const pollingTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const pollingExecutionIdRef = useRef<string | null>(null);\n const pollDelayRef = useRef(0);\n const pollFailuresRef = useRef(0);\n const pollRateLimitsRef = useRef(0);\n const pollLastProgressRef = useRef(0);\n const pollLastStatusRef = useRef<string | null>(null);\n\n const stopPolling = useCallback(() => {\n if (pollingTimeoutRef.current) {\n clearTimeout(pollingTimeoutRef.current);\n pollingTimeoutRef.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 const baseDelayMs = pollingInterval ?? LEGACY_POLL_BASE_INTERVAL_MS;\n pollDelayRef.current = baseDelayMs;\n pollFailuresRef.current = 0;\n pollRateLimitsRef.current = 0;\n pollLastProgressRef.current = Date.now();\n pollLastStatusRef.current = null;\n\n if (__DEV__) console.log('[useAgentChat] Starting polling fallback for:', executionId);\n\n const schedule = (delayMs: number) => {\n if (pollingExecutionIdRef.current !== executionId) return;\n pollingTimeoutRef.current = setTimeout(() => {\n pollingTimeoutRef.current = null;\n void poll();\n }, Math.max(0, Math.round(delayMs)));\n };\n\n const giveUp = (message: string) => {\n if (__DEV__) console.warn('[useAgentChat] Polling gave up:', message);\n stopPolling();\n handleError(message);\n };\n\n const poll = async () => {\n if (pollingExecutionIdRef.current !== executionId) return;\n\n // Bound on IDLENESS: a loop re-reading the same unchanged status will not\n // learn anything, and must not outlive the tab.\n if (Date.now() - pollLastProgressRef.current >= LEGACY_POLL_MAX_IDLE_MS) {\n giveUp(\"Lost the live connection and stopped receiving updates for this run\");\n return;\n }\n\n try {\n const execution = await adapter.getExecution(executionId);\n pollFailuresRef.current = 0;\n pollRateLimitsRef.current = 0;\n\n if (execution.status !== pollLastStatusRef.current) {\n pollLastStatusRef.current = execution.status;\n pollLastProgressRef.current = Date.now();\n pollDelayRef.current = baseDelayMs;\n } else {\n // Nothing new — decay toward the ceiling so a forgotten tab is cheap.\n pollDelayRef.current = nextIdleDelayMs(pollDelayRef.current, LEGACY_POLL_MAX_INTERVAL_MS);\n }\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 return;\n }\n if (execution.status === \"failed\") {\n if (__DEV__) console.log('[useAgentChat] Polling: execution failed');\n stopPolling();\n handleError(execution.error || \"Execution failed\");\n return;\n }\n } catch (err) {\n const retryAfterMs = getRetryAfterMs(err);\n\n if (isRateLimited(err) || retryAfterMs !== null) {\n pollRateLimitsRef.current++;\n const resetTooFarOut = retryAfterMs !== null && retryAfterMs > LEGACY_POLL_MAX_RETRY_AFTER_MS;\n if (resetTooFarOut || pollRateLimitsRef.current >= LEGACY_POLL_MAX_RATE_LIMITS) {\n giveUp(\"Rate limited by the API — stopped polling for updates on this run\");\n return;\n }\n // Never sooner than the server asked; a 429 with no reset named means\n // a quota window, which is minutes wide.\n pollDelayRef.current = Math.max(retryAfterMs ?? UNNAMED_RATE_LIMIT_WAIT_MS, pollDelayRef.current);\n } else {\n pollFailuresRef.current++;\n if (__DEV__) console.warn('[useAgentChat] Polling error (will retry):', err);\n if (pollFailuresRef.current >= LEGACY_POLL_MAX_FAILURES) {\n giveUp(\"Lost connection to the agent — stopped polling for updates on this run\");\n return;\n }\n pollDelayRef.current = nextFailureDelayMs(pollDelayRef.current, LEGACY_POLL_MAX_INTERVAL_MS);\n }\n }\n\n schedule(applyJitter(pollDelayRef.current, LEGACY_POLL_JITTER_RATIO));\n };\n\n void poll();\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) || isUuidLikeToolName(toolName)) return;\n\n // Skip if the log path has already processed BOTH the tool_call AND\n // tool_result for this id. The log handler deletes the entry from\n // pendingToolCallsRef on completion, so a missing pending entry +\n // already-fired result means the tool is fully done — recreating a\n // \"running\" entry here would wipe the completed result (and any\n // attached images) from the message state.\n if (firedToolResultsRef.current.has(toolCallId)) 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 startedAt: Date.now(),\n };\n pendingToolCallsRef.current.set(toolCallId, newToolCall);\n updateToolCall(newToolCall);\n dispatchProjection({\n kind: 'tool_call',\n id: toolCallId,\n name: toolName,\n args: data.inputs as Record<string, unknown> | undefined,\n // CAD-87 S1-003: (execId, seq) reducer dedup for replayed events.\n execId: data.sourceExecutionId,\n seq: data.seq,\n });\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) || isUuidLikeToolName(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 finished via log event path\n const existing = pendingToolCallsRef.current.get(toolCallId);\n if (existing && (existing.status === \"completed\" || existing.status === \"failed\")) return;\n\n // CAD-243: the producer stamps `isError`/`status:'failed'` on a failed\n // call; older producers are read from the result shape.\n const outcome = resolveToolOutcome({\n result: data.result,\n isError: data.isError,\n status: data.status,\n error: data.error,\n });\n const outcomeFields = {\n status: outcome.status,\n ...(outcome.error ? { error: outcome.error } : {}),\n };\n\n if (existing) {\n const completedToolCall: ToolCall = {\n ...existing,\n result: data.result,\n ...outcomeFields,\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 ...outcomeFields,\n durationMs: data.durationMs,\n };\n updateToolCall(lateToolCall);\n }\n // Update contentBlocks projection — matched path updates the\n // existing block's tool state; orphan path appends a tool block\n // (gated by seenToolBlockIds inside applyEvent).\n dispatchProjection({\n kind: 'tool_result',\n id: toolCallId,\n toolName,\n result: data.result,\n durationMs: data.durationMs,\n ...outcomeFields,\n // CAD-87 S1-003: (execId, seq) reducer dedup for replayed events.\n execId: data.sourceExecutionId,\n seq: data.seq,\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 // P25 — Action 1: surface `started` / `progress` / `status_update`\n // events as a thinking-pill label on the streaming message. The stream\n // controller already maps both `progress` and `status_update` SSE\n // events to the 'progress' callback (see stream-controller.ts).\n // `started` carries an optional `currentStep` too.\n controller.on('started', (data) => {\n if (data.currentStep) {\n setStreamingMessageStep({\n label: data.currentStep,\n updatedAt: Date.now(),\n });\n }\n });\n\n controller.on('progress', (data) => {\n if (data.currentStep) {\n setStreamingMessageStep({\n label: data.currentStep,\n updatedAt: Date.now(),\n // Attribute the rolling line to the specialist when this progress\n // was FORWARDED from a sub-agent during a handoff.\n subagentName: data.subagentName,\n });\n }\n });\n\n controller.on('textDelta', (data) => {\n // Skip sub-agent forwarded text — would contaminate parent message\n // contentBlocks. Sub-agent narration belongs to its own execution.\n // forwardedFrom is set by stream-controller from wire field\n // `_forwardedFrom` (added by cadra-api subscribeAndForwardEvents).\n if (data.forwardedFrom) return;\n dispatchProjection({\n kind: 'text_delta',\n delta: data.delta,\n // CAD-87 S1-003: (execId, seq) reducer dedup for replayed events.\n execId: data.sourceExecutionId,\n seq: data.seq,\n });\n });\n\n controller.on('narration', (data) => {\n // Manus rolling-narration UX. Every narration event drives a PERSISTENT\n // narration block AND is a phase boundary that resets the rolling pill\n // (dispatchProjection clears currentStep for narration; the next\n // progress event re-populates it). Two flavours:\n //\n // • NATIVE (no forwardedFrom) — the agent's own gated per-step\n // sentence, also streamed via text_delta. applyEvent SOLIDIFIES the\n // trailing live text block into a narration block (dedup).\n // • FORWARDED (forwardedFrom set) — a specialist's line during a\n // handoff (its text_delta is not forwarded). Appended as a separate\n // subagent-attributed block.\n //\n // Neither touches `content` (so it can't trip looksLikePlanJson).\n if (!data.text || !data.text.trim()) return;\n dispatchProjection({\n kind: 'narration',\n text: data.text,\n subagentName: data.subagentName,\n forwarded: !!data.forwardedFrom,\n // CAD-87 S1-002: the producer role — a NATIVE `terminal_answer`\n // renders the closing answer as a text block, not a narration block\n // (the SDK no longer needs isFinalAnswer, which it never read).\n role: data.role,\n // CAD-87 S1-003: (execId, seq) reducer dedup — the resume narration\n // buffer replays carry the ORIGINAL seq, so this drops them (no lump).\n execId: data.sourceExecutionId,\n seq: data.seq,\n });\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, setStreamingMessageStep, 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 // P25 — Action 5: pre-generate the execution UUID so we can open SSE in\n // parallel with the startExecution HTTP call. The server uses this exact\n // UUID for the new execution row (see cadra-web executions-router).\n const preparedExecutionId = generateExecutionId();\n\n // Add placeholder assistant message.\n //\n // P25 — Action 2: seed `currentStep` with a default optimistic label so\n // consumers always have something to render the instant the user\n // submits. Overwritten by the first real `progress` / `status_update`\n // event; cleared by the first `text_delta`.\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 currentStep: {\n label: DEFAULT_INITIAL_STEP_LABEL,\n updatedAt: Date.now(),\n },\n };\n\n setMessages((prev) => [...prev, assistantMessage]);\n streamingMessageIdRef.current = assistantMessageId;\n streamingContentRef.current = \"\";\n projectionRef.current = initialProjectionState();\n completedRef.current = false;\n finalizedRef.current = false;\n\n if (__DEV__) console.log('[useAgentChat] Starting execution...', {\n agentId,\n sessionId: currentSessionId,\n preparedExecutionId,\n });\n\n // P25 — Action 5: open the SSE stream IMMEDIATELY against the\n // pre-generated executionId, before the HTTP execute call resolves.\n // The server-side stream route accepts connections for not-yet-created\n // execution rows (it subscribes to the Redis channel by ID), so events\n // published by the worker the moment the job runs will land in our\n // controller.\n //\n // Legacy path can't pre-open (useExecutionStream is driven by\n // currentExecutionId state and uses adapter.getStreamUrl which assumes\n // the row exists), so we keep the await-then-connect order there.\n // p35 Option 1 (serialize): open the SSE stream only AFTER startExecution\n // resolves, against the server-confirmed executionId. cadra-web inserts the\n // agent_executions row before the 202 returns (p35 §6 \"Q2 invariant\"), so\n // the stream's ownership gate always finds the row — eliminating the\n // create/connect 404 race the old parallel pre-open used to hit. The\n // optimistic assistant placeholder above already gives instant local\n // feedback; only the token stream attaches ~1 RTT later. Worker events\n // published during that window are buffered + replayed by the server route\n // on connect, so none are lost.\n try {\n const result = await adapter.startExecution({\n agentId,\n teamId,\n sessionId: currentSessionId ?? undefined,\n content: content.trim(),\n attachmentUuids,\n // Pass our pre-generated ID so the server persists the run under it;\n // adapters/servers that ignore it still work — we open against the\n // authoritative `result.executionId` below.\n executionId: preparedExecutionId,\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 // Open the stream now, against the resolved executionId. Both the\n // controller path and the legacy state-driven path key off this id.\n if (useStreamController) {\n connectStreamController(\n result.executionId,\n result.sessionId || currentSessionId || undefined\n );\n } else if (__DEV__) {\n console.log('[useAgentChat] Setting executionId:', result.executionId);\n }\n setCurrentExecutionId(result.executionId);\n } catch (err) {\n console.error('[useAgentChat] Error starting execution:', err);\n // Tear down any pre-opened controller so we don't hang on a stream\n // for an execution that will never run.\n if (useStreamController && streamControllerRef.current) {\n streamControllerRef.current.cancel();\n streamControllerRef.current = null;\n }\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 // Fix 3: paint from the module-level cache immediately. A fresh hit\n // skips the network entirely; a stale hit paints the cached view, then\n // revalidates silently below (no loading spinner over usable content).\n const cached = getCachedHistory(sessionId, historyStaleMs);\n if (cached) {\n setMessages(cached.messages);\n setCurrentSessionId(sessionId);\n setIsLoadingHistory(false);\n if (cached.isFresh) return;\n } else {\n setIsLoadingHistory(true);\n }\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: [\n artifact.thumbnailUrl\n ? { url: artifact.url, thumbnailUrl: artifact.thumbnailUrl }\n : { url: artifact.url },\n ],\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 // Symptom #3 — resume the live stream when the latest execution is\n // still in-flight, so a reopened in-progress chat keeps receiving events\n // instead of looking dead. Only the stream-controller path supports it.\n const active = history.activeExecution;\n const resumable =\n useStreamController &&\n !!active &&\n active.status !== \"waiting_user_input\"; // paused → clarification, not a live stream\n\n if (resumable && active) {\n // Target the latest assistant message (the in-flight turn). If none was\n // persisted yet (execution just started, no logs), append a fresh\n // streaming placeholder so events have somewhere to land.\n let targetIdx = -1;\n for (let i = loadedMessages.length - 1; i >= 0; i--) {\n if (loadedMessages[i]!.role === \"assistant\") { targetIdx = i; break; }\n }\n if (targetIdx === -1) {\n const placeholder: ChatMessage = {\n id: generateId(),\n role: \"assistant\",\n content: \"\",\n timestamp: new Date(),\n isStreaming: true,\n toolCalls: [],\n currentStep: { label: DEFAULT_INITIAL_STEP_LABEL, updatedAt: Date.now() },\n };\n loadedMessages.push(placeholder);\n streamingMessageIdRef.current = placeholder.id;\n projectionRef.current = initialProjectionState();\n streamingContentRef.current = \"\";\n } else {\n const target = loadedMessages[targetIdx]!;\n loadedMessages[targetIdx] = { ...target, isStreaming: true };\n streamingMessageIdRef.current = target.id;\n // CAD-87 S1-003: carry the (execId, seq) dedup ledger from the\n // pre-resume projection into the rehydrated one, so the isolated\n // narration-buffer replay that follows the reconnect is dropped by\n // seq (blocks alone don't carry it) instead of re-appending — no\n // \"narration lump\". Cold reopen (fresh ref) starts empty; the\n // existing tail-dedup remains the fallback there.\n projectionRef.current = projectionFromMessage(\n target,\n projectionRef.current?.seenEventKeys\n );\n streamingContentRef.current = target.content ?? \"\";\n }\n completedRef.current = false;\n finalizedRef.current = false;\n }\n\n // Fix 3: cache settled history for instant reopen — but NEVER a live\n // (in-flight) session; caching a snapshot would make a later reopen skip\n // the fetch + resume and look dead again.\n if (!active) setCachedHistory(sessionId, loadedMessages);\n\n setMessages(loadedMessages);\n setCurrentSessionId(sessionId);\n\n // Connect AFTER messages are in state so resumed events attach to the\n // streaming target message.\n if (resumable && active) {\n connectStreamController(active.id, sessionId);\n setCurrentExecutionId(active.id);\n }\n } catch (err) {\n // If we already painted from cache, keep that usable view rather than\n // flashing an error over it — the stale data stands until a later load.\n if (!cached) {\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 }\n } finally {\n setIsLoadingHistory(false);\n }\n },\n [adapter, onError, historyStaleMs, useStreamController, connectStreamController]\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 // Fix 3: keep the history cache in sync with the live view. Once a turn has\n // settled (nothing streaming), write the current messages back so reopening\n // \"the chat I was just in\" paints instantly instead of doing a full fetch.\n useEffect(() => {\n if (!currentSessionId) return;\n if (messages.length === 0) return;\n if (messages.some((m) => m.isStreaming)) return; // only cache settled state\n setCachedHistory(currentSessionId, messages);\n }, [currentSessionId, messages]);\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 * Callback fired on every keystroke with the current input value.\n * Useful for triggering inline UI like @-mention popovers or slash-command menus.\n */\n onInputChange?: (value: string) => void;\n /**\n * Imperatively set the input value from a parent (e.g. after a mention is\n * selected from a popover). Provided as a callback ref-style setter via\n * onInputControlReady.\n */\n onInputControlReady?: (control: {\n setValue: (value: string) => void;\n focus: () => void;\n getTextarea: () => HTMLTextAreaElement | null;\n }) => void;\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 onInputChange,\n onInputControlReady,\n}: ChatInputProps) {\n const [content, setContent] = useState(\"\");\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n // Expose imperative control to parent (set value, focus). Used for inline\n // mention/slash-command popovers that need to mutate the textarea content\n // when the user selects an item.\n useEffect(() => {\n if (!onInputControlReady) return;\n onInputControlReady({\n setValue: (value: string) => {\n setContent(value);\n onInputChange?.(value);\n },\n focus: () => {\n textareaRef.current?.focus();\n },\n getTextarea: () => textareaRef.current,\n });\n }, [onInputControlReady, onInputChange]);\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) => {\n setContent(e.target.value);\n onInputChange?.(e.target.value);\n }}\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","/**\n * Pure helpers for elapsed-time computation and duration formatting.\n *\n * Extracted from ElapsedTimer component so the math is unit-testable\n * without React. The component becomes a thin shell around these\n * functions; interval registration/cleanup is verified via manual\n * smoke (per v1 trade-off documented in spec — no RTL in repo yet).\n */\n\n/**\n * Compute elapsed seconds since a startedAt epoch ms timestamp.\n * Returns `floor((now - startedAt) / 1000)`.\n *\n * `now` defaults to `Date.now()`; pass explicit values in tests to\n * avoid wall-clock dependency.\n */\nexport function computeElapsedSeconds(\n startedAt: number,\n now: number = Date.now()\n): number {\n return Math.floor((now - startedAt) / 1000);\n}\n\n/**\n * Format a completed duration in milliseconds as rounded seconds with\n * a trailing \"s\" (e.g. `1499 → \"1s\"`, `1500 → \"2s\"`, `0 → \"0s\"`).\n */\nexport function formatCompletedDuration(durationMs: number): string {\n return `${Math.round(durationMs / 1000)}s`;\n}\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 { useEffect, 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 { computeElapsedSeconds } from \"../utils/elapsed.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 */\n/**\n * Maps HTTP methods + resource context to human-readable action verbs.\n */\nconst HTTP_METHOD_VERBS: Record<string, string> = {\n post: \"Creating\",\n get: \"Fetching\",\n put: \"Updating\",\n patch: \"Updating\",\n delete: \"Deleting\",\n list: \"Listing\",\n};\n\nfunction formatToolName(toolName: string): string {\n if (!toolName) return toolName;\n\n // Handle dot-separated names like \"Merchant Products.post /products\"\n // or \"Create Ad Images.create Ad Images\"\n if (toolName.includes(\".\")) {\n const [toolPart, actionPart] = toolName.split(\".\", 2);\n const trimmedAction = actionPart?.trim() || \"\";\n\n // Detect \"method /path\" pattern (e.g., \"post /products\", \"get /products/{id}\")\n const methodPathMatch = trimmedAction.match(/^(get|post|put|patch|delete)\\s+\\/(.+)/i);\n if (methodPathMatch) {\n const method = methodPathMatch[1]!.toLowerCase();\n const path = methodPathMatch[2]!;\n const verb = HTTP_METHOD_VERBS[method] || method;\n\n // Extract resource name from path: \"/products/{id}\" → \"Product\", \"/products\" → \"Product\"\n const firstSegment = path.split(\"/\")[0]?.replace(/\\{.*\\}/, \"\").trim();\n if (firstSegment) {\n // Singularize simple plurals and title-case\n const resource = firstSegment.endsWith(\"s\") && firstSegment.length > 3\n ? firstSegment.slice(0, -1)\n : firstSegment;\n return `${verb} ${resource.charAt(0).toUpperCase() + resource.slice(1)}`;\n }\n return `${verb} ${toolPart?.trim() || \"\"}`.trim();\n }\n\n // Non-method pattern: deduplicate segments\n const segments = toolName.split(\".\");\n const uniqueSegments = segments.filter(\n (seg, idx) =>\n idx === 0 ||\n seg.toLowerCase().trim() !== segments[idx - 1]?.toLowerCase().trim()\n );\n const bestSegment = uniqueSegments[uniqueSegments.length - 1]?.trim() || toolName;\n if (bestSegment.includes(\" \")) return bestSegment;\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 * ElapsedTimer — live seconds counter for running tool calls.\n *\n * Reads from `computeElapsedSeconds` (pure helper, unit-tested in\n * elapsed.test.ts). Component is a thin shell: useState seeded from\n * the helper at mount, setInterval re-reads the helper every 1s,\n * cleanup clears the interval on unmount or startedAt change.\n */\nfunction ElapsedTimer({ startedAt }: { startedAt: number }) {\n const [elapsed, setElapsed] = useState(() => computeElapsedSeconds(startedAt));\n useEffect(() => {\n const id = setInterval(() => {\n setElapsed(computeElapsedSeconds(startedAt));\n }, 1000);\n return () => clearInterval(id);\n }, [startedAt]);\n return (\n <span className=\"ml-auto text-xs text-gray-500 dark:text-gray-400 flex-shrink-0\">\n {elapsed}s\n </span>\n );\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 {/* Live elapsed timer (running) */}\n {toolCall.status === \"running\" && toolCall.startedAt !== undefined && (\n <ElapsedTimer startedAt={toolCall.startedAt} />\n )}\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, ContentBlock, 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 * Defensive render guard: a narration block must never carry raw plan JSON.\n * The producer (cadra-api) already gates narration to non-JSON-leading text,\n * but keep a client guard so a stray structured blob never renders as a\n * narration line. Mirrors the consumer `looksLikePlanJson` heuristic\n * (JSON-leading body with several `\"key\":` pairs).\n */\nfunction narrationLooksLikeRawJson(content: string): boolean {\n const trimmed = content.trimStart();\n const first = trimmed[0];\n if (first !== \"{\" && first !== \"[\") return false;\n const keyMatches = trimmed.match(/\"[a-zA-Z_][a-zA-Z0-9_]*\"\\s*:/g);\n return keyMatches !== null && keyMatches.length >= 5;\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 /** Hide avatar icons — useful when role distinction is handled by background color alone */\n hideAvatars?: boolean;\n /** Display name for the assistant role. Defaults to \"Assistant\". Pass empty string \"\" to hide the label. */\n agentName?: string;\n /**\n * Suppress the agent-name / role header row entirely while an assistant\n * message is still streaming and has no meaningful content yet (no tool\n * calls visible and trimmed text length <= ~40 chars).\n *\n * Use this to avoid a \"name flicker\" when an external progress pill is\n * already covering the empty-bubble state — the header would otherwise\n * flash for a few hundred ms before the first text token lands.\n *\n * Default `false` (existing behavior: always render header).\n * P25 STORY-006.\n */\n hideHeaderWhileEmpty?: boolean;\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// INTERLEAVED CONTENT — text + tool_call blocks in natural emission order\n// =============================================================================\n\ninterface InterleavedContentProps {\n blocks: ContentBlock[];\n toolCalls: ToolCall[];\n toolCallVerbosity: ToolCallVerbosity;\n showToolCalls: boolean;\n showImages: boolean;\n enableMarkdown: boolean;\n isFlat: boolean;\n isUser: boolean;\n isAssistant: boolean;\n markdownComponents?: ChatMessageProps[\"markdownComponents\"];\n markdownUrlTransform?: ChatMessageProps[\"markdownUrlTransform\"];\n markdownContentTransform?: ChatMessageProps[\"markdownContentTransform\"];\n onImageClick?: ChatMessageProps[\"onImageClick\"];\n renderToolCall?: ChatMessageProps[\"renderToolCall\"];\n}\n\nfunction InterleavedContent({\n blocks,\n toolCalls,\n toolCallVerbosity,\n showToolCalls,\n showImages: _showImages,\n enableMarkdown,\n isFlat,\n isUser,\n isAssistant,\n markdownComponents,\n markdownUrlTransform,\n markdownContentTransform,\n onImageClick,\n renderToolCall,\n}: InterleavedContentProps) {\n const toolCallsById = useMemo(\n () => Object.fromEntries(toolCalls.map((tc) => [tc.id, tc])),\n [toolCalls]\n );\n\n return (\n <div className=\"space-y-2\">\n {blocks.map((block, i) => {\n if (block.type === \"text\") {\n if (!block.content) return null;\n if (isFlat) {\n return (\n <div\n key={`text-${i}`}\n className={cn(\n \"text-sm break-words\",\n !(isAssistant && enableMarkdown) && \"whitespace-pre-wrap\"\n )}\n style={{ color: \"var(--chat-content-text, inherit)\" }}\n >\n {isAssistant && enableMarkdown ? (\n <MarkdownContent\n content={block.content}\n components={markdownComponents}\n urlTransform={markdownUrlTransform}\n contentTransform={markdownContentTransform}\n />\n ) : (\n <p className=\"whitespace-pre-wrap\">{block.content}</p>\n )}\n </div>\n );\n }\n return (\n <div\n key={`text-${i}`}\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={block.content}\n components={markdownComponents}\n urlTransform={markdownUrlTransform}\n contentTransform={markdownContentTransform}\n />\n ) : (\n <p className=\"whitespace-pre-wrap\">{block.content}</p>\n )}\n </div>\n );\n }\n\n // narration block — a persistent per-step narration line (manus\n // rolling-narration UX). Never part of message.content.\n // • NATIVE narration (no subagentName) is the agent's OWN prose, so\n // it renders like a normal assistant text block (not muted).\n // • FORWARDED specialist narration (subagentName set) renders muted +\n // attributed, visually secondary to the orchestrator's own lines.\n if (block.type === \"narration\") {\n if (!block.content) return null;\n // Defensive: never let a raw structured blob render as narration.\n if (narrationLooksLikeRawJson(block.content)) return null;\n const isForwarded = !!block.subagentName;\n const body =\n isAssistant && enableMarkdown ? (\n <MarkdownContent\n content={block.content}\n components={markdownComponents}\n urlTransform={markdownUrlTransform}\n contentTransform={markdownContentTransform}\n />\n ) : (\n <span className=\"whitespace-pre-wrap\">{block.content}</span>\n );\n return (\n <div\n key={`narration-${i}`}\n className={cn(\"text-sm break-words\", isForwarded && \"opacity-80\")}\n style={{ color: \"var(--chat-content-text, inherit)\" }}\n >\n {isForwarded && (\n <span className=\"mr-1 text-xs font-medium opacity-70\">\n {block.subagentName}\n </span>\n )}\n {body}\n </div>\n );\n }\n\n // tool_call block\n const tc = toolCallsById[block.toolCallId];\n if (!tc) return null;\n if (!showToolCalls) return null;\n if (toolCallVerbosity === \"hidden\") return null;\n if (toolCallVerbosity === \"compact\" && isInternalTool(tc.name)) return null;\n\n const defaultRender = () => (\n <ToolCallEntry key={tc.id} toolCall={tc} onImageClick={onImageClick} />\n );\n\n if (renderToolCall) {\n return (\n <div key={`tool-${block.toolCallId}`}>{renderToolCall(tc, defaultRender)}</div>\n );\n }\n return <div key={`tool-${block.toolCallId}`}>{defaultRender()}</div>;\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 hideAvatars = false,\n agentName = \"Assistant\",\n hideHeaderWhileEmpty = false,\n}: ChatMessageProps) {\n const isUser = message.role === \"user\";\n const isAssistant = message.role === \"assistant\";\n const isFlat = variant === \"flat\";\n\n // P25 STORY-006: suppress the agent-name header row entirely while an\n // assistant message is mid-stream with no real content yet. Avoids a\n // 100–500ms \"AIRA\"/\"Assistant\" flash before the first text token lands\n // when the consumer is already rendering an overlay progress pill.\n const trimmedContentLen = message.content?.trim().length ?? 0;\n const hasVisibleToolCalls = !!message.toolCalls && message.toolCalls.length > 0;\n const headerSuppressedWhileEmpty =\n hideHeaderWhileEmpty &&\n isAssistant &&\n !!message.isStreaming &&\n trimmedContentLen <= 40 &&\n !hasVisibleToolCalls;\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 — hidden when hideAvatars=true */}\n {!hideAvatars && (\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\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 Suppressed entirely when hideHeaderWhileEmpty + streaming + no content\n (so the row collapses, leaving no layout gap). P25 STORY-006. */}\n {!headerSuppressedWhileEmpty && (\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\" : (agentName ?? \"Assistant\")}\n </span>\n <span>{formattedTime}</span>\n {message.isStreaming && (\n <LoadingSpinner className=\"h-3 w-3\" />\n )}\n </div>\n )}\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 {/* Interleaved render (text + tool_calls in natural emission order)\n when contentBlocks present. Falls back to legacy ToolCallList +\n content render path for historical messages without blocks. */}\n {message.contentBlocks && message.contentBlocks.length > 0 ? (\n <InterleavedContent\n blocks={message.contentBlocks}\n toolCalls={message.toolCalls ?? []}\n toolCallVerbosity={toolCallVerbosity}\n showToolCalls={showToolCalls}\n showImages={showImages}\n enableMarkdown={enableMarkdown}\n isFlat={isFlat}\n isUser={isUser}\n isAssistant={isAssistant}\n markdownComponents={markdownComponents}\n markdownUrlTransform={markdownUrlTransform}\n markdownContentTransform={markdownContentTransform}\n onImageClick={onImageClick}\n renderToolCall={renderToolCall}\n />\n ) : (\n <>\n {/* Tool calls (rendered before text — legacy fallback path) */}\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 )}\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 /** Hide avatar icons next to each message */\n hideAvatars?: boolean;\n /** Display name for assistant messages. Default \"Assistant\". Pass \"\" to hide. */\n agentName?: string;\n /**\n * Suppress the agent-name / role header row on assistant messages that are\n * still streaming with no real content yet. Forwarded to each `ChatMessage`.\n * Default `false`. P25 STORY-006.\n */\n hideHeaderWhileEmpty?: boolean;\n /**\n * Suppress the built-in bottom-of-list \"Thinking...\" typing indicator that\n * renders when `isLoading && !isStreaming`. Use this when the consuming app\n * already shows its own progress UI (e.g. an in-bubble progress pill driven\n * by `currentStep`) so progress isn't double-rendered. Default `false`\n * (existing behavior unchanged). P25 STORY-006.\n */\n hideTypingIndicator?: boolean;\n}\n\n// =============================================================================\n// SKELETON\n// =============================================================================\n\n/**\n * MessageHistorySkeleton - Shimmer placeholder shown while session history loads.\n *\n * Renders a vertical stack of placeholder message groups with alternating\n * alignment (assistant rows left, user rows right) so the loading state reads\n * as \"chat is populating\" rather than \"frozen\". Uses only Tailwind\n * `animate-pulse` utilities — zero external dependencies (SDK constraint).\n */\nfunction MessageHistorySkeleton() {\n // Alternating rows: assistant (left, multi-line) then user (right, shorter).\n const rows: (\"assistant\" | \"user\")[] = [\n \"assistant\",\n \"user\",\n \"assistant\",\n \"user\",\n \"assistant\",\n ];\n\n return (\n <div\n className=\"p-4 space-y-6\"\n aria-busy=\"true\"\n aria-label=\"Loading conversation history\"\n >\n {rows.map((role, i) =>\n role === \"assistant\" ? (\n <div key={i} className=\"flex items-start gap-3\">\n {/* Avatar dot */}\n <div className=\"flex-shrink-0 w-8 h-8 rounded-full bg-gray-200 dark:bg-gray-700 animate-pulse\" />\n {/* Text-line bars of varying widths */}\n <div className=\"flex-1 space-y-2 pt-1\">\n <div className=\"h-3 w-3/4 rounded bg-gray-200 dark:bg-gray-700 animate-pulse\" />\n <div className=\"h-3 w-5/6 rounded bg-gray-200 dark:bg-gray-700 animate-pulse\" />\n <div className=\"h-3 w-2/5 rounded bg-gray-200 dark:bg-gray-700 animate-pulse\" />\n </div>\n </div>\n ) : (\n <div key={i} className=\"flex items-start justify-end gap-3\">\n {/* Shorter bars, right-aligned */}\n <div className=\"flex flex-col items-end space-y-2 pt-1 max-w-[60%] w-full\">\n <div className=\"h-3 w-1/2 rounded bg-gray-200 dark:bg-gray-700 animate-pulse\" />\n <div className=\"h-3 w-1/3 rounded bg-gray-200 dark:bg-gray-700 animate-pulse\" />\n </div>\n </div>\n )\n )}\n </div>\n );\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 hideAvatars = false,\n agentName = \"Assistant\",\n hideHeaderWhileEmpty = false,\n hideTypingIndicator = false,\n}: MessageListProps) {\n const scrollRef = useRef<HTMLDivElement>(null);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const userScrolledUpRef = useRef(false);\n const prevMessageCountRef = useRef(messages.length);\n\n // Track whether user has scrolled up manually\n useEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n const handleScroll = () => {\n const { scrollTop, scrollHeight, clientHeight } = el;\n userScrolledUpRef.current = scrollHeight - scrollTop - clientHeight > 150;\n };\n el.addEventListener(\"scroll\", handleScroll, { passive: true });\n return () => el.removeEventListener(\"scroll\", handleScroll);\n }, []);\n\n // Auto-scroll to bottom: always on new messages, only if near-bottom during streaming\n useEffect(() => {\n const isNewMessage = messages.length > prevMessageCountRef.current;\n prevMessageCountRef.current = messages.length;\n\n if (isNewMessage) {\n // New message added — reset scroll lock so response is visible\n userScrolledUpRef.current = false;\n }\n\n if (!userScrolledUpRef.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 min-h-0 overflow-y-auto\",\n className\n )}\n >\n {/* Loading history skeleton */}\n {isLoadingHistory && <MessageHistorySkeleton />}\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 agentName={agentName}\n hideAvatars={hideAvatars}\n hideHeaderWhileEmpty={hideHeaderWhileEmpty}\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 {!hideTypingIndicator && 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 /**\n * Extra messages MERGED into the rendered list by timestamp on every render\n * (interleaved chronologically, deduped by id). Use for durable turns that\n * arrive out-of-band on a separate delivery plane — e.g. human-operator /\n * system replies in a webchat handoff — so they don't dock at the bottom.\n * Unlike `initialMessages`, these are NOT seeded into internal state.\n */\n injectedMessages?: 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 /** Hide avatar icons next to each message */\n hideAvatars?: boolean;\n\n /** Display name for assistant messages. Default \"Assistant\". Pass \"\" to hide the label entirely. */\n agentName?: string;\n\n /**\n * Suppress the assistant header row (agent name + timestamp + streaming\n * spinner) while a streaming assistant message has no real content yet\n * (trimmed text length <= ~40 chars and no visible tool calls). Use this\n * when the consuming app is already rendering an overlay progress pill,\n * so the header doesn't flicker on/off before the first text token.\n *\n * Default `false` (existing behavior unchanged). P25 STORY-006.\n */\n hideHeaderWhileEmpty?: boolean;\n\n /**\n * Suppress the built-in bottom-of-list \"Thinking...\" typing indicator that\n * `MessageList` shows when `isLoading && !isStreaming`. Use this when the\n * consuming app already renders its own progress UI (e.g. an in-bubble\n * progress pill driven by `currentStep`) so progress isn't double-rendered.\n *\n * Default `false` (existing behavior unchanged). P25 STORY-006.\n */\n hideTypingIndicator?: boolean;\n\n /**\n * Callback fired on every keystroke in the chat input.\n * Useful for triggering inline UI like @-mention popovers or slash-command menus.\n */\n onInputChange?: (value: string) => void;\n\n /**\n * Receives an imperative control handle for the chat input.\n * Used by parents that need to mutate the input value (e.g. inserting an\n * @mention token after the user picks an item from a custom popover).\n */\n onInputControlReady?: (control: {\n setValue: (value: string) => void;\n focus: () => void;\n getTextarea: () => HTMLTextAreaElement | null;\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 hideAvatars = false,\n agentName = \"Assistant\",\n hideHeaderWhileEmpty = false,\n hideTypingIndicator = false,\n onInputChange,\n onInputControlReady,\n injectedMessages,\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 // Merge out-of-band injected turns (e.g. durable operator/system replies that\n // arrive on a separate delivery plane) into the rendered list BY TIMESTAMP, so\n // they interleave chronologically instead of docking at the bottom. Dedupe by\n // id (the in-stream `messages` win over an injected duplicate).\n const renderedMessages =\n injectedMessages && injectedMessages.length > 0\n ? [...messages, ...injectedMessages]\n .filter((m, i, arr) => arr.findIndex((x) => x.id === m.id) === i)\n .sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime())\n : messages;\n\n // Common MessageList props\n const messageListProps = {\n messages: renderedMessages,\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 hideAvatars,\n agentName,\n hideHeaderWhileEmpty,\n hideTypingIndicator,\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 onInputChange={onInputChange}\n onInputControlReady={onInputControlReady}\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 * useImageStream — progressive image streaming hook.\n *\n * Subscribes to an agent execution's stream and returns images as they're\n * generated, plus the final list when the execution completes. Wraps\n * `client.agents.streamImages` / `client.agents.streamImagesFromExecution`\n * for React consumers.\n *\n * Two modes:\n * 1. **Kickoff mode** — pass `agentUuid` + `input` and the hook starts the\n * execution itself when `enabled` is true.\n * 2. **Attach mode** — pass `executionId` (started elsewhere, e.g. via tRPC)\n * and the hook connects to the existing stream.\n *\n * Cleans up on unmount, parameter change, or `cancel()`.\n *\n * @module @cadraos/sdk/chat\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { ExecuteInput } from '../../types/index.js';\nimport type { ImageEvent } from '../../types/streaming.js';\nimport type { ImageData } from '../../streaming/extract-images.js';\nimport type { CollectImagesOptions, StreamImagesResult } from '../../streaming/collect-images.js';\n\n/**\n * Structural client interface — only the methods this hook actually uses.\n *\n * Avoids depending on the full `CadraClient` class which gets re-declared\n * in every tsup entry-point bundle (main vs `/chat`), making nominal\n * comparisons fail across consumers that import the class from one\n * entry point and the hook from another.\n */\nexport interface ImageStreamClient {\n agents: {\n streamImages: (\n uuid: string,\n input: ExecuteInput,\n options?: CollectImagesOptions\n ) => Promise<StreamImagesResult>;\n streamImagesFromExecution: (\n executionId: string,\n options?: CollectImagesOptions & { sessionId?: string }\n ) => Promise<StreamImagesResult>;\n };\n}\n\n/**\n * Stream status state machine.\n * idle — no execution started yet (or `enabled = false`).\n * connecting — execution kicked off / connect() in flight.\n * streaming — receiving events.\n * complete — agent finished, images is final.\n * error — stream errored or aborted.\n */\nexport type ImageStreamStatus = 'idle' | 'connecting' | 'streaming' | 'complete' | 'error';\n\nexport interface UseImageStreamOptions {\n /**\n * Cadra client instance (or any object implementing ImageStreamClient).\n * Pass a `new CadraClient(...)` instance from `@cadraos/sdk`.\n */\n client: ImageStreamClient;\n\n /**\n * Execution UUID to attach to. Mutually exclusive with `agentUuid` /\n * `input` — if both are supplied, `executionId` wins.\n */\n executionId?: string | null;\n\n /**\n * Agent UUID to kick off. Requires `input`. Ignored if `executionId` is\n * supplied.\n */\n agentUuid?: string | null;\n\n /**\n * Execute input for kickoff mode. Required if `agentUuid` is set.\n */\n input?: ExecuteInput | null;\n\n /**\n * Optional session UUID (passed to streamImagesFromExecution for session\n * continuity).\n */\n sessionId?: string;\n\n /**\n * Whether the hook should connect / kick off. Set to `false` to defer\n * until you're ready (e.g. waiting for user input).\n * Default: `true` if either executionId or (agentUuid + input) is provided.\n */\n enabled?: boolean;\n\n /** Per-image callback (fires on every new image, not just final). */\n onImage?: (image: ImageEvent) => void | Promise<void>;\n\n /** Fired once when the agent completes. Receives the final result. */\n onComplete?: (result: StreamImagesResult) => void;\n\n /** Fired on stream error or abort. */\n onError?: (error: Error) => void;\n}\n\nexport interface UseImageStreamResult {\n /** Images collected so far, in arrival order. */\n images: ImageData[];\n /** Current stream state. */\n status: ImageStreamStatus;\n /** Last error, if any. */\n error: Error | null;\n /** Execution UUID being streamed (resolved after kickoff in kickoff mode). */\n executionId: string | null;\n /** Final agent output (only set after `complete`). */\n output: unknown;\n /** Cancel the current stream. */\n cancel: () => void;\n}\n\n/**\n * Stream images from an agent execution.\n */\nexport function useImageStream(options: UseImageStreamOptions): UseImageStreamResult {\n const {\n client,\n executionId: providedExecutionId = null,\n agentUuid = null,\n input = null,\n sessionId,\n enabled,\n onImage,\n onComplete,\n onError,\n } = options;\n\n const [images, setImages] = useState<ImageData[]>([]);\n const [status, setStatus] = useState<ImageStreamStatus>('idle');\n const [error, setError] = useState<Error | null>(null);\n const [executionId, setExecutionId] = useState<string | null>(providedExecutionId);\n const [output, setOutput] = useState<unknown>(undefined);\n\n // Refs let us call latest callbacks without re-subscribing.\n const onImageRef = useRef(onImage);\n const onCompleteRef = useRef(onComplete);\n const onErrorRef = useRef(onError);\n useEffect(() => { onImageRef.current = onImage; }, [onImage]);\n useEffect(() => { onCompleteRef.current = onComplete; }, [onComplete]);\n useEffect(() => { onErrorRef.current = onError; }, [onError]);\n\n const abortRef = useRef<AbortController | null>(null);\n\n const shouldConnect = enabled ?? Boolean(providedExecutionId || (agentUuid && input));\n\n const inputKey = input ? JSON.stringify(input) : null;\n\n const cancel = useCallback(() => {\n abortRef.current?.abort();\n abortRef.current = null;\n }, []);\n\n useEffect(() => {\n if (!shouldConnect) {\n setStatus('idle');\n return;\n }\n if (!providedExecutionId && !(agentUuid && input)) {\n setStatus('idle');\n return;\n }\n\n // Reset state on each new connection\n setImages([]);\n setError(null);\n setOutput(undefined);\n setStatus('connecting');\n setExecutionId(providedExecutionId);\n\n const ac = new AbortController();\n abortRef.current = ac;\n\n const seenUrls = new Set<string>();\n\n const collectOptions = {\n signal: ac.signal,\n onImage: (img: ImageEvent) => {\n if (seenUrls.has(img.url)) return;\n seenUrls.add(img.url);\n setImages((prev) => [...prev, img]);\n setStatus((prev) => (prev === 'connecting' ? 'streaming' : prev));\n if (!executionId && img.executionId) {\n setExecutionId(img.executionId);\n }\n try {\n const ret = onImageRef.current?.(img);\n if (ret && typeof (ret as Promise<void>).catch === 'function') {\n (ret as Promise<void>).catch(() => { /* ignore */ });\n }\n } catch {\n /* ignore */\n }\n },\n onComplete: (result: StreamImagesResult) => {\n setImages(result.images);\n setOutput(result.output);\n setExecutionId(result.executionId);\n setStatus('complete');\n try {\n onCompleteRef.current?.(result);\n } catch {\n /* ignore */\n }\n },\n onError: (err: Error) => {\n setError(err);\n setStatus('error');\n try {\n onErrorRef.current?.(err);\n } catch {\n /* ignore */\n }\n },\n };\n\n let promise: Promise<StreamImagesResult>;\n if (providedExecutionId) {\n promise = client.agents.streamImagesFromExecution(providedExecutionId, {\n ...collectOptions,\n sessionId,\n });\n } else if (agentUuid && input) {\n promise = client.agents.streamImages(agentUuid, input, collectOptions);\n } else {\n // unreachable due to earlier guard, but keep TS happy\n return;\n }\n\n promise.catch((err: unknown) => {\n // Both signal-abort and stream errors land here. We've already\n // surfaced these via collectOptions.onError.\n if (ac.signal.aborted && err instanceof Error && err.message === 'Aborted') {\n return;\n }\n // Defensive: if the promise rejected without firing onError (shouldn't\n // happen given collect-images.ts contract, but…), capture it now.\n setError((cur) => cur ?? (err instanceof Error ? err : new Error(String(err))));\n setStatus((cur) => (cur === 'complete' ? cur : 'error'));\n });\n\n return () => {\n ac.abort();\n if (abortRef.current === ac) abortRef.current = null;\n };\n // We depend on input via its serialised form to avoid effect loops\n // when callers pass new object identities for the same payload.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [client, providedExecutionId, agentUuid, inputKey, sessionId, shouldConnect]);\n\n return { images, status, error, executionId, output, cancel };\n}\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"]}
|
|
1
|
+
{"version":3,"sources":["../../src/resources/base.ts","../../src/errors/sdk-errors.ts","../../src/errors/ai-function-errors.ts","../../src/utils/retry.ts","../../src/utils/http.ts","../../src/streaming/sse-client.ts","../../src/streaming/extract-images.ts","../../src/streaming/poll-policy.ts","../../src/streaming/stream-controller.ts","../../src/streaming/collect-images.ts","../../src/utils/api-paths.ts","../../src/utils/message-key.ts","../../src/resources/agent-messages.ts","../../src/resources/agents.ts","../../src/resources/skills.ts","../../src/resources/tools.ts","../../src/resources/artifacts.ts","../../src/resources/attachments.ts","../../src/resources/sessions.ts","../../src/resources/kanban.ts","../../src/resources/teams.ts","../../src/resources/remote-agents.ts","../../src/resources/remote-runners.ts","../../src/resources/ai-functions.ts","../../src/client.ts","../../src/chat/adapters/default-adapter.ts","../../src/chat/context/ChatConfigContext.tsx","../../src/chat/hooks/useExecutionStream.ts","../../src/chat/utils/toolOutcome.ts","../../src/chat/hooks/history-cache.ts","../../src/chat/utils/contentBlocks.ts","../../src/chat/utils/applyEvent.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/utils/elapsed.ts","../../src/chat/components/ToolCallEntry.tsx","../../src/chat/components/ChatMessage.tsx","../../src/chat/components/MessageList.tsx","../../src/chat/components/AgentChat.tsx","../../src/chat/hooks/useImageStream.ts","../../src/chat/components/AgentMessagePicker.tsx","../../src/chat/components/internal-tools/TodoList.tsx"],"names":["value","result","fetchEventSource","createContext","useMemo","jsx","useContext","useState","useRef","useCallback","useEffect","generateExecutionId","deriveImagesFromToolCalls","options","jsxs","cn","ImageIcon","FileIcon","formatFileSize","forwardRef","FileDropZone","useImperativeHandle","Fragment","createPortal","ReactMarkdown","remarkGfm","formatDuration","extractImagesFromResult"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Base Resource API\n *\n * Abstract base class for all resource APIs.\n * Provides common HTTP methods and path handling.\n */\n\nimport type { HttpClient } from '../utils/http.js';\nimport type { ListOptions, PaginatedResponse } from '../types/index.js';\n\n/**\n * Base Resource API class\n */\nexport abstract class BaseResourceAPI {\n protected readonly http: HttpClient;\n protected readonly basePath: string;\n\n constructor(http: HttpClient, basePath: string) {\n this.http = http;\n this.basePath = basePath;\n }\n\n /**\n * Build query parameters from list options\n */\n protected buildListQuery(options?: ListOptions): Record<string, string | number | boolean | undefined> {\n if (!options) return {};\n\n return {\n limit: options.limit,\n offset: options.offset,\n sort: options.sort,\n order: options.order,\n };\n }\n\n /**\n * HTTP GET request helper\n */\n protected async httpGet<T>(\n path: string,\n query?: Record<string, string | number | boolean | undefined>\n ): Promise<T> {\n return this.http.get<T>(`${this.basePath}${path}`, query);\n }\n\n /**\n * HTTP POST request helper\n */\n protected async httpPost<T>(\n path: string,\n body?: unknown,\n options?: { idempotencyKey?: string; skipRetry?: boolean; timeoutMs?: number }\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; skipRetry?: boolean }\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 * The server's own `error.code` exactly as sent on the wire (e.g.\n * `FUNCTION_NOT_PUBLISHED`, `DUPLICATE_REQUEST`, `VARIABLE_TYPE`).\n * Populated by `parseApiError` for EVERY status. `code` keeps its historic\n * per-class values (`conflict`, `server_error`, `validation_error`, …) for\n * compatibility; branch on `serverCode` when you need the precise reason.\n */\n serverCode?: 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 const serverCode =\n typeof errorBody?.error?.code === 'string' ? errorBody.error.code : undefined;\n\n const error = buildApiError(status, message, code, details, requestId);\n if (serverCode !== undefined) error.serverCode = serverCode;\n return error;\n}\n\nfunction buildApiError(\n status: number,\n message: string,\n code: string,\n details: Record<string, unknown> | undefined,\n requestId: string | undefined\n): CadraError {\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 * AI function errors (p93 AIF-010, specs §9 + D27c).\n *\n * All extend the existing hierarchy so `instanceof CadraError` (and, where it\n * applies, `ConflictError` / `ValidationError`) keeps working.\n */\n\nimport type { AiFunctionParameterIssue } from '../types/ai-functions.js';\nimport { CadraError, ConflictError, ValidationError } from './sdk-errors.js';\n\n/**\n * 409 `DUPLICATE_REQUEST`: a run with the same idempotency key already exists.\n * No provider call was made. A retry after `abandoned` or a failure needs a NEW key.\n */\nexport class AiFunctionDuplicateError extends ConflictError {\n /** The existing run's execution id. */\n readonly executionId?: string;\n /** The existing run's status (`running`, a terminal status, or `abandoned`). */\n readonly runStatus?: string;\n\n constructor(\n message: string,\n details?: Record<string, unknown>,\n requestId?: string\n ) {\n super(message, details, requestId);\n this.name = 'AiFunctionDuplicateError';\n this.serverCode = 'DUPLICATE_REQUEST';\n this.executionId = typeof details?.executionId === 'string' ? details.executionId : undefined;\n this.runStatus = typeof details?.status === 'string' ? details.status : undefined;\n }\n}\n\n/**\n * The provider answered 2xx and the run WAS metered, but the output then failed\n * (`OUTPUT_INVALID`, `DELIVERY_FAILED` — `details.charged: true`). Never retry\n * automatically: a retry is a second paid call.\n */\nexport class AiFunctionChargedError extends CadraError {\n constructor(source: CadraError) {\n super(source.message, source.code, source.status, source.details, source.requestId);\n this.name = 'AiFunctionChargedError';\n this.serverCode = source.serverCode;\n }\n}\n\n/**\n * The client-side parameter check failed (D27c). No run request was sent.\n * Also a `ValidationError`, with one `errors[]` entry per issue.\n */\nexport class AiFunctionParameterError extends ValidationError {\n readonly functionKey: string;\n readonly issues: AiFunctionParameterIssue[];\n\n constructor(functionKey: string, issues: AiFunctionParameterIssue[]) {\n super(\n `Invalid parameters for AI function \"${functionKey}\": ` +\n issues.map((i) => `${i.name} (${i.code})`).join(', '),\n issues.map((i) => ({ field: i.name, message: i.code })),\n { functionKey, issues }\n );\n this.name = 'AiFunctionParameterError';\n this.functionKey = functionKey;\n this.issues = issues;\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 /** Optional fetch implementation — inject `expo/fetch` for React Native streaming. Defaults to global fetch. */\n fetch?: typeof fetch;\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 * Per-request timeout in milliseconds. Overrides the client-wide\n * `config.timeout` for this call only (p93 AIF-010: a paid AI-function run\n * waits for the server's route ceiling while every other call keeps the\n * 30 s default).\n */\n timeoutMs?: number;\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 /** The client-wide request timeout (ms) this client was configured with. */\n get timeoutMs(): number {\n return this.config.timeout;\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 timeoutMs = options.timeoutMs ?? this.config.timeout;\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const doFetch = this.config.fetch ?? fetch;\n const response = await doFetch(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 ${options.timeoutMs ?? 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; timeoutMs?: number }\n ): Promise<T> {\n return this.request<T>({\n method: 'POST',\n path,\n body,\n idempotencyKey: options?.idempotencyKey,\n skipRetry: options?.skipRetry,\n timeoutMs: options?.timeoutMs,\n });\n }\n\n /**\n * PATCH request\n */\n async patch<T>(\n path: string,\n body?: unknown,\n options?: { idempotencyKey?: string; skipRetry?: boolean }\n ): Promise<T> {\n return this.request<T>({\n method: 'PATCH',\n path,\n body,\n idempotencyKey: options?.idempotencyKey,\n skipRetry: options?.skipRetry,\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/**\n * Generate an RFC-4122 v4 UUID for a client-prepared executionId.\n *\n * The `Idempotency-Key` HEADER is opaque, but cadra-web dedupes a duplicate\n * remote dispatch on the body `executionId` (a UUID). So to make the SDK's\n * automatic retries idempotent end-to-end, execute() must send a STABLE\n * executionId — not just the header. Prefers the platform `crypto.randomUUID()`\n * (modern browsers, Node 19+); falls back to a Math.random v4 only so the SDK\n * never hard-fails in unusual environments (the server accepts any valid UUID).\n */\nexport function generateExecutionId(): string {\n const g =\n typeof globalThis !== 'undefined'\n ? (globalThis as { crypto?: { randomUUID?: () => string } })\n : undefined;\n if (g?.crypto?.randomUUID) {\n return g.crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\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 /** Optional fetch implementation — inject `expo/fetch` for React Native streaming. Defaults to global fetch. */\n fetch?: typeof fetch;\n /**\n * Last event id seen on a previous connection. Sent as `Last-Event-ID` so the\n * server can replay only what was missed instead of the whole backlog. The\n * controller dedupes by event id regardless, so this is an optimisation, not\n * a correctness requirement.\n */\n lastEventId?: string | null;\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 doFetch = this.config.fetch ?? fetch;\n const response = await doFetch(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 ...(this.config.lastEventId ? { 'Last-Event-ID': this.config.lastEventId } : {}),\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 * Image extraction utilities\n *\n * Pure, environment-agnostic functions for pulling image URLs out of agent\n * tool results and execution outputs. Works in Node and the browser, no\n * React or DOM dependencies.\n *\n * Used by:\n * - ExecutionStreamController — derives 'image' events from tool_result events\n * so any consumer can subscribe to images as they're generated.\n * - useAgentChat — renders image artifacts inline in chat messages.\n * - Server-side workers (Node) — persist images progressively without React.\n *\n * Recognised result shapes (in priority order):\n * 1. { images: [{ url, thumbnailUrl?, filename?, mimeType?, dimensions?, prompt? }, ...] }\n * Emitted by cadra-api's response-transformer for create_ad_images, edit_image,\n * and any tool that produces image artifacts.\n * 2. { url: '...png' } — single image with image extension.\n * 3. { imageUrl: '...' } — alternate single-image shape.\n * 4. JSON string wrapping any of the above (with optional ```json fence).\n * 5. Bare image URL string or data: URL.\n */\n\n/**\n * Image extracted from a tool result or execution output.\n *\n * Shape is a superset of historical chat ImageData — all extra fields are\n * optional, so existing chat consumers keep working unchanged.\n */\nexport interface ImageData {\n /** Full-size image URL (https) */\n url: string;\n /** Optional thumbnail URL (smaller, for chat / preview display) */\n thumbnailUrl?: string;\n /** Original filename */\n filename?: string;\n /** MIME type (e.g. image/png) */\n mimeType?: string;\n /** Alt text — falls back to the agent's prompt if no explicit alt was provided */\n alt?: string;\n /** Image width in pixels */\n width?: number;\n /** Image height in pixels */\n height?: number;\n /** ID of the tool call that produced this image (when extracted from a tool_result) */\n sourceToolCallId?: string;\n /** Execution UUID this image came from (when extracted via the streaming pipeline) */\n executionId?: string;\n}\n\n/**\n * Optional context applied to every extracted image.\n * Use this to attach the originating tool-call and execution IDs.\n */\nexport interface ExtractContext {\n sourceToolCallId?: string;\n executionId?: string;\n}\n\nconst IMAGE_EXT_RE = /\\.(png|jpg|jpeg|gif|webp|svg|bmp)(\\?.*)?$/i;\n\n/**\n * Extract images from a single tool result.\n *\n * @param result The tool result. May be an object, an already-parsed value,\n * or a JSON / URL string.\n * @param ctx Optional sourceToolCallId / executionId to attach to each\n * extracted image.\n */\nexport function extractImagesFromResult(\n result: unknown,\n ctx: ExtractContext = {}\n): ImageData[] {\n if (!result) return [];\n\n let data: unknown = result;\n\n if (typeof result === 'string') {\n // Bare image URL or data: URL? treat as a single image.\n if (IMAGE_EXT_RE.test(result) || result.startsWith('data:image/')) {\n return [{ url: normalizeUrl(result), sourceToolCallId: ctx.sourceToolCallId, executionId: ctx.executionId }];\n }\n // Otherwise try to parse as JSON (possibly wrapped in a code fence).\n const fence = result.match(/```(?:json)?\\s*\\n?([\\s\\S]*?)\\n?```/);\n const jsonStr = fence?.[1] ?? result;\n try {\n data = JSON.parse(jsonStr.trim());\n } catch {\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: [...] } — preferred (cadra-api ResponseTransformer)\n if (Array.isArray(obj.images)) {\n return (obj.images as Array<Record<string, unknown>>)\n .filter((img) => img && typeof img.url === 'string')\n .map((img) => mapImage(img, ctx));\n }\n\n // Pattern 2: { url: \"...png\" }\n if (typeof obj.url === 'string' && IMAGE_EXT_RE.test(obj.url)) {\n return [mapImage(obj, ctx)];\n }\n\n // Pattern 3: { imageUrl: \"...\" }\n if (typeof obj.imageUrl === 'string') {\n return [{\n url: normalizeUrl(obj.imageUrl),\n thumbnailUrl: typeof obj.thumbnailUrl === 'string' ? normalizeUrl(obj.thumbnailUrl) : undefined,\n alt: (obj.alt as string) || (obj.prompt as string) || undefined,\n sourceToolCallId: ctx.sourceToolCallId,\n executionId: ctx.executionId,\n }];\n }\n\n return [];\n}\n\n/**\n * Extract images from a final execution output.\n *\n * Execution outputs are often JSON strings, sometimes wrapped in a markdown\n * `json` code fence. This helper unwraps + parses + delegates to\n * extractImagesFromResult.\n *\n * Use this when an execution has already completed and you have its\n * `output` field — for live executions, prefer subscribing to the\n * stream's `image` event.\n */\nexport function extractImagesFromExecutionOutput(\n output: unknown,\n ctx: ExtractContext = {}\n): ImageData[] {\n let parsed: unknown = output;\n\n if (typeof output === 'string') {\n const fence = output.match(/```(?:json)?\\s*\\n?([\\s\\S]*?)\\n?```/);\n const jsonStr = fence?.[1] ?? output;\n try {\n parsed = JSON.parse(jsonStr.trim());\n } catch {\n // Not JSON — try the bare-URL / data-URL fallbacks via extractImagesFromResult.\n return extractImagesFromResult(output, ctx);\n }\n }\n\n return extractImagesFromResult(parsed, ctx);\n}\n\n/**\n * Aggregate images from a list of completed tool calls.\n *\n * Used by chat-style consumers that maintain an ordered list of tool calls\n * and want a single source of truth for the displayed image list.\n */\nexport function deriveImagesFromToolCalls<\n T extends { id?: string; status?: string; result?: unknown }\n>(toolCalls: T[] | undefined, ctx: Omit<ExtractContext, 'sourceToolCallId'> = {}): 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, { ...ctx, sourceToolCallId: tc.id }));\n }\n }\n return images;\n}\n\n// =============================================================================\n// INTERNAL\n// =============================================================================\n\nfunction mapImage(img: Record<string, unknown>, ctx: ExtractContext): ImageData {\n const dims = img.dimensions as Record<string, unknown> | undefined;\n return {\n url: normalizeUrl(img.url as string),\n thumbnailUrl: typeof img.thumbnailUrl === 'string' ? normalizeUrl(img.thumbnailUrl) : undefined,\n filename: img.filename as string | undefined,\n mimeType: img.mimeType as string | undefined,\n alt: (img.alt as string) || (img.prompt as string) || undefined,\n width: typeof dims?.width === 'number' ? (dims.width as number) : (img.width as number | undefined),\n height: typeof dims?.height === 'number' ? (dims.height as number) : (img.height as number | undefined),\n sourceToolCallId: ctx.sourceToolCallId,\n executionId: ctx.executionId,\n };\n}\n\n/**\n * Cadra agents sometimes emit `LINK://` URLs to defeat auto-link rendering\n * in chat UIs. Convert those back to https for downstream consumers.\n */\nfunction normalizeUrl(url: string): string {\n if (url.startsWith('LINK://')) return url.replace('LINK://', 'https://');\n return url;\n}\n","/**\n * Poll Policy\n *\n * Backpressure helpers for the SSE fallback polling loop.\n *\n * The fallback loop talks to an API key that is shared with every other feature\n * on the same key. A loop that ignores 429 does not just fail itself — it burns\n * the shared quota and takes unrelated features down with it. These helpers give\n * the loop the two things it needs to be a good citizen: a structural way to\n * recognise \"the server told me to stop\", and a delay schedule that grows when\n * the loop is failing or learning nothing.\n *\n * Everything here is pure and synchronous so the loop's timing can be asserted\n * under fake timers.\n */\n\n/** Delay a rate-limited loop waits when the server named no reset (ms). */\nexport const UNNAMED_RATE_LIMIT_WAIT_MS = 60_000;\n\ntype Dict = Record<string, unknown>;\n\nfunction asDict(value: unknown): Dict | null {\n return typeof value === 'object' && value !== null ? (value as Dict) : null;\n}\n\n/** Error codes different layers use for the same 429 condition. */\nconst RATE_LIMIT_CODES = new Set([\n 'rate_limit_error',\n 'rate_limited',\n 'rate_limit_exceeded',\n 'too_many_requests',\n]);\n\n/**\n * Is this error a rate limit (429)?\n *\n * Detected STRUCTURALLY — by status/code/name — never with `instanceof`.\n * Consumers link this package rather than depending on a single installed copy,\n * so a `RateLimitError` thrown by their copy of the SDK is not `instanceof` our\n * copy's class. Identity checks silently return false across that boundary,\n * which is exactly how a 429 ends up looking like a transient blip.\n */\nexport function isRateLimited(error: unknown): boolean {\n if (typeof error === 'string') return /\\b429\\b/.test(error);\n\n const err = asDict(error);\n if (!err) return false;\n\n for (const key of ['status', 'statusCode', 'httpStatus', 'code']) {\n if (err[key] === 429 || err[key] === '429') return true;\n }\n\n const response = asDict(err.response);\n if (response && (response.status === 429 || response.statusCode === 429)) return true;\n\n if (typeof err.code === 'string' && RATE_LIMIT_CODES.has(err.code.toLowerCase())) return true;\n if (err.name === 'RateLimitError') return true;\n\n const message = typeof err.message === 'string' ? err.message : '';\n return /\\b429\\b/.test(message)\n || /rate[\\s_-]?limit/i.test(message)\n || /too many requests/i.test(message);\n}\n\n/**\n * Read a header off whatever shape carries it — a `Headers` instance, a plain\n * object, or a lower/mixed-case bag.\n */\nfunction readHeader(bag: unknown, name: string): string | null {\n if (bag === null || bag === undefined) return null;\n\n const getter = (bag as { get?: unknown }).get;\n if (typeof getter === 'function') {\n try {\n const value = (getter as (n: string) => unknown).call(bag, name);\n if (value !== null && value !== undefined) return String(value);\n } catch {\n // Not Headers-like after all — fall through to the plain-object scan.\n }\n }\n\n const dict = asDict(bag);\n if (!dict) return null;\n const wanted = name.toLowerCase();\n for (const [key, value] of Object.entries(dict)) {\n if (key.toLowerCase() === wanted && value !== null && value !== undefined) {\n return String(value);\n }\n }\n return null;\n}\n\n/**\n * Parse a `Retry-After`-style value into milliseconds.\n * Accepts a delta in seconds (number or numeric string) or an HTTP-date.\n */\nfunction parseRetryAfter(raw: unknown, now: number): number | null {\n if (raw === null || raw === undefined) return null;\n\n if (typeof raw === 'number') {\n return Number.isFinite(raw) && raw >= 0 ? raw * 1000 : null;\n }\n if (typeof raw !== 'string') return null;\n\n const trimmed = raw.trim();\n if (trimmed === '') return null;\n if (/^\\d+(\\.\\d+)?$/.test(trimmed)) return Number(trimmed) * 1000;\n\n const at = Date.parse(trimmed);\n return Number.isNaN(at) ? null : Math.max(0, at - now);\n}\n\n/**\n * Parse an `X-RateLimit-Reset`-style value into milliseconds from now.\n * Accepts epoch seconds, epoch milliseconds, an ISO date, or a plain delta in\n * seconds — every one of which appears in the wild under this header name.\n */\nfunction parseResetAt(raw: unknown, now: number): number | null {\n if (raw === null || raw === undefined) return null;\n\n const numeric = typeof raw === 'number'\n ? raw\n : typeof raw === 'string' && /^\\d+(\\.\\d+)?$/.test(raw.trim())\n ? Number(raw.trim())\n : null;\n\n if (numeric !== null) {\n if (!Number.isFinite(numeric) || numeric < 0) return null;\n // Epoch milliseconds (~1.7e12) vs epoch seconds (~1.7e9) vs a small delta.\n if (numeric > 1e11) return Math.max(0, numeric - now);\n if (numeric > 1e9) return Math.max(0, numeric * 1000 - now);\n return numeric * 1000;\n }\n\n if (typeof raw !== 'string') return null;\n const at = Date.parse(raw.trim());\n return Number.isNaN(at) ? null : Math.max(0, at - now);\n}\n\n/**\n * How long the server asked us to wait, in milliseconds, or `null` if it said\n * nothing usable.\n *\n * Checked in order of authority: the SDK's own `RateLimitError.retryAfter`\n * (seconds) first, then the error envelope's details, then the raw\n * `Retry-After` / `X-RateLimit-Reset` headers the API actually sets.\n */\nexport function getRetryAfterMs(error: unknown, now: number = Date.now()): number | null {\n const err = asDict(error);\n if (!err) return null;\n\n const details = asDict(err.details);\n const response = asDict(err.response);\n const body = asDict(err.body) ?? asDict(response?.data);\n const bodyError = asDict(body?.error);\n const bodyDetails = asDict(bodyError?.details) ?? asDict(body?.details);\n\n // Already-in-milliseconds fields win outright — no unit guessing.\n for (const source of [err, details, bodyDetails]) {\n const ms = source?.retryAfterMs;\n if (typeof ms === 'number' && Number.isFinite(ms) && ms >= 0) return ms;\n }\n\n // `retryAfter` is seconds everywhere it appears in this stack.\n for (const source of [err, details, bodyDetails, bodyError]) {\n const parsed = parseRetryAfter(source?.retryAfter, now);\n if (parsed !== null) return parsed;\n }\n\n const headerBags = [err.headers, response?.headers, details?.headers, body?.headers];\n for (const bag of headerBags) {\n const parsed = parseRetryAfter(readHeader(bag, 'retry-after'), now);\n if (parsed !== null) return parsed;\n }\n\n for (const source of [details, bodyDetails, err]) {\n for (const key of ['resetAt', 'reset', 'rateLimitReset']) {\n const parsed = parseResetAt(source?.[key], now);\n if (parsed !== null) return parsed;\n }\n }\n\n for (const bag of headerBags) {\n for (const header of ['x-ratelimit-reset', 'ratelimit-reset']) {\n const parsed = parseResetAt(readHeader(bag, header), now);\n if (parsed !== null) return parsed;\n }\n }\n\n return null;\n}\n\n/**\n * The HTTP status carried by an error, however the thrower spelled it.\n */\nexport function getHttpStatus(error: unknown): number | null {\n const err = asDict(error);\n if (!err) return null;\n\n for (const key of ['status', 'statusCode', 'httpStatus']) {\n const value = err[key];\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n if (typeof value === 'string' && /^\\d{3}$/.test(value)) return Number(value);\n }\n\n const response = asDict(err.response);\n for (const key of ['status', 'statusCode']) {\n const value = response?.[key];\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n }\n\n return null;\n}\n\n/**\n * A 4xx that will not fix itself by asking again.\n *\n * Mirrors the SSE side's \"any 4xx is terminal\" rule, with two carve-outs:\n * 429 is backpressure (wait, don't quit) and 408 is a timeout (transient).\n * A 404 lands here — which is what a wrong path looks like, and previously it\n * was swallowed by a blanket catch and retried until the tab closed.\n */\nexport function isTerminalClientError(error: unknown): boolean {\n const status = getHttpStatus(error);\n if (status === null) return false;\n return status >= 400 && status < 500 && status !== 429 && status !== 408;\n}\n\n/** Growth applied to the delay after a failed poll. */\nexport const FAILURE_GROWTH_FACTOR = 2;\n\n/** Growth applied to the delay after a poll that learned nothing new. */\nexport const IDLE_GROWTH_FACTOR = 1.5;\n\n/**\n * Next delay after a poll that failed for a reason other than rate limiting.\n * Exponential, capped.\n */\nexport function nextFailureDelayMs(currentMs: number, maxMs: number): number {\n return Math.min(Math.max(currentMs, 1) * FAILURE_GROWTH_FACTOR, maxMs);\n}\n\n/**\n * Next delay after a successful poll that observed nothing new — no new logs\n * and no status change. This is the incident's exact shape: an execution that\n * finished long ago, polled at full rate for the lifetime of the tab. Decaying\n * toward the ceiling makes an idle tab cheap without making an active one slow.\n */\nexport function nextIdleDelayMs(currentMs: number, maxMs: number): number {\n return Math.min(Math.ceil(Math.max(currentMs, 1) * IDLE_GROWTH_FACTOR), maxMs);\n}\n\n/**\n * Add positive-only jitter so tabs that fell back together do not re-converge\n * into a synchronised wave. Positive-only matters: jitter must never shorten a\n * delay below what the server asked for.\n */\nexport function applyJitter(delayMs: number, ratio: number, random: () => number = Math.random): number {\n if (ratio <= 0) return delayMs;\n return Math.round(delayMs * (1 + random() * ratio));\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 { extractImagesFromResult } from './extract-images.js';\nimport {\n isRateLimited,\n getRetryAfterMs,\n nextFailureDelayMs,\n nextIdleDelayMs,\n applyJitter,\n isTerminalClientError,\n getHttpStatus,\n UNNAMED_RATE_LIMIT_WAIT_MS,\n} from './poll-policy.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 *\n * `pollingIntervalMs` is deliberately 5000, not the 2000 it used to be. The\n * pressure is AGGREGATE — many concurrent executions in fallback, not one\n * runaway tab — so what matters is polls-per-execution across the fleet. On the\n * observed distribution (519 executions/24h in one org, mean 146s), a 2s cadence\n * costs ~73 requests per mean-length run; if those runs fall back, that alone\n * exceeds a 1000/hour key's entire daily budget. At 5s it is ~29, which fits\n * with headroom, while a median-length run still gets ~7 updates. Going slower\n * still (10s) would leave a median run with 3 updates and the user waiting up to\n * 10s past completion — a bad trade, because in fallback polling is the ONLY\n * channel the session has.\n *\n * 5s is a floor, not a period: the loop backs off from here toward\n * `pollingMaxIntervalMs` whenever it fails or learns nothing (see poll-policy),\n * so the cadence stays responsive exactly while there is something to report.\n */\nconst DEFAULT_STREAMING_CONFIG: StreamingConfig = {\n maxReconnectAttempts: 5,\n reconnectBaseDelayMs: 1000,\n reconnectMaxDelayMs: 10000,\n // NOTE (unchanged, deliberately): this watchdog force-disconnects a HEALTHY\n // SSE connection after 30s of silence and routes it through the same\n // handleConnectionError path as a real transport failure. Ordinary LLM\n // latency exceeds 30s routinely, so it fires against working streams — that\n // is what drives sessions into the polling fallback in the first place. The\n // fix is a server-side SSE heartbeat, not a bigger number here; raising this\n // is a guess against a moving target. Everything below only bounds what the\n // fallback costs once it has been entered.\n activityTimeoutMs: 30000,\n pollingIntervalMs: 5000,\n pollingMaxIntervalMs: 30000,\n pollingMaxConsecutiveFailures: 10,\n pollingMaxConsecutiveRateLimits: 3,\n pollingMaxConsecutiveClientErrors: 3,\n pollingMaxDurationMs: 1800000,\n pollingMaxRetryAfterMs: 300000,\n pollingJitterRatio: 0.1,\n sseRetryIntervalMs: 60000,\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 /** Optional fetch implementation — inject `expo/fetch` for React Native streaming. Defaults to global fetch. */\n fetch?: typeof fetch;\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 finalExecution: AgentExecution | null = null;\n private finalError: ErrorEvent | null = null;\n\n // --- Fallback polling state ---\n // A self-rescheduling timeout, not setInterval: the delay has to change\n // between ticks (that is what backoff IS), and a timeout chain also cannot\n // stack overlapping requests the way a fixed interval does when the API is\n // slow to answer.\n private pollTimeoutId: ReturnType<typeof setTimeout> | null = null;\n private pollDelayMs = 0;\n private pollConsecutiveFailures = 0;\n private pollConsecutiveRateLimits = 0;\n private pollConsecutiveClientErrors = 0;\n /** When the loop last observed anything new — the clock the give-up bound runs on. */\n private pollLastProgressAt = 0;\n private pollInFlight = false;\n private lastPolledStatus: string | null = null;\n private sseRetryTimeoutId: ReturnType<typeof setTimeout> | null = null;\n private sseRetryInFlight = false;\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 image: Array<(data: StreamEventMap['image']) => 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 narration: Array<(data: StreamEventMap['narration']) => 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 image: [],\n plan: [],\n paused: [],\n started: [],\n progress: [],\n taskListUpdate: [],\n delegationStarted: [],\n delegationCompleted: [],\n textDelta: [],\n narration: [],\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 // Resolved fallback-poll settings. Read through `??` rather than off the\n // spread config so an explicit `undefined` in a caller's partial config still\n // lands on the default instead of NaN-ing the arithmetic.\n private get pollBaseIntervalMs(): number {\n return this.config.pollingIntervalMs ?? DEFAULT_STREAMING_CONFIG.pollingIntervalMs;\n }\n private get pollMaxIntervalMs(): number {\n return Math.max(\n this.config.pollingMaxIntervalMs ?? DEFAULT_STREAMING_CONFIG.pollingMaxIntervalMs!,\n this.pollBaseIntervalMs\n );\n }\n private get pollMaxConsecutiveFailures(): number {\n return this.config.pollingMaxConsecutiveFailures ?? DEFAULT_STREAMING_CONFIG.pollingMaxConsecutiveFailures!;\n }\n private get pollMaxConsecutiveRateLimits(): number {\n return this.config.pollingMaxConsecutiveRateLimits ?? DEFAULT_STREAMING_CONFIG.pollingMaxConsecutiveRateLimits!;\n }\n private get pollMaxConsecutiveClientErrors(): number {\n return this.config.pollingMaxConsecutiveClientErrors ?? DEFAULT_STREAMING_CONFIG.pollingMaxConsecutiveClientErrors!;\n }\n private get pollMaxDurationMs(): number {\n return this.config.pollingMaxDurationMs ?? DEFAULT_STREAMING_CONFIG.pollingMaxDurationMs!;\n }\n private get pollMaxRetryAfterMs(): number {\n return this.config.pollingMaxRetryAfterMs ?? DEFAULT_STREAMING_CONFIG.pollingMaxRetryAfterMs!;\n }\n private get pollJitterRatio(): number {\n return this.config.pollingJitterRatio ?? DEFAULT_STREAMING_CONFIG.pollingJitterRatio!;\n }\n private get sseRetryIntervalMs(): number {\n return this.config.sseRetryIntervalMs ?? DEFAULT_STREAMING_CONFIG.sseRetryIntervalMs!;\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 // Never leave a previous client subscribed. Reconnects and the fallback's\n // periodic SSE re-attempt both land here, and two live SSEClients on one\n // execution means every event arrives twice.\n if (this.sseClient) {\n this.sseClient.disconnect();\n this.sseClient = null;\n }\n\n // Callbacks are gated on `client` still being the current one. A replaced\n // client's teardown emits one last onConnectionChange(false) as its stream\n // unwinds; without this gate that stale report lands after the replacement\n // has already reported connected, and stale events would be injected too.\n const client: SSEClient = new SSEClient({\n url,\n authHeader: `Bearer ${authToken}`,\n orgId: this.options.orgId,\n fetch: this.options.fetch,\n // Resume from where this session left off. On a first connect this is\n // null and the header is omitted.\n lastEventId: this._lastEventId,\n onEvent: (event) => {\n if (this.sseClient !== client) return;\n this.handleEvent(event);\n },\n onError: (error) => {\n if (this.sseClient !== client) return;\n console.error('[SDK:StreamController] SSE error:', error);\n this.handleConnectionError(error);\n },\n onConnectionChange: (connected) => {\n if (this.sseClient !== client) return;\n console.log('[SDK:StreamController] SSE connection change:', connected);\n if (connected) {\n // The single place a live SSE stream is observed — so the single\n // place the fallback loop is retired. Whether this connection came\n // from connect(), the reconnect ladder, or the fallback's periodic\n // re-attempt, polling must not survive alongside a working stream.\n this.status = 'connected';\n this.reconnectAttempts = 0;\n this.stopPolling();\n this.resetActivityTimeout();\n }\n this.emit('connectionChange', {\n connected,\n usingFallback: this.status === 'fallback_polling',\n });\n },\n });\n\n this.sseClient = client;\n\n try {\n // Resolves when the stream ENDS, not when it opens — the open is reported\n // through onConnectionChange above.\n await client.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 // Pass through forwarded-from flag (set by cadra-api's\n // subscribeAndForwardEvents on sub-agent events). Wire field\n // is `_forwardedFrom` at the top of event.data.\n forwardedFrom: (event.data as Record<string, unknown>)._forwardedFrom as string | 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 // Pass through forwarded-from flag (set by cadra-api's\n // subscribeAndForwardEvents on sub-agent events). Wire field\n // is `_forwardedFrom` per redis-manager.ts:232.\n forwardedFrom: (event.data as Record<string, unknown>)._forwardedFrom as string | undefined,\n // CAD-87 S1-001 EventIdentity → (execId, seq) reducer dedup (S1-003).\n sourceExecutionId: (data.sourceExecutionId as string) ?? (data.executionId as string | undefined),\n seq: data.seq as number | undefined,\n });\n break;\n\n case 'tool_result': {\n // Fix: Handle undefined toolName gracefully (defensive coding)\n const toolCallId = (data.toolCallId as string) || `tool-result-${Date.now()}`;\n const toolName = (data.toolName as string) || 'Unknown Tool';\n this.emit('toolResult', {\n toolCallId,\n toolName,\n result: data.result,\n durationMs: data.durationMs as number ?? 0,\n // CAD-243: pass the producer's failure verdict through.\n ...(data.isError === true ? { isError: true } : {}),\n ...(typeof data.status === 'string' ? { status: data.status } : {}),\n ...(typeof data.error === 'string' ? { error: data.error } : {}),\n forwardedFrom: (event.data as Record<string, unknown>)._forwardedFrom as string | undefined,\n // CAD-87 S1-001 EventIdentity → (execId, seq) reducer dedup (S1-003).\n sourceExecutionId: (data.sourceExecutionId as string) ?? (data.executionId as string | undefined),\n seq: data.seq as number | undefined,\n });\n\n // Derived event: emit one `image` per image found in the result.\n // Lets any consumer (chat UI, server worker) react to images progressively\n // without parsing tool results themselves.\n const images = extractImagesFromResult(data.result, {\n sourceToolCallId: toolCallId,\n executionId: this.options.executionId,\n });\n for (const img of images) {\n this.emit('image', {\n ...img,\n executionId: this.options.executionId,\n sourceToolCallId: toolCallId,\n toolName,\n });\n }\n break;\n }\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 // Forwarded specialist activity → rolling line attribution. Wire\n // fields `_forwardedFrom` / `_subagentName` sit at event.data top level.\n forwardedFrom: (event.data as Record<string, unknown>)._forwardedFrom as string | undefined,\n subagentName: (event.data as Record<string, unknown>)._subagentName as string | 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 // Forwarded specialist status → rolling line attribution.\n forwardedFrom: (event.data as Record<string, unknown>)._forwardedFrom as string | undefined,\n subagentName: (event.data as Record<string, unknown>)._subagentName 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 forwardedFrom: (event.data as Record<string, unknown>)._forwardedFrom as string | undefined,\n // CAD-87 S1-001 EventIdentity → (execId, seq) reducer dedup (S1-003).\n sourceExecutionId: (data.sourceExecutionId as string) ?? (data.executionId as string | undefined),\n seq: data.seq as number | undefined,\n });\n break;\n\n // Handle narration event - clean per-step narration sentence (CAD\n // forwarded-narration). Native events (no forwardedFrom) mirror the\n // parent's own text_delta and are ignored by the chat hook; FORWARDED\n // events carry a specialist's narration during a handoff (its text_delta\n // is intentionally not forwarded) tagged `_subagentName`.\n case 'narration':\n this.emit('narration', {\n text: data.text as string,\n executionId: data.executionId as string | undefined,\n forwardedFrom: (event.data as Record<string, unknown>)._forwardedFrom as string | undefined,\n subagentName: (event.data as Record<string, unknown>)._subagentName as string | undefined,\n iteration: data.iteration as number | undefined,\n timestamp: (data.timestamp as string) || new Date().toISOString(),\n // CAD-87 S1-001 EventIdentity → (execId, seq) reducer dedup (S1-003).\n // The FORWARDED specialist narration keeps the CHILD's sourceExecutionId\n // + seq (preserved through the forward), so its resume replay dedups too.\n sourceExecutionId: (data.sourceExecutionId as string) ?? (data.executionId as string | undefined),\n seq: data.seq as number | undefined,\n // CAD-87 S1-002: the producer role — the reducer renders a native\n // `terminal_answer` as the answer (text), not a narration block.\n role: data.role as StreamEventMap['narration']['role'],\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 // Any terminal observation retires the fallback loop, no matter which path\n // observed it (SSE, state recovery, or a poll tick).\n this.stopPolling();\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 this.stopPolling();\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 // Permanent (4xx) failures won't fix themselves — auth rejected, bad/expired\n // run id, missing scope. Retrying floods the server and leaks connections\n // (each retry holds a privileged-DB connection on the stream route). Treat\n // any 4xx as terminal: stop, surface the error, and close.\n const msg = error instanceof Error ? error.message : String(error);\n if (/\\b4\\d\\d\\b/.test(msg) || /INVALID_API_KEY|INVALID_REQUEST/.test(msg)) {\n // Tear down the SSE then surface a terminal error (no reconnect).\n if (this.sseClient) {\n this.sseClient.disconnect();\n this.sseClient = null;\n }\n this.handleError({ error: msg, errorCode: 'stream_unrecoverable' });\n return;\n }\n\n // Already in fallback: the poll loop plus its periodic SSE re-attempt own\n // recovery from here. Re-entering the reconnect ladder would spawn a second\n // poll loop and a second connectionChange storm for every failed re-attempt.\n if (this.status === 'fallback_polling') {\n this.startPolling(); // no-op when the loop is already running\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 * Idempotent — calling it while a loop is already running is a no-op, so no\n * path can end up with two loops racing the same execution.\n */\n private startPolling(): void {\n if (this.pollTimeoutId !== null || this.pollInFlight) {\n return;\n }\n\n this.pollLastProgressAt = Date.now();\n this.pollDelayMs = this.pollBaseIntervalMs;\n this.pollConsecutiveFailures = 0;\n this.pollConsecutiveRateLimits = 0;\n this.pollConsecutiveClientErrors = 0;\n this.lastPolledStatus = null;\n\n // SSE is down; the activity watchdog has nothing left to watch and would\n // only re-enter handleConnectionError on a timer.\n this.stopActivityTimeout();\n\n this.scheduleSSERetry();\n this.schedulePoll(this.pollDelayMs);\n }\n\n /**\n * Queue the next poll tick.\n */\n private schedulePoll(delayMs: number): void {\n if (this.status !== 'fallback_polling') {\n return;\n }\n this.pollTimeoutId = setTimeout(() => {\n this.pollTimeoutId = null;\n void this.runPoll();\n }, Math.max(0, Math.round(delayMs)));\n }\n\n /**\n * One poll tick: fetch state, emit what is new, then decide how long to wait\n * before the next one — or whether there should be a next one at all.\n */\n private async runPoll(): Promise<void> {\n if (this.status !== 'fallback_polling') {\n return;\n }\n\n // The give-up bound, measured from the last thing the loop LEARNED rather\n // than from when it started. A loop still delivering logs is doing its job\n // and gets to keep going; a loop re-reading the same unchanged state has\n // proven it will not learn anything, and surfacing an error beats outliving\n // the tab. (The incident's session last did anything at 11:05 and was still\n // polling at 11:20 — squarely this branch.)\n if (Date.now() - this.pollLastProgressAt >= this.pollMaxDurationMs) {\n this.failPolling(\n `Streaming fallback gave up: no execution progress for ${Math.round(this.pollMaxDurationMs / 1000)}s`,\n 'polling_timeout'\n );\n return;\n }\n\n this.pollInFlight = true;\n try {\n const execution = await this.options.getExecution(this.options.executionId);\n\n this.pollConsecutiveFailures = 0;\n this.pollConsecutiveRateLimits = 0;\n this.pollConsecutiveClientErrors = 0;\n\n // Emit new logs\n let sawNewInfo = false;\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 sawNewInfo = true;\n }\n }\n if (execution.status !== this.lastPolledStatus) {\n this.lastPolledStatus = execution.status;\n sawNewInfo = true;\n }\n if (sawNewInfo) {\n this.pollLastProgressAt = Date.now();\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 return;\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 // Active execution keeps the fast cadence; an idle one decays toward the\n // ceiling so a forgotten tab costs a request every 30s, not every 2s.\n this.pollDelayMs = sawNewInfo\n ? this.pollBaseIntervalMs\n : nextIdleDelayMs(this.pollDelayMs, this.pollMaxIntervalMs);\n } catch (error) {\n if (!this.handlePollError(error)) {\n return; // handlePollError already terminated the loop\n }\n } finally {\n this.pollInFlight = false;\n }\n\n this.schedulePoll(applyJitter(this.pollDelayMs, this.pollJitterRatio));\n }\n\n /**\n * Apply backpressure for a failed poll.\n *\n * @returns `true` to keep polling (with `pollDelayMs` updated), `false` when\n * the loop has been terminated.\n */\n private handlePollError(error: unknown): boolean {\n const retryAfterMs = getRetryAfterMs(error);\n const rateLimited = isRateLimited(error) || retryAfterMs !== null;\n\n if (rateLimited) {\n this.pollConsecutiveRateLimits++;\n console.warn(\n '[SDK:StreamController] Poll rate-limited',\n retryAfterMs !== null ? `(server asked for ${Math.round(retryAfterMs / 1000)}s)` : '(no reset named)'\n );\n\n // A reset this far out is not something to sit on holding a stream open.\n if (retryAfterMs !== null && retryAfterMs > this.pollMaxRetryAfterMs) {\n this.failPolling(\n `Rate limited: the API asked for ${Math.round(retryAfterMs / 1000)}s, longer than this stream will wait`,\n 'rate_limited'\n );\n return false;\n }\n\n // 429 is not transient noise — it means the quota window is spent. Probing\n // it further starves every other feature sharing the key, which is the\n // collateral damage that made this worth fixing in the first place.\n if (this.pollConsecutiveRateLimits >= this.pollMaxConsecutiveRateLimits) {\n this.failPolling(\n 'Rate limited by the API; stopped the streaming fallback rather than keep spending the key quota',\n 'rate_limited'\n );\n return false;\n }\n\n // Never sooner than the server said. When it named nothing, assume a\n // window measured in minutes — retrying inside one is pure waste.\n // Deliberately NOT clamped by pollMaxIntervalMs: the server's number wins.\n this.pollDelayMs = Math.max(retryAfterMs ?? UNNAMED_RATE_LIMIT_WAIT_MS, this.pollDelayMs);\n return true;\n }\n\n // A 4xx will not fix itself by asking again — wrong path, dead run id,\n // rejected auth, missing scope. Mirrors the SSE side's terminal-4xx rule,\n // but with a small tolerance rather than instant death: a poll issued\n // immediately after dispatch can legitimately 404 before the execution row\n // is readable. Blanket catch-and-continue meant a permanently wrong URL\n // (which is what the bare `/executions/{id}` path was) looked exactly like\n // a transient blip, forever.\n if (isTerminalClientError(error)) {\n this.pollConsecutiveClientErrors++;\n const status = getHttpStatus(error);\n console.warn(\n `[SDK:StreamController] Poll got HTTP ${status} (${this.pollConsecutiveClientErrors}/${this.pollMaxConsecutiveClientErrors})`\n );\n if (this.pollConsecutiveClientErrors >= this.pollMaxConsecutiveClientErrors) {\n this.failPolling(\n `Execution status endpoint returned HTTP ${status} ${this.pollConsecutiveClientErrors} times — cannot track this run`,\n 'polling_unrecoverable'\n );\n return false;\n }\n this.pollDelayMs = nextFailureDelayMs(this.pollDelayMs, this.pollMaxIntervalMs);\n return true;\n }\n\n this.pollConsecutiveFailures++;\n console.warn(\n `[SDK:StreamController] Poll failed (${this.pollConsecutiveFailures}/${this.pollMaxConsecutiveFailures}):`,\n error\n );\n\n if (this.pollConsecutiveFailures >= this.pollMaxConsecutiveFailures) {\n this.failPolling(\n `Streaming fallback failed ${this.pollConsecutiveFailures} times in a row`,\n 'polling_failed'\n );\n return false;\n }\n\n this.pollDelayMs = nextFailureDelayMs(this.pollDelayMs, this.pollMaxIntervalMs);\n return true;\n }\n\n /**\n * Terminate the fallback loop and surface the reason.\n */\n private failPolling(error: string, errorCode: string): void {\n this.stopPolling();\n this.handleError({ error, errorCode });\n }\n\n /**\n * Stop polling, including the periodic SSE re-attempt that belongs to it.\n */\n private stopPolling(): void {\n if (this.pollTimeoutId !== null) {\n clearTimeout(this.pollTimeoutId);\n this.pollTimeoutId = null;\n }\n if (this.sseRetryTimeoutId !== null) {\n clearTimeout(this.sseRetryTimeoutId);\n this.sseRetryTimeoutId = null;\n }\n }\n\n /**\n * Queue the next attempt to get the real stream back.\n */\n private scheduleSSERetry(): void {\n if (this.sseRetryTimeoutId !== null || this.status !== 'fallback_polling') {\n return;\n }\n this.sseRetryTimeoutId = setTimeout(() => {\n this.sseRetryTimeoutId = null;\n this.attemptSSERecovery();\n }, this.sseRetryIntervalMs);\n }\n\n /**\n * Re-attempt SSE from inside the fallback, so a transient outage costs the\n * session a few polls rather than its stream for the lifetime of the tab.\n *\n * Success is NOT observed here: `SSEClient.connect()` resolves when the\n * stream ENDS, not when it opens. The open is observed by\n * `onConnectionChange(true)`, which flips status and stops this loop. The\n * promise below only tells us the attempt is over so the next one can be\n * queued.\n */\n private attemptSSERecovery(): void {\n if (this.status !== 'fallback_polling') {\n return;\n }\n if (this.sseRetryInFlight) {\n this.scheduleSSERetry();\n return;\n }\n\n this.sseRetryInFlight = true;\n void this.connectSSE()\n .catch(() => {\n // Still down — the poll loop keeps carrying the session.\n })\n .finally(() => {\n this.sseRetryInFlight = false;\n this.scheduleSSERetry();\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 * Collect images from an execution stream.\n *\n * Awaitable wrapper around ExecutionStreamController that:\n * - Subscribes to `image` events and accumulates them in arrival order.\n * - On `complete`, falls back to parsing `execution.output` for any images\n * that didn't arrive via streaming (older agents, missed events on reconnect).\n * - Returns a Promise<{ images, output, executionId }> that resolves on\n * `complete` or rejects on `error`.\n *\n * Optional callbacks let the caller react progressively as images arrive\n * (e.g. persist to a DB, push to React state, log to disk) without having\n * to wait for the final result.\n *\n * Works in Node and the browser — the controller is environment-agnostic.\n */\n\nimport type { ExecutionStreamController } from './stream-controller.js';\nimport { extractImagesFromExecutionOutput, type ImageData } from './extract-images.js';\nimport type { ImageEvent } from '../types/streaming.js';\n\n/**\n * Options for collectImagesFromStream / streamImages / streamImagesFromExecution.\n */\nexport interface CollectImagesOptions {\n /**\n * Callback fired once per image as it arrives. Receives the full ImageEvent\n * (including executionId, sourceToolCallId, toolName).\n *\n * Returning a Promise is allowed but not awaited — collection does not\n * block on the callback. If you need ordering guarantees (e.g. sequential\n * DB inserts), serialise inside the callback yourself.\n */\n onImage?: (image: ImageEvent) => void | Promise<void>;\n\n /**\n * Callback fired once when the execution completes. Receives the same\n * value the returned Promise resolves with.\n */\n onComplete?: (result: StreamImagesResult) => void;\n\n /**\n * Callback fired if the execution errors. The returned Promise also rejects.\n */\n onError?: (error: Error) => void;\n\n /**\n * AbortSignal. When aborted: cancels the stream and rejects the Promise.\n */\n signal?: AbortSignal;\n}\n\n/**\n * Result of a streamImages / collectImagesFromStream call.\n */\nexport interface StreamImagesResult {\n /** All images collected, in arrival order */\n images: ImageData[];\n /** The agent's final execution output (raw — may be a JSON string) */\n output: unknown;\n /** The execution UUID */\n executionId: string;\n}\n\n/**\n * Collect images from an already-created stream controller.\n *\n * The caller is responsible for calling `stream.connect()` — this helper\n * only attaches listeners and awaits completion.\n *\n * Most callers should use the higher-level `client.agents.streamImages()` or\n * `client.agents.streamImagesFromExecution()` instead, which handle the\n * connect step too.\n */\nexport async function collectImagesFromStream(\n stream: ExecutionStreamController,\n options: CollectImagesOptions = {}\n): Promise<StreamImagesResult> {\n const { onImage, onComplete, onError, signal } = options;\n\n const images: ImageData[] = [];\n const seenUrls = new Set<string>();\n\n if (signal?.aborted) {\n stream.cancel();\n throw new Error('Aborted');\n }\n\n return new Promise<StreamImagesResult>((resolve, reject) => {\n let settled = false;\n\n const settleResolve = (result: StreamImagesResult): void => {\n if (settled) return;\n settled = true;\n try {\n onComplete?.(result);\n } catch (err) {\n // Don't let consumer callbacks break the Promise contract.\n // Fire-and-forget — they can still see errors via onError.\n // eslint-disable-next-line no-console\n console.error('[SDK:collectImages] onComplete threw:', err);\n }\n resolve(result);\n };\n\n const settleReject = (err: Error): void => {\n if (settled) return;\n settled = true;\n try {\n onError?.(err);\n } catch (cbErr) {\n // eslint-disable-next-line no-console\n console.error('[SDK:collectImages] onError threw:', cbErr);\n }\n reject(err);\n };\n\n stream.on('image', (img) => {\n if (seenUrls.has(img.url)) return;\n seenUrls.add(img.url);\n images.push(img);\n try {\n const ret = onImage?.(img);\n if (ret && typeof (ret as Promise<void>).catch === 'function') {\n (ret as Promise<void>).catch((err) => {\n // eslint-disable-next-line no-console\n console.error('[SDK:collectImages] onImage rejected:', err);\n });\n }\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error('[SDK:collectImages] onImage threw:', err);\n }\n });\n\n stream.on('error', (err) => {\n settleReject(new Error(err.error || 'Stream error'));\n });\n\n stream.on('complete', ({ execution }) => {\n // Fallback: backfill from execution.output if streaming didn't surface\n // any images (older agents, non-streaming tool paths, missed events).\n if (images.length === 0 && execution.output) {\n const fromOutput = extractImagesFromExecutionOutput(execution.output, {\n executionId: stream.executionId,\n });\n for (const img of fromOutput) {\n if (seenUrls.has(img.url)) continue;\n seenUrls.add(img.url);\n images.push(img);\n // Also fire onImage so progressive consumers see fallback images.\n try {\n onImage?.({\n ...img,\n executionId: stream.executionId,\n sourceToolCallId: img.sourceToolCallId ?? '',\n toolName: '',\n });\n } catch {\n // ignore\n }\n }\n }\n\n settleResolve({\n images: [...images],\n output: execution.output,\n executionId: stream.executionId,\n });\n });\n\n if (signal) {\n signal.addEventListener(\n 'abort',\n () => {\n stream.cancel();\n settleReject(new Error('Aborted'));\n },\n { once: true }\n );\n }\n });\n}\n","/**\n * API paths for TOP-LEVEL resources\n *\n * `BaseResourceAPI.httpGet/httpPost/...` prefix a resource's own `basePath`\n * (e.g. `/api/v1/agents`), which is right for sub-resources but wrong for\n * resources that live at the root of the API. Those call `this.http.*`\n * directly — and every place that did so had dropped the `/api/v1` prefix\n * entirely, producing requests that resolve on NO host:\n *\n * - cadra-web (what every chat/copilot consumer passes as `baseUrl`) serves\n * `/api/v1/executions/{id}`. A bare `/executions/{id}` falls through to the\n * Next.js page router and returns 404 HTML — it never reaches `withApiAuth`,\n * so it is invisible to auth, quota and logging alike.\n * - cadra-api mounts the equivalent Fastify route under `/internal/v1`, behind\n * the web↔api internal key that SDK consumers do not hold. Its public\n * `/api/v1` surface carries only the session routes.\n *\n * Centralised here so the prefix is stated once instead of being re-typed (and\n * re-dropped) at each call site.\n */\n\n/** Root of the versioned public API. */\nexport const API_V1 = '/api/v1';\n\n/** Executions are a top-level resource, NOT a sub-resource of agents. */\nexport const EXECUTION_PATH = `${API_V1}/executions`;\n\n/** `GET /api/v1/executions/{id}` — execution status, output and logs. */\nexport function executionPath(executionId: string): string {\n return `${EXECUTION_PATH}/${executionId}`;\n}\n\n/** `POST /api/v1/executions/{id}/cancel` — request cancellation. */\nexport function executionCancelPath(executionId: string): string {\n return `${EXECUTION_PATH}/${executionId}/cancel`;\n}\n","/**\n * Agent message keys (p13) — lowercase dotted, e.g. `chat.welcome`.\n *\n * Same rule cadra-web enforces on `/api/v1/agents/:id/messages/render`, so an\n * invalid key fails client-side before a request is made. Kept free of any\n * client import so the chat entry can use it without pulling in the client.\n */\nexport const MESSAGE_KEY_PATTERN = /^[a-z][a-z0-9_]*(\\.[a-z0-9_]+)+$/;\n\n/** True when `key` is a valid lowercase dotted agent message key. */\nexport function isValidMessageKey(key: string): boolean {\n return MESSAGE_KEY_PATTERN.test(key);\n}\n","/**\n * Agent Messages Resource API (p13)\n *\n * Read-only access to an agent's saved messages (welcome, handoff, fallback\n * copy, ...). Reached as `client.agents.messages`.\n * - list(): the agent's saved messages, every known key, the agent's languages\n * - render(): one message filled with vars, in a language (server falls back:\n * exact, base, agent default, en, first non-empty; `lang` says which was used)\n */\n\nimport { BaseResourceAPI } from './base.js';\nimport type { HttpClient } from '../utils/http.js';\nimport { ValidationError } from '../errors/index.js';\nimport { isValidMessageKey } from '../utils/message-key.js';\nimport type {\n AgentMessageList,\n AgentMessageRenderOptions,\n AgentMessageRenderResult,\n} from '../types/index.js';\n\nexport class AgentMessagesAPI extends BaseResourceAPI {\n constructor(http: HttpClient) {\n super(http, '/api/v1/agents');\n }\n\n /**\n * List an agent's saved messages and the known keys\n *\n * @param agentUuid - Agent UUID (a team UUID resolves to its lead agent)\n *\n * @example\n * ```typescript\n * const { messages, knownKeys, languages, defaultLanguage } = await client.agents.messages.list('agent-uuid');\n * ```\n */\n async list(agentUuid: string): Promise<AgentMessageList> {\n return this.httpGet<AgentMessageList>(`/${agentUuid}/messages`);\n }\n\n /**\n * Render one message with placeholders filled\n *\n * Resolves with `text: null` when the agent has no message for the key.\n * Throws `ValidationError` before any request when the key is not a\n * lowercase dotted key (see `MESSAGE_KEY_PATTERN`).\n *\n * @example\n * ```typescript\n * const { text } = await client.agents.messages.render('agent-uuid', 'handoff.requested', {\n * lang: 'es',\n * vars: { agentName: 'Ana' },\n * });\n * ```\n */\n async render(\n agentUuid: string,\n key: string,\n options: AgentMessageRenderOptions = {}\n ): Promise<AgentMessageRenderResult> {\n if (!isValidMessageKey(key)) {\n throw new ValidationError(`Invalid message key \"${key}\"`, [\n { field: 'key', message: 'Must be a lowercase dotted key, e.g. chat.welcome' },\n ]);\n }\n return this.httpPost<AgentMessageRenderResult>(`/${agentUuid}/messages/render`, {\n key,\n ...(options.lang ? { lang: options.lang } : {}),\n ...(options.vars ? { vars: options.vars } : {}),\n });\n }\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';\nimport {\n collectImagesFromStream,\n type CollectImagesOptions,\n type StreamImagesResult,\n} from '../streaming/collect-images.js';\nimport { executionPath, executionCancelPath } from '../utils/api-paths.js';\nimport { AgentMessagesAPI } from './agent-messages.js';\n\n/**\n * Agents API class\n */\nexport class AgentsAPI extends BaseResourceAPI {\n /** Saved agent messages (p13): `list()` and `render()` */\n readonly messages: AgentMessagesAPI;\n\n constructor(http: HttpClient, private readonly getStreamConfig: () => StreamConfig) {\n super(http, '/api/v1/agents');\n this.messages = new AgentMessagesAPI(http);\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, executionId, options }\n // This matches cadra-web's sdkFormatSchema which preserves teamUuid.\n //\n // `executionId`, when present, is a client-prepared UUID v4 (P25 — Action 5).\n // cadra-web's executions router accepts it (validated as UUID) and uses it\n // as the new execution row's UUID so the SDK can pre-open SSE.\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 ...(input.executionId ? { executionId: input.executionId } : {}),\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 fetch: config.fetch,\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 fetch: config.fetch,\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 /**\n * Stream image generation — kicks off an execution and resolves with all\n * images once the agent completes, while firing per-image callbacks as\n * each one arrives.\n *\n * Use this for one-shot image generation from agents whose primary output\n * is images (`create_ad_images`, `edit_image`, etc.). Works in Node and\n * the browser.\n *\n * @example\n * ```typescript\n * // Server-side: persist each image as it arrives, then return creative IDs\n * const { images, executionId } = await client.agents.streamImages(\n * batchAgentUuid,\n * { task: 'Generate 4 ads for new product launch', attachmentIds },\n * { onImage: async (img) => { await persist(img); } }\n * );\n * ```\n *\n * @example\n * ```typescript\n * // Browser-side: progressive UI without polling\n * const result = await client.agents.streamImages(uuid, input, {\n * onImage: (img) => setImages((prev) => [...prev, img]),\n * signal: abortController.signal,\n * });\n * ```\n */\n async streamImages(\n uuid: string,\n input: ExecuteInput,\n options?: CollectImagesOptions\n ): Promise<StreamImagesResult> {\n const stream = await this.stream(uuid, input);\n const collectionPromise = collectImagesFromStream(stream, options);\n // Connect AFTER collectImagesFromStream attaches listeners to avoid race.\n stream.connect().catch(() => {\n // connectionError surfaces via the stream's 'error' event; the\n // collection promise will reject through that path. Swallow here so\n // we don't trigger unhandled-rejection.\n });\n return collectionPromise;\n }\n\n /**\n * Connect to an already-started execution, stream image events, and\n * resolve with the collected images on completion.\n *\n * Useful when execution is started elsewhere (e.g. via tRPC mutation\n * that returns `executionId`) and the consumer wants to wait for images.\n *\n * @example\n * ```typescript\n * // After a tRPC mutation returns { executionId }\n * const { images } = await client.agents.streamImagesFromExecution(executionId, {\n * onImage: (img) => appendToUI(img),\n * });\n * ```\n */\n async streamImagesFromExecution(\n executionId: string,\n options?: CollectImagesOptions & { sessionId?: string }\n ): Promise<StreamImagesResult> {\n const { sessionId, ...collectOptions } = options ?? {};\n const stream = this.streamExecution(executionId, sessionId);\n const collectionPromise = collectImagesFromStream(stream, collectOptions);\n stream.connect().catch(() => {\n // see streamImages — error path reaches the promise via 'error' event\n });\n return collectionPromise;\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 // Executions are a TOP-LEVEL resource (`/api/v1/executions/...`), not a\n // sub-resource of `/api/v1/agents`, so this cannot go through `httpGet`\n // (which would prefix this resource's basePath). It still needs the\n // `/api/v1` prefix: a bare `/executions/{id}` resolves on NO host — on\n // cadra-web it lands on the Next page router (404 HTML, never reaching\n // auth), and on cadra-api the equivalent route is mounted under\n // `/internal/v1` behind the internal key. See EXECUTION_PATH.\n return this.http.get<AgentExecution>(executionPath(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 executionCancelPath(executionId),\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 /** Optional fetch implementation — inject `expo/fetch` for React Native streaming. Defaults to global fetch. */\n fetch?: typeof fetch;\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 // KNOWN BROKEN (not fixed here — no verified target route): this bare\n // path drops the `/api/v1` prefix and resolves on no host. Unlike the\n // execution endpoints, cadra-web exposes no public skill-execution route to\n // point it at, so correcting it needs a server-side route first.\n // See utils/api-paths.ts.\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 // KNOWN BROKEN (not fixed here — no verified target route): this bare\n // path drops the `/api/v1` prefix and resolves on no host. Unlike the\n // execution endpoints, cadra-web exposes no public tool-execution route to\n // point it at, so correcting it needs a server-side route first.\n // See utils/api-paths.ts.\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 // KNOWN BROKEN (not fixed here — no verified target route): this bare\n // path drops the `/api/v1` prefix and resolves on no host. Unlike the\n // execution endpoints, cadra-web exposes no public artifacts-by-execution route to\n // point it at, so correcting it needs a server-side route first.\n // See utils/api-paths.ts.\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 // KNOWN BROKEN — same missing `/api/v1` prefix as listArtifacts above.\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 * Attachments Resource API\n *\n * Provides attachment operations for uploading files (images, documents)\n * that can be referenced in agent executions via attachmentIds.\n *\n * - Upload flow: getUploadUrl() → PUT to presigned URL → confirm()\n * - Download: getDownloadUrl()\n */\n\nimport { BaseResourceAPI } from './base.js';\n\n/**\n * Input for requesting a presigned upload URL\n */\nexport interface AttachmentUploadUrlInput {\n /** Original filename */\n filename: string;\n /** MIME type of the file */\n mimeType: string;\n /** File size in bytes */\n size: number;\n}\n\n/**\n * Response from requesting an upload URL\n */\nexport interface AttachmentUploadUrlResponse {\n /** UUID assigned to the attachment */\n attachmentUuid: string;\n /** Presigned S3 PUT URL for uploading the file */\n uploadUrl: string;\n /** ISO timestamp when the upload URL expires */\n expiresAt?: string;\n}\n\n/**\n * Attachments API class\n */\nexport class AttachmentsAPI extends BaseResourceAPI {\n constructor(http: import('../utils/http.js').HttpClient) {\n super(http, '/api/v1/attachments');\n }\n\n /**\n * Get a presigned URL for uploading a file\n *\n * After receiving the URL, upload the file directly to S3 using a PUT request,\n * then call confirm() to mark it as ready.\n *\n * @param input - File metadata (filename, mimeType, size)\n * @returns Presigned upload URL and attachment UUID\n *\n * @example\n * ```typescript\n * // 1. Get presigned URL\n * const { attachmentUuid, uploadUrl } = await client.attachments.getUploadUrl({\n * filename: 'photo.jpg',\n * mimeType: 'image/jpeg',\n * size: 102400,\n * });\n *\n * // 2. Upload file to S3\n * await fetch(uploadUrl, { method: 'PUT', body: fileBuffer });\n *\n * // 3. Confirm upload\n * await client.attachments.confirm(attachmentUuid);\n *\n * // 4. Use in execution\n * await client.agents.execute('agent-uuid', {\n * task: 'Describe this image',\n * attachmentIds: [attachmentUuid],\n * });\n * ```\n */\n async getUploadUrl(input: AttachmentUploadUrlInput): Promise<AttachmentUploadUrlResponse> {\n return this.httpPost<AttachmentUploadUrlResponse>('/upload-url', {\n filename: input.filename,\n mimeType: input.mimeType,\n size: input.size,\n });\n }\n\n /**\n * Confirm that a file upload has completed\n *\n * Must be called after successfully uploading the file to the presigned URL.\n *\n * @param uuid - Attachment UUID returned from getUploadUrl()\n */\n async confirm(uuid: string): Promise<void> {\n await this.httpPost<void>(`/${uuid}/confirm`);\n }\n\n /**\n * Get a download URL for an attachment\n *\n * @param uuid - Attachment UUID\n * @returns Presigned download URL\n */\n async getDownloadUrl(uuid: string): Promise<string> {\n const result = await this.httpGet<{ url: string }>(`/${uuid}/download-url`);\n return result.url;\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';\nimport { executionPath } from '../utils/api-paths.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 // Optional client-prepared execution UUID v4 (P25 — Action 5).\n ...(input.executionId ? { executionId: input.executionId } : {}),\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 fetch: config.fetch,\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>(executionPath(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 * Kanban Resource API\n *\n * Provides the org-scoped board operations against `/api/v1/kanban/*`:\n * - Board: getBoard()\n * - Cards: listCards(), createCard(), getCard(), transitionCard()\n * - Run: streamCardRun() — reuses the EXISTING execution-stream controller\n * keyed on the card's executionId (no bespoke kanban stream).\n *\n * Mirrors `SessionsAPI` / `AgentsAPI` resource shape and is wired onto\n * `CadraClient` as `client.kanban`.\n *\n * @module @cadraos/sdk\n */\n\nimport { BaseResourceAPI } from './base.js';\nimport type { HttpClient } from '../utils/http.js';\nimport { generateIdempotencyKey } from '../utils/http.js';\nimport type { ExecutionStreamController } from '../streaming/stream-controller.js';\nimport { createExecutionStreamController } from '../streaming/stream-controller.js';\nimport type { StreamConfig } from './agents.js';\nimport type { AgentExecution } from '../types/agents.js';\nimport type {\n CardList,\n CreateCardInput,\n KanbanBoard,\n KanbanCard,\n KanbanHandlerType,\n KanbanLane,\n KanbanRunSummary,\n KanbanTransition,\n ListCardsInput,\n TransitionCardInput,\n} from '../kanban/types.js';\nimport { executionPath } from '../utils/api-paths.js';\n\n// ---------------------------------------------------------------------------\n// API → SDK mappers\n//\n// The `/api/v1/kanban/*` endpoints return a richer wire envelope than the flat\n// SDK types the hook/components consume: lanes are nested under `lifecycle`,\n// cards use `currentLane`/`uuid`, and lane fields are snake_cased. These\n// mappers adapt the wire shape to the public `KanbanBoard`/`KanbanCard`\n// contract. Without them the board renders \"No lanes configured\" (the raw\n// envelope has no top-level `.lanes`) and cards land in undefined lanes.\n// ---------------------------------------------------------------------------\n\ninterface RawLane {\n id?: string;\n key: string;\n name: string;\n handler?: { handler_type?: string; agent_ref?: string } | null;\n is_initial?: boolean;\n is_terminal?: boolean;\n}\n\ninterface RawTransition {\n id: string;\n from_lane_id: string;\n to_lane_id: string;\n manual_allowed?: boolean;\n}\n\ninterface RawBoardResponse {\n board: { id: number; uuid: string; orgId: number };\n lifecycle?: {\n id: number;\n uuid: string;\n slug: string;\n name: string;\n version: number;\n lanes?: RawLane[];\n transitions?: RawTransition[];\n };\n}\n\ninterface RawCard {\n id: number;\n uuid: string;\n currentLane: string;\n title: string;\n description?: string | null;\n type?: string | null;\n sharedContext?: Record<string, unknown> | null;\n executionId?: string | null;\n /** Run status of the linked execution (board listing) — drives card animation. */\n runStatus?: string | null;\n createdAt?: string | null;\n updatedAt?: string | null;\n}\n\nfunction mapLane(l: RawLane, index: number): KanbanLane {\n return {\n key: l.key,\n label: l.name,\n order: index,\n handler: l.handler\n ? {\n type: (l.handler.handler_type ?? 'cadra_agent') as KanbanHandlerType,\n agentRef: l.handler.agent_ref,\n }\n : undefined,\n terminal: l.is_terminal ?? false,\n initial: l.is_initial ?? false,\n };\n}\n\nfunction mapTransition(t: RawTransition): KanbanTransition {\n return {\n id: t.id,\n fromLane: t.from_lane_id,\n toLane: t.to_lane_id,\n manualAllowed: t.manual_allowed ?? false,\n };\n}\n\n/** Normalize a raw execution status string onto the board's KanbanRunStatus. */\nfunction mapExecStatus(s?: string | null): KanbanRunSummary['status'] {\n switch ((s ?? '').toLowerCase()) {\n case 'running':\n case 'in_progress':\n case 'processing':\n return 'running';\n case 'queued':\n case 'pending':\n case 'created':\n return 'pending';\n case 'completed':\n case 'success':\n case 'succeeded':\n return 'completed';\n case 'failed':\n case 'error':\n return 'failed';\n case 'cancelled':\n case 'canceled':\n return 'cancelled';\n default:\n return 'pending';\n }\n}\n\nfunction mapBoard(data: RawBoardResponse): KanbanBoard {\n return {\n id: data.board.uuid,\n orgId: data.board.orgId,\n lifecycleId: data.lifecycle?.uuid,\n lifecycleVersion: data.lifecycle?.version,\n name: data.lifecycle?.name,\n lanes: (data.lifecycle?.lanes ?? []).map(mapLane),\n transitions: (data.lifecycle?.transitions ?? []).map(mapTransition),\n };\n}\n\nfunction mapCard(c: RawCard, run?: KanbanRunSummary): KanbanCard {\n return {\n // The `/cards/:id` + `/cards/:id/transition` routes key on the integer PK\n // (`Number(id)`), so the card handle the board passes back MUST be that id,\n // not the uuid (a uuid → `Number(uuid)` = NaN → \"Invalid card id\").\n id: String(c.id),\n boardId: '',\n lane: c.currentLane,\n title: c.title,\n description: c.description ?? undefined,\n type: c.type ?? undefined,\n sharedContext: c.sharedContext ?? undefined,\n // Streaming key: the run-stream route (/api/v1/agents/runs/{id}/stream)\n // validates a UUID. Prefer the run summary's execution UUID; the raw card's\n // executionId is now the execution UUID too (board + card routes return it).\n executionId: run?.executionId ?? c.executionId ?? undefined,\n // Board-listing cards carry only `runStatus` (no full run summary). Synthesize\n // a minimal run so the card can render its \"agent working\" animation without\n // a detail fetch. getCard supplies the full `run` (takes precedence).\n run:\n run ??\n (c.runStatus\n ? {\n executionId: c.executionId ?? '',\n status: mapExecStatus(c.runStatus),\n }\n : undefined),\n createdAt: c.createdAt ?? undefined,\n updatedAt: c.updatedAt ?? undefined,\n };\n}\n\n/**\n * Kanban API class.\n */\nexport class KanbanAPI extends BaseResourceAPI {\n constructor(http: HttpClient, private readonly getStreamConfig: () => StreamConfig) {\n super(http, '/api/v1/kanban');\n }\n\n // ===== BOARD =====\n\n /**\n * Get the current org's board (lanes in declared order). Auto-provisions\n * the board server-side on first access.\n *\n * @returns The board with its lanes.\n *\n * @example\n * ```typescript\n * const board = await client.kanban.getBoard();\n * console.log(board.lanes.map((l) => l.label));\n * ```\n */\n async getBoard(): Promise<KanbanBoard> {\n const data = await this.httpGet<RawBoardResponse>('/boards/current');\n return mapBoard(data);\n }\n\n // ===== CARDS =====\n\n /**\n * List cards on the board (optionally filtered by lane/type).\n *\n * @param input - Optional list filters.\n * @returns The card list.\n */\n async listCards(input?: ListCardsInput): Promise<CardList> {\n const query: Record<string, string | number | boolean | undefined> = {\n lane: input?.lane,\n type: input?.type,\n limit: input?.limit,\n offset: input?.offset,\n };\n const data = await this.httpGet<{ cards: RawCard[]; total?: number }>(\n '/cards',\n query\n );\n return { cards: (data.cards ?? []).map((c) => mapCard(c)), total: data.total };\n }\n\n /**\n * Create a card. The server engine places it in the initial lane and fires\n * the lane's handler.\n *\n * @param input - Card creation input.\n * @returns The created card.\n */\n async createCard(input: CreateCardInput): Promise<KanbanCard> {\n const idempotencyKey = generateIdempotencyKey();\n const data = await this.httpPost<{ card: RawCard }>(\n '/cards',\n {\n title: input.title,\n type: input.type,\n description: input.description,\n sharedContext: input.sharedContext,\n lane: input.lane,\n },\n // Card creation is NON-idempotent and dispatches an agent run; a client\n // retry (e.g. on a slow create) would create a DUPLICATE card + a second\n // agent run (token waste). The server does not honor Idempotency-Key, so\n // never auto-retry this mutation.\n { idempotencyKey, skipRetry: true }\n );\n return mapCard(data.card);\n }\n\n /**\n * Get a single card by id, including its current run (`executionId` + run\n * summary) so the live run can be streamed.\n *\n * @param cardId - Card UUID.\n * @returns The card with its current/last run.\n */\n async getCard(cardId: string): Promise<KanbanCard> {\n // cadra-web returns the run as { executionId: <integer PK>, executionUuid,\n // status, error }. The SDK's KanbanRunSummary.executionId is the UUID that\n // drives the stream, so normalize executionUuid -> executionId here.\n const data = await this.httpGet<{\n card: RawCard;\n run?: {\n executionId?: number | string;\n executionUuid?: string;\n status?: KanbanRunSummary['status'];\n output?: string;\n error?: string | null;\n } | null;\n }>(`/cards/${cardId}`);\n const run: KanbanRunSummary | undefined = data.run\n ? {\n executionId:\n data.run.executionUuid ?? String(data.run.executionId ?? ''),\n status: data.run.status ?? 'pending',\n output: data.run.output,\n error: data.run.error ?? undefined,\n }\n : undefined;\n return mapCard(data.card, run);\n }\n\n /**\n * Patch a card's mutable fields (title/description/sharedContext). Maps the\n * `{ card: RawCard }` response back to a `KanbanCard`.\n *\n * @param cardId - Card id (the integer PK string the routes key on).\n * @param patch - The fields to update (all optional).\n * @returns The updated card.\n */\n async updateCard(\n cardId: string,\n patch: {\n title?: string;\n description?: string;\n sharedContext?: Record<string, unknown>;\n }\n ): Promise<KanbanCard> {\n // Non-idempotent-ish but safe; skipRetry to stay consistent with create.\n const data = await this.httpPatch<{ card: RawCard }>(\n `/cards/${cardId}`,\n patch,\n { skipRetry: true }\n );\n return mapCard(data.card);\n }\n\n /**\n * Manually transition a card to another lane (validated by the server\n * engine).\n *\n * @param input - Transition input.\n * @returns The updated card.\n */\n async transitionCard(input: TransitionCardInput): Promise<KanbanCard> {\n const idempotencyKey = generateIdempotencyKey();\n const data = await this.httpPost<{\n card: { uuid: string; currentLane: string; executionId?: string | null } | null;\n newLane?: string;\n }>(\n `/cards/${input.cardId}/transition`,\n {\n // The cadra-web route reads `toLane` (not `targetLane`). When omitted,\n // the engine auto-advances single-edge lanes.\n toLane: input.targetLane,\n contextPatch: input.contextPatch,\n },\n // Non-idempotent state change — don't auto-retry (a retry could\n // double-advance or re-fire a lane handler).\n { idempotencyKey, skipRetry: true }\n );\n // The transition endpoint returns a minimal card; surface the updated lane\n // (callers typically refetch the board/cards after a transition).\n return {\n id: data.card?.uuid ?? input.cardId,\n boardId: '',\n lane: data.card?.currentLane ?? data.newLane ?? input.targetLane ?? '',\n title: '',\n executionId: data.card?.executionId ?? undefined,\n };\n }\n\n // ===== RUN (reuses the existing execution-stream controller) =====\n\n /**\n * Get the card's current run as an execution. Thin convenience over the\n * existing agents/runs surface, used for polling fallback in the run view.\n *\n * @param executionId - The card's execution UUID.\n * @returns Execution details.\n */\n async getCardRun(executionId: string): Promise<AgentExecution> {\n return this.http.get<AgentExecution>(executionPath(executionId));\n }\n\n /**\n * Create a stream controller for a card's run, keyed on the card's\n * `executionId`.\n *\n * This reuses the SAME `ExecutionStreamController` the chat/agents modules\n * use against `GET /api/v1/agents/runs/{executionId}/stream` — automatic\n * reconnection, polling fallback, event dedup, and state recovery. There is\n * NO bespoke kanban stream (design.md §4.3).\n *\n * IMPORTANT: Do NOT call `.connect()` here — the caller must register\n * event listeners with `.on()` FIRST, then call `.connect()` (same contract\n * as `AgentsAPI.streamExecution`).\n *\n * @param executionId - The card's execution UUID.\n * @returns A stream controller.\n */\n streamCardRun(executionId: string): ExecutionStreamController {\n const config = this.getStreamConfig();\n return createExecutionStreamController({\n executionId,\n baseUrl: config.baseUrl,\n // The stream controller sends `Bearer <apiKey>`. Board consumers (yobo\n // copilot) construct the client with `token` (not `apiKey`), so fall back\n // to the token here — otherwise the SSE request sends `Bearer undefined`\n // and the stream route (withApiAuth) rejects it with INVALID_API_KEY.\n apiKey: config.apiKey ?? config.token,\n tokenProvider: config.tokenProvider,\n orgId: config.orgId,\n getExecution: (id) => this.getCardRun(id),\n });\n }\n}\n","/**\n * Teams Resource API\n *\n * Provides team-related operations:\n * - List: list(), get()\n */\n\nimport { BaseResourceAPI } from './base.js';\nimport type { ListOptions, PaginatedResponse } from '../types/index.js';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/** Agent classification within a team */\nexport type TeamAgentType = 'ORCHESTRATOR' | 'SPECIALIST';\n\n/** Agent operational status */\nexport type TeamAgentStatus = 'ACTIVE' | 'IDLE' | 'BUSY' | 'OFFLINE' | 'DRAFT';\n\n/** Agent summary within a team member entry */\nexport interface TeamMemberAgent {\n uuid: string;\n name: string;\n agentType: TeamAgentType;\n roleTemplate: string | null;\n status: TeamAgentStatus;\n description?: string | null;\n}\n\n/**\n * STORY-014 (CAD-70): TeamMemberRef discriminated union.\n *\n * A team member reference is either:\n * - cadra_agent — a native Cadra agent (resolved by agentUuid)\n * - remote_agent — a remote external agent (resolved by remoteAgentUuid)\n *\n * The discriminator is `memberType` — IDENTICAL to TeamMemberData.memberType and\n * cadra-api's SpecialistAgentInfo.memberType / the cadra-web specialists route, so\n * this union narrows the same shape the runtime actually produces (not a separate\n * `type`-keyed config dialect).\n *\n * MVP: remote_agent is always a LEAF/specialist. The orchestrator/lead is always a\n * native cadra_agent (teams.leadAgentId); leaf-only is enforced structurally in\n * cadra-api (a remote dispatch only ever routes to RemoteExecutionBroker and never\n * constructs a native AgentRuntime), not by a runtime flag.\n */\nexport type TeamMemberRef =\n | { memberType: 'cadra_agent'; agentUuid: string }\n | { memberType: 'remote_agent'; remoteAgentUuid: string };\n\n/** A team member with their agent details */\nexport interface TeamMemberData {\n id: number | string;\n isLead: boolean;\n agent: TeamMemberAgent;\n /**\n * STORY-014: Member type discriminator.\n * - 'cadra_agent' — native Cadra agent (default, backward-compatible)\n * - 'remote_agent' — remote external agent; remoteAgentUuid identifies the record\n */\n memberType?: 'cadra_agent' | 'remote_agent';\n /**\n * STORY-014: UUID of the remote_agents record (cadra-web).\n * Set when memberType === 'remote_agent'.\n */\n remoteAgentUuid?: string;\n}\n\n/** Lead agent summary */\nexport interface TeamLeadAgentData {\n uuid: string;\n name: string;\n agentType: TeamAgentType;\n status: TeamAgentStatus;\n}\n\n/** Team detail returned by the API */\nexport interface Team {\n uuid: string;\n name: string;\n description?: string | null;\n isActive: boolean;\n leadAgent: TeamLeadAgentData | null;\n members: TeamMemberData[];\n}\n\n/** List options for teams */\nexport interface TeamListOptions extends ListOptions {\n /** Filter by active status */\n isActive?: boolean;\n}\n\n// =============================================================================\n// API CLASS\n// =============================================================================\n\n/**\n * Teams API class\n */\nexport class TeamsAPI extends BaseResourceAPI {\n constructor(http: import('../utils/http.js').HttpClient) {\n super(http, '/api/v1/teams');\n }\n\n /**\n * List all teams in the organization\n */\n async list(options?: TeamListOptions): Promise<PaginatedResponse<Team>> {\n const query: Record<string, string | number | boolean | undefined> = {\n ...this.buildListQuery(options),\n isActive: options?.isActive,\n };\n return this.httpGet<PaginatedResponse<Team>>('', query);\n }\n\n /**\n * Get a single team by UUID\n *\n * @param uuid - Team UUID\n * @param includeMembers - Whether to include team members (default: true)\n */\n async get(uuid: string, includeMembers = true): Promise<Team> {\n return this.httpGet<Team>(`/${uuid}`, { includeMembers });\n }\n}\n","/**\n * Remote Agents Resource API\n *\n * Provides operations for remote agent management and execution:\n * - List: list(), get()\n * - Manage: create(), update(), delete(), deploy()\n * - Execute: execute(), stream()\n */\n\nimport { BaseResourceAPI } from './base.js';\nimport type { HttpClient } from '../utils/http.js';\nimport { generateIdempotencyKey, generateExecutionId } from '../utils/http.js';\nimport type {\n RemoteAgent,\n RemoteAgentListOptions,\n RemoteAgentCreateInput,\n RemoteAgentUpdateInput,\n RemoteAgentExecuteResponse,\n} from '../types/remote-agents.js';\nimport type { PaginatedResponse, ExecuteInput } from '../types/index.js';\nimport type { ExecutionStreamController } from '../streaming/stream-controller.js';\nimport { createExecutionStreamController } from '../streaming/stream-controller.js';\nimport type { AgentExecution } from '../types/agents.js';\nimport type { StreamConfig } from './agents.js';\nimport { executionPath } from '../utils/api-paths.js';\n\n/**\n * Remote Agents API class\n */\nexport class RemoteAgentsAPI extends BaseResourceAPI {\n constructor(http: HttpClient, private readonly getStreamConfig: () => StreamConfig) {\n super(http, '/api/v1/remote-agents');\n }\n\n /**\n * List all remote agents in the organization\n *\n * @param options - List options (pagination, filtering)\n * @returns Paginated list of remote agents\n *\n * @example\n * ```typescript\n * const { data: agents, pagination } = await client.remoteAgents.list({ status: 'active' });\n * ```\n */\n async list(options?: RemoteAgentListOptions): Promise<PaginatedResponse<RemoteAgent>> {\n const query: Record<string, string | number | boolean | undefined> = {\n ...this.buildListQuery(options),\n status: options?.status,\n adapterType: options?.adapterType,\n };\n return this.httpGet<PaginatedResponse<RemoteAgent>>('', query);\n }\n\n /**\n * Get a single remote agent by UUID\n *\n * @param uuid - Remote agent UUID\n * @returns Remote agent details\n */\n async get(uuid: string): Promise<RemoteAgent> {\n return this.httpGet<RemoteAgent>(`/${uuid}`);\n }\n\n /**\n * Create a new remote agent\n *\n * @param data - Remote agent creation input\n * @returns Created remote agent\n */\n async create(data: RemoteAgentCreateInput): Promise<RemoteAgent> {\n return this.httpPost<RemoteAgent>('', data);\n }\n\n /**\n * Update a remote agent\n *\n * @param uuid - Remote agent UUID\n * @param data - Fields to update\n * @returns Updated remote agent\n */\n async update(uuid: string, data: RemoteAgentUpdateInput): Promise<RemoteAgent> {\n return this.httpPatch<RemoteAgent>(`/${uuid}`, data);\n }\n\n /**\n * Delete a remote agent\n *\n * @param uuid - Remote agent UUID\n * @returns Success response\n */\n async delete(uuid: string): Promise<{ success: boolean }> {\n return this.httpDelete<{ success: boolean }>(`/${uuid}`);\n }\n\n /**\n * Deploy a remote agent (make it available for execution)\n *\n * @param uuid - Remote agent UUID\n * @returns Updated remote agent with deployed visibility\n */\n async deploy(uuid: string): Promise<RemoteAgent> {\n return this.httpPost<RemoteAgent>(`/${uuid}/deploy`);\n }\n\n /**\n * Start a remote agent execution (async)\n *\n * Returns immediately with executionId and streamUrl.\n * Use stream() for real-time updates.\n *\n * @param uuid - Remote agent UUID\n * @param input - Execution input (task, context, options)\n * @returns Execution ID and stream URL\n *\n * @example\n * ```typescript\n * const { executionId, streamUrl } = await client.remoteAgents.execute('agent-uuid', {\n * task: 'Process the uploaded dataset',\n * });\n * ```\n */\n async execute(uuid: string, input: ExecuteInput): Promise<RemoteAgentExecuteResponse> {\n // STORY-017: mirror AgentsAPI.execute — an idempotency key + a client-prepared\n // executionId make remote dispatch safe under HttpClient's automatic retries\n // (a timeout/5xx after the server already enqueued must not double-dispatch\n // remote runner work).\n const idempotencyKey = input.options?.idempotencyKey ?? generateIdempotencyKey();\n // STORY-017 (re-review): cadra-web dedupes a duplicate dispatch on the BODY\n // executionId, not the idempotency-key header. Default a stable client UUID so\n // the SDK's automatic retries hit the same row instead of double-dispatching.\n const executionId = input.executionId ?? generateExecutionId();\n return this.httpPost<RemoteAgentExecuteResponse>(\n `/${uuid}/execute`,\n {\n task: input.task,\n context: input.context ?? {},\n attachmentIds: input.attachmentIds,\n options: input.options,\n // Review #10: forward sessionId so multi-turn remote sessions are possible.\n // The cadra-web execute route's Zod schema already accepts sessionId.\n ...(input.sessionId ? { sessionId: input.sessionId } : {}),\n executionId,\n },\n { idempotencyKey }\n );\n }\n\n /**\n * Stream a remote agent execution\n *\n * Returns a StreamController for real-time event handling.\n * IMPORTANT: Do NOT call connect() inside this method — caller must register\n * listeners first, THEN call connect().\n *\n * @param uuid - Remote agent UUID\n * @param input - Execution input\n * @returns Stream controller (caller must call connect() after registering listeners)\n *\n * @example\n * ```typescript\n * const stream = await client.remoteAgents.stream('agent-uuid', {\n * task: 'Process the dataset',\n * });\n *\n * stream.on('log', (log) => console.log(log.title));\n * stream.on('complete', ({ execution }) => console.log(execution.output));\n *\n * await stream.connect();\n * const result = await stream.wait();\n * ```\n */\n async stream(uuid: string, input: ExecuteInput): Promise<ExecutionStreamController> {\n const { executionId } = await this.execute(uuid, input);\n\n const config = this.getStreamConfig();\n const controller = createExecutionStreamController({\n executionId,\n baseUrl: config.baseUrl,\n apiKey: config.apiKey,\n tokenProvider: config.tokenProvider,\n orgId: config.orgId,\n getExecution: (id) => this.http.get<AgentExecution>(executionPath(id)),\n });\n\n // DO NOT call connect() here - caller registers listeners first, then connects\n return controller;\n }\n}\n","/**\n * Remote Runners Resource API\n *\n * Provides operations for remote runner management:\n * - List: list()\n */\n\nimport { BaseResourceAPI } from './base.js';\nimport type {\n RemoteRunner,\n RemoteRunnerListOptions,\n} from '../types/remote-agents.js';\nimport type { PaginatedResponse } from '../types/index.js';\n\n/**\n * Remote Runners API class\n */\nexport class RemoteRunnersAPI extends BaseResourceAPI {\n constructor(http: import('../utils/http.js').HttpClient) {\n super(http, '/api/v1/remote-runners');\n }\n\n /**\n * List all remote runners in the organization\n *\n * @param options - List options (pagination, filtering)\n * @returns Paginated list of remote runners\n *\n * @example\n * ```typescript\n * const { data: runners, pagination } = await client.remoteRunners.list({ status: 'connected' });\n * ```\n */\n async list(options?: RemoteRunnerListOptions): Promise<PaginatedResponse<RemoteRunner>> {\n const query: Record<string, string | number | boolean | undefined> = {\n ...this.buildListQuery(options),\n status: options?.status,\n };\n return this.httpGet<PaginatedResponse<RemoteRunner>>('', query);\n }\n}\n","/**\n * AI Functions API (p93 AIF-010 — specs §9, D27).\n *\n * @example\n * ```typescript\n * // Discover what the org can call, and with which parameters\n * const functions = await client.aiFunctions.list();\n * const fn = await client.aiFunctions.get('summarise_ticket');\n *\n * // Call it — parameters are checked against the live version before sending\n * const result = await client.aiFunctions.run('summarise_ticket', { ticket_text: '…' });\n * if (result.output.type === 'text') console.log(result.output.text);\n * ```\n */\n\nimport {\n AiFunctionChargedError,\n AiFunctionDuplicateError,\n AiFunctionParameterError,\n CadraError,\n} from '../errors/index.js';\nimport type {\n AiFunctionDescriptor,\n AiFunctionParameter,\n AiFunctionParameterIssue,\n AiFunctionRef,\n AiFunctionRun,\n AiFunctionRunOptions,\n AiFunctionRunResult,\n AiFunctionRunShorthandOptions,\n AiFunctionVariables,\n} from '../types/ai-functions.js';\nimport { generateExecutionId, type HttpClient } from '../utils/http.js';\nimport { BaseResourceAPI } from './base.js';\n\n/**\n * How long the client waits for a paid run. It tracks cadra-web\n * `AI_FUNCTION_ROUTE_MAX_MS` (300 s, the Vercel `maxDuration` of the run\n * routes) plus 10 s, so the server always answers first — with the result or\n * with its own `failed_timeout` — and the client never abandons a run the\n * server is still finishing. A larger client-wide `timeout` wins.\n * (Was 60 s, from the old p93 D6 route budget.)\n */\nexport const AI_FUNCTION_RUN_TIMEOUT_MS = 310_000;\n\n/** Descriptors used by the client-side check are cached per client for 60 s (D27c). */\nexport const AI_FUNCTION_DESCRIPTOR_TTL_MS = 60_000;\n\ninterface DescriptorCacheEntry {\n descriptor: AiFunctionDescriptor;\n expiresAt: number;\n}\n\n/**\n * Check `variables` against a descriptor's parameters (D27c). Returns the issues,\n * in parameter order, then unknown names. Empty array = OK.\n */\nexport function checkAiFunctionParameters(\n parameters: AiFunctionParameter[],\n variables: AiFunctionVariables\n): AiFunctionParameterIssue[] {\n const issues: AiFunctionParameterIssue[] = [];\n const declared = new Set<string>();\n\n for (const p of parameters) {\n declared.add(p.name);\n const has = Object.prototype.hasOwnProperty.call(variables, p.name);\n const value = has ? variables[p.name] : undefined;\n\n if (value === undefined || value === null) {\n if (p.required) issues.push({ name: p.name, code: 'missing' });\n continue;\n }\n\n switch (p.type) {\n case 'number':\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n issues.push({ name: p.name, code: 'type' });\n }\n break;\n case 'boolean':\n if (typeof value !== 'boolean') issues.push({ name: p.name, code: 'type' });\n break;\n case 'enum':\n if (typeof value !== 'string') issues.push({ name: p.name, code: 'type' });\n else if (p.options && !p.options.includes(value)) {\n issues.push({ name: p.name, code: 'option' });\n }\n break;\n case 'string':\n case 'text':\n if (typeof value !== 'string') issues.push({ name: p.name, code: 'type' });\n else if (typeof p.maxLength === 'number' && value.length > p.maxLength) {\n issues.push({ name: p.name, code: 'too_long' });\n }\n break;\n case 'image':\n if (typeof value !== 'string') issues.push({ name: p.name, code: 'type' });\n break;\n default:\n // Unknown future type — leave it to the server (the authority).\n break;\n }\n }\n\n for (const name of Object.keys(variables)) {\n if (!declared.has(name)) issues.push({ name, code: 'unknown' });\n }\n\n return issues;\n}\n\n/**\n * AI Functions API\n */\nexport class AiFunctionsAPI extends BaseResourceAPI {\n private readonly descriptorCache = new Map<string, DescriptorCacheEntry>();\n\n constructor(http: HttpClient) {\n super(http, '/api/v1/ai-functions');\n }\n\n /**\n * List the functions this org can call — the index (D27a). Each entry carries\n * the live version's typed parameters; never prompt text.\n */\n async list(): Promise<AiFunctionDescriptor[]> {\n const data = await this.httpGet<{ functions?: AiFunctionDescriptor[] } | AiFunctionDescriptor[]>('');\n const functions = Array.isArray(data) ? data : (data?.functions ?? []);\n for (const d of functions) this.cacheDescriptor(d);\n return functions;\n }\n\n /**\n * Get one function's descriptor by key (D27a).\n * `NotFoundError` (`FUNCTION_NOT_FOUND`) / `ConflictError` (`FUNCTION_NOT_PUBLISHED`).\n */\n async get(functionKey: string): Promise<AiFunctionDescriptor> {\n const data = await this.httpGet<AiFunctionDescriptor | { function: AiFunctionDescriptor }>(\n `/${encodeURIComponent(functionKey)}`\n );\n const descriptor =\n data && typeof data === 'object' && 'function' in data && !('functionKey' in data)\n ? data.function\n : (data as AiFunctionDescriptor);\n this.cacheDescriptor(descriptor, functionKey);\n return descriptor;\n }\n\n /**\n * Read one of this org's own runs (safe projection, §6.5).\n */\n async getRun(executionId: string): Promise<AiFunctionRun> {\n return this.httpGet<AiFunctionRun>(`/runs/${encodeURIComponent(executionId)}`);\n }\n\n /** Forget cached descriptors (one key, or all). */\n clearDescriptorCache(functionKey?: string): void {\n if (functionKey) this.descriptorCache.delete(functionKey);\n else this.descriptorCache.clear();\n }\n\n /**\n * Run an AI function — one paid provider call.\n *\n * - `run('function_key', parameters, opts?)` — shorthand for `{ functionKey }`.\n * - `run({ functionKey | promptUuid | slot }, { variables, version?, idempotencyKey?, params?, validate? })`.\n *\n * For a `functionKey` ref without a pinned `version`, parameters are checked\n * against the live version first (D27c); a problem throws\n * `AiFunctionParameterError` and NO run request is sent. Paid runs are never\n * auto-retried; an idempotency key is generated when omitted.\n *\n * @throws AiFunctionParameterError — client-side check failed (nothing sent)\n * @throws AiFunctionDuplicateError — 409 `DUPLICATE_REQUEST`\n * @throws AiFunctionChargedError — the run was metered but its output failed (`details.charged`)\n */\n async run<TOutput = unknown>(\n functionKey: string,\n parameters: AiFunctionVariables,\n opts?: AiFunctionRunShorthandOptions\n ): Promise<AiFunctionRunResult<TOutput>>;\n async run<TOutput = unknown>(\n ref: AiFunctionRef,\n options: AiFunctionRunOptions\n ): Promise<AiFunctionRunResult<TOutput>>;\n async run<TOutput = unknown>(\n refOrKey: AiFunctionRef | string,\n parametersOrOptions: AiFunctionVariables | AiFunctionRunOptions,\n shorthandOpts?: AiFunctionRunShorthandOptions\n ): Promise<AiFunctionRunResult<TOutput>> {\n let ref: AiFunctionRef;\n let options: AiFunctionRunOptions;\n if (typeof refOrKey === 'string') {\n ref = { functionKey: refOrKey };\n options = { ...(shorthandOpts ?? {}), variables: parametersOrOptions as AiFunctionVariables };\n } else {\n ref = refOrKey;\n options = parametersOrOptions as AiFunctionRunOptions;\n }\n const variables = options.variables ?? {};\n\n const functionKey = 'functionKey' in ref ? ref.functionKey : undefined;\n const shouldCheck =\n functionKey !== undefined && options.version === undefined && options.validate !== false;\n\n if (shouldCheck) {\n const descriptor = await this.getCachedDescriptor(functionKey);\n const issues = checkAiFunctionParameters(descriptor.parameters, variables);\n if (issues.length > 0) {\n throw new AiFunctionParameterError(functionKey, issues);\n }\n }\n\n const body = {\n ref,\n variables,\n version: options.version,\n idempotencyKey: options.idempotencyKey ?? generateExecutionId(),\n params: options.params,\n };\n\n try {\n return await this.httpPost<AiFunctionRunResult<TOutput>>('/run', body, {\n skipRetry: true,\n timeoutMs: Math.max(AI_FUNCTION_RUN_TIMEOUT_MS, this.http.timeoutMs ?? 0),\n });\n } catch (error) {\n throw this.mapRunError(error, functionKey);\n }\n }\n\n // ── internals ──────────────────────────────────────────────────────────────\n\n private cacheDescriptor(descriptor: AiFunctionDescriptor | undefined, key?: string): void {\n if (!descriptor || typeof descriptor !== 'object') return;\n const cacheKey = key ?? descriptor.functionKey;\n if (!cacheKey) return;\n this.descriptorCache.set(cacheKey, {\n descriptor,\n expiresAt: Date.now() + AI_FUNCTION_DESCRIPTOR_TTL_MS,\n });\n }\n\n private async getCachedDescriptor(functionKey: string): Promise<AiFunctionDescriptor> {\n const hit = this.descriptorCache.get(functionKey);\n if (hit && hit.expiresAt > Date.now()) return hit.descriptor;\n return this.get(functionKey);\n }\n\n private mapRunError(error: unknown, functionKey: string | undefined): unknown {\n if (!(error instanceof CadraError)) return error;\n\n if (error.serverCode === 'DUPLICATE_REQUEST') {\n return new AiFunctionDuplicateError(error.message, error.details, error.requestId);\n }\n if (error.details?.charged === true) {\n return new AiFunctionChargedError(error);\n }\n // The server disagreed with our (cached) view of the parameters: the live\n // version probably changed. Drop the descriptor so the next run re-reads it.\n if (functionKey && error.serverCode?.startsWith('VARIABLE_')) {\n this.descriptorCache.delete(functionKey);\n }\n return error;\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, AiFunctionsAPI, ArtifactsAPI, AttachmentsAPI, KanbanAPI, RemoteAgentsAPI, RemoteRunnersAPI, SessionsAPI, SkillsAPI, TeamsAPI, 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 /** Optional fetch implementation — inject `expo/fetch` for React Native streaming. Defaults to global fetch. */\n fetch?: typeof fetch;\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 /** Optional fetch implementation — inject `expo/fetch` for React Native streaming. Defaults to global fetch. */\n fetch?: typeof fetch;\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 /** Optional fetch implementation — inject `expo/fetch` for React Native streaming. Defaults to global fetch. */\n fetch?: typeof fetch;\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 fetch?: typeof fetch;\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 * Attachment operations (upload, confirm, download)\n */\n readonly attachments: AttachmentsAPI;\n\n /**\n * Session operations (list, get, create, message, delete)\n */\n readonly sessions: SessionsAPI;\n\n /**\n * Team operations (list, get)\n */\n readonly teams: TeamsAPI;\n\n /**\n * Kanban operations (board, cards, transitions, card-run stream)\n */\n readonly kanban: KanbanAPI;\n\n /**\n * Remote agent operations (list, get, create, update, delete, deploy, execute, stream)\n */\n readonly remoteAgents: RemoteAgentsAPI;\n\n /**\n * Remote runner operations (list)\n */\n readonly remoteRunners: RemoteRunnersAPI;\n\n /**\n * AI function operations (list, get, run, getRun) — p93\n */\n readonly aiFunctions: AiFunctionsAPI;\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 fetch: options.fetch,\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 fetch: this.config.fetch,\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 fetch: this.config.fetch,\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.attachments = new AttachmentsAPI(this.httpClient);\n this.sessions = new SessionsAPI(this.httpClient, getStreamConfig);\n this.teams = new TeamsAPI(this.httpClient);\n this.kanban = new KanbanAPI(this.httpClient, getStreamConfig);\n this.remoteAgents = new RemoteAgentsAPI(this.httpClient, getStreamConfig);\n this.remoteRunners = new RemoteRunnersAPI(this.httpClient);\n this.aiFunctions = new AiFunctionsAPI(this.httpClient);\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// SSE STREAM RETRY (degrade-don't-detonate)\n// =============================================================================\n\n/**\n * Total time to keep retrying a not-yet-ready run stream before surfacing an\n * error. The chat mints the runId client-side and opens the SSE stream in\n * parallel with the POST that creates the run, so the server's ownership gate\n * can briefly return 404 (\"Agent run not found\") until the run row is visible\n * under cold-start load. Retrying — instead of throwing a terminal banner —\n * lets the stream connect once the row lands.\n */\nconst STREAM_RETRY_WINDOW_MS = 30_000;\n/** Delay between reconnect attempts while a run is not yet ready. */\nconst STREAM_RETRY_DELAY_MS = 500;\n\n/** Stream isn't ready yet (run row not visible) — safe to retry. */\nclass RetriableStreamError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"RetriableStreamError\";\n }\n}\n\n/** Stream failed for a non-transient reason (auth, 4xx/5xx) — stop retrying. */\nclass FatalStreamError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"FatalStreamError\";\n }\n}\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 SSE stream URLs)\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// 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 // P25 — Action 5: forward client-prepared execution UUID.\n executionId: input.executionId,\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 // P25 — Action 5: forward client-prepared execution UUID so cadra-web\n // uses our pre-generated ID instead of minting its own. The caller\n // (useAgentChat.sendMessage) has already opened SSE against this ID\n // in parallel with this HTTP call.\n executionId: input.executionId,\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 // P25 — Action 5: forward client-prepared execution UUID.\n executionId: input.executionId,\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 (delegates to CadraClient.attachments)\n // -------------------------------------------------------------------------\n\n async getUploadUrl(input: UploadUrlInput): Promise<UploadUrlResult> {\n const result = await client.attachments.getUploadUrl({\n filename: input.filename,\n mimeType: input.mimeType,\n size: input.size,\n });\n return {\n attachmentUuid: result.attachmentUuid,\n uploadUrl: result.uploadUrl,\n };\n },\n\n async confirmUpload(uuid: string): Promise<void> {\n await client.attachments.confirm(uuid);\n },\n\n async getDownloadUrl(uuid: string): Promise<string> {\n return client.attachments.getDownloadUrl(uuid);\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 ...(a.thumbnailUrl ? { thumbnailUrl: a.thumbnailUrl } : {}),\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 // Pass through toolCalls so the chat hook can rebuild tool-call UI\n // (e.g. strategy/campaign cards) for historical sessions. Server\n // pairs tool_call + tool_result execution logs into this shape.\n toolCalls: Array.isArray(m.toolCalls)\n ? m.toolCalls.map((tc: any) => ({\n id: String(tc.id),\n name: String(tc.name),\n args: tc.args,\n result: tc.result,\n status: tc.status as\n | \"pending\"\n | \"running\"\n | \"completed\"\n | \"failed\",\n durationMs:\n typeof tc.durationMs === \"number\" ? tc.durationMs : undefined,\n }))\n : undefined,\n // Pass through reconstructed content blocks (text + tool_call refs)\n // so narrated turns replay their interleaved narration on reload. (Fix 2.)\n contentBlocks: Array.isArray(m.contentBlocks) ? m.contentBlocks : undefined,\n })),\n createdAt: history.session.createdAt,\n updatedAt: history.session.lastMessageAt,\n // Resume support: the in-flight execution to reconnect to on reopen.\n activeExecution: (history as { activeExecution?: { id: string; status: string } })\n .activeExecution,\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 // When this subscription began — bounds the not-ready (404) retry loop.\n const connectStartedAt = Date.now();\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 callbacks.onConnectionChange?.(true);\n return;\n }\n const errorText = await response.text().catch(() => \"\");\n // 404 = create/connect race: the runId was minted client-side and\n // this stream opened in parallel with the POST that creates the\n // run, so the server ownership gate can't see the row yet. Retry\n // rather than detonate a terminal \"SSE connection failed: 404\"\n // banner — the stream connects once the row lands.\n if (response.status === 404) {\n throw new RetriableStreamError(\n `run ${executionId} not ready yet (404)`\n );\n }\n throw new FatalStreamError(\n `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 // An abort is intentional teardown — never retry it.\n if (err instanceof Error && err.name === \"AbortError\") {\n throw err;\n }\n callbacks.onConnectionChange?.(false);\n const fatal = err instanceof FatalStreamError;\n const exhausted =\n Date.now() - connectStartedAt >= STREAM_RETRY_WINDOW_MS;\n if (fatal || exhausted) {\n // Surfaced once by the outer catch; throwing stops retrying.\n throw err;\n }\n // Retriable (run-not-ready 404 race or a transient drop):\n // reconnect after a short delay without alarming the UI.\n return STREAM_RETRY_DELAY_MS;\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 /**\n * Callback for progress updates.\n *\n * Fires for `step`, `progress`, `status_update`, and `started` SSE events.\n * `currentStep` is a human-readable label (e.g. \"Loading agent…\", \"Thinking…\")\n * carried by worker init events and used to render a \"thinking pill\" in the\n * empty assistant bubble before any text tokens arrive. See P25 — Action 1.\n */\n onProgress?: (data: {\n iteration?: number;\n tokenUsage?: { prompt: number; completion: number; total: number };\n cost?: number;\n /** Latest human-readable label describing what the agent is doing */\n currentStep?: string;\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 // P25 — Action 1: forward worker-published progress / status_update /\n // started events so the chat hook can populate the streaming\n // message's `currentStep` thinking pill while waiting for the first\n // text_delta. These events were previously silently dropped on the\n // legacy path.\n case \"progress\":\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 currentStep: data.currentStep as string | undefined,\n });\n break;\n\n case \"status_update\":\n onProgress?.({\n // `status_update` events from cadra-api carry the label as\n // `message` (mapped to `progress.currentStep` by the controller).\n // Mirror that here for the legacy path.\n currentStep: (data.currentStep as string | undefined)\n ?? (data.message as string | undefined),\n });\n break;\n\n case \"started\":\n onProgress?.({\n currentStep: data.currentStep as string | 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","/**\n * CAD-243 — decide whether a tool result is a SUCCESS or a FAILURE.\n *\n * Every tool_result handler in useAgentChat used to hard-code\n * `status: \"completed\"`, so a failed tool rendered as a green chip. This is the\n * one place that reads the failure signals a tool result can carry:\n *\n * - producer verdict on the dedicated `tool_result` event: `isError: true` /\n * `status: \"failed\"` (cadra-api, thrown tool calls);\n * - LogCollector `tool_result` log metadata: `success: false` (envelope\n * failure) or `payloadFailure: true` (success envelope, failure payload);\n * - the result payload itself: `{ success: false }` / `{ isError: true }`\n * (older producers, tools that return a failure instead of throwing).\n *\n * Deliberately narrow: an empty or unusual result is a success. Only explicit\n * failure signals count.\n */\n\nexport interface ToolOutcomeInput {\n result?: unknown;\n isError?: unknown;\n status?: unknown;\n success?: unknown;\n payloadFailure?: unknown;\n error?: unknown;\n}\n\nexport interface ToolOutcome {\n status: \"completed\" | \"failed\";\n /** Human-readable error text, only for a failed outcome. */\n error?: string;\n}\n\nconst MAX_ERROR_CHARS = 500;\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction errorFrom(value: unknown): string | undefined {\n if (typeof value === \"string\" && value.trim()) return value;\n const rec = asRecord(value);\n if (rec && typeof rec.message === \"string\" && rec.message.trim()) return rec.message;\n return undefined;\n}\n\nfunction isFailurePayload(result: unknown): boolean {\n const rec = asRecord(result);\n if (!rec) return false;\n return rec.success === false || rec.isError === true;\n}\n\nfunction cap(text: string): string {\n return text.length > MAX_ERROR_CHARS ? `${text.slice(0, MAX_ERROR_CHARS)}…` : text;\n}\n\nexport function resolveToolOutcome(input: ToolOutcomeInput): ToolOutcome {\n const failed =\n input.isError === true ||\n input.status === \"failed\" ||\n input.success === false ||\n input.payloadFailure === true ||\n isFailurePayload(input.result);\n if (!failed) return { status: \"completed\" };\n const error =\n errorFrom(input.error) ?? errorFrom(asRecord(input.result)?.error) ?? \"Tool call failed\";\n return { status: \"failed\", error: cap(error) };\n}\n","/**\n * Session-history cache (Fix 3 — instant chat reopen).\n *\n * Consumers like yobo remount `<AgentChat>` on every navigation back into a\n * session, so a hook-instance cache cannot survive — the cache must live at\n * module scope, mirroring React Query's global QueryClient (which is what\n * makes the cadra-web playground's history load feel instant).\n *\n * `useAgentChat.loadSession` paints from this cache synchronously on a hit\n * (instant), and only hits the network when the entry is missing or stale.\n * When a turn settles, the live message list is written back here so that\n * reopening \"the chat I was just in\" is instant rather than a full fetch.\n *\n * `now` is injectable on every entry point so freshness logic is deterministic\n * in tests without fake timers or Date.now mocking.\n */\nimport type { ChatMessage } from \"../types.js\";\n\n/** Default freshness window — matches the playground's 10s React Query staleTime. */\nexport const DEFAULT_HISTORY_STALE_MS = 10_000;\n\ninterface CacheEntry {\n messages: ChatMessage[];\n fetchedAt: number;\n}\n\nconst cache = new Map<string, CacheEntry>();\n\nexport interface CachedHistoryLookup {\n /** The cached messages — safe to paint immediately. */\n messages: ChatMessage[];\n /** true when within `staleMs`: the caller may skip the network refetch entirely. */\n isFresh: boolean;\n}\n\n/**\n * Look up cached history for a session. Returns `null` on a miss. On a hit the\n * messages are always returned (paint them immediately); `isFresh` tells the\n * caller whether a background revalidation is still needed.\n */\nexport function getCachedHistory(\n sessionId: string,\n staleMs: number = DEFAULT_HISTORY_STALE_MS,\n now: number = Date.now(),\n): CachedHistoryLookup | null {\n const entry = cache.get(sessionId);\n if (!entry) return null;\n return {\n messages: entry.messages,\n isFresh: now - entry.fetchedAt < staleMs,\n };\n}\n\n/** Store (or refresh) the cached history for a session. */\nexport function setCachedHistory(\n sessionId: string,\n messages: ChatMessage[],\n now: number = Date.now(),\n): void {\n cache.set(sessionId, { messages, fetchedAt: now });\n}\n\n/** Drop a single session's cached history (e.g. after an explicit refresh). */\nexport function invalidateCachedHistory(sessionId: string): void {\n cache.delete(sessionId);\n}\n\n/** Clear the entire cache (test hook; also useful on logout/org switch). */\nexport function clearHistoryCache(): void {\n cache.clear();\n}\n","/**\n * Pure helpers for accumulating ordered content blocks during streaming.\n *\n * Used by useAgentChat across all SSE event paths (delta text, snapshot\n * text, tool_call, orphan tool_result) to maintain a single ordered\n * sequence of text segments and tool call references on ChatMessage.\n *\n * All helpers return new arrays — never mutate the input. This preserves\n * React state immutability for downstream setState consumers.\n */\n\nimport type { ContentBlock } from \"../types.js\";\n\n/**\n * Append a text delta to the content blocks array.\n *\n * - Empty delta → returns input unchanged.\n * - Last block is text → extends its content.\n * - Last block is tool_call (or array empty) → opens a new text block.\n *\n * Use for delta SSE paths only (textDelta, response_text, text_chunk).\n * For full-content snapshot paths (llm_response, message,\n * final_response divergent), use `replaceTextSnapshot` instead.\n */\nexport function appendTextDelta(\n blocks: ContentBlock[],\n delta: string\n): ContentBlock[] {\n if (!delta) return blocks;\n const last = blocks[blocks.length - 1];\n if (last?.type === \"text\") {\n const next = blocks.slice(0, -1);\n next.push({ type: \"text\", content: last.content + delta });\n return next;\n }\n return [...blocks, { type: \"text\", content: delta }];\n}\n\n/**\n * Replace the open text block with a full snapshot.\n *\n * Use for SSE event types that emit the FULL current content rather\n * than an incremental delta — `llm_response`, `message`, divergent\n * `final_response`. Wiring `appendTextDelta` to these paths would\n * duplicate content.\n *\n * - Tail is text → replace its content with the snapshot.\n * - Tail is tool_call (or array empty) → open a new text block with\n * the snapshot.\n */\nexport function replaceTextSnapshot(\n blocks: ContentBlock[],\n fullText: string\n): ContentBlock[] {\n const last = blocks[blocks.length - 1];\n if (last?.type === \"text\") {\n const next = blocks.slice(0, -1);\n next.push({ type: \"text\", content: fullText });\n return next;\n }\n return [...blocks, { type: \"text\", content: fullText }];\n}\n\n/**\n * Append a forwarded-narration block (CAD forwarded-narration).\n *\n * Each forwarded specialist narration sentence is its OWN block, attributed to\n * `subagentName`. Never merges into the preceding text block (that would put\n * sub-agent text into `content` and trip `looksLikePlanJson`). Tail-dedups an\n * identical consecutive narration (same content + subagent) so buffer replay\n * or a duplicate publish doesn't double it.\n */\nexport function appendNarrationBlock(\n blocks: ContentBlock[],\n content: string,\n subagentName?: string\n): ContentBlock[] {\n if (!content) return blocks;\n const last = blocks[blocks.length - 1];\n if (\n last?.type === \"narration\" &&\n last.content === content &&\n last.subagentName === subagentName\n ) {\n return blocks;\n }\n return [...blocks, { type: \"narration\", content, subagentName }];\n}\n\n/**\n * Solidify the trailing live streaming-text block into a persistent NATIVE\n * narration block (manus rolling-narration UX).\n *\n * cadra-api emits, per step, BOTH a raw `text_delta` firehose (which streams\n * into a \"live\" text block via {@link appendTextDelta}) AND a discrete, gated\n * `narration` event carrying the same sentence, cleaned. To avoid rendering the\n * sentence twice, the arriving native narration REPLACES the live text block it\n * was streaming into, converting it in place to a `narration` block (no\n * `subagentName` — it's the agent's own line).\n *\n * The step's text block is NOT always the tail: the SAME step's `tool_call`\n * (e.g. update_task_list) is frequently appended AFTER the text but BEFORE the\n * step-finish `narration` event, so the tail is a tool_call. We therefore search\n * BACKWARD for the LAST `text` block and replace THAT (in place, preserving\n * order), rather than only checking the tail — otherwise a step with both text\n * and a tool call renders the sentence twice (a text block + a duplicate\n * narration block). Per-step narration fires in order, and each step's text\n * block is solidified by its own narration before the next, so the last text\n * block is always the current step's line.\n *\n * - A `text` block exists (anywhere near the tail) → replace it in place.\n * - No `text` block, identical native narration at the tail → no-op (replay).\n * - No `text` block at all → append a fresh native narration block.\n *\n * Deliberately does NOT touch `state.content`: the raw text_delta accumulation\n * stays intact for finalization, the `looksLikePlanJson` gate, and history.\n * Short final sentences that never cross the narration gate (<50 chars) are\n * never solidified — their text block survives as the fallback render.\n */\nexport function solidifyTrailingTextAsNarration(\n blocks: ContentBlock[],\n content: string\n): ContentBlock[] {\n if (!content) return blocks;\n // Search backward for the last live text block (the current step's streamed\n // text) — it may sit behind this step's tool_call blocks.\n for (let i = blocks.length - 1; i >= 0; i--) {\n if (blocks[i]!.type === \"text\") {\n const next = blocks.slice();\n next[i] = { type: \"narration\", content };\n return next;\n }\n }\n // No live text to convert. Replay / duplicate-publish guard: identical native\n // narration already present at the tail → no-op.\n const last = blocks[blocks.length - 1];\n if (\n last?.type === \"narration\" &&\n last.content === content &&\n last.subagentName === undefined\n ) {\n return blocks;\n }\n // Nothing to convert (tool_call tail, attributed narration, or empty) →\n // append a fresh native narration block (forwarded-less specialist edge).\n return [...blocks, { type: \"narration\", content }];\n}\n\n/**\n * Keep the trailing live streaming-text block as the TERMINAL ANSWER `text`\n * block (CAD-87 S1-002 — role `terminal_answer`).\n *\n * The closing answer is streamed via `text_delta` into a live `text` block AND\n * (like every gated step) re-emitted as a `narration` event. Unlike an\n * intermediate step, the terminal answer must render as the answer document —\n * a `text` block — NOT be solidified into a `narration` block (which is what the\n * SDK did before it read the role, quirk #2). So this is the terminal-answer\n * counterpart of {@link solidifyTrailingTextAsNarration}: it finds the last live\n * `text` block (the streamed answer) and LEAVES it as text.\n *\n * - Trailing (backward-nearest) `text` block already holds the answer → no-op.\n * - A `text` block holds different content → replace it with the answer text.\n * - No `text` block at all (e.g. a narration-only replay with no live text) →\n * append the answer as a fresh `text` block.\n *\n * Like the narration solidify, this never touches `state.content` (the raw\n * text_delta accumulation stays intact for finalization / history).\n */\nexport function solidifyTrailingTextAsAnswer(\n blocks: ContentBlock[],\n content: string\n): ContentBlock[] {\n if (!content) return blocks;\n for (let i = blocks.length - 1; i >= 0; i--) {\n if (blocks[i]!.type === \"text\") {\n const b = blocks[i] as { type: \"text\"; content: string };\n if (b.content === content) return blocks; // already the answer text\n const next = blocks.slice();\n next[i] = { type: \"text\", content };\n return next;\n }\n }\n // No live text to keep (replay / duplicate-publish guard): identical answer\n // text already at the tail → no-op; otherwise append it as a fresh text block.\n const last = blocks[blocks.length - 1];\n if (last?.type === \"text\" && last.content === content) return blocks;\n return [...blocks, { type: \"text\", content }];\n}\n\n/**\n * Append a tool_call reference block.\n *\n * Idempotent against the tail: if the last block already references\n * this toolCallId, returns the input unchanged. The primary cross-path\n * dedup mechanism in useAgentChat is `seenToolBlockIdsRef: Set<string>`\n * (since tool_call events from log + dedicated paths can interleave\n * with text deltas, defeating tail-only checks). This tail-idempotency\n * is defense-in-depth.\n */\nexport function appendToolCallBlock(\n blocks: ContentBlock[],\n toolCallId: string\n): ContentBlock[] {\n const last = blocks[blocks.length - 1];\n if (last?.type === \"tool_call\" && last.toolCallId === toolCallId) {\n return blocks;\n }\n return [...blocks, { type: \"tool_call\", toolCallId }];\n}\n","/**\n * Pure event-to-state dispatch for content block accumulation.\n *\n * Shared by:\n * - `useAgentChat.ts` handlers — every SSE event is normalized into a\n * `NormalizedEvent` and dispatched through `applyEvent` so production\n * wiring is exercised by test fixtures.\n * - Hook-level fixture tests — `simulate(events)` reduces over the same\n * `applyEvent` function production calls. Branch-misrouting bugs in\n * production show up in tests because both call the same dispatch.\n *\n * Keep this module pure: no React, no refs, no IO. State is a plain\n * value passed in, new state is returned.\n */\n\nimport type { ContentBlock, ToolCall } from \"../types.js\";\nimport type { EventRole } from \"../../types/streaming.js\";\nimport {\n appendTextDelta,\n appendNarrationBlock,\n appendToolCallBlock,\n replaceTextSnapshot,\n solidifyTrailingTextAsNarration,\n solidifyTrailingTextAsAnswer,\n} from \"./contentBlocks.js\";\n\nexport interface ProjectionState {\n blocks: ContentBlock[];\n seenToolBlockIds: Set<string>;\n toolCalls: Map<string, ToolCall>;\n content: string;\n /**\n * CAD-87 S1-003: the `(execId, seq)` dedup ledger. cadra-api stamps a\n * monotonic per-execution `seq` (+ source id) on every published event\n * (S1-001); this set records the keys already applied so a byte-identical\n * REPLAY (the isolated narration buffer re-read on resume) is DROPPED instead\n * of re-appending each pre-pause narration (\"the lump\"). Optional so older\n * `ProjectionState` literals stay valid and un-stamped streams keep today's\n * behavior (see {@link applyEvent}).\n */\n seenEventKeys?: Set<string>;\n}\n\n/**\n * Producer-stamped event identity (CAD-87 S1-001). Carried on every\n * {@link NormalizedEvent} so {@link applyEvent} can dedup a replayed event by\n * `(execId, seq)`. Both are optional: when absent (older producer), dedup is a\n * no-op and the reducer falls back to today's behavior.\n */\nexport interface NormalizedEventIdentity {\n /** Source execution id (event.sourceExecutionId / executionId; child on a\n * forwarded event). */\n execId?: string;\n /** Monotonic per-source sequence stamped by the producer. */\n seq?: number;\n}\n\n/**\n * Normalized event kinds. Raw SSE event handlers translate to these\n * before dispatching. Names reflect semantic intent, not the original\n * event-type string.\n */\nexport type NormalizedEvent = (\n | { kind: \"text_delta\"; delta: string }\n | { kind: \"text_snapshot\"; text: string }\n | { kind: \"text_snapshot_divergent\"; text: string }\n | { kind: \"narration\"; text: string; subagentName?: string; forwarded?: boolean; role?: EventRole }\n | { kind: \"tool_call\"; id: string; name: string; args?: Record<string, unknown> }\n | {\n kind: \"tool_result\";\n id: string;\n result?: unknown;\n durationMs?: number;\n toolName?: string;\n /** CAD-243: terminal status (default \"completed\"); \"failed\" renders red. */\n status?: \"completed\" | \"failed\";\n /** CAD-243: error text for a failed call. */\n error?: string;\n }\n | { kind: \"terminate\" }\n) & NormalizedEventIdentity;\n\n/**\n * Build a ProjectionState seeded from an existing (partially-rendered) assistant\n * message, so a RESUMED stream appends to what's already there instead of\n * wiping it. Used when reopening a session whose latest execution is still\n * in-flight (stream resume): the loaded message carries the narration/tool\n * blocks produced so far; future events continue from this point.\n */\nexport function projectionFromMessage(\n msg: {\n content?: string;\n contentBlocks?: ContentBlock[];\n toolCalls?: ToolCall[];\n },\n /**\n * CAD-87 S1-003: the `(execId, seq)` dedup ledger from the PRE-resume\n * projection. Carried forward so a warm resume / in-flight reconnect still\n * drops the narration-buffer replay (blocks alone don't carry seq). Absent on\n * a cold reopen (empty) — the existing tail-dedup remains the fallback there.\n */\n priorSeenEventKeys?: ReadonlySet<string>\n): ProjectionState {\n const blocks: ContentBlock[] = msg.contentBlocks ? [...msg.contentBlocks] : [];\n const seenToolBlockIds = new Set<string>();\n for (const b of blocks) {\n if (b.type === \"tool_call\") seenToolBlockIds.add(b.toolCallId);\n }\n const toolCalls = new Map<string, ToolCall>();\n for (const tc of msg.toolCalls ?? []) toolCalls.set(tc.id, tc);\n return {\n blocks,\n seenToolBlockIds,\n toolCalls,\n content: msg.content ?? \"\",\n seenEventKeys: new Set(priorSeenEventKeys ?? []),\n };\n}\n\n/**\n * CAD-87 S1-003: `(execId, seq)` dedup wrapper around {@link applyEventInner}.\n *\n * cadra-api stamps a monotonic per-execution `seq` on every published event\n * (S1-001). An event whose `(execId, seq)` was already applied is DROPPED — the\n * byte-identical isolated-narration-buffer replay on resume carries the ORIGINAL\n * seq, so it no longer re-appends each pre-pause narration (\"the lump\"). Robust\n * to older producers: when `seq`/`execId` is absent the key is null and the\n * event dispatches unchanged (today's behavior).\n */\nexport function applyEvent(\n state: ProjectionState,\n event: NormalizedEvent\n): ProjectionState {\n const key =\n event.seq !== undefined && event.execId\n ? `${event.execId}:${event.seq}`\n : null;\n if (key && state.seenEventKeys?.has(key)) {\n // Already applied — a replay / duplicate publish. Drop it idempotently.\n return state;\n }\n const next = applyEventInner(state, event);\n if (!key) return next;\n // Record the identity so a later replay of the SAME (execId, seq) is dropped.\n const seenEventKeys = new Set(state.seenEventKeys ?? []);\n seenEventKeys.add(key);\n return { ...next, seenEventKeys };\n}\n\nfunction applyEventInner(\n state: ProjectionState,\n event: NormalizedEvent\n): ProjectionState {\n switch (event.kind) {\n case \"text_delta\":\n return {\n ...state,\n blocks: appendTextDelta(state.blocks, event.delta),\n content: state.content + event.delta,\n };\n\n case \"text_snapshot\":\n case \"text_snapshot_divergent\":\n // Exact match: no-op. Snapshot already in sync.\n if (event.text === state.content) {\n return state;\n }\n // Prefix extension: Vercel AI SDK multi-step `streamText` produces\n // `llm_response` log events with CUMULATIVE text after each step\n // (step1_text + step2_text). The deltas already gave us step1_text\n // as one block plus step2_text as another. If we replaceTextSnapshot\n // with cumulative text, we'd push it as a NEW block (tail is tool)\n // — user sees step1 text twice (correct first block + duplicate\n // cumulative third block under tools). Treat as a delta of just\n // the new tail content.\n if (state.content && event.text.startsWith(state.content)) {\n const newTail = event.text.slice(state.content.length);\n if (!newTail.trim()) {\n // Only whitespace added — update content but skip block change\n return { ...state, content: event.text };\n }\n return {\n ...state,\n blocks: appendTextDelta(state.blocks, newTail),\n content: event.text,\n };\n }\n // Genuine divergent / replace case\n return {\n ...state,\n blocks: replaceTextSnapshot(state.blocks, event.text),\n content: event.text,\n };\n\n case \"narration\":\n // Manus rolling-narration UX. Every flavour leaves `content` untouched (so\n // narration can never merge into the parent's text and trip the consumer's\n // looksLikePlanJson gate):\n //\n // • FORWARDED specialist narration — a sub-agent's own line during a\n // handoff (its raw text_delta is NOT forwarded to the parent, so\n // there is no trailing live text to dedup against). Append a separate,\n // `subagentName`-attributed block. A forwarded event is never the\n // PARENT's terminal answer, so role is irrelevant here.\n //\n // • NATIVE `terminal_answer` (CAD-87 S1-002) — the closing answer\n // document. It was ALSO streamed via text_delta into the trailing live\n // text block; KEEP that block as `text` (the answer) instead of\n // solidifying it into a narration block. This retires slice-1 quirk #2\n // (the SDK never read `isFinalAnswer`; the final answer used to render\n // as narration). Compat: an un-roled stream never hits this branch and\n // keeps the solidify behavior below.\n //\n // • NATIVE intermediate narration (`user_visible_progress` or no role) —\n // the agent's own gated per-step sentence, also streamed via\n // text_delta. SOLIDIFY that trailing text block in place (text →\n // narration) to dedup.\n if (event.forwarded) {\n return {\n ...state,\n blocks: appendNarrationBlock(state.blocks, event.text, event.subagentName),\n };\n }\n if (event.role === \"terminal_answer\") {\n return {\n ...state,\n blocks: solidifyTrailingTextAsAnswer(state.blocks, event.text),\n };\n }\n return {\n ...state,\n blocks: solidifyTrailingTextAsNarration(state.blocks, event.text),\n };\n\n case \"tool_call\": {\n const blocks = state.seenToolBlockIds.has(event.id)\n ? state.blocks\n : appendToolCallBlock(state.blocks, event.id);\n const seen = new Set(state.seenToolBlockIds);\n seen.add(event.id);\n const toolCalls = new Map(state.toolCalls);\n toolCalls.set(event.id, {\n id: event.id,\n name: event.name,\n args: event.args ?? {},\n status: \"running\",\n startedAt: Date.now(),\n });\n return { ...state, blocks, seenToolBlockIds: seen, toolCalls };\n }\n\n case \"tool_result\": {\n const tc = state.toolCalls.get(event.id);\n const toolCalls = new Map(state.toolCalls);\n if (tc) {\n toolCalls.set(event.id, {\n ...tc,\n status: event.status ?? \"completed\",\n result: event.result,\n durationMs: event.durationMs,\n ...(event.error !== undefined ? { error: event.error } : {}),\n });\n return { ...state, toolCalls };\n }\n // Orphan: synthesize the finished tool + append block (if not seen)\n toolCalls.set(event.id, {\n id: event.id,\n name: event.toolName ?? \"unknown\",\n args: {},\n result: event.result,\n status: event.status ?? \"completed\",\n durationMs: event.durationMs,\n ...(event.error !== undefined ? { error: event.error } : {}),\n });\n if (state.seenToolBlockIds.has(event.id)) {\n return { ...state, toolCalls };\n }\n const seen = new Set(state.seenToolBlockIds);\n seen.add(event.id);\n return {\n ...state,\n toolCalls,\n seenToolBlockIds: seen,\n blocks: appendToolCallBlock(state.blocks, event.id),\n };\n }\n\n case \"terminate\": {\n const toolCalls = new Map(state.toolCalls);\n for (const [id, tc] of toolCalls) {\n if (tc.status === \"running\" || tc.status === \"pending\") {\n toolCalls.set(id, { ...tc, status: \"completed\" });\n }\n }\n return { ...state, toolCalls };\n }\n }\n}\n\n/**\n * Whether a projected event should RESET/HIDE the rolling-narration pill\n * (`currentStep`) — the manus rolling-line phase logic.\n *\n * - Text arrival (`text_delta` / snapshots) HIDES the pill: the streaming text\n * is itself the live indicator.\n * - A `narration` sentence is a PHASE BOUNDARY that resets the rolling line; the\n * next `progress` event re-populates it during the silent wait that follows.\n * - `tool_call` / `tool_result` / `terminate` leave the pill alone so it keeps\n * rolling while work happens (otherwise it would flicker off on every chip).\n *\n * `useAgentChat.dispatchProjection` calls this to decide whether to clear\n * `currentStep`; keeping it here makes the phase decision pure + unit-testable.\n */\nexport function eventClearsRollingStep(event: NormalizedEvent): boolean {\n return (\n event.kind === \"text_delta\" ||\n event.kind === \"text_snapshot\" ||\n event.kind === \"text_snapshot_divergent\" ||\n event.kind === \"narration\"\n );\n}\n\nexport function initialState(): ProjectionState {\n return {\n blocks: [],\n seenToolBlockIds: new Set(),\n toolCalls: new Map(),\n content: \"\",\n seenEventKeys: new Set(),\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 {\n deriveImagesFromToolCalls as sharedDeriveImagesFromToolCalls,\n} from \"../../streaming/extract-images.js\";\nimport {\n isRateLimited,\n getRetryAfterMs,\n nextFailureDelayMs,\n nextIdleDelayMs,\n applyJitter,\n UNNAMED_RATE_LIMIT_WAIT_MS,\n} from \"../../streaming/poll-policy.js\";\nimport type { ExecutionLog } from \"../../types/agents.js\";\nimport type {\n ChatError,\n ChatMessage,\n ClarificationData,\n ContentBlock,\n CurrentStep,\n DelegationEvent,\n ExecutionStreamEvent,\n ImageData,\n ToolCall,\n} from \"../types.js\";\nimport { useExecutionStream } from \"./useExecutionStream.js\";\nimport { resolveToolOutcome } from \"../utils/toolOutcome.js\";\nimport {\n getCachedHistory,\n setCachedHistory,\n DEFAULT_HISTORY_STALE_MS,\n} from \"./history-cache.js\";\nimport {\n applyEvent,\n eventClearsRollingStep,\n initialState as initialProjectionState,\n projectionFromMessage,\n type NormalizedEvent,\n type ProjectionState,\n} from \"../utils/applyEvent.js\";\n\n// =============================================================================\n// DEV-ONLY LOGGING\n// =============================================================================\nconst __DEV__ = typeof process !== \"undefined\" && process.env?.NODE_ENV !== \"production\";\n\n// =============================================================================\n// LEGACY POLLING FALLBACK BUDGET\n// =============================================================================\n// Mirrors the ExecutionStreamController fallback policy. The old loop polled a\n// fixed 2s forever — ~1,800 requests/hour from a single open tab, more than a\n// 1,000/hour API key grants, which exhausted the key and 429'd unrelated\n// features sharing it.\n// =============================================================================\n/** Base delay between fallback polls (ms). A floor, not a fixed period. */\nconst LEGACY_POLL_BASE_INTERVAL_MS = 5_000;\n/** Ceiling the delay backs off to when failing or idle (ms). */\nconst LEGACY_POLL_MAX_INTERVAL_MS = 30_000;\n/** Consecutive non-429 failures before the loop gives up. */\nconst LEGACY_POLL_MAX_FAILURES = 10;\n/** Consecutive 429s before the loop gives up rather than keep spending quota. */\nconst LEGACY_POLL_MAX_RATE_LIMITS = 3;\n/** How long the loop may learn nothing before giving up (ms). */\nconst LEGACY_POLL_MAX_IDLE_MS = 1_800_000;\n/** Longest server-named Retry-After the loop will sit out (ms). */\nconst LEGACY_POLL_MAX_RETRY_AFTER_MS = 300_000;\n/** Positive-only jitter so tabs that fall back together do not re-converge. */\nconst LEGACY_POLL_JITTER_RATIO = 0.1;\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// =============================================================================\n/**\n * Internal/orchestration tools that should never appear in the chat UI.\n * These are silenced at the hook level — they never enter the message state.\n * This is more reliable than render-level filtering in ToolCallList, which\n * only works in \"compact\" verbosity mode.\n */\nconst SILENT_TOOL_NAMES = new Set([\n \"check_delegations\",\n]);\n\n/**\n * Some forwarded events from cadra-api arrive with a UUID (typically the\n * sub-agent execution UUID) set as `toolName` instead of a real tool name.\n * These render as ugly raw-UUID cards in the chat. Filter them out — the\n * underlying handoff/delegation is already represented by a proper\n * handoff_to_agent tool call or a delegation event, so dropping these avoids\n * duplication without losing information.\n */\nconst UUID_REGEX =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nfunction isUuidLikeToolName(name: string | undefined): boolean {\n if (!name) return false;\n return UUID_REGEX.test(name.trim());\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\n/**\n * Default optimistic \"currentStep\" label seeded on the streaming placeholder\n * the instant `sendMessage` adds it to the message list. Overwritten by the\n * first real `progress` / `status_update` event, then cleared by the first\n * `text_delta`. Guarantees the user always has something to render within\n * a frame of submitting, regardless of network / backend latency.\n *\n * See P25 (agent execution speed) — Action 2.\n */\nconst DEFAULT_INITIAL_STEP_LABEL = \"Got it. Working on this…\";\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 * Generate a UUID v4 for client-prepared execution IDs.\n *\n * Used by `sendMessage` to mint the executionId synchronously *before*\n * calling `adapter.startExecution`. This lets us open the SSE stream in\n * parallel with the HTTP execute call, removing the 250–1000 ms enqueue\n * round-trip from the perceived-TTFT critical path. See P25 — Action 5.\n *\n * Prefers the platform `crypto.randomUUID()` (available in modern browsers\n * and Node 19+). Falls back to a Math.random-based v4 if missing — this\n * fallback is only present so the SDK doesn't hard-fail in unusual\n * environments; the server still accepts whatever UUID we send.\n */\nfunction generateExecutionId(): string {\n const g = (typeof globalThis !== \"undefined\" ? (globalThis as { crypto?: { randomUUID?: () => string } }) : undefined);\n if (g?.crypto?.randomUUID) {\n return g.crypto.randomUUID();\n }\n // RFC 4122 v4 fallback\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * Derive message.images[] from message.toolCalls[].\n * Single source of truth: images are always extracted from completed tool results.\n *\n * Delegates to the shared `streaming/extract-images.ts` util so non-chat\n * consumers (Node workers, ExecutionStreamController) use the same logic.\n */\nfunction deriveImagesFromToolCalls(toolCalls: ToolCall[] | undefined): ImageData[] {\n return sharedDeriveImagesFromToolCalls(toolCalls);\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 * Freshness window (ms) for the module-level session-history cache.\n * Within this window a reopened session paints from cache with no network\n * fetch; past it, the cached messages are painted immediately and a silent\n * background revalidation runs. Mirrors the playground's React Query\n * staleTime. Default: 10000ms. Set to 0 to always revalidate.\n */\n historyStaleMs?: number;\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 // Fix 2: rehydrate the interleaved narration so a reloaded turn renders\n // via the same contentBlocks path as the live stream (text + tool refs in\n // order), not just the collapsed final output.\n contentBlocks: historyMsg.contentBlocks,\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 historyStaleMs = DEFAULT_HISTORY_STALE_MS,\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\n // Projection state for ordered contentBlocks (text + tool_call refs).\n // Drives the new interleaved render path in ChatMessage.tsx. Updated\n // via shared `applyEvent` dispatch so production wiring is exercised\n // by hook fixture tests in useAgentChat.contentBlocks.test.ts.\n const projectionRef = useRef<ProjectionState>(initialProjectionState());\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 * `currentStep` (the rolling-narration pill) is managed EXPLICITLY, not\n * derived from `content` length. In the manus rolling-narration UX the pill\n * must be able to re-appear AFTER text has landed (during the silent wait\n * between narration blocks). So this setter only clears the pill when\n * `clearStep` is passed — i.e. when NEW TEXT is landing (text_delta /\n * llm_response) or a narration sentence has just solidified (phase boundary).\n * Tool-call / tool-result projection updates must NOT clear it, or the\n * rolling line would flicker off on every chip.\n */\n const updateStreamingMessage = useCallback(\n (content: string, blocks?: ContentBlock[], clearStep?: boolean) => {\n if (!streamingMessageIdRef.current) return;\n\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === streamingMessageIdRef.current\n ? {\n ...msg,\n content,\n ...(blocks !== undefined ? { contentBlocks: blocks } : {}),\n isStreaming: true,\n ...(clearStep ? { currentStep: undefined } : {}),\n }\n : msg\n )\n );\n },\n []\n );\n\n /**\n * Dispatch a normalized event through `applyEvent` and flush the new\n * projection state to React. Used by every SSE event handler that\n * affects contentBlocks or content. Production calls this so the same\n * dispatch tested in useAgentChat.contentBlocks.test.ts runs in real\n * traffic.\n */\n const dispatchProjection = useCallback((event: NormalizedEvent) => {\n const next = applyEvent(projectionRef.current, event);\n projectionRef.current = next;\n streamingContentRef.current = next.content;\n // Text arrival hides the rolling pill (the streaming text is now the live\n // indicator); a narration event is a phase boundary that resets the rolling\n // line (the NEXT progress event re-populates it). Tool-call / tool-result\n // projection updates leave the pill alone so it keeps rolling during work.\n updateStreamingMessage(next.content, next.blocks, eventClearsRollingStep(event));\n }, [updateStreamingMessage]);\n\n /**\n * Update the streaming message's `currentStep` (the rolling-narration pill).\n *\n * Called from `progress` / `status_update` / `started` events. In the manus\n * rolling-narration UX this SETS the label even after text has already\n * streamed — the pill is the \"current activity\" line that rolls during the\n * silent wait between narration blocks (fed, in team mode, by the specialist's\n * FORWARDED progress). Text arrival (dispatchProjection) and narration phase\n * boundaries clear it; this handler re-populates it.\n */\n const setStreamingMessageStep = useCallback((step: CurrentStep) => {\n if (!streamingMessageIdRef.current) return;\n\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === streamingMessageIdRef.current\n ? { ...msg, currentStep: step }\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 // PREFER the locally-streamed text (text_delta accumulator) over `finalOutput`\n // from the execution_complete payload. The streamed text is the authoritative\n // live transcript; the persisted execution.output may be truncated, stale, or\n // empty due to a race between the complete event and the DB persistence step\n // (Vercel AI SDK's streamText emits text deltas in real time but agent-runtime\n // assembles `output` from result.text after the stream loop ends).\n const resolvedContent = streamingContentRef.current || finalOutput || \"\";\n\n // Content-based dedup: check if another non-streaming assistant message\n // already has this content (SSE + polling dual-path race).\n //\n // CAD-243: only THIS turn (messages after the user message that started\n // it) can hold such a duplicate. Scanning the whole thread deleted a\n // legitimate answer that repeated an earlier turn word for word — the\n // common case after a failed tool, whose answer (\"Gmail isn't enabled on\n // this account…\") is identical on every retry — so the new turn showed\n // nothing at all.\n const streamIdx = prev.findIndex((msg) => msg.id === streamMsgId);\n let turnStart = 0;\n for (let i = streamIdx - 1; i >= 0; i--) {\n if (prev[i]!.role === \"user\") {\n turnStart = i + 1;\n break;\n }\n }\n const duplicateExists = resolvedContent && prev.some(\n (msg, idx) =>\n idx >= turnStart &&\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 projectionRef.current = initialProjectionState();\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 // Forwarded sub-agent text-related log events would overwrite the\n // parent's contentBlocks/content with sub-agent payload (e.g., a\n // sub-agent's JSON plan triggers Yobo's `looksLikePlanJson` gate\n // and hides the parent's narration). Skip text-dispatch for those.\n // Tool/delegation events still flow through — sub-agent tool chips\n // need to render on the parent's message.\n const isForwarded = !!log.forwardedFrom;\n const isTextEvent = log.type === \"llm_response\" || log.type === \"message\";\n if (isForwarded && isTextEvent) {\n if (__DEV__) console.log('[useAgentChat] Skipping forwarded text log from sub-agent', log.forwardedFrom, log.type);\n return;\n }\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 // cadra-api emits per-step `llm_response` text (just the current\n // step's text, not cumulative). For contentBlocks we trust the\n // text_delta events — they're authoritative and give us proper\n // per-step text blocks in arrival order. Dispatching a snapshot\n // here would clobber state.content (lose prior steps) and break\n // subsequent prefix-dedup logic. Only update legacy msg.content\n // for backwards-compat consumers that read `message.content`.\n streamingContentRef.current = llmText;\n updateStreamingMessage(llmText, undefined, true);\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 // Same reasoning as llm_response — trust deltas for blocks,\n // only update legacy msg.content here.\n streamingContentRef.current = content;\n updateStreamingMessage(content, undefined, true);\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) || isUuidLikeToolName(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 startedAt: Date.now(),\n };\n\n pendingToolCallsRef.current.set(toolCallId, newToolCall);\n updateToolCall(newToolCall);\n dispatchProjection({\n kind: 'tool_call',\n id: toolCallId,\n name: toolName,\n args,\n });\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) || isUuidLikeToolName(resultToolName)) break;\n\n const resultToolCallId = log.metadata?.toolCallId as string;\n const result = log.metadata?.output;\n const durationMs = log.durationMs;\n // CAD-243: a failed tool (log `success:false` / failure payload) is\n // FAILED, not a green \"completed\".\n const outcome = resolveToolOutcome({\n result,\n success: log.metadata?.success,\n payloadFailure: log.metadata?.payloadFailure,\n isError: log.metadata?.isError,\n error: log.metadata?.error,\n });\n const outcomeFields = {\n status: outcome.status,\n ...(outcome.error ? { error: outcome.error } : {}),\n };\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 ...outcomeFields,\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 ...outcomeFields,\n durationMs,\n };\n updateToolCall(lateToolCall);\n }\n if (resultToolCallId) {\n dispatchProjection({\n kind: 'tool_result',\n id: resultToolCallId,\n toolName: resultToolName,\n result,\n durationMs,\n ...outcomeFields,\n });\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 // Per-step snapshot — trust text_delta for contentBlocks.\n // Only update legacy msg.content for backwards-compat consumers.\n // (Snapshot dispatch would clobber accumulated state.content\n // and break prefix-dedup for subsequent steps.)\n streamingContentRef.current = llmText;\n updateStreamingMessage(llmText, undefined, true);\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 // Same reasoning as llm_response — trust deltas, only update\n // legacy msg.content.\n streamingContentRef.current = content;\n updateStreamingMessage(content, undefined, true);\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 if (text) {\n dispatchProjection({ kind: 'text_delta', delta: text });\n }\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) || isUuidLikeToolName(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 startedAt: Date.now(),\n };\n\n pendingToolCallsRef.current.set(toolCallId, newToolCall);\n updateToolCall(newToolCall);\n dispatchProjection({\n kind: 'tool_call',\n id: toolCallId,\n name: toolName,\n args,\n });\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) || isUuidLikeToolName(resultToolName)) break;\n\n const resultToolCallId = log.metadata?.toolCallId as string;\n const result = log.metadata?.output;\n const durationMs = log.durationMs;\n // CAD-243: a failed tool (log `success:false` / failure payload) is\n // FAILED, not a green \"completed\".\n const outcome = resolveToolOutcome({\n result,\n success: log.metadata?.success,\n payloadFailure: log.metadata?.payloadFailure,\n isError: log.metadata?.isError,\n error: log.metadata?.error,\n });\n const outcomeFields = {\n status: outcome.status,\n ...(outcome.error ? { error: outcome.error } : {}),\n };\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 ...outcomeFields,\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 ...outcomeFields,\n durationMs,\n };\n updateToolCall(lateToolCall);\n }\n // Update contentBlocks projection — matched path updates tool\n // state in-place; orphan path appends a tool block (gated by\n // seenToolBlockIds inside applyEvent).\n if (resultToolCallId) {\n dispatchProjection({\n kind: 'tool_result',\n id: resultToolCallId,\n toolName: resultToolName,\n result,\n durationMs,\n ...outcomeFields,\n });\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 // Divergent: server-corrected final differs from streamed\n // deltas. Sync blocks so they don't render stale text.\n dispatchProjection({ kind: 'text_snapshot_divergent', text: 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 // P25 — Action 1: render `progress` / `status_update` / `started`\n // labels in the streaming bubble's thinking pill.\n onProgress: (data) => {\n if (data.currentStep) {\n setStreamingMessageStep({\n label: data.currentStep,\n updatedAt: Date.now(),\n });\n }\n },\n });\n\n // =========================================================================\n // LEGACY POLLING FALLBACK (only for legacy SSE path)\n // =========================================================================\n // A self-rescheduling timeout rather than a fixed interval — the delay has to\n // change between ticks so this loop can honour a 429 and back off. Same policy\n // as the stream controller's fallback (see streaming/poll-policy.ts): one open\n // tab must not be able to spend an API key's whole hourly quota and 429 every\n // other feature sharing it.\n const pollingTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const pollingExecutionIdRef = useRef<string | null>(null);\n const pollDelayRef = useRef(0);\n const pollFailuresRef = useRef(0);\n const pollRateLimitsRef = useRef(0);\n const pollLastProgressRef = useRef(0);\n const pollLastStatusRef = useRef<string | null>(null);\n\n const stopPolling = useCallback(() => {\n if (pollingTimeoutRef.current) {\n clearTimeout(pollingTimeoutRef.current);\n pollingTimeoutRef.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 const baseDelayMs = pollingInterval ?? LEGACY_POLL_BASE_INTERVAL_MS;\n pollDelayRef.current = baseDelayMs;\n pollFailuresRef.current = 0;\n pollRateLimitsRef.current = 0;\n pollLastProgressRef.current = Date.now();\n pollLastStatusRef.current = null;\n\n if (__DEV__) console.log('[useAgentChat] Starting polling fallback for:', executionId);\n\n const schedule = (delayMs: number) => {\n if (pollingExecutionIdRef.current !== executionId) return;\n pollingTimeoutRef.current = setTimeout(() => {\n pollingTimeoutRef.current = null;\n void poll();\n }, Math.max(0, Math.round(delayMs)));\n };\n\n const giveUp = (message: string) => {\n if (__DEV__) console.warn('[useAgentChat] Polling gave up:', message);\n stopPolling();\n handleError(message);\n };\n\n const poll = async () => {\n if (pollingExecutionIdRef.current !== executionId) return;\n\n // Bound on IDLENESS: a loop re-reading the same unchanged status will not\n // learn anything, and must not outlive the tab.\n if (Date.now() - pollLastProgressRef.current >= LEGACY_POLL_MAX_IDLE_MS) {\n giveUp(\"Lost the live connection and stopped receiving updates for this run\");\n return;\n }\n\n try {\n const execution = await adapter.getExecution(executionId);\n pollFailuresRef.current = 0;\n pollRateLimitsRef.current = 0;\n\n if (execution.status !== pollLastStatusRef.current) {\n pollLastStatusRef.current = execution.status;\n pollLastProgressRef.current = Date.now();\n pollDelayRef.current = baseDelayMs;\n } else {\n // Nothing new — decay toward the ceiling so a forgotten tab is cheap.\n pollDelayRef.current = nextIdleDelayMs(pollDelayRef.current, LEGACY_POLL_MAX_INTERVAL_MS);\n }\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 return;\n }\n if (execution.status === \"failed\") {\n if (__DEV__) console.log('[useAgentChat] Polling: execution failed');\n stopPolling();\n handleError(execution.error || \"Execution failed\");\n return;\n }\n } catch (err) {\n const retryAfterMs = getRetryAfterMs(err);\n\n if (isRateLimited(err) || retryAfterMs !== null) {\n pollRateLimitsRef.current++;\n const resetTooFarOut = retryAfterMs !== null && retryAfterMs > LEGACY_POLL_MAX_RETRY_AFTER_MS;\n if (resetTooFarOut || pollRateLimitsRef.current >= LEGACY_POLL_MAX_RATE_LIMITS) {\n giveUp(\"Rate limited by the API — stopped polling for updates on this run\");\n return;\n }\n // Never sooner than the server asked; a 429 with no reset named means\n // a quota window, which is minutes wide.\n pollDelayRef.current = Math.max(retryAfterMs ?? UNNAMED_RATE_LIMIT_WAIT_MS, pollDelayRef.current);\n } else {\n pollFailuresRef.current++;\n if (__DEV__) console.warn('[useAgentChat] Polling error (will retry):', err);\n if (pollFailuresRef.current >= LEGACY_POLL_MAX_FAILURES) {\n giveUp(\"Lost connection to the agent — stopped polling for updates on this run\");\n return;\n }\n pollDelayRef.current = nextFailureDelayMs(pollDelayRef.current, LEGACY_POLL_MAX_INTERVAL_MS);\n }\n }\n\n schedule(applyJitter(pollDelayRef.current, LEGACY_POLL_JITTER_RATIO));\n };\n\n void poll();\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) || isUuidLikeToolName(toolName)) return;\n\n // Skip if the log path has already processed BOTH the tool_call AND\n // tool_result for this id. The log handler deletes the entry from\n // pendingToolCallsRef on completion, so a missing pending entry +\n // already-fired result means the tool is fully done — recreating a\n // \"running\" entry here would wipe the completed result (and any\n // attached images) from the message state.\n if (firedToolResultsRef.current.has(toolCallId)) 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 startedAt: Date.now(),\n };\n pendingToolCallsRef.current.set(toolCallId, newToolCall);\n updateToolCall(newToolCall);\n dispatchProjection({\n kind: 'tool_call',\n id: toolCallId,\n name: toolName,\n args: data.inputs as Record<string, unknown> | undefined,\n // CAD-87 S1-003: (execId, seq) reducer dedup for replayed events.\n execId: data.sourceExecutionId,\n seq: data.seq,\n });\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) || isUuidLikeToolName(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 finished via log event path\n const existing = pendingToolCallsRef.current.get(toolCallId);\n if (existing && (existing.status === \"completed\" || existing.status === \"failed\")) return;\n\n // CAD-243: the producer stamps `isError`/`status:'failed'` on a failed\n // call; older producers are read from the result shape.\n const outcome = resolveToolOutcome({\n result: data.result,\n isError: data.isError,\n status: data.status,\n error: data.error,\n });\n const outcomeFields = {\n status: outcome.status,\n ...(outcome.error ? { error: outcome.error } : {}),\n };\n\n if (existing) {\n const completedToolCall: ToolCall = {\n ...existing,\n result: data.result,\n ...outcomeFields,\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 ...outcomeFields,\n durationMs: data.durationMs,\n };\n updateToolCall(lateToolCall);\n }\n // Update contentBlocks projection — matched path updates the\n // existing block's tool state; orphan path appends a tool block\n // (gated by seenToolBlockIds inside applyEvent).\n dispatchProjection({\n kind: 'tool_result',\n id: toolCallId,\n toolName,\n result: data.result,\n durationMs: data.durationMs,\n ...outcomeFields,\n // CAD-87 S1-003: (execId, seq) reducer dedup for replayed events.\n execId: data.sourceExecutionId,\n seq: data.seq,\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 // P25 — Action 1: surface `started` / `progress` / `status_update`\n // events as a thinking-pill label on the streaming message. The stream\n // controller already maps both `progress` and `status_update` SSE\n // events to the 'progress' callback (see stream-controller.ts).\n // `started` carries an optional `currentStep` too.\n controller.on('started', (data) => {\n if (data.currentStep) {\n setStreamingMessageStep({\n label: data.currentStep,\n updatedAt: Date.now(),\n });\n }\n });\n\n controller.on('progress', (data) => {\n if (data.currentStep) {\n setStreamingMessageStep({\n label: data.currentStep,\n updatedAt: Date.now(),\n // Attribute the rolling line to the specialist when this progress\n // was FORWARDED from a sub-agent during a handoff.\n subagentName: data.subagentName,\n });\n }\n });\n\n controller.on('textDelta', (data) => {\n // Skip sub-agent forwarded text — would contaminate parent message\n // contentBlocks. Sub-agent narration belongs to its own execution.\n // forwardedFrom is set by stream-controller from wire field\n // `_forwardedFrom` (added by cadra-api subscribeAndForwardEvents).\n if (data.forwardedFrom) return;\n dispatchProjection({\n kind: 'text_delta',\n delta: data.delta,\n // CAD-87 S1-003: (execId, seq) reducer dedup for replayed events.\n execId: data.sourceExecutionId,\n seq: data.seq,\n });\n });\n\n controller.on('narration', (data) => {\n // Manus rolling-narration UX. Every narration event drives a PERSISTENT\n // narration block AND is a phase boundary that resets the rolling pill\n // (dispatchProjection clears currentStep for narration; the next\n // progress event re-populates it). Two flavours:\n //\n // • NATIVE (no forwardedFrom) — the agent's own gated per-step\n // sentence, also streamed via text_delta. applyEvent SOLIDIFIES the\n // trailing live text block into a narration block (dedup).\n // • FORWARDED (forwardedFrom set) — a specialist's line during a\n // handoff (its text_delta is not forwarded). Appended as a separate\n // subagent-attributed block.\n //\n // Neither touches `content` (so it can't trip looksLikePlanJson).\n if (!data.text || !data.text.trim()) return;\n dispatchProjection({\n kind: 'narration',\n text: data.text,\n subagentName: data.subagentName,\n forwarded: !!data.forwardedFrom,\n // CAD-87 S1-002: the producer role — a NATIVE `terminal_answer`\n // renders the closing answer as a text block, not a narration block\n // (the SDK no longer needs isFinalAnswer, which it never read).\n role: data.role,\n // CAD-87 S1-003: (execId, seq) reducer dedup — the resume narration\n // buffer replays carry the ORIGINAL seq, so this drops them (no lump).\n execId: data.sourceExecutionId,\n seq: data.seq,\n });\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, setStreamingMessageStep, 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 // P25 — Action 5: pre-generate the execution UUID so we can open SSE in\n // parallel with the startExecution HTTP call. The server uses this exact\n // UUID for the new execution row (see cadra-web executions-router).\n const preparedExecutionId = generateExecutionId();\n\n // Add placeholder assistant message.\n //\n // P25 — Action 2: seed `currentStep` with a default optimistic label so\n // consumers always have something to render the instant the user\n // submits. Overwritten by the first real `progress` / `status_update`\n // event; cleared by the first `text_delta`.\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 currentStep: {\n label: DEFAULT_INITIAL_STEP_LABEL,\n updatedAt: Date.now(),\n },\n };\n\n setMessages((prev) => [...prev, assistantMessage]);\n streamingMessageIdRef.current = assistantMessageId;\n streamingContentRef.current = \"\";\n projectionRef.current = initialProjectionState();\n completedRef.current = false;\n finalizedRef.current = false;\n\n if (__DEV__) console.log('[useAgentChat] Starting execution...', {\n agentId,\n sessionId: currentSessionId,\n preparedExecutionId,\n });\n\n // P25 — Action 5: open the SSE stream IMMEDIATELY against the\n // pre-generated executionId, before the HTTP execute call resolves.\n // The server-side stream route accepts connections for not-yet-created\n // execution rows (it subscribes to the Redis channel by ID), so events\n // published by the worker the moment the job runs will land in our\n // controller.\n //\n // Legacy path can't pre-open (useExecutionStream is driven by\n // currentExecutionId state and uses adapter.getStreamUrl which assumes\n // the row exists), so we keep the await-then-connect order there.\n // p35 Option 1 (serialize): open the SSE stream only AFTER startExecution\n // resolves, against the server-confirmed executionId. cadra-web inserts the\n // agent_executions row before the 202 returns (p35 §6 \"Q2 invariant\"), so\n // the stream's ownership gate always finds the row — eliminating the\n // create/connect 404 race the old parallel pre-open used to hit. The\n // optimistic assistant placeholder above already gives instant local\n // feedback; only the token stream attaches ~1 RTT later. Worker events\n // published during that window are buffered + replayed by the server route\n // on connect, so none are lost.\n try {\n const result = await adapter.startExecution({\n agentId,\n teamId,\n sessionId: currentSessionId ?? undefined,\n content: content.trim(),\n attachmentUuids,\n // Pass our pre-generated ID so the server persists the run under it;\n // adapters/servers that ignore it still work — we open against the\n // authoritative `result.executionId` below.\n executionId: preparedExecutionId,\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 // Open the stream now, against the resolved executionId. Both the\n // controller path and the legacy state-driven path key off this id.\n if (useStreamController) {\n connectStreamController(\n result.executionId,\n result.sessionId || currentSessionId || undefined\n );\n } else if (__DEV__) {\n console.log('[useAgentChat] Setting executionId:', result.executionId);\n }\n setCurrentExecutionId(result.executionId);\n } catch (err) {\n console.error('[useAgentChat] Error starting execution:', err);\n // Tear down any pre-opened controller so we don't hang on a stream\n // for an execution that will never run.\n if (useStreamController && streamControllerRef.current) {\n streamControllerRef.current.cancel();\n streamControllerRef.current = null;\n }\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 // Fix 3: paint from the module-level cache immediately. A fresh hit\n // skips the network entirely; a stale hit paints the cached view, then\n // revalidates silently below (no loading spinner over usable content).\n const cached = getCachedHistory(sessionId, historyStaleMs);\n if (cached) {\n setMessages(cached.messages);\n setCurrentSessionId(sessionId);\n setIsLoadingHistory(false);\n if (cached.isFresh) return;\n } else {\n setIsLoadingHistory(true);\n }\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: [\n artifact.thumbnailUrl\n ? { url: artifact.url, thumbnailUrl: artifact.thumbnailUrl }\n : { url: artifact.url },\n ],\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 // Symptom #3 — resume the live stream when the latest execution is\n // still in-flight, so a reopened in-progress chat keeps receiving events\n // instead of looking dead. Only the stream-controller path supports it.\n const active = history.activeExecution;\n const resumable =\n useStreamController &&\n !!active &&\n active.status !== \"waiting_user_input\"; // paused → clarification, not a live stream\n\n if (resumable && active) {\n // Target the latest assistant message (the in-flight turn). If none was\n // persisted yet (execution just started, no logs), append a fresh\n // streaming placeholder so events have somewhere to land.\n let targetIdx = -1;\n for (let i = loadedMessages.length - 1; i >= 0; i--) {\n if (loadedMessages[i]!.role === \"assistant\") { targetIdx = i; break; }\n }\n if (targetIdx === -1) {\n const placeholder: ChatMessage = {\n id: generateId(),\n role: \"assistant\",\n content: \"\",\n timestamp: new Date(),\n isStreaming: true,\n toolCalls: [],\n currentStep: { label: DEFAULT_INITIAL_STEP_LABEL, updatedAt: Date.now() },\n };\n loadedMessages.push(placeholder);\n streamingMessageIdRef.current = placeholder.id;\n projectionRef.current = initialProjectionState();\n streamingContentRef.current = \"\";\n } else {\n const target = loadedMessages[targetIdx]!;\n loadedMessages[targetIdx] = { ...target, isStreaming: true };\n streamingMessageIdRef.current = target.id;\n // CAD-87 S1-003: carry the (execId, seq) dedup ledger from the\n // pre-resume projection into the rehydrated one, so the isolated\n // narration-buffer replay that follows the reconnect is dropped by\n // seq (blocks alone don't carry it) instead of re-appending — no\n // \"narration lump\". Cold reopen (fresh ref) starts empty; the\n // existing tail-dedup remains the fallback there.\n projectionRef.current = projectionFromMessage(\n target,\n projectionRef.current?.seenEventKeys\n );\n streamingContentRef.current = target.content ?? \"\";\n }\n completedRef.current = false;\n finalizedRef.current = false;\n }\n\n // Fix 3: cache settled history for instant reopen — but NEVER a live\n // (in-flight) session; caching a snapshot would make a later reopen skip\n // the fetch + resume and look dead again.\n if (!active) setCachedHistory(sessionId, loadedMessages);\n\n setMessages(loadedMessages);\n setCurrentSessionId(sessionId);\n\n // Connect AFTER messages are in state so resumed events attach to the\n // streaming target message.\n if (resumable && active) {\n connectStreamController(active.id, sessionId);\n setCurrentExecutionId(active.id);\n }\n } catch (err) {\n // If we already painted from cache, keep that usable view rather than\n // flashing an error over it — the stale data stands until a later load.\n if (!cached) {\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 }\n } finally {\n setIsLoadingHistory(false);\n }\n },\n [adapter, onError, historyStaleMs, useStreamController, connectStreamController]\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 // Fix 3: keep the history cache in sync with the live view. Once a turn has\n // settled (nothing streaming), write the current messages back so reopening\n // \"the chat I was just in\" paints instantly instead of doing a full fetch.\n useEffect(() => {\n if (!currentSessionId) return;\n if (messages.length === 0) return;\n if (messages.some((m) => m.isStreaming)) return; // only cache settled state\n setCachedHistory(currentSessionId, messages);\n }, [currentSessionId, messages]);\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 * Callback fired on every keystroke with the current input value.\n * Useful for triggering inline UI like @-mention popovers or slash-command menus.\n */\n onInputChange?: (value: string) => void;\n /**\n * Imperatively set the input value from a parent (e.g. after a mention is\n * selected from a popover). Provided as a callback ref-style setter via\n * onInputControlReady.\n */\n onInputControlReady?: (control: {\n setValue: (value: string) => void;\n focus: () => void;\n getTextarea: () => HTMLTextAreaElement | null;\n }) => void;\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 onInputChange,\n onInputControlReady,\n}: ChatInputProps) {\n const [content, setContent] = useState(\"\");\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n // Expose imperative control to parent (set value, focus). Used for inline\n // mention/slash-command popovers that need to mutate the textarea content\n // when the user selects an item.\n useEffect(() => {\n if (!onInputControlReady) return;\n onInputControlReady({\n setValue: (value: string) => {\n setContent(value);\n onInputChange?.(value);\n },\n focus: () => {\n textareaRef.current?.focus();\n },\n getTextarea: () => textareaRef.current,\n });\n }, [onInputControlReady, onInputChange]);\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) => {\n setContent(e.target.value);\n onInputChange?.(e.target.value);\n }}\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","/**\n * Pure helpers for elapsed-time computation and duration formatting.\n *\n * Extracted from ElapsedTimer component so the math is unit-testable\n * without React. The component becomes a thin shell around these\n * functions; interval registration/cleanup is verified via manual\n * smoke (per v1 trade-off documented in spec — no RTL in repo yet).\n */\n\n/**\n * Compute elapsed seconds since a startedAt epoch ms timestamp.\n * Returns `floor((now - startedAt) / 1000)`.\n *\n * `now` defaults to `Date.now()`; pass explicit values in tests to\n * avoid wall-clock dependency.\n */\nexport function computeElapsedSeconds(\n startedAt: number,\n now: number = Date.now()\n): number {\n return Math.floor((now - startedAt) / 1000);\n}\n\n/**\n * Format a completed duration in milliseconds as rounded seconds with\n * a trailing \"s\" (e.g. `1499 → \"1s\"`, `1500 → \"2s\"`, `0 → \"0s\"`).\n */\nexport function formatCompletedDuration(durationMs: number): string {\n return `${Math.round(durationMs / 1000)}s`;\n}\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 { useEffect, 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 { computeElapsedSeconds } from \"../utils/elapsed.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 */\n/**\n * Maps HTTP methods + resource context to human-readable action verbs.\n */\nconst HTTP_METHOD_VERBS: Record<string, string> = {\n post: \"Creating\",\n get: \"Fetching\",\n put: \"Updating\",\n patch: \"Updating\",\n delete: \"Deleting\",\n list: \"Listing\",\n};\n\nfunction formatToolName(toolName: string): string {\n if (!toolName) return toolName;\n\n // Handle dot-separated names like \"Merchant Products.post /products\"\n // or \"Create Ad Images.create Ad Images\"\n if (toolName.includes(\".\")) {\n const [toolPart, actionPart] = toolName.split(\".\", 2);\n const trimmedAction = actionPart?.trim() || \"\";\n\n // Detect \"method /path\" pattern (e.g., \"post /products\", \"get /products/{id}\")\n const methodPathMatch = trimmedAction.match(/^(get|post|put|patch|delete)\\s+\\/(.+)/i);\n if (methodPathMatch) {\n const method = methodPathMatch[1]!.toLowerCase();\n const path = methodPathMatch[2]!;\n const verb = HTTP_METHOD_VERBS[method] || method;\n\n // Extract resource name from path: \"/products/{id}\" → \"Product\", \"/products\" → \"Product\"\n const firstSegment = path.split(\"/\")[0]?.replace(/\\{.*\\}/, \"\").trim();\n if (firstSegment) {\n // Singularize simple plurals and title-case\n const resource = firstSegment.endsWith(\"s\") && firstSegment.length > 3\n ? firstSegment.slice(0, -1)\n : firstSegment;\n return `${verb} ${resource.charAt(0).toUpperCase() + resource.slice(1)}`;\n }\n return `${verb} ${toolPart?.trim() || \"\"}`.trim();\n }\n\n // Non-method pattern: deduplicate segments\n const segments = toolName.split(\".\");\n const uniqueSegments = segments.filter(\n (seg, idx) =>\n idx === 0 ||\n seg.toLowerCase().trim() !== segments[idx - 1]?.toLowerCase().trim()\n );\n const bestSegment = uniqueSegments[uniqueSegments.length - 1]?.trim() || toolName;\n if (bestSegment.includes(\" \")) return bestSegment;\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 * ElapsedTimer — live seconds counter for running tool calls.\n *\n * Reads from `computeElapsedSeconds` (pure helper, unit-tested in\n * elapsed.test.ts). Component is a thin shell: useState seeded from\n * the helper at mount, setInterval re-reads the helper every 1s,\n * cleanup clears the interval on unmount or startedAt change.\n */\nfunction ElapsedTimer({ startedAt }: { startedAt: number }) {\n const [elapsed, setElapsed] = useState(() => computeElapsedSeconds(startedAt));\n useEffect(() => {\n const id = setInterval(() => {\n setElapsed(computeElapsedSeconds(startedAt));\n }, 1000);\n return () => clearInterval(id);\n }, [startedAt]);\n return (\n <span className=\"ml-auto text-xs text-gray-500 dark:text-gray-400 flex-shrink-0\">\n {elapsed}s\n </span>\n );\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 {/* Live elapsed timer (running) */}\n {toolCall.status === \"running\" && toolCall.startedAt !== undefined && (\n <ElapsedTimer startedAt={toolCall.startedAt} />\n )}\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, ContentBlock, 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 * Defensive render guard: a narration block must never carry raw plan JSON.\n * The producer (cadra-api) already gates narration to non-JSON-leading text,\n * but keep a client guard so a stray structured blob never renders as a\n * narration line. Mirrors the consumer `looksLikePlanJson` heuristic\n * (JSON-leading body with several `\"key\":` pairs).\n */\nfunction narrationLooksLikeRawJson(content: string): boolean {\n const trimmed = content.trimStart();\n const first = trimmed[0];\n if (first !== \"{\" && first !== \"[\") return false;\n const keyMatches = trimmed.match(/\"[a-zA-Z_][a-zA-Z0-9_]*\"\\s*:/g);\n return keyMatches !== null && keyMatches.length >= 5;\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 /** Hide avatar icons — useful when role distinction is handled by background color alone */\n hideAvatars?: boolean;\n /** Display name for the assistant role. Defaults to \"Assistant\". Pass empty string \"\" to hide the label. */\n agentName?: string;\n /**\n * Suppress the agent-name / role header row entirely while an assistant\n * message is still streaming and has no meaningful content yet (no tool\n * calls visible and trimmed text length <= ~40 chars).\n *\n * Use this to avoid a \"name flicker\" when an external progress pill is\n * already covering the empty-bubble state — the header would otherwise\n * flash for a few hundred ms before the first text token lands.\n *\n * Default `false` (existing behavior: always render header).\n * P25 STORY-006.\n */\n hideHeaderWhileEmpty?: boolean;\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// INTERLEAVED CONTENT — text + tool_call blocks in natural emission order\n// =============================================================================\n\ninterface InterleavedContentProps {\n blocks: ContentBlock[];\n toolCalls: ToolCall[];\n toolCallVerbosity: ToolCallVerbosity;\n showToolCalls: boolean;\n showImages: boolean;\n enableMarkdown: boolean;\n isFlat: boolean;\n isUser: boolean;\n isAssistant: boolean;\n markdownComponents?: ChatMessageProps[\"markdownComponents\"];\n markdownUrlTransform?: ChatMessageProps[\"markdownUrlTransform\"];\n markdownContentTransform?: ChatMessageProps[\"markdownContentTransform\"];\n onImageClick?: ChatMessageProps[\"onImageClick\"];\n renderToolCall?: ChatMessageProps[\"renderToolCall\"];\n}\n\nfunction InterleavedContent({\n blocks,\n toolCalls,\n toolCallVerbosity,\n showToolCalls,\n showImages: _showImages,\n enableMarkdown,\n isFlat,\n isUser,\n isAssistant,\n markdownComponents,\n markdownUrlTransform,\n markdownContentTransform,\n onImageClick,\n renderToolCall,\n}: InterleavedContentProps) {\n const toolCallsById = useMemo(\n () => Object.fromEntries(toolCalls.map((tc) => [tc.id, tc])),\n [toolCalls]\n );\n\n return (\n <div className=\"space-y-2\">\n {blocks.map((block, i) => {\n if (block.type === \"text\") {\n if (!block.content) return null;\n if (isFlat) {\n return (\n <div\n key={`text-${i}`}\n className={cn(\n \"text-sm break-words\",\n !(isAssistant && enableMarkdown) && \"whitespace-pre-wrap\"\n )}\n style={{ color: \"var(--chat-content-text, inherit)\" }}\n >\n {isAssistant && enableMarkdown ? (\n <MarkdownContent\n content={block.content}\n components={markdownComponents}\n urlTransform={markdownUrlTransform}\n contentTransform={markdownContentTransform}\n />\n ) : (\n <p className=\"whitespace-pre-wrap\">{block.content}</p>\n )}\n </div>\n );\n }\n return (\n <div\n key={`text-${i}`}\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={block.content}\n components={markdownComponents}\n urlTransform={markdownUrlTransform}\n contentTransform={markdownContentTransform}\n />\n ) : (\n <p className=\"whitespace-pre-wrap\">{block.content}</p>\n )}\n </div>\n );\n }\n\n // narration block — a persistent per-step narration line (manus\n // rolling-narration UX). Never part of message.content.\n // • NATIVE narration (no subagentName) is the agent's OWN prose, so\n // it renders like a normal assistant text block (not muted).\n // • FORWARDED specialist narration (subagentName set) renders muted +\n // attributed, visually secondary to the orchestrator's own lines.\n if (block.type === \"narration\") {\n if (!block.content) return null;\n // Defensive: never let a raw structured blob render as narration.\n if (narrationLooksLikeRawJson(block.content)) return null;\n const isForwarded = !!block.subagentName;\n const body =\n isAssistant && enableMarkdown ? (\n <MarkdownContent\n content={block.content}\n components={markdownComponents}\n urlTransform={markdownUrlTransform}\n contentTransform={markdownContentTransform}\n />\n ) : (\n <span className=\"whitespace-pre-wrap\">{block.content}</span>\n );\n return (\n <div\n key={`narration-${i}`}\n className={cn(\"text-sm break-words\", isForwarded && \"opacity-80\")}\n style={{ color: \"var(--chat-content-text, inherit)\" }}\n >\n {isForwarded && (\n <span className=\"mr-1 text-xs font-medium opacity-70\">\n {block.subagentName}\n </span>\n )}\n {body}\n </div>\n );\n }\n\n // tool_call block\n const tc = toolCallsById[block.toolCallId];\n if (!tc) return null;\n if (!showToolCalls) return null;\n if (toolCallVerbosity === \"hidden\") return null;\n if (toolCallVerbosity === \"compact\" && isInternalTool(tc.name)) return null;\n\n const defaultRender = () => (\n <ToolCallEntry key={tc.id} toolCall={tc} onImageClick={onImageClick} />\n );\n\n if (renderToolCall) {\n return (\n <div key={`tool-${block.toolCallId}`}>{renderToolCall(tc, defaultRender)}</div>\n );\n }\n return <div key={`tool-${block.toolCallId}`}>{defaultRender()}</div>;\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 hideAvatars = false,\n agentName = \"Assistant\",\n hideHeaderWhileEmpty = false,\n}: ChatMessageProps) {\n const isUser = message.role === \"user\";\n const isAssistant = message.role === \"assistant\";\n const isFlat = variant === \"flat\";\n\n // P25 STORY-006: suppress the agent-name header row entirely while an\n // assistant message is mid-stream with no real content yet. Avoids a\n // 100–500ms \"AIRA\"/\"Assistant\" flash before the first text token lands\n // when the consumer is already rendering an overlay progress pill.\n const trimmedContentLen = message.content?.trim().length ?? 0;\n const hasVisibleToolCalls = !!message.toolCalls && message.toolCalls.length > 0;\n const headerSuppressedWhileEmpty =\n hideHeaderWhileEmpty &&\n isAssistant &&\n !!message.isStreaming &&\n trimmedContentLen <= 40 &&\n !hasVisibleToolCalls;\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 — hidden when hideAvatars=true */}\n {!hideAvatars && (\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\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 Suppressed entirely when hideHeaderWhileEmpty + streaming + no content\n (so the row collapses, leaving no layout gap). P25 STORY-006. */}\n {!headerSuppressedWhileEmpty && (\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\" : (agentName ?? \"Assistant\")}\n </span>\n <span>{formattedTime}</span>\n {message.isStreaming && (\n <LoadingSpinner className=\"h-3 w-3\" />\n )}\n </div>\n )}\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 {/* Interleaved render (text + tool_calls in natural emission order)\n when contentBlocks present. Falls back to legacy ToolCallList +\n content render path for historical messages without blocks. */}\n {message.contentBlocks && message.contentBlocks.length > 0 ? (\n <InterleavedContent\n blocks={message.contentBlocks}\n toolCalls={message.toolCalls ?? []}\n toolCallVerbosity={toolCallVerbosity}\n showToolCalls={showToolCalls}\n showImages={showImages}\n enableMarkdown={enableMarkdown}\n isFlat={isFlat}\n isUser={isUser}\n isAssistant={isAssistant}\n markdownComponents={markdownComponents}\n markdownUrlTransform={markdownUrlTransform}\n markdownContentTransform={markdownContentTransform}\n onImageClick={onImageClick}\n renderToolCall={renderToolCall}\n />\n ) : (\n <>\n {/* Tool calls (rendered before text — legacy fallback path) */}\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 )}\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 /** Hide avatar icons next to each message */\n hideAvatars?: boolean;\n /** Display name for assistant messages. Default \"Assistant\". Pass \"\" to hide. */\n agentName?: string;\n /**\n * Suppress the agent-name / role header row on assistant messages that are\n * still streaming with no real content yet. Forwarded to each `ChatMessage`.\n * Default `false`. P25 STORY-006.\n */\n hideHeaderWhileEmpty?: boolean;\n /**\n * Suppress the built-in bottom-of-list \"Thinking...\" typing indicator that\n * renders when `isLoading && !isStreaming`. Use this when the consuming app\n * already shows its own progress UI (e.g. an in-bubble progress pill driven\n * by `currentStep`) so progress isn't double-rendered. Default `false`\n * (existing behavior unchanged). P25 STORY-006.\n */\n hideTypingIndicator?: boolean;\n}\n\n// =============================================================================\n// SKELETON\n// =============================================================================\n\n/**\n * MessageHistorySkeleton - Shimmer placeholder shown while session history loads.\n *\n * Renders a vertical stack of placeholder message groups with alternating\n * alignment (assistant rows left, user rows right) so the loading state reads\n * as \"chat is populating\" rather than \"frozen\". Uses only Tailwind\n * `animate-pulse` utilities — zero external dependencies (SDK constraint).\n */\nfunction MessageHistorySkeleton() {\n // Alternating rows: assistant (left, multi-line) then user (right, shorter).\n const rows: (\"assistant\" | \"user\")[] = [\n \"assistant\",\n \"user\",\n \"assistant\",\n \"user\",\n \"assistant\",\n ];\n\n return (\n <div\n className=\"p-4 space-y-6\"\n aria-busy=\"true\"\n aria-label=\"Loading conversation history\"\n >\n {rows.map((role, i) =>\n role === \"assistant\" ? (\n <div key={i} className=\"flex items-start gap-3\">\n {/* Avatar dot */}\n <div className=\"flex-shrink-0 w-8 h-8 rounded-full bg-gray-200 dark:bg-gray-700 animate-pulse\" />\n {/* Text-line bars of varying widths */}\n <div className=\"flex-1 space-y-2 pt-1\">\n <div className=\"h-3 w-3/4 rounded bg-gray-200 dark:bg-gray-700 animate-pulse\" />\n <div className=\"h-3 w-5/6 rounded bg-gray-200 dark:bg-gray-700 animate-pulse\" />\n <div className=\"h-3 w-2/5 rounded bg-gray-200 dark:bg-gray-700 animate-pulse\" />\n </div>\n </div>\n ) : (\n <div key={i} className=\"flex items-start justify-end gap-3\">\n {/* Shorter bars, right-aligned */}\n <div className=\"flex flex-col items-end space-y-2 pt-1 max-w-[60%] w-full\">\n <div className=\"h-3 w-1/2 rounded bg-gray-200 dark:bg-gray-700 animate-pulse\" />\n <div className=\"h-3 w-1/3 rounded bg-gray-200 dark:bg-gray-700 animate-pulse\" />\n </div>\n </div>\n )\n )}\n </div>\n );\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 hideAvatars = false,\n agentName = \"Assistant\",\n hideHeaderWhileEmpty = false,\n hideTypingIndicator = false,\n}: MessageListProps) {\n const scrollRef = useRef<HTMLDivElement>(null);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const userScrolledUpRef = useRef(false);\n const prevMessageCountRef = useRef(messages.length);\n\n // Track whether user has scrolled up manually\n useEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n const handleScroll = () => {\n const { scrollTop, scrollHeight, clientHeight } = el;\n userScrolledUpRef.current = scrollHeight - scrollTop - clientHeight > 150;\n };\n el.addEventListener(\"scroll\", handleScroll, { passive: true });\n return () => el.removeEventListener(\"scroll\", handleScroll);\n }, []);\n\n // Auto-scroll to bottom: always on new messages, only if near-bottom during streaming\n useEffect(() => {\n const isNewMessage = messages.length > prevMessageCountRef.current;\n prevMessageCountRef.current = messages.length;\n\n if (isNewMessage) {\n // New message added — reset scroll lock so response is visible\n userScrolledUpRef.current = false;\n }\n\n if (!userScrolledUpRef.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 min-h-0 overflow-y-auto\",\n className\n )}\n >\n {/* Loading history skeleton */}\n {isLoadingHistory && <MessageHistorySkeleton />}\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 agentName={agentName}\n hideAvatars={hideAvatars}\n hideHeaderWhileEmpty={hideHeaderWhileEmpty}\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 {!hideTypingIndicator && 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 /**\n * Extra messages MERGED into the rendered list by timestamp on every render\n * (interleaved chronologically, deduped by id). Use for durable turns that\n * arrive out-of-band on a separate delivery plane — e.g. human-operator /\n * system replies in a webchat handoff — so they don't dock at the bottom.\n * Unlike `initialMessages`, these are NOT seeded into internal state.\n */\n injectedMessages?: 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 /** Hide avatar icons next to each message */\n hideAvatars?: boolean;\n\n /** Display name for assistant messages. Default \"Assistant\". Pass \"\" to hide the label entirely. */\n agentName?: string;\n\n /**\n * Suppress the assistant header row (agent name + timestamp + streaming\n * spinner) while a streaming assistant message has no real content yet\n * (trimmed text length <= ~40 chars and no visible tool calls). Use this\n * when the consuming app is already rendering an overlay progress pill,\n * so the header doesn't flicker on/off before the first text token.\n *\n * Default `false` (existing behavior unchanged). P25 STORY-006.\n */\n hideHeaderWhileEmpty?: boolean;\n\n /**\n * Suppress the built-in bottom-of-list \"Thinking...\" typing indicator that\n * `MessageList` shows when `isLoading && !isStreaming`. Use this when the\n * consuming app already renders its own progress UI (e.g. an in-bubble\n * progress pill driven by `currentStep`) so progress isn't double-rendered.\n *\n * Default `false` (existing behavior unchanged). P25 STORY-006.\n */\n hideTypingIndicator?: boolean;\n\n /**\n * Callback fired on every keystroke in the chat input.\n * Useful for triggering inline UI like @-mention popovers or slash-command menus.\n */\n onInputChange?: (value: string) => void;\n\n /**\n * Receives an imperative control handle for the chat input.\n * Used by parents that need to mutate the input value (e.g. inserting an\n * @mention token after the user picks an item from a custom popover).\n */\n onInputControlReady?: (control: {\n setValue: (value: string) => void;\n focus: () => void;\n getTextarea: () => HTMLTextAreaElement | null;\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 hideAvatars = false,\n agentName = \"Assistant\",\n hideHeaderWhileEmpty = false,\n hideTypingIndicator = false,\n onInputChange,\n onInputControlReady,\n injectedMessages,\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 // Merge out-of-band injected turns (e.g. durable operator/system replies that\n // arrive on a separate delivery plane) into the rendered list BY TIMESTAMP, so\n // they interleave chronologically instead of docking at the bottom. Dedupe by\n // id (the in-stream `messages` win over an injected duplicate).\n const renderedMessages =\n injectedMessages && injectedMessages.length > 0\n ? [...messages, ...injectedMessages]\n .filter((m, i, arr) => arr.findIndex((x) => x.id === m.id) === i)\n .sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime())\n : messages;\n\n // Common MessageList props\n const messageListProps = {\n messages: renderedMessages,\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 hideAvatars,\n agentName,\n hideHeaderWhileEmpty,\n hideTypingIndicator,\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 onInputChange={onInputChange}\n onInputControlReady={onInputControlReady}\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 * useImageStream — progressive image streaming hook.\n *\n * Subscribes to an agent execution's stream and returns images as they're\n * generated, plus the final list when the execution completes. Wraps\n * `client.agents.streamImages` / `client.agents.streamImagesFromExecution`\n * for React consumers.\n *\n * Two modes:\n * 1. **Kickoff mode** — pass `agentUuid` + `input` and the hook starts the\n * execution itself when `enabled` is true.\n * 2. **Attach mode** — pass `executionId` (started elsewhere, e.g. via tRPC)\n * and the hook connects to the existing stream.\n *\n * Cleans up on unmount, parameter change, or `cancel()`.\n *\n * @module @cadraos/sdk/chat\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { ExecuteInput } from '../../types/index.js';\nimport type { ImageEvent } from '../../types/streaming.js';\nimport type { ImageData } from '../../streaming/extract-images.js';\nimport type { CollectImagesOptions, StreamImagesResult } from '../../streaming/collect-images.js';\n\n/**\n * Structural client interface — only the methods this hook actually uses.\n *\n * Avoids depending on the full `CadraClient` class which gets re-declared\n * in every tsup entry-point bundle (main vs `/chat`), making nominal\n * comparisons fail across consumers that import the class from one\n * entry point and the hook from another.\n */\nexport interface ImageStreamClient {\n agents: {\n streamImages: (\n uuid: string,\n input: ExecuteInput,\n options?: CollectImagesOptions\n ) => Promise<StreamImagesResult>;\n streamImagesFromExecution: (\n executionId: string,\n options?: CollectImagesOptions & { sessionId?: string }\n ) => Promise<StreamImagesResult>;\n };\n}\n\n/**\n * Stream status state machine.\n * idle — no execution started yet (or `enabled = false`).\n * connecting — execution kicked off / connect() in flight.\n * streaming — receiving events.\n * complete — agent finished, images is final.\n * error — stream errored or aborted.\n */\nexport type ImageStreamStatus = 'idle' | 'connecting' | 'streaming' | 'complete' | 'error';\n\nexport interface UseImageStreamOptions {\n /**\n * Cadra client instance (or any object implementing ImageStreamClient).\n * Pass a `new CadraClient(...)` instance from `@cadraos/sdk`.\n */\n client: ImageStreamClient;\n\n /**\n * Execution UUID to attach to. Mutually exclusive with `agentUuid` /\n * `input` — if both are supplied, `executionId` wins.\n */\n executionId?: string | null;\n\n /**\n * Agent UUID to kick off. Requires `input`. Ignored if `executionId` is\n * supplied.\n */\n agentUuid?: string | null;\n\n /**\n * Execute input for kickoff mode. Required if `agentUuid` is set.\n */\n input?: ExecuteInput | null;\n\n /**\n * Optional session UUID (passed to streamImagesFromExecution for session\n * continuity).\n */\n sessionId?: string;\n\n /**\n * Whether the hook should connect / kick off. Set to `false` to defer\n * until you're ready (e.g. waiting for user input).\n * Default: `true` if either executionId or (agentUuid + input) is provided.\n */\n enabled?: boolean;\n\n /** Per-image callback (fires on every new image, not just final). */\n onImage?: (image: ImageEvent) => void | Promise<void>;\n\n /** Fired once when the agent completes. Receives the final result. */\n onComplete?: (result: StreamImagesResult) => void;\n\n /** Fired on stream error or abort. */\n onError?: (error: Error) => void;\n}\n\nexport interface UseImageStreamResult {\n /** Images collected so far, in arrival order. */\n images: ImageData[];\n /** Current stream state. */\n status: ImageStreamStatus;\n /** Last error, if any. */\n error: Error | null;\n /** Execution UUID being streamed (resolved after kickoff in kickoff mode). */\n executionId: string | null;\n /** Final agent output (only set after `complete`). */\n output: unknown;\n /** Cancel the current stream. */\n cancel: () => void;\n}\n\n/**\n * Stream images from an agent execution.\n */\nexport function useImageStream(options: UseImageStreamOptions): UseImageStreamResult {\n const {\n client,\n executionId: providedExecutionId = null,\n agentUuid = null,\n input = null,\n sessionId,\n enabled,\n onImage,\n onComplete,\n onError,\n } = options;\n\n const [images, setImages] = useState<ImageData[]>([]);\n const [status, setStatus] = useState<ImageStreamStatus>('idle');\n const [error, setError] = useState<Error | null>(null);\n const [executionId, setExecutionId] = useState<string | null>(providedExecutionId);\n const [output, setOutput] = useState<unknown>(undefined);\n\n // Refs let us call latest callbacks without re-subscribing.\n const onImageRef = useRef(onImage);\n const onCompleteRef = useRef(onComplete);\n const onErrorRef = useRef(onError);\n useEffect(() => { onImageRef.current = onImage; }, [onImage]);\n useEffect(() => { onCompleteRef.current = onComplete; }, [onComplete]);\n useEffect(() => { onErrorRef.current = onError; }, [onError]);\n\n const abortRef = useRef<AbortController | null>(null);\n\n const shouldConnect = enabled ?? Boolean(providedExecutionId || (agentUuid && input));\n\n const inputKey = input ? JSON.stringify(input) : null;\n\n const cancel = useCallback(() => {\n abortRef.current?.abort();\n abortRef.current = null;\n }, []);\n\n useEffect(() => {\n if (!shouldConnect) {\n setStatus('idle');\n return;\n }\n if (!providedExecutionId && !(agentUuid && input)) {\n setStatus('idle');\n return;\n }\n\n // Reset state on each new connection\n setImages([]);\n setError(null);\n setOutput(undefined);\n setStatus('connecting');\n setExecutionId(providedExecutionId);\n\n const ac = new AbortController();\n abortRef.current = ac;\n\n const seenUrls = new Set<string>();\n\n const collectOptions = {\n signal: ac.signal,\n onImage: (img: ImageEvent) => {\n if (seenUrls.has(img.url)) return;\n seenUrls.add(img.url);\n setImages((prev) => [...prev, img]);\n setStatus((prev) => (prev === 'connecting' ? 'streaming' : prev));\n if (!executionId && img.executionId) {\n setExecutionId(img.executionId);\n }\n try {\n const ret = onImageRef.current?.(img);\n if (ret && typeof (ret as Promise<void>).catch === 'function') {\n (ret as Promise<void>).catch(() => { /* ignore */ });\n }\n } catch {\n /* ignore */\n }\n },\n onComplete: (result: StreamImagesResult) => {\n setImages(result.images);\n setOutput(result.output);\n setExecutionId(result.executionId);\n setStatus('complete');\n try {\n onCompleteRef.current?.(result);\n } catch {\n /* ignore */\n }\n },\n onError: (err: Error) => {\n setError(err);\n setStatus('error');\n try {\n onErrorRef.current?.(err);\n } catch {\n /* ignore */\n }\n },\n };\n\n let promise: Promise<StreamImagesResult>;\n if (providedExecutionId) {\n promise = client.agents.streamImagesFromExecution(providedExecutionId, {\n ...collectOptions,\n sessionId,\n });\n } else if (agentUuid && input) {\n promise = client.agents.streamImages(agentUuid, input, collectOptions);\n } else {\n // unreachable due to earlier guard, but keep TS happy\n return;\n }\n\n promise.catch((err: unknown) => {\n // Both signal-abort and stream errors land here. We've already\n // surfaced these via collectOptions.onError.\n if (ac.signal.aborted && err instanceof Error && err.message === 'Aborted') {\n return;\n }\n // Defensive: if the promise rejected without firing onError (shouldn't\n // happen given collect-images.ts contract, but…), capture it now.\n setError((cur) => cur ?? (err instanceof Error ? err : new Error(String(err))));\n setStatus((cur) => (cur === 'complete' ? cur : 'error'));\n });\n\n return () => {\n ac.abort();\n if (abortRef.current === ac) abortRef.current = null;\n };\n // We depend on input via its serialised form to avoid effect loops\n // when callers pass new object identities for the same payload.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [client, providedExecutionId, agentUuid, inputKey, sessionId, shouldConnect]);\n\n return { images, status, error, executionId, output, cancel };\n}\n","\"use client\";\n\n/**\n * AgentMessagePicker (p13)\n *\n * Searchable list of an agent's message keys (welcome, handoff, fallback copy,\n * ...) with a text preview. Keys the platform knows about but the agent has\n * not saved are listed as \"not set\". With `allowCustom`, the search box can\n * also offer a new lowercase dotted key (validated with MESSAGE_KEY_PATTERN).\n *\n * Preview language: choices come from the agent's `languages` (older servers\n * without it: the languages seen in the saved texts). Starts on the `lang`\n * prop, else the agent's `defaultLanguage`, else `en`. A language select is\n * shown when the agent has more than one language.\n *\n * Takes any object shaped like `client.agents.messages` so the chat entry does\n * not import the CadraClient itself.\n *\n * @example\n * ```tsx\n * <AgentMessagePicker client={client} agentUuid={uuid} value={key} onChange={setKey} allowCustom />\n * ```\n */\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport { CheckIcon, LoadingSpinner } from \"../icons/index.js\";\nimport { isValidMessageKey } from \"../../utils/message-key.js\";\nimport type { AgentMessage, AgentMessageLang, AgentMessageList } from \"../../types/agents.js\";\n\n/** The slice of CadraClient the picker uses. */\nexport interface AgentMessagePickerClient {\n agents: {\n messages: {\n list(agentUuid: string): Promise<AgentMessageList>;\n };\n };\n}\n\n/** UI labels; override to translate. */\nexport interface AgentMessagePickerLabels {\n search: string;\n loading: string;\n loadError: string;\n empty: string;\n notSet: string;\n useCustom: (key: string) => string;\n invalidCustom: string;\n /** Accessible label of the preview-language select */\n language: string;\n}\n\nconst DEFAULT_LABELS: AgentMessagePickerLabels = {\n search: \"Search messages\",\n loading: \"Loading messages\",\n loadError: \"Could not load messages\",\n empty: \"No matching messages\",\n notSet: \"not set\",\n useCustom: (key) => `Use \"${key}\"`,\n invalidCustom: \"Keys are lowercase and dotted, like chat.welcome\",\n language: \"Preview language\",\n};\n\nexport interface AgentMessagePickerProps {\n client: AgentMessagePickerClient;\n agentUuid: string;\n /** Selected key */\n value?: string | null;\n onChange: (key: string) => void;\n /** Let the user type a new dotted key */\n allowCustom?: boolean;\n /** Starting preview language. Default: the agent's defaultLanguage, else en */\n lang?: AgentMessageLang;\n /** Called when the user picks another preview language */\n onLangChange?: (lang: AgentMessageLang) => void;\n labels?: Partial<AgentMessagePickerLabels>;\n className?: string;\n}\n\ninterface PickerItem {\n key: string;\n preview: string | null;\n}\n\n/** Same order as the server's render: exact, base (pt-br to pt), agent default, en, first non-empty. */\nexport function previewOf(\n message: AgentMessage,\n lang: AgentMessageLang,\n defaultLanguage: AgentMessageLang = \"en\"\n): string | null {\n const base = lang.split(\"-\")[0] ?? lang;\n for (const candidate of [lang, base, defaultLanguage, \"en\"]) {\n const text = message.text[candidate];\n if (text) return text;\n }\n return Object.values(message.text).find((t): t is string => Boolean(t)) ?? null;\n}\n\n/** The agent's languages; older servers send none, so use the ones seen in the texts. */\nexport function languagesOf(list: AgentMessageList): AgentMessageLang[] {\n if (list.languages && list.languages.length > 0) return list.languages;\n const seen = new Set<AgentMessageLang>([list.defaultLanguage ?? \"en\"]);\n for (const m of list.messages) {\n for (const [code, text] of Object.entries(m.text)) if (text) seen.add(code);\n }\n return [...seen];\n}\n\nexport function AgentMessagePicker({\n client,\n agentUuid,\n value,\n onChange,\n allowCustom = false,\n lang,\n onLangChange,\n labels: labelOverrides,\n className = \"\",\n}: AgentMessagePickerProps) {\n const labels = { ...DEFAULT_LABELS, ...labelOverrides };\n const [data, setData] = useState<AgentMessageList | null>(null);\n const [error, setError] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [pickedLang, setPickedLang] = useState<AgentMessageLang | null>(null);\n\n useEffect(() => {\n setPickedLang(null);\n }, [lang, agentUuid]);\n\n const defaultLanguage = data?.defaultLanguage ?? \"en\";\n const languages = useMemo(() => (data ? languagesOf(data) : []), [data]);\n const activeLang = pickedLang ?? lang ?? defaultLanguage;\n\n useEffect(() => {\n let cancelled = false;\n setData(null);\n setError(false);\n client.agents.messages\n .list(agentUuid)\n .then((result) => {\n if (!cancelled) setData(result);\n })\n .catch(() => {\n if (!cancelled) setError(true);\n });\n return () => {\n cancelled = true;\n };\n }, [client, agentUuid]);\n\n const items = useMemo<PickerItem[]>(() => {\n if (!data) return [];\n const saved = data.messages.map((m) => ({\n key: m.key,\n preview: previewOf(m, activeLang, defaultLanguage),\n }));\n const savedKeys = new Set(saved.map((i) => i.key));\n const unsaved = data.knownKeys\n .filter((k) => !savedKeys.has(k))\n .sort()\n .map((key) => ({ key, preview: null }));\n return [...saved, ...unsaved];\n }, [data, activeLang, defaultLanguage]);\n\n const needle = query.trim().toLowerCase();\n const visible = needle\n ? items.filter(\n (i) => i.key.includes(needle) || (i.preview?.toLowerCase().includes(needle) ?? false)\n )\n : items;\n\n const custom = query.trim();\n const showCustom = allowCustom && custom.length > 0 && !items.some((i) => i.key === custom);\n const customValid = showCustom && isValidMessageKey(custom);\n\n const languageChoices = languages.includes(activeLang) ? languages : [...languages, activeLang];\n\n return (\n <div className={`flex flex-col gap-2 text-sm ${className}`}>\n <div className=\"flex gap-2\">\n <input\n type=\"search\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder={labels.search}\n aria-label={labels.search}\n className=\"w-full min-w-0 flex-1 rounded-lg bg-gray-100 dark:bg-gray-800 px-3 py-2 text-gray-900 dark:text-gray-100 placeholder:text-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n />\n {data && languages.length > 1 && (\n <select\n value={activeLang}\n onChange={(e) => {\n setPickedLang(e.target.value);\n onLangChange?.(e.target.value);\n }}\n aria-label={labels.language}\n className=\"rounded-lg bg-gray-100 dark:bg-gray-800 px-2 py-2 font-mono text-xs text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n {languageChoices.map((code) => (\n <option key={code} value={code}>\n {code}\n </option>\n ))}\n </select>\n )}\n </div>\n\n {error ? (\n <p role=\"alert\" className=\"px-1 text-red-500\">\n {labels.loadError}\n </p>\n ) : !data ? (\n <p className=\"flex items-center gap-2 px-1 text-gray-500 dark:text-gray-400\">\n <LoadingSpinner className=\"h-4 w-4\" />\n {labels.loading}\n </p>\n ) : (\n <ul role=\"listbox\" aria-label={labels.search} className=\"flex max-h-72 flex-col gap-0.5 overflow-y-auto\">\n {visible.map((item) => {\n const selected = item.key === value;\n return (\n <li key={item.key} role=\"option\" aria-selected={selected}>\n <button\n type=\"button\"\n onClick={() => onChange(item.key)}\n className={`flex w-full items-start gap-2 rounded-lg px-3 py-2 text-left transition-colors ${\n selected\n ? \"bg-blue-50 dark:bg-blue-900/30\"\n : \"hover:bg-gray-100 dark:hover:bg-gray-800\"\n }`}\n >\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"font-mono text-xs text-gray-900 dark:text-gray-100\">{item.key}</span>\n {item.preview !== null ? (\n <span className=\"truncate text-gray-500 dark:text-gray-400\">{item.preview}</span>\n ) : (\n <span className=\"italic text-gray-400 dark:text-gray-500\">{labels.notSet}</span>\n )}\n </span>\n {selected && <CheckIcon className=\"h-4 w-4 flex-shrink-0 text-blue-500\" />}\n </button>\n </li>\n );\n })}\n {visible.length === 0 && !showCustom && (\n <li className=\"px-3 py-2 text-gray-500 dark:text-gray-400\">{labels.empty}</li>\n )}\n </ul>\n )}\n\n {data && showCustom &&\n (customValid ? (\n <button\n type=\"button\"\n onClick={() => onChange(custom)}\n className=\"rounded-lg bg-gray-100 dark:bg-gray-800 px-3 py-2 text-left font-mono text-xs text-blue-600 dark:text-blue-400 hover:bg-gray-200 dark:hover:bg-gray-700\"\n >\n {labels.useCustom(custom)}\n </button>\n ) : (\n <p className=\"px-1 text-xs text-gray-500 dark:text-gray-400\">{labels.invalidCustom}</p>\n ))}\n </div>\n );\n}\n\nexport default AgentMessagePicker;\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"]}
|