@yourgpt/copilot-sdk 0.1.1 → 1.0.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/LICENSE +21 -0
- package/dist/{thread-CLmfwine.d.ts → ThreadManager-BCVt-_k_.d.cts} +376 -223
- package/dist/{thread-CLmfwine.d.cts → ThreadManager-BjC15mh8.d.ts} +376 -223
- package/dist/{chunk-IH7WXWX4.cjs → chunk-42YQ4ATO.cjs} +889 -2
- package/dist/chunk-42YQ4ATO.cjs.map +1 -0
- package/dist/{chunk-R452HH3J.cjs → chunk-BN75ZW24.cjs} +455 -26
- package/dist/chunk-BN75ZW24.cjs.map +1 -0
- package/dist/{chunk-QWQELTEB.js → chunk-QSEGNATZ.js} +882 -3
- package/dist/chunk-QSEGNATZ.js.map +1 -0
- package/dist/{chunk-FO75W5UI.js → chunk-XAVZZVUL.js} +428 -4
- package/dist/chunk-XAVZZVUL.js.map +1 -0
- package/dist/core/index.cjs +99 -71
- package/dist/core/index.d.cts +4 -4
- package/dist/core/index.d.ts +4 -4
- package/dist/core/index.js +1 -1
- package/dist/react/index.cjs +66 -34
- package/dist/react/index.d.cts +371 -5
- package/dist/react/index.d.ts +371 -5
- package/dist/react/index.js +2 -2
- package/dist/{tools-eeJ5iEC4.d.ts → types-BtAaOV07.d.cts} +367 -1
- package/dist/{tools-eeJ5iEC4.d.cts → types-BtAaOV07.d.ts} +367 -1
- package/dist/ui/index.cjs +1703 -467
- package/dist/ui/index.cjs.map +1 -1
- package/dist/ui/index.d.cts +333 -38
- package/dist/ui/index.d.ts +333 -38
- package/dist/ui/index.js +1699 -467
- package/dist/ui/index.js.map +1 -1
- package/package.json +9 -9
- package/dist/chunk-FO75W5UI.js.map +0 -1
- package/dist/chunk-IH7WXWX4.cjs.map +0 -1
- package/dist/chunk-QWQELTEB.js.map +0 -1
- package/dist/chunk-R452HH3J.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/chat/types/tool.ts","../src/chat/interfaces/ChatState.ts","../src/chat/functions/stream/parseSSE.ts","../src/chat/functions/stream/processChunk.ts","../src/chat/functions/message/createMessage.ts","../src/chat/adapters/HttpTransport.ts","../src/chat/classes/AbstractChat.ts","../src/chat/AbstractAgentLoop.ts","../src/chat/ChatWithTools.ts","../src/react/internal/ReactChatState.ts","../src/react/internal/ReactChatWithTools.ts","../src/react/utils/context-tree.ts","../src/react/provider/CopilotProvider.tsx","../src/react/hooks/useAIAction.ts","../src/react/hooks/useAIContext.ts","../src/react/hooks/useAITools.ts","../src/react/hooks/useTool.ts","../src/react/context/CopilotContext.tsx","../src/react/hooks/useToolWithSchema.ts","../src/react/hooks/useToolExecutor.ts","../src/react/hooks/useSuggestions.ts","../src/react/hooks/useAgent.ts","../src/react/utils/knowledge-base.ts","../src/react/hooks/useKnowledgeBase.ts","../src/react/hooks/useCapabilities.ts","../src/react/hooks/useDevLogger.ts","../src/react/internal/ReactThreadManagerState.ts","../src/react/internal/ReactThreadManager.ts","../src/react/hooks/useThreadManager.ts","../src/react/utils/permission-storage.ts","../src/react/internal/ReactChat.ts","../src/react/internal/useChat.ts"],"names":["error","messages","useEffect","useRef","useState","useCallback","useMemo","CopilotContext","createContext","useContext","useSyncExternalStore"],"mappings":"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","file":"chunk-XAVZZVUL.js","sourcesContent":["/**\n * Tool Types\n *\n * Types for tool execution and agent loop.\n */\n\nimport type { ToolDefinition, PermissionLevel } from \"../../core\";\n\n/**\n * Tool call from LLM\n */\nexport interface ToolCallInfo {\n id: string;\n name: string;\n args: Record<string, unknown>;\n}\n\n/**\n * Raw tool call from API\n */\nexport interface RawToolCall {\n id: string;\n type: \"function\";\n function: {\n name: string;\n arguments: string;\n };\n}\n\n/**\n * Tool execution status\n */\nexport type ToolExecutionStatus =\n | \"pending\"\n | \"executing\"\n | \"completed\"\n | \"failed\"\n | \"rejected\";\n\n/**\n * Tool approval status\n */\nexport type ToolApprovalStatus = \"none\" | \"required\" | \"approved\" | \"rejected\";\n\n/**\n * Tool execution record\n */\nexport interface ToolExecution {\n id: string;\n toolCallId: string;\n name: string;\n args: Record<string, unknown>;\n status: ToolExecutionStatus;\n approvalStatus: ToolApprovalStatus;\n result?: unknown;\n error?: string;\n startedAt?: Date;\n completedAt?: Date;\n /** Custom approval message from tool definition */\n approvalMessage?: string;\n /** Data passed from user's approval action (e.g., selected supervisor) */\n approvalData?: Record<string, unknown>;\n}\n\n/**\n * Tool response\n */\nexport interface ToolResponse {\n toolCallId: string;\n success: boolean;\n result?: unknown;\n error?: string;\n}\n\n/**\n * Agent loop configuration\n */\nexport interface AgentLoopConfig {\n /** Maximum iterations */\n maxIterations?: number;\n /** Auto-approve all tools */\n autoApprove?: boolean;\n /** Initial tools */\n tools?: ToolDefinition[];\n /** Max tool executions to keep in memory (default: 100). Oldest are pruned. */\n maxExecutionHistory?: number;\n}\n\n/**\n * Agent loop callbacks\n */\nexport interface AgentLoopCallbacks {\n /** Called when tool executions change */\n onExecutionsChange?: (executions: ToolExecution[]) => void;\n /** Called when a tool needs approval */\n onApprovalRequired?: (execution: ToolExecution) => void;\n /** Called when a tool starts */\n onToolStart?: (execution: ToolExecution) => void;\n /** Called when a tool completes */\n onToolComplete?: (execution: ToolExecution) => void;\n /** Called to continue chat with tool results */\n onContinue?: (results: ToolResponse[]) => Promise<void>;\n /** Called when max iterations reached */\n onMaxIterationsReached?: () => void;\n}\n\n/**\n * Permission check result\n */\nexport type PermissionCheckResult =\n | { action: \"auto-approve\" }\n | { action: \"auto-reject\"; reason: string }\n | { action: \"require-approval\" };\n\n/**\n * Agent loop state\n */\nexport interface AgentLoopState {\n toolExecutions: ToolExecution[];\n iteration: number;\n maxIterations: number;\n maxIterationsReached: boolean;\n isProcessing: boolean;\n}\n\n/**\n * Agent loop actions interface\n */\nexport interface AgentLoopActions {\n /**\n * Approve a tool execution with optional extra data.\n * The extraData is passed to the tool handler via context.approvalData.\n *\n * @param executionId - The tool execution ID\n * @param extraData - Optional data from user's approval action (e.g., selected item)\n * @param permissionLevel - Optional permission level for persistence\n */\n approveToolExecution: (\n executionId: string,\n extraData?: Record<string, unknown>,\n permissionLevel?: PermissionLevel,\n ) => void;\n\n /**\n * Reject a tool execution.\n *\n * @param executionId - The tool execution ID\n * @param reason - Optional rejection reason\n * @param permissionLevel - Optional permission level for persistence\n */\n rejectToolExecution: (\n executionId: string,\n reason?: string,\n permissionLevel?: PermissionLevel,\n ) => void;\n\n clearToolExecutions: () => void;\n}\n\n/**\n * Initial agent loop state\n */\nexport const initialAgentLoopState: AgentLoopState = {\n toolExecutions: [],\n iteration: 0,\n maxIterations: 20,\n maxIterationsReached: false,\n isProcessing: false,\n};\n","/**\n * ChatState Interface\n *\n * Contract for framework-specific state implementations.\n * React, Vue, Svelte each implement this differently.\n */\n\nimport type { UIMessage, ChatStatus } from \"../types/index\";\n\n/**\n * ChatState interface - Framework adapters implement this\n *\n * This is the key abstraction that enables framework-agnostic code.\n * The AbstractChat class uses this interface, and each framework\n * provides its own implementation.\n *\n * @example React implementation\n * ```typescript\n * class ReactChatState implements ChatState<UIMessage> {\n * #messages: UIMessage[] = [];\n * #callbacks = new Set<() => void>();\n *\n * get messages() { return this.#messages; }\n * set messages(m) {\n * this.#messages = m;\n * this.#callbacks.forEach(cb => cb()); // Trigger re-render\n * }\n *\n * subscribe(cb: () => void) {\n * this.#callbacks.add(cb);\n * return () => this.#callbacks.delete(cb);\n * }\n * }\n * ```\n *\n * @example Vue implementation\n * ```typescript\n * class VueChatState implements ChatState<UIMessage> {\n * messages = ref<UIMessage[]>([]);\n * status = ref<ChatStatus>('ready');\n * // Vue refs are automatically reactive\n * }\n * ```\n */\nexport interface ChatState<T extends UIMessage = UIMessage> {\n // ============================================\n // State Properties\n // ============================================\n\n /** All messages in the conversation */\n messages: T[];\n\n /** Current chat status */\n status: ChatStatus;\n\n /** Current error if any */\n error: Error | undefined;\n\n // ============================================\n // State Mutations (trigger reactivity)\n // ============================================\n\n /**\n * Add a message to the end\n */\n pushMessage(message: T): void;\n\n /**\n * Remove the last message\n */\n popMessage(): void;\n\n /**\n * Replace a message at index\n */\n replaceMessage(index: number, message: T): void;\n\n /**\n * Update the last message (common during streaming)\n */\n updateLastMessage(updater: (message: T) => T): void;\n\n /**\n * Set all messages (replace entire array)\n */\n setMessages(messages: T[]): void;\n\n /**\n * Clear all messages\n */\n clearMessages(): void;\n\n // ============================================\n // Subscription (for React's useSyncExternalStore)\n // ============================================\n\n /**\n * Subscribe to state changes\n * Returns unsubscribe function\n *\n * This is used by React's useSyncExternalStore.\n * Vue/Svelte may not need this (they use refs/stores).\n */\n subscribe?(callback: () => void): () => void;\n\n // ============================================\n // Snapshot (for React concurrent mode)\n // ============================================\n\n /**\n * Get immutable snapshot of messages\n * Used by useSyncExternalStore's getSnapshot\n */\n getMessagesSnapshot?(): T[];\n\n /**\n * Get status snapshot\n */\n getStatusSnapshot?(): ChatStatus;\n\n /**\n * Get error snapshot\n */\n getErrorSnapshot?(): Error | undefined;\n}\n\n/**\n * Default in-memory state implementation (for testing/vanilla JS)\n */\nexport class SimpleChatState<\n T extends UIMessage = UIMessage,\n> implements ChatState<T> {\n private _messages: T[] = [];\n private _status: ChatStatus = \"ready\";\n private _error: Error | undefined = undefined;\n private callbacks = new Set<() => void>();\n\n get messages(): T[] {\n return this._messages;\n }\n\n set messages(value: T[]) {\n this._messages = value;\n this.notify();\n }\n\n get status(): ChatStatus {\n return this._status;\n }\n\n set status(value: ChatStatus) {\n this._status = value;\n this.notify();\n }\n\n get error(): Error | undefined {\n return this._error;\n }\n\n set error(value: Error | undefined) {\n this._error = value;\n this.notify();\n }\n\n pushMessage(message: T): void {\n this._messages = [...this._messages, message];\n this.notify();\n }\n\n popMessage(): void {\n this._messages = this._messages.slice(0, -1);\n this.notify();\n }\n\n replaceMessage(index: number, message: T): void {\n this._messages = [\n ...this._messages.slice(0, index),\n message,\n ...this._messages.slice(index + 1),\n ];\n this.notify();\n }\n\n updateLastMessage(updater: (message: T) => T): void {\n if (this._messages.length === 0) return;\n const lastIndex = this._messages.length - 1;\n this.replaceMessage(lastIndex, updater(this._messages[lastIndex]));\n }\n\n setMessages(messages: T[]): void {\n this._messages = messages;\n this.notify();\n }\n\n clearMessages(): void {\n this._messages = [];\n this.notify();\n }\n\n subscribe(callback: () => void): () => void {\n this.callbacks.add(callback);\n return () => this.callbacks.delete(callback);\n }\n\n getMessagesSnapshot(): T[] {\n return this._messages;\n }\n\n getStatusSnapshot(): ChatStatus {\n return this._status;\n }\n\n getErrorSnapshot(): Error | undefined {\n return this._error;\n }\n\n private notify(): void {\n this.callbacks.forEach((cb) => cb());\n }\n}\n","/**\n * SSE Parsing Functions\n *\n * Pure functions for parsing Server-Sent Events.\n * No side effects, easy to test.\n */\n\nimport type { StreamChunk } from \"../../interfaces\";\n\n/**\n * Parse a single SSE line into an event\n *\n * @param line - Raw SSE line (e.g., \"data: {...}\")\n * @returns Parsed stream chunk or null if not a data line\n *\n * @example\n * ```typescript\n * const chunk = parseSSELine('data: {\"type\":\"message:delta\",\"content\":\"Hi\"}');\n * // { type: 'message:delta', content: 'Hi' }\n *\n * const empty = parseSSELine('');\n * // null\n *\n * const comment = parseSSELine(': heartbeat');\n * // null\n * ```\n */\nexport function parseSSELine(line: string): StreamChunk | null {\n // Skip empty lines\n if (!line || line.trim() === \"\") {\n return null;\n }\n\n // Skip comments (lines starting with :)\n if (line.startsWith(\":\")) {\n return null;\n }\n\n // Parse data lines\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6); // Remove \"data: \" prefix\n\n // Handle [DONE] marker\n if (data === \"[DONE]\") {\n return { type: \"done\" };\n }\n\n try {\n return JSON.parse(data) as StreamChunk;\n } catch {\n // Invalid JSON, skip\n return null;\n }\n }\n\n // Skip other SSE fields (event:, id:, retry:)\n return null;\n}\n\n/**\n * Parse multiple SSE lines (batch processing)\n *\n * @param text - Raw SSE text with multiple lines\n * @returns Array of parsed chunks (excludes nulls)\n *\n * @example\n * ```typescript\n * const chunks = parseSSEText(`\n * data: {\"type\":\"message:start\",\"id\":\"1\"}\n *\n * data: {\"type\":\"message:delta\",\"content\":\"Hello\"}\n *\n * data: {\"type\":\"message:end\"}\n * `);\n * // [\n * // { type: 'message:start', id: '1' },\n * // { type: 'message:delta', content: 'Hello' },\n * // { type: 'message:end' }\n * // ]\n * ```\n */\nexport function parseSSEText(text: string): StreamChunk[] {\n return text\n .split(\"\\n\")\n .map(parseSSELine)\n .filter((chunk): chunk is StreamChunk => chunk !== null);\n}\n\n/**\n * Check if a chunk indicates the stream is done\n */\nexport function isStreamDone(chunk: StreamChunk): boolean {\n return chunk.type === \"done\" || chunk.type === \"error\";\n}\n\n/**\n * Check if a chunk indicates tool calls need execution\n */\nexport function requiresToolExecution(chunk: StreamChunk): boolean {\n if (chunk.type === \"done\" && chunk.requiresAction) {\n return true;\n }\n if (chunk.type === \"tool_calls\") {\n return true;\n }\n return false;\n}\n","/**\n * Stream Chunk Processing Functions\n *\n * Pure functions for processing stream chunks.\n * Returns new state without mutating input.\n */\n\nimport type { StreamChunk } from \"../../interfaces\";\nimport type { StreamingMessageState } from \"../../types/index\";\n\n/**\n * Process a stream chunk and return updated state\n *\n * This is a pure function - it takes state and chunk,\n * returns new state without mutating the input.\n *\n * @param chunk - Stream chunk to process\n * @param state - Current streaming state\n * @returns New streaming state\n *\n * @example\n * ```typescript\n * let state = createStreamState('msg-1');\n *\n * state = processStreamChunk(\n * { type: 'message:delta', content: 'Hello' },\n * state\n * );\n * // state.content === 'Hello'\n *\n * state = processStreamChunk(\n * { type: 'message:delta', content: ' World' },\n * state\n * );\n * // state.content === 'Hello World'\n * ```\n */\nexport function processStreamChunk(\n chunk: StreamChunk,\n state: StreamingMessageState,\n): StreamingMessageState {\n switch (chunk.type) {\n case \"message:start\":\n return {\n ...state,\n messageId: chunk.id,\n };\n\n case \"message:delta\":\n return {\n ...state,\n content: state.content + chunk.content,\n };\n\n case \"message:end\":\n return {\n ...state,\n finishReason: \"stop\",\n };\n\n case \"thinking:delta\":\n return {\n ...state,\n thinking: state.thinking + chunk.content,\n };\n\n case \"tool_calls\":\n return {\n ...state,\n toolCalls: parseToolCalls(chunk.toolCalls),\n requiresAction: true,\n };\n\n case \"done\":\n return {\n ...state,\n requiresAction: chunk.requiresAction ?? false,\n finishReason: \"stop\",\n };\n\n case \"error\":\n return {\n ...state,\n finishReason: \"error\",\n };\n\n default:\n // Unknown chunk type, return unchanged\n return state;\n }\n}\n\n/**\n * Parse raw tool calls into typed format\n */\nfunction parseToolCalls(\n rawToolCalls: unknown[],\n): Array<{ id: string; name: string; args: Record<string, unknown> }> {\n return rawToolCalls.map((tc) => {\n const toolCall = tc as {\n id: string;\n function?: { name: string; arguments: string };\n name?: string;\n args?: Record<string, unknown>;\n };\n\n // Handle both OpenAI format and simplified format\n if (toolCall.function) {\n return {\n id: toolCall.id,\n name: toolCall.function.name,\n args: JSON.parse(toolCall.function.arguments),\n };\n }\n\n return {\n id: toolCall.id,\n name: toolCall.name ?? \"\",\n args: toolCall.args ?? {},\n };\n });\n}\n\n/**\n * Create initial streaming state\n *\n * @param messageId - ID for the message being built\n * @returns Initial streaming state\n */\nexport function createStreamState(messageId: string): StreamingMessageState {\n return {\n messageId,\n content: \"\",\n thinking: \"\",\n toolCalls: [],\n requiresAction: false,\n finishReason: undefined,\n };\n}\n\n/**\n * Check if streaming is complete\n */\nexport function isStreamComplete(state: StreamingMessageState): boolean {\n return state.finishReason !== undefined;\n}\n\n/**\n * Check if stream has content\n */\nexport function hasContent(state: StreamingMessageState): boolean {\n return state.content.length > 0 || state.thinking.length > 0;\n}\n","/**\n * Message Creation Functions\n *\n * Pure factory functions for creating messages.\n */\n\nimport type { MessageAttachment, ToolCall } from \"../../../core\";\nimport type { UIMessage, StreamingMessageState } from \"../../types/index\";\n\n/**\n * Generate a unique message ID\n */\nexport function generateMessageId(): string {\n return `msg-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n}\n\n/**\n * Create a user message\n *\n * @param content - Message content\n * @param attachments - Optional attachments\n * @returns New user message\n */\nexport function createUserMessage(\n content: string,\n attachments?: MessageAttachment[],\n): UIMessage {\n return {\n id: generateMessageId(),\n role: \"user\",\n content,\n attachments,\n createdAt: new Date(),\n };\n}\n\n/**\n * Create an assistant message\n *\n * @param content - Message content\n * @param options - Optional properties\n * @returns New assistant message\n */\nexport function createAssistantMessage(\n content: string,\n options?: {\n id?: string;\n thinking?: string;\n toolCalls?: ToolCall[];\n metadata?: Record<string, unknown>;\n },\n): UIMessage {\n return {\n id: options?.id ?? generateMessageId(),\n role: \"assistant\",\n content,\n thinking: options?.thinking,\n toolCalls: options?.toolCalls,\n createdAt: new Date(),\n metadata: options?.metadata,\n };\n}\n\n/**\n * Create a tool result message\n *\n * @param toolCallId - ID of the tool call\n * @param result - Tool execution result\n * @returns New tool message\n */\nexport function createToolMessage(\n toolCallId: string,\n result: unknown,\n): UIMessage {\n return {\n id: generateMessageId(),\n role: \"tool\",\n content: typeof result === \"string\" ? result : JSON.stringify(result),\n toolCallId,\n createdAt: new Date(),\n };\n}\n\n/**\n * Create a system message\n *\n * @param content - Message content\n * @returns New system message\n */\nexport function createSystemMessage(content: string): UIMessage {\n return {\n id: generateMessageId(),\n role: \"system\",\n content,\n createdAt: new Date(),\n };\n}\n\n/**\n * Convert streaming state to UIMessage\n *\n * @param state - Current streaming state\n * @returns UIMessage representation\n */\nexport function streamStateToMessage(state: StreamingMessageState): UIMessage {\n // Convert simplified tool calls to ToolCall format\n const toolCalls: ToolCall[] | undefined =\n state.toolCalls.length > 0\n ? state.toolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.args),\n },\n }))\n : undefined;\n\n return {\n id: state.messageId,\n role: \"assistant\",\n content: state.content,\n thinking: state.thinking || undefined,\n toolCalls,\n createdAt: new Date(),\n };\n}\n\n/**\n * Create an empty assistant message (for streaming)\n *\n * @param id - Optional message ID\n * @returns Empty assistant message\n */\nexport function createEmptyAssistantMessage(id?: string): UIMessage {\n return {\n id: id ?? generateMessageId(),\n role: \"assistant\",\n content: \"\",\n createdAt: new Date(),\n };\n}\n","/**\n * HttpTransport - HTTP/SSE implementation of ChatTransport\n *\n * Uses fetch with streaming for SSE responses.\n */\n\nimport type {\n ChatTransport,\n ChatRequest,\n ChatResponse,\n StreamChunk,\n TransportConfig,\n} from \"../interfaces\";\nimport { parseSSELine } from \"../functions\";\n\n/**\n * HTTP Transport for chat API\n *\n * @example\n * ```typescript\n * const transport = new HttpTransport({\n * url: '/api/chat',\n * headers: { ... },\n * });\n *\n * const stream = await transport.send(request);\n * for await (const chunk of stream) {\n * console.log(chunk);\n * }\n * ```\n */\nexport class HttpTransport implements ChatTransport {\n private config: TransportConfig;\n private abortController: AbortController | null = null;\n private streaming = false;\n\n constructor(config: TransportConfig) {\n this.config = {\n streaming: true,\n timeout: 60000,\n ...config,\n };\n }\n\n /**\n * Send a chat request\n */\n async send(\n request: ChatRequest,\n ): Promise<AsyncIterable<StreamChunk> | ChatResponse> {\n // Create new abort controller\n this.abortController = new AbortController();\n this.streaming = true;\n\n try {\n const response = await fetch(this.config.url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.config.headers,\n },\n body: JSON.stringify({\n messages: request.messages,\n threadId: request.threadId,\n systemPrompt: request.systemPrompt,\n llm: request.llm,\n tools: request.tools,\n actions: request.actions,\n streaming: this.config.streaming,\n ...request.body,\n }),\n signal: this.abortController.signal,\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`HTTP ${response.status}: ${error}`);\n }\n\n const contentType = response.headers.get(\"content-type\") || \"\";\n\n // Handle non-streaming JSON response\n if (contentType.includes(\"application/json\")) {\n this.streaming = false;\n const json = await response.json();\n return json as ChatResponse;\n }\n\n // Handle streaming SSE response\n if (!response.body) {\n throw new Error(\"No response body\");\n }\n\n return this.createStreamIterable(response.body);\n } catch (error) {\n this.streaming = false;\n if ((error as Error).name === \"AbortError\") {\n // Return empty iterable for aborted requests\n return (async function* () {})();\n }\n throw error;\n }\n }\n\n /**\n * Abort the current request\n */\n abort(): void {\n this.abortController?.abort();\n this.abortController = null;\n this.streaming = false;\n }\n\n /**\n * Check if currently streaming\n */\n isStreaming(): boolean {\n return this.streaming;\n }\n\n /**\n * Create an async iterable from a ReadableStream\n */\n private createStreamIterable(\n body: ReadableStream<Uint8Array>,\n ): AsyncIterable<StreamChunk> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n // Queue to hold parsed chunks that haven't been returned yet\n const chunkQueue: StreamChunk[] = [];\n let streamDone = false;\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n\n return {\n [Symbol.asyncIterator]() {\n return {\n async next(): Promise<IteratorResult<StreamChunk>> {\n // First, return any queued chunks\n if (chunkQueue.length > 0) {\n return { value: chunkQueue.shift()!, done: false };\n }\n\n // If stream is done and no more chunks, we're done\n if (streamDone) {\n return { value: undefined as unknown as StreamChunk, done: true };\n }\n\n try {\n const { done, value } = await reader.read();\n\n if (done) {\n self.streaming = false;\n streamDone = true;\n // Process any remaining buffer\n if (buffer.trim()) {\n const chunk = parseSSELine(buffer.trim());\n if (chunk) {\n buffer = \"\";\n return { value: chunk, done: false };\n }\n }\n return {\n value: undefined as unknown as StreamChunk,\n done: true,\n };\n }\n\n // Decode and add to buffer\n buffer += decoder.decode(value, { stream: true });\n\n // Process complete lines\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() || \"\"; // Keep incomplete line in buffer\n\n // Parse all lines and queue the chunks\n for (const line of lines) {\n const chunk = parseSSELine(line);\n if (chunk) {\n chunkQueue.push(chunk);\n }\n }\n\n // Return first chunk if available, otherwise read more\n if (chunkQueue.length > 0) {\n return { value: chunkQueue.shift()!, done: false };\n }\n\n // No complete chunk yet, continue reading\n return this.next();\n } catch (error) {\n self.streaming = false;\n streamDone = true;\n if ((error as Error).name === \"AbortError\") {\n return {\n value: undefined as unknown as StreamChunk,\n done: true,\n };\n }\n throw error;\n }\n },\n };\n },\n };\n }\n}\n\n/**\n * Create an HTTP transport instance\n */\nexport function createHttpTransport(config: TransportConfig): HttpTransport {\n return new HttpTransport(config);\n}\n","/**\n * AbstractChat - Framework-agnostic chat orchestration\n *\n * This class coordinates:\n * - Message sending and receiving\n * - Stream processing\n * - State updates via injected ChatState\n *\n * Framework adapters (React, Vue, etc.) extend this class\n * and inject their own state implementation.\n */\n\nimport type {\n MessageAttachment,\n AIResponseMode,\n ToolResponse,\n ToolDefinition,\n} from \"../../core\";\nimport type { ChatState } from \"../interfaces/ChatState\";\nimport type {\n ChatTransport,\n StreamChunk,\n ChatResponse,\n} from \"../interfaces/ChatTransport\";\nimport type {\n UIMessage,\n ChatConfig,\n ChatCallbacks,\n ChatInit,\n StreamingMessageState,\n} from \"../types/index\";\nimport { HttpTransport } from \"../adapters/HttpTransport\";\nimport {\n createUserMessage,\n createEmptyAssistantMessage,\n generateMessageId,\n streamStateToMessage,\n} from \"../functions/message\";\nimport {\n createStreamState,\n processStreamChunk,\n isStreamDone,\n requiresToolExecution,\n} from \"../functions/stream\";\nimport { SimpleChatState } from \"../interfaces/ChatState\";\n\n// ============================================\n// AI Response Control Helper\n// ============================================\n\n/**\n * Tool definition with AI response control fields\n */\ninterface ToolWithAIConfig {\n name: string;\n aiResponseMode?: AIResponseMode;\n aiContext?:\n | string\n | ((result: ToolResponse, args: Record<string, unknown>) => string);\n}\n\n/**\n * Build tool result content for AI based on aiResponseMode and aiContext\n * This transforms client-side tool results before sending to the LLM\n *\n * Priority for responseMode: result._aiResponseMode > tool.aiResponseMode > \"full\"\n * Priority for context: result._aiContext > tool.aiContext > undefined\n *\n * @param result - The tool result (may include _aiResponseMode, _aiContext, _aiContent)\n * @param tool - Optional tool definition with aiResponseMode and aiContext\n * @param args - Tool arguments (for dynamic aiContext functions)\n * @returns The content string to send to the AI\n */\nfunction buildToolResultContentForAI(\n result: unknown,\n tool?: ToolWithAIConfig,\n args?: Record<string, unknown>,\n): string {\n if (typeof result === \"string\") return result;\n\n const typedResult = result as ToolResponse | null;\n\n // Priority: result._aiResponseMode > tool.aiResponseMode > \"full\"\n const responseMode =\n typedResult?._aiResponseMode ?? tool?.aiResponseMode ?? \"full\";\n\n // Check for multimodal content\n if (typedResult?._aiContent) {\n return JSON.stringify(typedResult._aiContent);\n }\n\n // Get AI context: result._aiContext > tool.aiContext (string or function)\n let aiContext: string | undefined = typedResult?._aiContext;\n if (!aiContext && tool?.aiContext) {\n aiContext =\n typeof tool.aiContext === \"function\"\n ? tool.aiContext(typedResult as ToolResponse, args ?? {})\n : tool.aiContext;\n }\n\n switch (responseMode) {\n case \"none\":\n return aiContext ?? \"[Result displayed to user]\";\n\n case \"brief\":\n return aiContext ?? \"[Tool executed successfully]\";\n\n case \"full\":\n default:\n if (aiContext) {\n // Include context as prefix, then full data (without the control fields)\n const { _aiResponseMode, _aiContext, _aiContent, ...dataOnly } =\n typedResult ?? {};\n return `${aiContext}\\n\\nFull data: ${JSON.stringify(dataOnly)}`;\n }\n return JSON.stringify(result);\n }\n}\n\n/**\n * Event types emitted by AbstractChat\n */\nexport type ChatEvent =\n | { type: \"toolCalls\"; toolCalls: UIMessage[\"toolCalls\"] }\n | { type: \"done\" }\n | { type: \"error\"; error: Error };\n\n/**\n * Event handler type\n */\nexport type ChatEventHandler<T extends ChatEvent[\"type\"]> = (\n event: Extract<ChatEvent, { type: T }>,\n) => void;\n\n/**\n * AbstractChat - Core chat functionality\n *\n * @example\n * ```typescript\n * // With React state\n * class ReactChat extends AbstractChat {\n * constructor(config: ChatInit) {\n * const state = new ReactChatState();\n * super({ ...config, state });\n * }\n * }\n *\n * // Usage\n * const chat = new ReactChat({ runtimeUrl: '/api/chat' });\n * await chat.sendMessage('Hello!');\n * ```\n */\nexport class AbstractChat<T extends UIMessage = UIMessage> {\n protected state: ChatState<T>;\n protected transport: ChatTransport;\n protected config: ChatConfig;\n protected callbacks: ChatCallbacks<T>;\n\n // Event handlers\n private eventHandlers = new Map<\n ChatEvent[\"type\"],\n Set<ChatEventHandler<ChatEvent[\"type\"]>>\n >();\n\n // Current streaming state\n private streamState: StreamingMessageState | null = null;\n\n constructor(init: ChatInit<T>) {\n this.config = {\n runtimeUrl: init.runtimeUrl,\n llm: init.llm,\n systemPrompt: init.systemPrompt,\n streaming: init.streaming ?? true,\n headers: init.headers,\n threadId: init.threadId,\n debug: init.debug,\n };\n\n // Use provided state or create default\n this.state =\n (init.state as ChatState<T>) ??\n (new SimpleChatState<T>() as ChatState<T>);\n\n // Use provided transport or create default\n this.transport =\n init.transport ??\n new HttpTransport({\n url: init.runtimeUrl,\n headers: init.headers,\n streaming: init.streaming ?? true,\n });\n\n // Store callbacks\n this.callbacks = init.callbacks ?? {};\n\n // Set initial messages\n if (init.initialMessages?.length) {\n this.state.setMessages(init.initialMessages);\n }\n }\n\n // ============================================\n // Public Getters\n // ============================================\n\n get messages(): T[] {\n return this.state.messages;\n }\n\n get status() {\n return this.state.status;\n }\n\n get error() {\n return this.state.error;\n }\n\n get isStreaming(): boolean {\n return this.transport.isStreaming();\n }\n\n // ============================================\n // Public Actions\n // ============================================\n\n /**\n * Send a message\n */\n async sendMessage(\n content: string,\n attachments?: MessageAttachment[],\n ): Promise<void> {\n this.debug(\"sendMessage\", { content, attachments });\n\n try {\n // Create user message\n const userMessage = createUserMessage(content, attachments) as T;\n\n // Add to state\n this.state.pushMessage(userMessage);\n this.state.status = \"submitted\";\n this.state.error = undefined;\n\n // Notify callbacks\n this.callbacks.onMessagesChange?.(this.state.messages);\n this.callbacks.onStatusChange?.(\"submitted\");\n\n // Yield to allow UI to render loading state (important for non-streaming)\n await Promise.resolve();\n\n // Send request\n await this.processRequest();\n } catch (error) {\n this.handleError(error as Error);\n }\n }\n\n /**\n * Continue with tool results\n *\n * Automatically handles `addAsUserMessage` flag in results (e.g., screenshots).\n * When a tool result has this flag, the attachment is extracted and sent as\n * a user message so the AI can see it (e.g., for vision analysis).\n */\n async continueWithToolResults(\n toolResults: Array<{ toolCallId: string; result: unknown }>,\n ): Promise<void> {\n this.debug(\"continueWithToolResults\", toolResults);\n\n try {\n // Process results - extract attachments that should be added as user message\n const attachmentsToAdd: MessageAttachment[] = [];\n\n for (const { toolCallId, result } of toolResults) {\n // Check if result wants to be added as user message (e.g., screenshot)\n const typedResult = result as {\n success?: boolean;\n message?: string;\n addAsUserMessage?: boolean;\n data?: {\n attachment?: MessageAttachment;\n };\n } | null;\n\n let messageContent: string;\n\n if (typedResult?.addAsUserMessage && typedResult.data?.attachment) {\n this.debug(\n \"Tool result has attachment to add as user message\",\n typedResult.data.attachment.type,\n );\n attachmentsToAdd.push(typedResult.data.attachment);\n\n // Simplified result without base64 data\n messageContent = JSON.stringify({\n success: true,\n message: typedResult.message || \"Content shared in conversation.\",\n });\n } else {\n // Store FULL result in message (Vercel-style)\n // Transformation happens at send time in buildRequest()\n messageContent =\n typeof result === \"string\" ? result : JSON.stringify(result);\n }\n\n const toolMessage = {\n id: generateMessageId(),\n role: \"tool\" as const,\n content: messageContent,\n toolCallId,\n createdAt: new Date(),\n } as T;\n\n this.state.pushMessage(toolMessage);\n }\n\n // If there are attachments (e.g., screenshots), add user message so AI can see them\n if (attachmentsToAdd.length > 0) {\n this.debug(\n \"Adding user message with attachments\",\n attachmentsToAdd.length,\n );\n const userMessage = {\n id: generateMessageId(),\n role: \"user\" as const,\n content: \"Here's my screen:\",\n attachments: attachmentsToAdd,\n createdAt: new Date(),\n } as T;\n\n this.state.pushMessage(userMessage);\n }\n\n this.state.status = \"submitted\";\n this.callbacks.onMessagesChange?.(this.state.messages);\n this.callbacks.onStatusChange?.(\"submitted\");\n\n // Yield to allow UI to render loading state (important for non-streaming)\n await Promise.resolve();\n\n // Continue request\n await this.processRequest();\n } catch (error) {\n this.handleError(error as Error);\n }\n }\n\n /**\n * Stop generation\n */\n stop(): void {\n this.transport.abort();\n this.state.status = \"ready\";\n this.callbacks.onStatusChange?.(\"ready\");\n }\n\n /**\n * Clear all messages\n */\n clearMessages(): void {\n this.state.clearMessages();\n this.callbacks.onMessagesChange?.([]);\n }\n\n /**\n * Set messages directly\n */\n setMessages(messages: T[]): void {\n this.state.setMessages(messages);\n this.callbacks.onMessagesChange?.(messages);\n }\n\n /**\n * Regenerate last response\n */\n async regenerate(messageId?: string): Promise<void> {\n // Remove messages from the specified ID (or last assistant message)\n const messages = this.state.messages;\n let targetIndex = messages.length - 1;\n\n if (messageId) {\n targetIndex = messages.findIndex((m) => m.id === messageId);\n } else {\n // Find last assistant message\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i].role === \"assistant\") {\n targetIndex = i;\n break;\n }\n }\n }\n\n if (targetIndex > 0) {\n // Remove from target onwards\n this.state.setMessages(messages.slice(0, targetIndex));\n this.callbacks.onMessagesChange?.(this.state.messages);\n\n // Resend\n await this.processRequest();\n }\n }\n\n // ============================================\n // Event Handling\n // ============================================\n\n /**\n * Subscribe to events\n */\n on<E extends ChatEvent[\"type\"]>(\n event: E,\n handler: ChatEventHandler<E>,\n ): () => void {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, new Set());\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.eventHandlers.get(event)!.add(handler as any);\n\n return () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.eventHandlers.get(event)?.delete(handler as any);\n };\n }\n\n /**\n * Emit an event\n */\n protected emit<E extends ChatEvent[\"type\"]>(\n type: E,\n data: Omit<Extract<ChatEvent, { type: E }>, \"type\">,\n ): void {\n const event = { type, ...data } as ChatEvent;\n this.eventHandlers.get(type)?.forEach((handler) => handler(event));\n }\n\n // ============================================\n // Protected Methods\n // ============================================\n\n /**\n * Process a chat request\n */\n protected async processRequest(): Promise<void> {\n // Build request\n const request = this.buildRequest();\n\n // Send request\n const response = await this.transport.send(request);\n\n // Check if streaming or JSON\n if (this.isAsyncIterable(response)) {\n await this.handleStreamResponse(response);\n } else {\n this.handleJsonResponse(response);\n }\n }\n\n /**\n * Set tools available for the LLM\n */\n setTools(tools: ToolDefinition[]): void {\n this.config.tools = tools;\n }\n\n /**\n * Dynamic context from useAIContext hook\n */\n protected dynamicContext: string = \"\";\n\n /**\n * Set dynamic context (appended to system prompt)\n */\n setContext(context: string): void {\n this.dynamicContext = context;\n this.debug(\"Context updated\", { length: context.length });\n }\n\n /**\n * Build the request payload\n */\n protected buildRequest() {\n // Send tools in SDK format - runtime handles conversion to LLM format\n const tools = this.config.tools?.map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n }));\n\n // Build a map of toolCallId -> { toolName, args } from assistant messages\n const toolCallMap = new Map<\n string,\n { toolName: string; args: Record<string, unknown> }\n >();\n for (const msg of this.state.messages) {\n if (msg.role === \"assistant\" && msg.toolCalls) {\n for (const tc of msg.toolCalls) {\n try {\n const args = tc.function?.arguments\n ? JSON.parse(tc.function.arguments)\n : {};\n toolCallMap.set(tc.id, { toolName: tc.function.name, args });\n } catch {\n toolCallMap.set(tc.id, { toolName: tc.function.name, args: {} });\n }\n }\n }\n }\n\n // Create a lookup for tool definitions by name\n const toolDefMap = new Map<string, ToolWithAIConfig>();\n if (this.config.tools) {\n for (const tool of this.config.tools) {\n toolDefMap.set(tool.name, {\n name: tool.name,\n aiResponseMode: tool.aiResponseMode,\n aiContext: tool.aiContext,\n });\n }\n }\n\n return {\n messages: this.state.messages.map((m) => {\n // For tool messages, transform based on aiResponseMode at SEND time\n // This preserves full data in storage while sending brief to AI\n if (m.role === \"tool\" && m.content && m.toolCallId) {\n try {\n const fullResult = JSON.parse(m.content);\n\n // Look up the tool name and args from the tool call\n const toolCallInfo = toolCallMap.get(m.toolCallId);\n const toolDef = toolCallInfo\n ? toolDefMap.get(toolCallInfo.toolName)\n : undefined;\n const toolArgs = toolCallInfo?.args;\n\n const transformedContent = buildToolResultContentForAI(\n fullResult,\n toolDef,\n toolArgs,\n );\n return {\n role: m.role,\n content: transformedContent,\n tool_call_id: m.toolCallId,\n };\n } catch (e) {\n // If not JSON, send as-is (log in debug mode)\n this.debug(\"Failed to parse tool message JSON\", {\n content: m.content?.slice(0, 100),\n error: e instanceof Error ? e.message : String(e),\n });\n return {\n role: m.role,\n content: m.content,\n tool_call_id: m.toolCallId,\n };\n }\n }\n\n // Other messages unchanged\n return {\n role: m.role,\n content: m.content,\n tool_calls: m.toolCalls,\n tool_call_id: m.toolCallId,\n attachments: m.attachments,\n };\n }),\n threadId: this.config.threadId,\n systemPrompt: this.dynamicContext\n ? `${this.config.systemPrompt || \"\"}\\n\\n## Current App Context:\\n${this.dynamicContext}`.trim()\n : this.config.systemPrompt,\n llm: this.config.llm,\n tools: tools?.length ? tools : undefined,\n };\n }\n\n /**\n * Handle streaming response\n */\n protected async handleStreamResponse(\n stream: AsyncIterable<StreamChunk>,\n ): Promise<void> {\n this.state.status = \"streaming\";\n this.callbacks.onStatusChange?.(\"streaming\");\n\n // Create empty assistant message for streaming\n const assistantMessage = createEmptyAssistantMessage() as T;\n this.state.pushMessage(assistantMessage);\n\n // Initialize stream state\n this.streamState = createStreamState(assistantMessage.id);\n this.callbacks.onMessageStart?.(assistantMessage.id);\n\n this.debug(\"handleStreamResponse\", \"Starting to process stream\");\n\n let chunkCount = 0;\n let hasError = false;\n let toolCallsEmitted = false; // Guard to prevent emitting toolCalls twice\n\n // Process stream chunks\n for await (const chunk of stream) {\n chunkCount++;\n this.debug(\"chunk\", { count: chunkCount, type: chunk.type });\n\n // Handle error chunks immediately\n if (chunk.type === \"error\") {\n hasError = true;\n const error = new Error(chunk.message || \"Stream error\");\n this.handleError(error);\n return;\n }\n\n // Update stream state (pure function)\n this.streamState = processStreamChunk(chunk, this.streamState);\n\n // Update message in state\n const updatedMessage = streamStateToMessage(this.streamState) as T;\n this.state.updateLastMessage(() => updatedMessage);\n\n // Notify delta callback\n if (chunk.type === \"message:delta\") {\n this.callbacks.onMessageDelta?.(assistantMessage.id, chunk.content);\n }\n\n // Check for tool calls - only emit once per stream\n if (requiresToolExecution(chunk) && !toolCallsEmitted) {\n toolCallsEmitted = true;\n this.debug(\"toolCalls\", { toolCalls: updatedMessage.toolCalls });\n this.emit(\"toolCalls\", { toolCalls: updatedMessage.toolCalls });\n }\n\n // Check for completion\n if (isStreamDone(chunk)) {\n this.debug(\"streamDone\", { chunk });\n break;\n }\n }\n\n this.debug(\"handleStreamResponse\", `Processed ${chunkCount} chunks`);\n\n // Finalize\n const finalMessage = streamStateToMessage(this.streamState) as T;\n this.state.updateLastMessage(() => finalMessage);\n this.state.status = \"ready\";\n\n // Check if we got any content\n if (\n !finalMessage.content &&\n (!finalMessage.toolCalls || finalMessage.toolCalls.length === 0)\n ) {\n this.debug(\"warning\", \"Empty response - no content and no tool calls\");\n }\n\n this.callbacks.onMessageFinish?.(finalMessage);\n this.callbacks.onStatusChange?.(\"ready\");\n this.callbacks.onMessagesChange?.(this.state.messages);\n this.callbacks.onFinish?.(this.state.messages);\n\n this.emit(\"done\", {});\n this.streamState = null;\n }\n\n /**\n * Handle JSON (non-streaming) response\n */\n protected handleJsonResponse(response: ChatResponse): void {\n // Add response messages\n for (const msg of response.messages ?? []) {\n const message = {\n id: generateMessageId(),\n role: msg.role as T[\"role\"],\n content: msg.content ?? \"\",\n toolCalls: msg.tool_calls as T[\"toolCalls\"],\n createdAt: new Date(),\n } as T;\n\n this.state.pushMessage(message);\n }\n\n this.state.status = \"ready\";\n this.callbacks.onStatusChange?.(\"ready\");\n this.callbacks.onMessagesChange?.(this.state.messages);\n this.callbacks.onFinish?.(this.state.messages);\n\n // Check for tool calls (with bounds check)\n if (response.requiresAction && this.state.messages.length > 0) {\n const lastMessage = this.state.messages[this.state.messages.length - 1];\n if (lastMessage?.toolCalls?.length) {\n this.emit(\"toolCalls\", { toolCalls: lastMessage.toolCalls });\n }\n }\n\n this.emit(\"done\", {});\n }\n\n /**\n * Handle errors\n */\n protected handleError(error: Error): void {\n this.debug(\"error\", error);\n this.state.error = error;\n this.state.status = \"error\";\n this.callbacks.onError?.(error);\n this.callbacks.onStatusChange?.(\"error\");\n this.emit(\"error\", { error });\n }\n\n /**\n * Debug logging\n */\n protected debug(action: string, data?: unknown): void {\n if (this.config.debug) {\n console.log(`[AbstractChat] ${action}`, data);\n }\n }\n\n /**\n * Type guard for async iterable\n */\n private isAsyncIterable(value: unknown): value is AsyncIterable<StreamChunk> {\n return (\n value !== null &&\n typeof value === \"object\" &&\n Symbol.asyncIterator in value\n );\n }\n\n /**\n * Dispose and cleanup\n */\n dispose(): void {\n this.stop();\n this.eventHandlers.clear();\n }\n}\n","/**\n * AbstractAgentLoop - Framework-agnostic agent loop for tool execution\n *\n * Handles the agentic loop where the LLM can call tools, receive results,\n * and continue processing until completion.\n */\n\nimport type { ToolDefinition, PermissionLevel } from \"../core\";\n\nimport type {\n AgentLoopState,\n AgentLoopConfig,\n AgentLoopCallbacks,\n AgentLoopActions,\n ToolExecution,\n ToolResponse,\n} from \"./types/index\";\n\n/**\n * Tool call info from LLM response\n */\nexport interface ToolCallInfo {\n id: string;\n name: string;\n args: Record<string, unknown>;\n}\n\n/**\n * AbstractAgentLoop - Core agent loop functionality\n *\n * @example\n * ```typescript\n * const agentLoop = new AbstractAgentLoop(config, {\n * onToolExecutionsChange: setToolExecutions,\n * onToolApprovalRequired: handleApproval,\n * });\n *\n * // Register tools\n * agentLoop.registerTool(myTool);\n *\n * // Execute tool calls from LLM\n * await agentLoop.executeToolCalls(toolCalls);\n * ```\n */\nexport class AbstractAgentLoop implements AgentLoopActions {\n // Internal state\n private _toolExecutions: ToolExecution[] = [];\n private _iteration = 0;\n private _maxIterations: number;\n private _maxIterationsReached = false;\n private _isProcessing = false;\n\n // Registered tools\n private registeredTools: Map<string, ToolDefinition> = new Map();\n\n // Pending approvals - resolve with approval result including extraData\n private pendingApprovals: Map<\n string,\n {\n resolve: (result: {\n approved: boolean;\n extraData?: Record<string, unknown>;\n }) => void;\n execution: ToolExecution;\n }\n > = new Map();\n\n // Configuration\n private config: AgentLoopConfig;\n private callbacks: AgentLoopCallbacks;\n\n // Max executions to keep in memory (prevents memory leak)\n private _maxExecutionHistory: number;\n\n constructor(\n config: AgentLoopConfig = {},\n callbacks: AgentLoopCallbacks = {},\n ) {\n this.config = config;\n this.callbacks = callbacks;\n this._maxIterations = config.maxIterations ?? 20;\n this._maxExecutionHistory = config.maxExecutionHistory ?? 100;\n\n // Register initial tools\n if (config.tools) {\n for (const tool of config.tools) {\n this.registerTool(tool);\n }\n }\n }\n\n // ============================================\n // Getters\n // ============================================\n\n get toolExecutions(): ToolExecution[] {\n return this._toolExecutions;\n }\n\n get iteration(): number {\n return this._iteration;\n }\n\n get maxIterations(): number {\n return this._maxIterations;\n }\n\n get maxIterationsReached(): boolean {\n return this._maxIterationsReached;\n }\n\n get isProcessing(): boolean {\n return this._isProcessing;\n }\n\n get state(): AgentLoopState {\n return {\n toolExecutions: this._toolExecutions,\n iteration: this._iteration,\n maxIterations: this._maxIterations,\n maxIterationsReached: this._maxIterationsReached,\n isProcessing: this._isProcessing,\n };\n }\n\n get pendingApprovalExecutions(): ToolExecution[] {\n return this._toolExecutions.filter(\n (exec) => exec.approvalStatus === \"required\",\n );\n }\n\n get tools(): ToolDefinition[] {\n return Array.from(this.registeredTools.values());\n }\n\n // ============================================\n // Private setters with callbacks\n // ============================================\n\n private setToolExecutions(executions: ToolExecution[]): void {\n this._toolExecutions = executions;\n this.callbacks.onExecutionsChange?.(executions);\n }\n\n private setIteration(iteration: number): void {\n this._iteration = iteration;\n }\n\n private setProcessing(processing: boolean): void {\n this._isProcessing = processing;\n }\n\n private addToolExecution(execution: ToolExecution): void {\n this._toolExecutions = [...this._toolExecutions, execution];\n\n // Prune old executions if over limit (prevents memory leak)\n if (this._toolExecutions.length > this._maxExecutionHistory) {\n this._toolExecutions = this._toolExecutions.slice(\n -this._maxExecutionHistory,\n );\n }\n\n this.callbacks.onExecutionsChange?.(this._toolExecutions);\n }\n\n private updateToolExecution(\n id: string,\n update: Partial<ToolExecution>,\n ): void {\n this._toolExecutions = this._toolExecutions.map((exec) =>\n exec.id === id ? { ...exec, ...update } : exec,\n );\n this.callbacks.onExecutionsChange?.(this._toolExecutions);\n }\n\n // ============================================\n // Tool Registration\n // ============================================\n\n /**\n * Register a tool\n */\n registerTool(tool: ToolDefinition): void {\n this.registeredTools.set(tool.name, tool);\n }\n\n /**\n * Unregister a tool\n */\n unregisterTool(name: string): void {\n this.registeredTools.delete(name);\n }\n\n /**\n * Get a registered tool\n */\n getTool(name: string): ToolDefinition | undefined {\n return this.registeredTools.get(name);\n }\n\n // ============================================\n // Tool Execution\n // ============================================\n\n /**\n * Execute tool calls from LLM response\n * Returns tool results for sending back to LLM\n */\n async executeToolCalls(toolCalls: ToolCallInfo[]): Promise<ToolResponse[]> {\n // Check iteration limit\n if (this._iteration >= this._maxIterations) {\n this._maxIterationsReached = true;\n this.callbacks.onMaxIterationsReached?.();\n return [];\n }\n\n this.setIteration(this._iteration + 1);\n const results: ToolResponse[] = [];\n\n for (const toolCall of toolCalls) {\n const result = await this.executeSingleTool(toolCall);\n results.push(result);\n }\n\n return results;\n }\n\n /**\n * Execute a single tool\n */\n private async executeSingleTool(\n toolCall: ToolCallInfo,\n ): Promise<ToolResponse> {\n const tool = this.registeredTools.get(toolCall.name);\n\n // Create execution record\n const execution: ToolExecution = {\n id: toolCall.id,\n toolCallId: toolCall.id,\n name: toolCall.name,\n args: toolCall.args,\n status: \"pending\",\n approvalStatus: \"none\",\n startedAt: new Date(),\n };\n\n this.addToolExecution(execution);\n this.callbacks.onToolStart?.(execution);\n\n // Tool not found\n if (!tool) {\n const errorResult: ToolResponse = {\n toolCallId: toolCall.id,\n success: false,\n error: `Tool \"${toolCall.name}\" not found`,\n };\n this.updateToolExecution(toolCall.id, {\n status: \"failed\",\n error: errorResult.error,\n completedAt: new Date(),\n });\n return errorResult;\n }\n\n // Track approval data for passing to handler\n let approvalData: Record<string, unknown> | undefined;\n\n // Check if approval is needed\n if (tool.needsApproval && !this.config.autoApprove) {\n // Get approval message (can be string or function)\n const approvalMessage =\n typeof tool.approvalMessage === \"function\"\n ? tool.approvalMessage(toolCall.args)\n : tool.approvalMessage;\n\n execution.approvalStatus = \"required\";\n execution.approvalMessage = approvalMessage;\n this.updateToolExecution(toolCall.id, {\n approvalStatus: \"required\",\n approvalMessage,\n });\n this.callbacks.onApprovalRequired?.(execution);\n\n // Wait for approval - now returns { approved, extraData }\n const approvalResult = await this.waitForApproval(toolCall.id, execution);\n\n if (!approvalResult.approved) {\n const rejectedResult: ToolResponse = {\n toolCallId: toolCall.id,\n success: false,\n error: \"Tool execution was rejected by user\",\n };\n this.updateToolExecution(toolCall.id, {\n status: \"rejected\",\n approvalStatus: \"rejected\",\n error: rejectedResult.error,\n completedAt: new Date(),\n });\n return rejectedResult;\n }\n\n // Store approval data for handler\n approvalData = approvalResult.extraData;\n\n // Note: approvalStatus is already set to \"approved\" in approveToolExecution\n }\n\n // Execute the tool\n this.updateToolExecution(toolCall.id, { status: \"executing\" });\n\n try {\n if (!tool.handler) {\n throw new Error(`Tool \"${toolCall.name}\" has no handler`);\n }\n // Pass approvalData to handler via context\n const result = await tool.handler(toolCall.args, {\n data: { toolCallId: toolCall.id },\n approvalData,\n });\n\n this.updateToolExecution(toolCall.id, {\n status: \"completed\",\n result,\n completedAt: new Date(),\n });\n\n const updatedExecution = this._toolExecutions.find(\n (e) => e.id === toolCall.id,\n );\n if (updatedExecution) {\n this.callbacks.onToolComplete?.(updatedExecution);\n }\n\n return {\n toolCallId: toolCall.id,\n success: true,\n result,\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n this.updateToolExecution(toolCall.id, {\n status: \"failed\",\n error: errorMessage,\n completedAt: new Date(),\n });\n\n return {\n toolCallId: toolCall.id,\n success: false,\n error: errorMessage,\n };\n }\n }\n\n /**\n * Wait for user approval\n * Returns approval result with optional extraData from user's action\n */\n private waitForApproval(\n executionId: string,\n execution: ToolExecution,\n ): Promise<{ approved: boolean; extraData?: Record<string, unknown> }> {\n return new Promise((resolve) => {\n this.pendingApprovals.set(executionId, { resolve, execution });\n });\n }\n\n // ============================================\n // Actions (implements AgentLoopActions)\n // ============================================\n\n /**\n * Approve a tool execution with optional extra data\n */\n approveToolExecution(\n executionId: string,\n extraData?: Record<string, unknown>,\n _permissionLevel?: PermissionLevel,\n ): void {\n const pending = this.pendingApprovals.get(executionId);\n if (pending) {\n pending.resolve({ approved: true, extraData });\n this.pendingApprovals.delete(executionId);\n\n // Store approvalData in execution record\n this.updateToolExecution(executionId, {\n approvalStatus: \"approved\",\n approvalData: extraData,\n });\n }\n }\n\n /**\n * Reject a tool execution\n */\n rejectToolExecution(\n executionId: string,\n reason?: string,\n _permissionLevel?: PermissionLevel,\n ): void {\n const pending = this.pendingApprovals.get(executionId);\n if (pending) {\n if (reason) {\n this.updateToolExecution(executionId, {\n error: reason,\n });\n }\n pending.resolve({ approved: false });\n this.pendingApprovals.delete(executionId);\n }\n }\n\n /**\n * Clear all tool executions\n */\n clearToolExecutions(): void {\n this.setToolExecutions([]);\n this.setIteration(0);\n this._maxIterationsReached = false;\n }\n\n // ============================================\n // State Management\n // ============================================\n\n /**\n * Reset the agent loop for a new conversation\n */\n reset(): void {\n this.clearToolExecutions();\n this.pendingApprovals.clear();\n }\n\n /**\n * Update configuration\n */\n updateConfig(config: Partial<AgentLoopConfig>): void {\n this.config = { ...this.config, ...config };\n if (config.maxIterations !== undefined) {\n this._maxIterations = config.maxIterations;\n }\n }\n\n /**\n * Update callbacks\n */\n updateCallbacks(callbacks: Partial<AgentLoopCallbacks>): void {\n this.callbacks = { ...this.callbacks, ...callbacks };\n }\n\n // ============================================\n // Cleanup\n // ============================================\n\n /**\n * Dispose of resources\n */\n dispose(): void {\n // Reject all pending approvals\n for (const [_id, pending] of this.pendingApprovals) {\n pending.resolve({ approved: false });\n }\n this.pendingApprovals.clear();\n this.registeredTools.clear();\n this._toolExecutions = [];\n }\n}\n","/**\n * ChatWithTools - Framework-agnostic coordinator for chat + tool execution\n *\n * This class combines AbstractChat and AbstractAgentLoop, handling all the\n * internal wiring so framework adapters don't need to manage it.\n *\n * Benefits:\n * - Single class to instantiate\n * - All event wiring handled internally\n * - Tool execution lifecycle managed automatically\n * - Framework-agnostic - works with React, Vue, Svelte, etc.\n */\n\nimport type {\n ToolDefinition,\n MessageAttachment,\n PermissionLevel,\n} from \"../core\";\nimport { AbstractChat } from \"./classes/AbstractChat\";\nimport { AbstractAgentLoop } from \"./AbstractAgentLoop\";\nimport type { ChatConfig, ChatCallbacks } from \"./types\";\nimport type { UIMessage } from \"./types/message\";\nimport type { ToolExecution, AgentLoopCallbacks } from \"./types/tool\";\nimport type { ChatState } from \"./interfaces/ChatState\";\nimport type { ChatTransport } from \"./interfaces/ChatTransport\";\n\n/**\n * Configuration for ChatWithTools\n */\nexport interface ChatWithToolsConfig {\n /** Runtime API endpoint */\n runtimeUrl: string;\n /** LLM configuration */\n llm?: ChatConfig[\"llm\"];\n /** System prompt */\n systemPrompt?: string;\n /** Enable streaming (default: true) */\n streaming?: boolean;\n /** Request headers */\n headers?: Record<string, string>;\n /** Thread ID for conversation persistence */\n threadId?: string;\n /** Debug mode */\n debug?: boolean;\n /** Initial messages */\n initialMessages?: UIMessage[];\n /** Initial tools to register */\n tools?: ToolDefinition[];\n /** Max tool execution iterations (default: 20) */\n maxIterations?: number;\n /** State implementation (injected by framework adapter) */\n state?: ChatState<UIMessage>;\n /** Transport implementation */\n transport?: ChatTransport;\n}\n\n/**\n * Callbacks for ChatWithTools\n */\nexport interface ChatWithToolsCallbacks extends ChatCallbacks<UIMessage> {\n /** Called when tool executions change */\n onToolExecutionsChange?: (executions: ToolExecution[]) => void;\n /** Called when a tool requires approval */\n onApprovalRequired?: (execution: ToolExecution) => void;\n}\n\n/**\n * ChatWithTools - Coordinated chat + tool execution\n *\n * @example\n * ```typescript\n * const chat = new ChatWithTools({\n * runtimeUrl: '/api/chat',\n * tools: [myTool],\n * debug: true,\n * }, {\n * onToolExecutionsChange: (execs) => setToolExecutions(execs),\n * });\n *\n * // Register more tools\n * chat.registerTool(anotherTool);\n *\n * // Send message - tool execution handled automatically\n * await chat.sendMessage('Take a screenshot');\n *\n * // Approve/reject tool execution\n * chat.approveToolExecution(executionId);\n * ```\n */\nexport class ChatWithTools {\n private chat: AbstractChat<UIMessage>;\n private agentLoop: AbstractAgentLoop;\n private config: ChatWithToolsConfig;\n private callbacks: ChatWithToolsCallbacks;\n\n constructor(\n config: ChatWithToolsConfig,\n callbacks: ChatWithToolsCallbacks = {},\n ) {\n this.config = config;\n this.callbacks = callbacks;\n\n // Create agent loop\n this.agentLoop = new AbstractAgentLoop(\n {\n maxIterations: config.maxIterations ?? 20,\n tools: config.tools,\n },\n {\n onExecutionsChange: (executions) => {\n callbacks.onToolExecutionsChange?.(executions);\n },\n onApprovalRequired: (execution) => {\n callbacks.onApprovalRequired?.(execution);\n },\n },\n );\n\n // Create chat\n this.chat = new AbstractChat<UIMessage>({\n runtimeUrl: config.runtimeUrl,\n llm: config.llm,\n systemPrompt: config.systemPrompt,\n streaming: config.streaming,\n headers: config.headers,\n threadId: config.threadId,\n debug: config.debug,\n initialMessages: config.initialMessages,\n state: config.state,\n transport: config.transport,\n callbacks: {\n onMessagesChange: callbacks.onMessagesChange,\n onStatusChange: callbacks.onStatusChange,\n onError: callbacks.onError,\n onMessageStart: callbacks.onMessageStart,\n onMessageDelta: callbacks.onMessageDelta,\n onMessageFinish: callbacks.onMessageFinish,\n onToolCalls: callbacks.onToolCalls,\n onFinish: callbacks.onFinish,\n },\n });\n\n // Wire up internal events\n this.wireEvents();\n }\n\n /**\n * Wire up internal events between chat and agent loop\n */\n private wireEvents(): void {\n // Handle tool calls from chat\n this.chat.on(\"toolCalls\", async (event) => {\n const toolCalls = event.toolCalls;\n if (!toolCalls?.length) return;\n\n this.debug(\"Tool calls received:\", toolCalls);\n\n // NOTE: We do NOT clear previous executions here.\n // Each message filters executions by its toolCallIds (in connected-chat.tsx),\n // so executions accumulate but each message shows only its own tools.\n // This preserves tool results for rendering. Full data is also in messages.\n\n // Convert tool calls to the format expected by agent loop\n const toolCallInfos = toolCalls.map((tc) => {\n const tcAny = tc as {\n id: string;\n function?: { name: string; arguments: string };\n name?: string;\n args?: Record<string, unknown>;\n };\n const name = tcAny.function?.name ?? tcAny.name ?? \"\";\n let args: Record<string, unknown> = {};\n\n if (tcAny.function?.arguments) {\n try {\n args = JSON.parse(tcAny.function.arguments);\n } catch {\n args = {};\n }\n } else if (tcAny.args) {\n args = tcAny.args;\n }\n\n return { id: tc.id, name, args };\n });\n\n // Execute tools\n try {\n const results = await this.agentLoop.executeToolCalls(toolCallInfos);\n this.debug(\"Tool results:\", results);\n\n // Continue chat with tool results\n if (results.length > 0) {\n const toolResults = results.map((r) => ({\n toolCallId: r.toolCallId,\n result: r.success ? r.result : { success: false, error: r.error },\n }));\n\n await this.chat.continueWithToolResults(toolResults);\n }\n } catch (error) {\n this.debug(\"Error executing tools:\", error);\n console.error(\"[ChatWithTools] Tool execution error:\", error);\n }\n });\n\n // NOTE: We do NOT clear tool executions on \"done\" event or \"toolCalls\" event.\n // Tool results need to persist so UI cards can continue rendering them.\n // Full data is also stored in tool messages (Vercel-style) for persistence.\n // Each message filters executions by toolCallIds, so accumulation is safe.\n }\n\n // ============================================\n // Chat Getters\n // ============================================\n\n get messages(): UIMessage[] {\n return this.chat.messages;\n }\n\n get status() {\n return this.chat.status;\n }\n\n get error() {\n return this.chat.error;\n }\n\n get isStreaming(): boolean {\n return this.chat.isStreaming;\n }\n\n // ============================================\n // Tool Execution Getters\n // ============================================\n\n get toolExecutions(): ToolExecution[] {\n return this.agentLoop.toolExecutions;\n }\n\n get tools(): ToolDefinition[] {\n return this.agentLoop.tools;\n }\n\n get iteration(): number {\n return this.agentLoop.iteration;\n }\n\n get maxIterations(): number {\n return this.agentLoop.maxIterations;\n }\n\n get isProcessing(): boolean {\n return this.agentLoop.isProcessing;\n }\n\n // ============================================\n // Chat Actions\n // ============================================\n\n /**\n * Send a message\n */\n async sendMessage(\n content: string,\n attachments?: MessageAttachment[],\n ): Promise<void> {\n await this.chat.sendMessage(content, attachments);\n }\n\n /**\n * Stop generation\n */\n stop(): void {\n this.chat.stop();\n }\n\n /**\n * Clear all messages\n */\n clearMessages(): void {\n this.chat.clearMessages();\n this.agentLoop.clearToolExecutions();\n }\n\n /**\n * Set messages directly\n */\n setMessages(messages: UIMessage[]): void {\n this.chat.setMessages(messages);\n }\n\n /**\n * Regenerate last response\n */\n async regenerate(messageId?: string): Promise<void> {\n await this.chat.regenerate(messageId);\n }\n\n /**\n * Set tools available for the LLM\n */\n setTools(tools: ToolDefinition[]): void {\n this.chat.setTools(tools);\n }\n\n /**\n * Set dynamic context (from useAIContext hook)\n */\n setContext(context: string): void {\n this.chat.setContext(context);\n }\n\n // ============================================\n // Tool Registration\n // ============================================\n\n /**\n * Register a tool\n */\n registerTool(tool: ToolDefinition): void {\n this.agentLoop.registerTool(tool);\n // Sync to chat so tools are included in requests\n this.chat.setTools(this.agentLoop.tools);\n }\n\n /**\n * Unregister a tool\n */\n unregisterTool(name: string): void {\n this.agentLoop.unregisterTool(name);\n // Sync to chat\n this.chat.setTools(this.agentLoop.tools);\n }\n\n // ============================================\n // Tool Approval\n // ============================================\n\n /**\n * Approve a tool execution with optional extra data\n */\n approveToolExecution(\n id: string,\n extraData?: Record<string, unknown>,\n permissionLevel?: PermissionLevel,\n ): void {\n this.agentLoop.approveToolExecution(id, extraData, permissionLevel);\n }\n\n /**\n * Reject a tool execution\n */\n rejectToolExecution(\n id: string,\n reason?: string,\n permissionLevel?: PermissionLevel,\n ): void {\n this.agentLoop.rejectToolExecution(id, reason, permissionLevel);\n }\n\n /**\n * Clear tool executions\n */\n clearToolExecutions(): void {\n this.agentLoop.clearToolExecutions();\n }\n\n // ============================================\n // Event Subscriptions (for framework adapters)\n // ============================================\n\n /**\n * Subscribe to chat events\n */\n on<E extends \"toolCalls\" | \"done\" | \"error\">(\n event: E,\n handler: (event: unknown) => void,\n ): () => void {\n return this.chat.on(event, handler as never);\n }\n\n // ============================================\n // Cleanup\n // ============================================\n\n /**\n * Dispose and cleanup\n */\n dispose(): void {\n this.chat.dispose();\n this.agentLoop.dispose();\n }\n\n // ============================================\n // Private\n // ============================================\n\n private debug(message: string, ...args: unknown[]): void {\n if (this.config.debug) {\n console.log(`[ChatWithTools] ${message}`, ...args);\n }\n }\n}\n\n/**\n * Create a ChatWithTools instance\n */\nexport function createChatWithTools(\n config: ChatWithToolsConfig,\n callbacks?: ChatWithToolsCallbacks,\n): ChatWithTools {\n return new ChatWithTools(config, callbacks);\n}\n","/**\n * ReactChatState - React-specific implementation of ChatState\n *\n * This class implements the ChatState interface with callback-based\n * reactivity for use with React's useSyncExternalStore.\n *\n * Pattern inspired by Vercel AI SDK's useSyncExternalStore pattern.\n */\n\nimport type { ChatState, UIMessage, ChatStatus } from \"../../chat\";\n\n/**\n * ReactChatState implements ChatState with callback-based reactivity\n *\n * @example\n * ```tsx\n * const state = new ReactChatState<UIMessage>();\n *\n * // Subscribe to changes (for useSyncExternalStore)\n * const unsubscribe = state.subscribe(() => {\n * console.log('State changed');\n * });\n *\n * // Get snapshot (for useSyncExternalStore)\n * const messages = state.messages;\n * ```\n */\nexport class ReactChatState<\n T extends UIMessage = UIMessage,\n> implements ChatState<T> {\n private _messages: T[] = [];\n private _status: ChatStatus = \"ready\";\n private _error: Error | undefined = undefined;\n\n // Callbacks for React subscriptions (useSyncExternalStore)\n private subscribers = new Set<() => void>();\n\n constructor(initialMessages?: T[]) {\n if (initialMessages) {\n this._messages = initialMessages;\n }\n }\n\n // ============================================\n // Getters\n // ============================================\n\n get messages(): T[] {\n return this._messages;\n }\n\n get status(): ChatStatus {\n return this._status;\n }\n\n get error(): Error | undefined {\n return this._error;\n }\n\n // ============================================\n // Setters (trigger reactivity)\n // ============================================\n\n set messages(value: T[]) {\n this._messages = value;\n this.notify();\n }\n\n set status(value: ChatStatus) {\n this._status = value;\n this.notify();\n }\n\n set error(value: Error | undefined) {\n this._error = value;\n this.notify();\n }\n\n // ============================================\n // Mutations\n // ============================================\n\n pushMessage(message: T): void {\n this._messages = [...this._messages, message];\n this.notify();\n }\n\n popMessage(): void {\n this._messages = this._messages.slice(0, -1);\n this.notify();\n }\n\n replaceMessage(index: number, message: T): void {\n this._messages = this._messages.map((m, i) => (i === index ? message : m));\n this.notify();\n }\n\n updateLastMessage(updater: (message: T) => T): void {\n if (this._messages.length === 0) return;\n\n const lastIndex = this._messages.length - 1;\n const lastMessage = this._messages[lastIndex];\n this._messages = [\n ...this._messages.slice(0, lastIndex),\n updater(lastMessage),\n ];\n this.notify();\n }\n\n setMessages(messages: T[]): void {\n this._messages = messages;\n this.notify();\n }\n\n clearMessages(): void {\n this._messages = [];\n this.notify();\n }\n\n // ============================================\n // Subscription (for useSyncExternalStore)\n // ============================================\n\n /**\n * Subscribe to state changes.\n * Returns an unsubscribe function.\n *\n * @example\n * ```tsx\n * const messages = useSyncExternalStore(\n * state.subscribe,\n * () => state.messages\n * );\n * ```\n */\n subscribe = (callback: () => void): (() => void) => {\n this.subscribers.add(callback);\n return () => {\n this.subscribers.delete(callback);\n };\n };\n\n // ============================================\n // Private Methods\n // ============================================\n\n private notify(): void {\n this.subscribers.forEach((cb) => cb());\n }\n\n /**\n * Cleanup subscriptions\n */\n dispose(): void {\n this.subscribers.clear();\n }\n}\n\n/**\n * Create a ReactChatState instance\n */\nexport function createReactChatState<T extends UIMessage = UIMessage>(\n initialMessages?: T[],\n): ReactChatState<T> {\n return new ReactChatState<T>(initialMessages);\n}\n","/**\n * ReactChatWithTools - React-specific wrapper for ChatWithTools\n *\n * Injects ReactChatState for proper useSyncExternalStore integration.\n */\n\nimport {\n ChatWithTools,\n type ChatWithToolsConfig,\n type ChatWithToolsCallbacks,\n type UIMessage,\n type ToolExecution,\n} from \"../../chat\";\nimport { ReactChatState } from \"./ReactChatState\";\n\n/**\n * React-specific configuration\n */\nexport interface ReactChatWithToolsConfig extends Omit<\n ChatWithToolsConfig,\n \"state\"\n> {\n /** Initial messages */\n initialMessages?: UIMessage[];\n}\n\n/**\n * ReactChatWithTools - Chat + Tools with React state management\n *\n * @example\n * ```tsx\n * const chatRef = useRef(new ReactChatWithTools(config, callbacks));\n *\n * const messages = useSyncExternalStore(\n * chatRef.current.subscribe,\n * () => chatRef.current.messages\n * );\n * ```\n */\nexport class ReactChatWithTools extends ChatWithTools {\n private reactState: ReactChatState<UIMessage>;\n\n constructor(\n config: ReactChatWithToolsConfig,\n callbacks: ChatWithToolsCallbacks = {},\n ) {\n // Create React-specific state\n const reactState = new ReactChatState<UIMessage>(config.initialMessages);\n\n // Pass state to parent\n super({ ...config, state: reactState }, callbacks);\n\n this.reactState = reactState;\n }\n\n /**\n * Subscribe to state changes (for useSyncExternalStore)\n */\n subscribe = (callback: () => void): (() => void) => {\n return this.reactState.subscribe(callback);\n };\n\n /**\n * Dispose and cleanup\n */\n dispose(): void {\n super.dispose();\n this.reactState.dispose();\n }\n}\n\n/**\n * Create a ReactChatWithTools instance\n */\nexport function createReactChatWithTools(\n config: ReactChatWithToolsConfig,\n callbacks?: ChatWithToolsCallbacks,\n): ReactChatWithTools {\n return new ReactChatWithTools(config, callbacks);\n}\n","/**\n * Context Tree Utilities\n *\n * Provides tree-based context management for hierarchical AI context.\n * Inspired by CopilotKit's useCopilotReadable pattern.\n */\n\n/**\n * Context tree node\n */\nexport interface ContextTreeNode {\n id: string;\n value: string;\n children: ContextTreeNode[];\n parentId?: string;\n}\n\n/**\n * Find a node in the tree by ID\n */\nfunction findNode(\n nodes: ContextTreeNode[],\n id: string,\n): ContextTreeNode | undefined {\n for (const node of nodes) {\n if (node.id === id) {\n return node;\n }\n const found = findNode(node.children, id);\n if (found) {\n return found;\n }\n }\n return undefined;\n}\n\n/**\n * Add a node to the tree\n * If parentId is provided, adds as a child of that node\n * Otherwise adds to the root level\n */\nexport function addNode(\n tree: ContextTreeNode[],\n node: Omit<ContextTreeNode, \"children\"> & { children?: ContextTreeNode[] },\n parentId?: string,\n): ContextTreeNode[] {\n const newNode: ContextTreeNode = {\n ...node,\n children: node.children || [],\n };\n\n if (!parentId) {\n // Add to root level\n return [...tree, newNode];\n }\n\n // Add as child of parent\n return tree.map((n) => {\n if (n.id === parentId) {\n return { ...n, children: [...n.children, newNode] };\n }\n if (n.children.length > 0) {\n return { ...n, children: addNode(n.children, node, parentId) };\n }\n return n;\n });\n}\n\n/**\n * Remove a node from the tree by ID\n * Also removes all children of that node\n */\nexport function removeNode(\n tree: ContextTreeNode[],\n id: string,\n): ContextTreeNode[] {\n return tree.reduce((result: ContextTreeNode[], node) => {\n if (node.id !== id) {\n const newNode = { ...node, children: removeNode(node.children, id) };\n result.push(newNode);\n }\n return result;\n }, []);\n}\n\n/**\n * Get indentation prefix for tree printing\n * Level 0: 1. 2. 3. ...\n * Level 1: A. B. C. ...\n * Level 2: a. b. c. ...\n * Level 3+: -\n */\nfunction getIndentPrefix(index: number, level: number): string {\n if (level === 0) {\n return `${index + 1}.`;\n } else if (level === 1) {\n return `${String.fromCharCode(65 + index)}.`; // A, B, C...\n } else if (level === 2) {\n return `${String.fromCharCode(97 + index)}.`; // a, b, c...\n } else {\n return \"-\";\n }\n}\n\n/**\n * Print a single node with proper indentation\n */\nfunction printNode(\n node: ContextTreeNode,\n prefix: string = \"\",\n indentLevel: number = 0,\n): string {\n const indent = \" \".repeat(indentLevel);\n const prefixLength = prefix.length + indent.length;\n const subsequentIndent = \" \".repeat(prefixLength);\n\n // Split value into lines and format\n const lines = node.value.split(\"\\n\");\n const firstLine = `${indent}${prefix}${lines[0]}`;\n const subsequentLines = lines\n .slice(1)\n .map((line) => `${subsequentIndent}${line}`)\n .join(\"\\n\");\n\n let output = `${firstLine}\\n`;\n if (subsequentLines) {\n output += `${subsequentLines}\\n`;\n }\n\n // Print children\n node.children.forEach((child, index) => {\n const childPrefix = `${\" \".repeat(prefix.length)}${getIndentPrefix(index, indentLevel + 1)} `;\n output += printNode(child, childPrefix, indentLevel + 1);\n });\n\n return output;\n}\n\n/**\n * Print the entire tree with numbered indentation\n *\n * Output format:\n * ```\n * 1. User profile\n * {\"name\": \"John\"}\n * A. Preferences\n * {\"theme\": \"dark\"}\n * 2. Current page\n * /dashboard\n * ```\n */\nexport function printTree(tree: ContextTreeNode[]): string {\n if (tree.length === 0) {\n return \"\";\n }\n\n let output = \"\";\n tree.forEach((node, index) => {\n if (index > 0) {\n output += \"\\n\";\n }\n output += printNode(node, `${getIndentPrefix(index, 0)} `);\n });\n\n return output.trim();\n}\n","\"use client\";\n\n/**\n * CopilotProvider - React context provider for Copilot SDK\n *\n * This provider uses ChatWithTools for coordinated chat + tool execution.\n * All internal wiring is handled by the chat package (framework-agnostic).\n */\n\nimport React, {\n createContext,\n useContext,\n useRef,\n useCallback,\n useMemo,\n useEffect,\n useSyncExternalStore,\n useState,\n} from \"react\";\n\nimport type {\n Message,\n CopilotConfig,\n ToolsConfig,\n ToolDefinition,\n ActionDefinition,\n MessageAttachment,\n PermissionLevel,\n} from \"../../core\";\n\nimport type { UIMessage, ToolExecution } from \"../../chat\";\n\nimport {\n ReactChatWithTools,\n type ReactChatWithToolsConfig,\n} from \"../internal/ReactChatWithTools\";\nimport {\n addNode,\n removeNode,\n printTree,\n type ContextTreeNode,\n} from \"../utils/context-tree\";\n\n// ============================================\n// Types\n// ============================================\n\nexport interface CopilotProviderProps {\n children: React.ReactNode;\n runtimeUrl: string;\n config?: CopilotConfig[\"config\"];\n cloud?: CopilotConfig[\"cloud\"];\n systemPrompt?: string;\n /** @deprecated Use useTools() hook instead */\n tools?: ToolsConfig;\n threadId?: string;\n initialMessages?: Message[];\n onMessagesChange?: (messages: Message[]) => void;\n onError?: (error: Error) => void;\n /** Enable/disable streaming (default: true) */\n streaming?: boolean;\n debug?: boolean;\n}\n\nexport interface CopilotContextValue {\n // Chat state\n messages: UIMessage[];\n status: \"ready\" | \"submitted\" | \"streaming\" | \"error\";\n error: Error | null;\n isLoading: boolean;\n\n // Chat actions\n sendMessage: (\n content: string,\n attachments?: MessageAttachment[],\n ) => Promise<void>;\n stop: () => void;\n clearMessages: () => void;\n setMessages: (messages: UIMessage[]) => void;\n regenerate: (messageId?: string) => Promise<void>;\n\n // Tool execution\n registerTool: (tool: ToolDefinition) => void;\n unregisterTool: (name: string) => void;\n registeredTools: ToolDefinition[];\n toolExecutions: ToolExecution[];\n pendingApprovals: ToolExecution[];\n approveToolExecution: (\n id: string,\n extraData?: Record<string, unknown>,\n permissionLevel?: PermissionLevel,\n ) => void;\n rejectToolExecution: (\n id: string,\n reason?: string,\n permissionLevel?: PermissionLevel,\n ) => void;\n\n // Actions\n registerAction: (action: ActionDefinition) => void;\n unregisterAction: (name: string) => void;\n registeredActions: ActionDefinition[];\n\n // AI Context (for useAIContext hook)\n addContext: (context: string, parentId?: string) => string;\n removeContext: (id: string) => void;\n\n // Config\n threadId?: string;\n runtimeUrl: string;\n toolsConfig?: ToolsConfig;\n}\n\n// ============================================\n// Context\n// ============================================\n\nconst CopilotContext = createContext<CopilotContextValue | null>(null);\n\nexport function useCopilot(): CopilotContextValue {\n const context = useContext(CopilotContext);\n if (!context) {\n throw new Error(\"useCopilot must be used within CopilotProvider\");\n }\n return context;\n}\n\n// ============================================\n// Provider Component\n// ============================================\n\nexport function CopilotProvider({\n children,\n runtimeUrl,\n config,\n cloud,\n systemPrompt,\n tools: toolsConfig,\n threadId,\n initialMessages,\n onMessagesChange,\n onError,\n streaming,\n debug = false,\n}: CopilotProviderProps) {\n // Debug logger\n const debugLog = useCallback(\n (...args: unknown[]) => {\n if (debug) console.log(\"[Copilot SDK]\", ...args);\n },\n [debug],\n );\n\n // Warn about deprecated tools config\n useEffect(() => {\n if (\n toolsConfig &&\n (toolsConfig.screenshot || toolsConfig.console || toolsConfig.network)\n ) {\n console.warn(\n \"[Copilot SDK] The `tools` prop is deprecated. Use the `useTools` hook instead.\",\n );\n }\n }, [toolsConfig]);\n\n // ============================================\n // Tool Executions State (for React reactivity)\n // ============================================\n const [toolExecutions, setToolExecutions] = useState<ToolExecution[]>([]);\n\n // ============================================\n // ChatWithTools Instance\n // ============================================\n\n const chatRef = useRef<ReactChatWithTools | null>(null);\n\n // Initialize chat on first render\n if (chatRef.current === null) {\n // Convert initial messages to UIMessage format\n const uiInitialMessages: UIMessage[] | undefined = initialMessages?.map(\n (m) => ({\n id: m.id,\n role: m.role,\n content: m.content ?? \"\",\n createdAt: m.created_at ?? new Date(),\n attachments: m.metadata?.attachments as MessageAttachment[] | undefined,\n toolCalls: m.tool_calls,\n toolCallId: m.tool_call_id,\n }),\n );\n\n chatRef.current = new ReactChatWithTools(\n {\n runtimeUrl,\n llm: config,\n systemPrompt,\n threadId,\n initialMessages: uiInitialMessages,\n streaming,\n debug,\n },\n {\n onToolExecutionsChange: (executions) => {\n debugLog(\"Tool executions changed:\", executions.length);\n setToolExecutions(executions);\n },\n onApprovalRequired: (execution) => {\n debugLog(\"Tool approval required:\", execution.name);\n },\n onError: (error) => {\n if (error) onError?.(error);\n },\n },\n );\n }\n\n // Subscribe to chat state with useSyncExternalStore\n const messages = useSyncExternalStore(\n chatRef.current.subscribe,\n () => chatRef.current!.messages,\n () => chatRef.current!.messages,\n );\n\n const status = useSyncExternalStore(\n chatRef.current.subscribe,\n () => chatRef.current!.status,\n () => \"ready\" as const,\n );\n\n const errorFromChat = useSyncExternalStore(\n chatRef.current.subscribe,\n () => chatRef.current!.error,\n () => undefined,\n );\n const error = errorFromChat ?? null;\n\n const isLoading = status === \"streaming\" || status === \"submitted\";\n\n // ============================================\n // Actions\n // ============================================\n\n const registerTool = useCallback((tool: ToolDefinition) => {\n chatRef.current?.registerTool(tool);\n }, []);\n\n const unregisterTool = useCallback((name: string) => {\n chatRef.current?.unregisterTool(name);\n }, []);\n\n const approveToolExecution = useCallback(\n (\n id: string,\n extraData?: Record<string, unknown>,\n permissionLevel?: PermissionLevel,\n ) => {\n chatRef.current?.approveToolExecution(id, extraData, permissionLevel);\n },\n [],\n );\n\n const rejectToolExecution = useCallback(\n (id: string, reason?: string, permissionLevel?: PermissionLevel) => {\n chatRef.current?.rejectToolExecution(id, reason, permissionLevel);\n },\n [],\n );\n\n const registeredTools = chatRef.current?.tools ?? [];\n const pendingApprovals = toolExecutions.filter(\n (e) => e.approvalStatus === \"required\",\n );\n\n // ============================================\n // Actions Registration (for UI actions like buttons)\n // ============================================\n\n const actionsRef = useRef<Map<string, ActionDefinition>>(new Map());\n const [actionsVersion, setActionsVersion] = useState(0);\n\n const registerAction = useCallback((action: ActionDefinition) => {\n actionsRef.current.set(action.name, action);\n setActionsVersion((v) => v + 1);\n }, []);\n\n const unregisterAction = useCallback((name: string) => {\n actionsRef.current.delete(name);\n setActionsVersion((v) => v + 1);\n }, []);\n\n const registeredActions = useMemo(\n () => Array.from(actionsRef.current.values()),\n [actionsVersion],\n );\n\n // ============================================\n // AI Context Tree (for useAIContext hook)\n // ============================================\n\n const contextTreeRef = useRef<ContextTreeNode[]>([]);\n const contextIdCounter = useRef(0);\n\n const addContext = useCallback(\n (context: string, parentId?: string): string => {\n const id = `ctx-${++contextIdCounter.current}`;\n contextTreeRef.current = addNode(\n contextTreeRef.current,\n { id, value: context, parentId },\n parentId,\n );\n // Update chat's context\n const contextString = printTree(contextTreeRef.current);\n chatRef.current?.setContext(contextString);\n debugLog(\"Context added:\", id);\n return id;\n },\n [debugLog],\n );\n\n const removeContext = useCallback(\n (id: string): void => {\n contextTreeRef.current = removeNode(contextTreeRef.current, id);\n // Update chat's context\n const contextString = printTree(contextTreeRef.current);\n chatRef.current?.setContext(contextString);\n debugLog(\"Context removed:\", id);\n },\n [debugLog],\n );\n\n // ============================================\n // Chat Actions\n // ============================================\n\n const sendMessage = useCallback(\n async (content: string, attachments?: MessageAttachment[]) => {\n debugLog(\"Sending message:\", content);\n await chatRef.current?.sendMessage(content, attachments);\n },\n [debugLog],\n );\n\n const stop = useCallback(() => {\n chatRef.current?.stop();\n }, []);\n\n const clearMessages = useCallback(() => {\n chatRef.current?.clearMessages();\n }, []);\n\n const setMessages = useCallback((messages: UIMessage[]) => {\n chatRef.current?.setMessages(messages);\n }, []);\n\n const regenerate = useCallback(async (messageId?: string) => {\n await chatRef.current?.regenerate(messageId);\n }, []);\n\n // ============================================\n // Callbacks\n // ============================================\n\n // Notify external callbacks\n useEffect(() => {\n if (onMessagesChange && messages.length > 0) {\n const coreMessages: Message[] = messages.map((m) => ({\n id: m.id,\n role: m.role,\n content: m.content,\n created_at: m.createdAt,\n tool_calls: m.toolCalls,\n tool_call_id: m.toolCallId,\n metadata: {\n attachments: m.attachments,\n thinking: m.thinking,\n },\n }));\n onMessagesChange(coreMessages);\n }\n }, [messages, onMessagesChange]);\n\n useEffect(() => {\n if (error && onError) {\n onError(error);\n }\n }, [error, onError]);\n\n // Cleanup\n useEffect(() => {\n return () => {\n chatRef.current?.dispose();\n };\n }, []);\n\n // ============================================\n // Context Value\n // ============================================\n\n const contextValue = useMemo<CopilotContextValue>(\n () => ({\n // Chat state\n messages,\n status,\n error,\n isLoading,\n\n // Chat actions\n sendMessage,\n stop,\n clearMessages,\n setMessages,\n regenerate,\n\n // Tool execution\n registerTool,\n unregisterTool,\n registeredTools,\n toolExecutions,\n pendingApprovals,\n approveToolExecution,\n rejectToolExecution,\n\n // Actions\n registerAction,\n unregisterAction,\n registeredActions,\n\n // AI Context\n addContext,\n removeContext,\n\n // Config\n threadId,\n runtimeUrl,\n toolsConfig,\n }),\n [\n messages,\n status,\n error,\n isLoading,\n sendMessage,\n stop,\n clearMessages,\n setMessages,\n regenerate,\n registerTool,\n unregisterTool,\n registeredTools,\n toolExecutions,\n pendingApprovals,\n approveToolExecution,\n rejectToolExecution,\n registerAction,\n unregisterAction,\n registeredActions,\n addContext,\n removeContext,\n threadId,\n runtimeUrl,\n toolsConfig,\n ],\n );\n\n return (\n <CopilotContext.Provider value={contextValue}>\n {children}\n </CopilotContext.Provider>\n );\n}\n","\"use client\";\n\nimport { useEffect } from \"react\";\nimport type { ActionDefinition } from \"../../core\";\nimport { useCopilot } from \"../provider/CopilotProvider\";\n\n/**\n * Hook to register multiple AI actions/tools\n *\n * @example\n * ```tsx\n * useAIActions([\n * {\n * name: 'getWeather',\n * description: 'Get weather for a location',\n * parameters: {\n * location: { type: 'string', required: true, description: 'City name' },\n * },\n * handler: async ({ location }) => {\n * const weather = await fetchWeather(location);\n * return weather;\n * },\n * },\n * ]);\n * ```\n */\nexport function useAIActions(actions: ActionDefinition[]): void {\n const { registerAction, unregisterAction } = useCopilot();\n\n useEffect(() => {\n // Register all actions\n for (const action of actions) {\n registerAction(action);\n }\n\n // Cleanup: unregister all actions\n return () => {\n for (const action of actions) {\n unregisterAction(action.name);\n }\n };\n }, [actions, registerAction, unregisterAction]);\n}\n\n/**\n * Hook to register a single AI action/tool\n *\n * @example\n * ```tsx\n * useAIAction({\n * name: 'searchProducts',\n * description: 'Search for products',\n * parameters: {\n * query: { type: 'string', required: true },\n * },\n * handler: async ({ query }) => {\n * return await searchProducts(query);\n * },\n * });\n * ```\n */\nexport function useAIAction(action: ActionDefinition): void {\n useAIActions([action]);\n}\n","\"use client\";\n\nimport { useEffect, useRef } from \"react\";\nimport { useCopilot } from \"../provider/CopilotProvider\";\n\n/**\n * Context item for AI\n */\nexport interface AIContextItem {\n /** Unique key for this context */\n key: string;\n /** Data to provide to AI (will be JSON stringified) */\n data: unknown;\n /** Optional description to help AI understand the context */\n description?: string;\n /** Parent context ID for hierarchical/nested contexts */\n parentId?: string;\n}\n\n/**\n * Hook to provide app state/context to the AI\n *\n * This hook allows you to inject React state into the AI's context,\n * so it can understand and reference your app's current state.\n *\n * @returns Context ID that can be used as `parentId` for nested contexts\n *\n * @example Basic usage\n * ```tsx\n * function CartPage() {\n * const [cart, setCart] = useState([]);\n *\n * // Provide cart data to AI\n * useAIContext({\n * key: 'cart',\n * data: cart,\n * description: 'User shopping cart items',\n * });\n *\n * return <CartUI cart={cart} />;\n * }\n * ```\n *\n * @example Nested/hierarchical contexts\n * ```tsx\n * function EmployeeList({ employees }) {\n * // Parent context - returns ID for nesting\n * const listId = useAIContext({\n * key: 'employees',\n * data: { count: employees.length },\n * description: 'Employee list',\n * });\n *\n * return employees.map(emp => (\n * <Employee key={emp.id} employee={emp} parentContextId={listId} />\n * ));\n * }\n *\n * function Employee({ employee, parentContextId }) {\n * // Child context - nested under parent\n * useAIContext({\n * key: `employee-${employee.id}`,\n * data: employee,\n * description: employee.name,\n * parentId: parentContextId, // Links to parent context\n * });\n *\n * return <div>{employee.name}</div>;\n * }\n * ```\n */\nexport function useAIContext(item: AIContextItem): string | undefined {\n const { addContext, removeContext } = useCopilot();\n const contextIdRef = useRef<string | null>(null);\n\n // Serialize data for stable dependency comparison (string comparison vs object reference)\n const serializedData =\n typeof item.data === \"string\" ? item.data : JSON.stringify(item.data);\n\n useEffect(() => {\n // Format the context value with pretty printing\n const formattedValue =\n typeof item.data === \"string\"\n ? item.data\n : JSON.stringify(item.data, null, 2);\n\n const contextString = item.description\n ? `${item.description}:\\n${formattedValue}`\n : `${item.key}:\\n${formattedValue}`;\n\n // Add context with optional parentId and store the ID\n contextIdRef.current = addContext(contextString, item.parentId);\n\n // Cleanup: remove context when component unmounts or deps change\n return () => {\n if (contextIdRef.current) {\n removeContext(contextIdRef.current);\n contextIdRef.current = null;\n }\n };\n // Use serializedData (string) instead of item.data (object) to avoid infinite loops\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n item.key,\n serializedData,\n item.description,\n item.parentId,\n addContext,\n removeContext,\n ]);\n\n // Return context ID for use as parentId in nested contexts\n return contextIdRef.current ?? undefined;\n}\n\n/**\n * Hook to provide multiple context items at once\n *\n * @example\n * ```tsx\n * useAIContexts([\n * { key: 'user', data: currentUser },\n * { key: 'cart', data: cartItems },\n * { key: 'page', data: { route: '/checkout', step: 2 } },\n * ]);\n * ```\n */\nexport function useAIContexts(items: AIContextItem[]): void {\n const { addContext, removeContext } = useCopilot();\n const contextIdsRef = useRef<string[]>([]);\n\n // Serialize items for stable dependency comparison (avoids infinite loops with inline arrays)\n const serializedItems = JSON.stringify(\n items.map((item) => ({\n key: item.key,\n data: item.data,\n description: item.description,\n parentId: item.parentId,\n })),\n );\n\n useEffect(() => {\n // Clear previous contexts\n contextIdsRef.current.forEach((id) => removeContext(id));\n contextIdsRef.current = [];\n\n // Parse serialized items\n const parsedItems = JSON.parse(serializedItems) as AIContextItem[];\n\n // Add new contexts\n for (const item of parsedItems) {\n const formattedValue =\n typeof item.data === \"string\"\n ? item.data\n : JSON.stringify(item.data, null, 2);\n\n const contextString = item.description\n ? `${item.description}:\\n${formattedValue}`\n : `${item.key}:\\n${formattedValue}`;\n\n // Support parentId for nested contexts\n const id = addContext(contextString, item.parentId);\n contextIdsRef.current.push(id);\n }\n\n // Cleanup\n return () => {\n contextIdsRef.current.forEach((id) => removeContext(id));\n contextIdsRef.current = [];\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [serializedItems, addContext, removeContext]);\n}\n","\"use client\";\n\nimport { useState, useCallback, useEffect, useRef, useMemo } from \"react\";\nimport type {\n ToolsConfig,\n ToolType,\n CapturedContext,\n ToolConsentRequest,\n ToolConsentResponse,\n IntentDetectionResult,\n ScreenshotOptions,\n ConsoleLogOptions,\n NetworkRequestOptions,\n} from \"../../core\";\nimport {\n // Screenshot\n captureScreenshot,\n isScreenshotSupported,\n // Console\n startConsoleCapture,\n stopConsoleCapture,\n getConsoleLogs,\n clearConsoleLogs,\n isConsoleCaptureActive,\n formatLogsForAI,\n // Network\n startNetworkCapture,\n stopNetworkCapture,\n getNetworkRequests,\n clearNetworkRequests,\n isNetworkCaptureActive,\n formatRequestsForAI,\n // Intent\n detectIntent,\n generateSuggestionReason,\n} from \"../../core\";\n\n/**\n * useAITools options\n */\nexport interface UseAIToolsOptions extends ToolsConfig {\n /** Callback when consent is requested */\n onConsentRequest?: (\n request: ToolConsentRequest,\n ) => Promise<ToolConsentResponse>;\n /** Auto-start capturing when enabled */\n autoStart?: boolean;\n}\n\n/**\n * useAITools return type\n */\nexport interface UseAIToolsReturn {\n /** Whether tools are enabled */\n isEnabled: boolean;\n /** Currently active captures */\n activeCaptures: {\n console: boolean;\n network: boolean;\n };\n /** Capture screenshot */\n captureScreenshot: (\n options?: ScreenshotOptions,\n ) => Promise<CapturedContext[\"screenshot\"]>;\n /** Get console logs */\n getConsoleLogs: (\n options?: ConsoleLogOptions,\n ) => CapturedContext[\"consoleLogs\"];\n /** Get network requests */\n getNetworkRequests: (\n options?: NetworkRequestOptions,\n ) => CapturedContext[\"networkRequests\"];\n /** Capture all enabled context */\n captureContext: (tools?: ToolType[]) => Promise<CapturedContext>;\n /** Detect intent from message */\n detectIntent: (message: string) => IntentDetectionResult;\n /** Request consent for tools */\n requestConsent: (\n tools: ToolType[],\n reason?: string,\n ) => Promise<ToolConsentResponse>;\n /** Start capturing */\n startCapturing: () => void;\n /** Stop capturing */\n stopCapturing: () => void;\n /** Clear captured data */\n clearCaptured: () => void;\n /** Format captured context for AI */\n formatForAI: (context: CapturedContext) => string;\n /** Pending consent request (for UI) */\n pendingConsent: ToolConsentRequest | null;\n /** Respond to consent request */\n respondToConsent: (response: ToolConsentResponse) => void;\n}\n\n/**\n * Hook for AI Smart Context Tools\n *\n * Provides React integration for screenshot, console, and network capture\n * with consent-based UX and intent detection.\n *\n * @example\n * ```tsx\n * const {\n * captureScreenshot,\n * getConsoleLogs,\n * detectIntent,\n * pendingConsent,\n * respondToConsent,\n * } = useAITools({\n * screenshot: true,\n * console: true,\n * network: true,\n * requireConsent: true,\n * });\n *\n * // Detect if tools are needed based on user message\n * const handleMessage = async (message: string) => {\n * const intent = detectIntent(message);\n *\n * if (intent.suggestedTools.length > 0) {\n * const consent = await requestConsent(\n * intent.suggestedTools,\n * generateSuggestionReason(intent)\n * );\n *\n * if (consent.approved.length > 0) {\n * const context = await captureContext(consent.approved);\n * // Include context with message\n * }\n * }\n * };\n * ```\n */\nexport function useAITools(options: UseAIToolsOptions = {}): UseAIToolsReturn {\n const {\n screenshot = false,\n console: consoleCapture = false,\n network = false,\n requireConsent = true,\n screenshotOptions,\n consoleOptions,\n networkOptions,\n onConsentRequest,\n autoStart = true,\n } = options;\n\n // State\n const [isEnabled] = useState(screenshot || consoleCapture || network);\n const [activeCaptures, setActiveCaptures] = useState({\n console: false,\n network: false,\n });\n const [pendingConsent, setPendingConsent] =\n useState<ToolConsentRequest | null>(null);\n\n // Refs for consent resolution\n const consentResolverRef = useRef<\n ((response: ToolConsentResponse) => void) | null\n >(null);\n\n // Remembered consent preferences\n const rememberedConsentRef = useRef<Set<ToolType>>(new Set());\n\n // Start capturing on mount if autoStart\n useEffect(() => {\n if (!autoStart || !isEnabled) return;\n\n if (consoleCapture && !isConsoleCaptureActive()) {\n startConsoleCapture(consoleOptions);\n setActiveCaptures((prev) => ({ ...prev, console: true }));\n }\n\n if (network && !isNetworkCaptureActive()) {\n startNetworkCapture(networkOptions);\n setActiveCaptures((prev) => ({ ...prev, network: true }));\n }\n\n return () => {\n stopConsoleCapture();\n stopNetworkCapture();\n };\n }, [\n autoStart,\n isEnabled,\n consoleCapture,\n network,\n consoleOptions,\n networkOptions,\n ]);\n\n // Capture screenshot\n const captureScreenshotFn = useCallback(\n async (opts?: ScreenshotOptions) => {\n if (!screenshot) {\n throw new Error(\"Screenshot capture is not enabled\");\n }\n\n if (!isScreenshotSupported()) {\n throw new Error(\n \"Screenshot capture is not supported in this environment\",\n );\n }\n\n return captureScreenshot({ ...screenshotOptions, ...opts });\n },\n [screenshot, screenshotOptions],\n );\n\n // Get console logs\n const getConsoleLogsFn = useCallback(\n (opts?: ConsoleLogOptions) => {\n if (!consoleCapture) {\n return { logs: [], totalCaptured: 0 };\n }\n\n return getConsoleLogs({ ...consoleOptions, ...opts });\n },\n [consoleCapture, consoleOptions],\n );\n\n // Get network requests\n const getNetworkRequestsFn = useCallback(\n (opts?: NetworkRequestOptions) => {\n if (!network) {\n return { requests: [], totalCaptured: 0 };\n }\n\n return getNetworkRequests({ ...networkOptions, ...opts });\n },\n [network, networkOptions],\n );\n\n // Request consent\n const requestConsent = useCallback(\n async (tools: ToolType[], reason = \"\"): Promise<ToolConsentResponse> => {\n const enabledTools = tools.filter((tool) => {\n if (tool === \"screenshot\") return screenshot;\n if (tool === \"console\") return consoleCapture;\n if (tool === \"network\") return network;\n return false;\n });\n\n if (enabledTools.length === 0) {\n return { approved: [], denied: [] };\n }\n\n if (!requireConsent) {\n return { approved: enabledTools, denied: [] };\n }\n\n const needsConsent = enabledTools.filter(\n (tool) => !rememberedConsentRef.current.has(tool),\n );\n\n if (needsConsent.length === 0) {\n return { approved: enabledTools, denied: [] };\n }\n\n const request: ToolConsentRequest = {\n tools: needsConsent,\n reason,\n keywords: [],\n };\n\n if (onConsentRequest) {\n const response = await onConsentRequest(request);\n if (response.remember) {\n response.approved.forEach((tool) =>\n rememberedConsentRef.current.add(tool),\n );\n }\n return response;\n }\n\n return new Promise((resolve) => {\n setPendingConsent(request);\n consentResolverRef.current = (response) => {\n if (response.remember) {\n response.approved.forEach((tool) =>\n rememberedConsentRef.current.add(tool),\n );\n }\n resolve(response);\n };\n });\n },\n [screenshot, consoleCapture, network, requireConsent, onConsentRequest],\n );\n\n // Respond to consent\n const respondToConsent = useCallback((response: ToolConsentResponse) => {\n if (consentResolverRef.current) {\n consentResolverRef.current(response);\n consentResolverRef.current = null;\n }\n setPendingConsent(null);\n }, []);\n\n // Capture context\n const captureContext = useCallback(\n async (tools?: ToolType[]): Promise<CapturedContext> => {\n const toolsToCapture =\n tools || ([\"screenshot\", \"console\", \"network\"] as ToolType[]);\n const context: CapturedContext = {\n timestamp: Date.now(),\n };\n\n const captures: Promise<void>[] = [];\n\n if (toolsToCapture.includes(\"screenshot\") && screenshot) {\n captures.push(\n captureScreenshotFn()\n .then((result) => {\n context.screenshot = result;\n })\n .catch(() => {}),\n );\n }\n\n if (toolsToCapture.includes(\"console\") && consoleCapture) {\n context.consoleLogs = getConsoleLogsFn();\n }\n\n if (toolsToCapture.includes(\"network\") && network) {\n context.networkRequests = getNetworkRequestsFn();\n }\n\n await Promise.all(captures);\n return context;\n },\n [\n screenshot,\n consoleCapture,\n network,\n captureScreenshotFn,\n getConsoleLogsFn,\n getNetworkRequestsFn,\n ],\n );\n\n // Start capturing\n const startCapturing = useCallback(() => {\n if (consoleCapture && !isConsoleCaptureActive()) {\n startConsoleCapture(consoleOptions);\n setActiveCaptures((prev) => ({ ...prev, console: true }));\n }\n\n if (network && !isNetworkCaptureActive()) {\n startNetworkCapture(networkOptions);\n setActiveCaptures((prev) => ({ ...prev, network: true }));\n }\n }, [consoleCapture, network, consoleOptions, networkOptions]);\n\n // Stop capturing\n const stopCapturing = useCallback(() => {\n stopConsoleCapture();\n stopNetworkCapture();\n setActiveCaptures({ console: false, network: false });\n }, []);\n\n // Clear captured data\n const clearCaptured = useCallback(() => {\n clearConsoleLogs();\n clearNetworkRequests();\n }, []);\n\n // Format captured context for AI\n const formatForAI = useCallback((context: CapturedContext): string => {\n const parts: string[] = [];\n\n if (context.screenshot) {\n parts.push(\n `Screenshot captured (${context.screenshot.width}x${context.screenshot.height}, ${context.screenshot.format})`,\n );\n }\n\n if (context.consoleLogs && context.consoleLogs.logs.length > 0) {\n parts.push(formatLogsForAI(context.consoleLogs.logs));\n }\n\n if (\n context.networkRequests &&\n context.networkRequests.requests.length > 0\n ) {\n parts.push(formatRequestsForAI(context.networkRequests.requests));\n }\n\n return parts.length > 0\n ? parts.join(\"\\n\\n---\\n\\n\")\n : \"No context captured.\";\n }, []);\n\n // Detect intent wrapper\n const detectIntentFn = useCallback(\n (message: string): IntentDetectionResult => {\n const result = detectIntent(message);\n\n result.suggestedTools = result.suggestedTools.filter((tool) => {\n if (tool === \"screenshot\") return screenshot;\n if (tool === \"console\") return consoleCapture;\n if (tool === \"network\") return network;\n return false;\n });\n\n return result;\n },\n [screenshot, consoleCapture, network],\n );\n\n return useMemo(\n () => ({\n isEnabled,\n activeCaptures,\n captureScreenshot: captureScreenshotFn,\n getConsoleLogs: getConsoleLogsFn,\n getNetworkRequests: getNetworkRequestsFn,\n captureContext,\n detectIntent: detectIntentFn,\n requestConsent,\n startCapturing,\n stopCapturing,\n clearCaptured,\n formatForAI,\n pendingConsent,\n respondToConsent,\n }),\n [\n isEnabled,\n activeCaptures,\n captureScreenshotFn,\n getConsoleLogsFn,\n getNetworkRequestsFn,\n captureContext,\n detectIntentFn,\n requestConsent,\n startCapturing,\n stopCapturing,\n clearCaptured,\n formatForAI,\n pendingConsent,\n respondToConsent,\n ],\n );\n}\n\n// Re-export for convenience\nexport { generateSuggestionReason };\n","\"use client\";\n\nimport { useEffect, useRef } from \"react\";\nimport type {\n ToolDefinition,\n ToolResponse,\n ToolContext,\n ToolRenderProps,\n ToolSet,\n} from \"../../core\";\nimport { useCopilot } from \"../provider/CopilotProvider\";\n\n/**\n * Configuration for registering a tool (legacy format)\n */\nexport interface UseToolConfig<TParams = Record<string, unknown>> {\n /** Unique tool name */\n name: string;\n /** Tool description for LLM */\n description: string;\n /** JSON Schema for input parameters */\n inputSchema: {\n type: \"object\";\n properties: Record<string, unknown>;\n required?: string[];\n };\n /** Handler function */\n handler: (\n params: TParams,\n context?: ToolContext,\n ) => Promise<ToolResponse> | ToolResponse;\n /** Optional render function for UI */\n render?: (props: ToolRenderProps<TParams>) => React.ReactNode;\n /** Whether the tool is available */\n available?: boolean;\n /** Require user approval */\n needsApproval?: boolean;\n /** Custom approval message */\n approvalMessage?: string;\n}\n\n/**\n * Register a client-side tool\n *\n * This hook registers a tool that can be called by the AI during a conversation.\n * The tool will execute on the client side.\n *\n * @example\n * ```tsx\n * useTool({\n * name: \"navigate_to_page\",\n * description: \"Navigate to a specific page in the app\",\n * inputSchema: {\n * type: \"object\",\n * properties: {\n * path: { type: \"string\", description: \"The path to navigate to\" },\n * },\n * required: [\"path\"],\n * },\n * handler: async ({ path }) => {\n * router.push(path);\n * return { success: true, message: `Navigated to ${path}` };\n * },\n * });\n * ```\n */\nexport function useTool<TParams = Record<string, unknown>>(\n config: UseToolConfig<TParams>,\n dependencies: unknown[] = [],\n): void {\n const { registerTool, unregisterTool } = useCopilot();\n const configRef = useRef(config);\n\n // Update ref when config changes\n configRef.current = config;\n\n useEffect(() => {\n // Create tool definition\n const tool: ToolDefinition = {\n name: config.name,\n description: config.description,\n location: \"client\",\n inputSchema: config.inputSchema as ToolDefinition[\"inputSchema\"],\n handler: async (params, context) => {\n return configRef.current.handler(params as TParams, context);\n },\n render: config.render as ToolDefinition[\"render\"],\n available: config.available ?? true,\n needsApproval: config.needsApproval,\n approvalMessage: config.approvalMessage,\n };\n\n // Register tool\n registerTool(tool);\n\n // Cleanup on unmount\n return () => {\n unregisterTool(config.name);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [config.name, ...dependencies]);\n}\n\n/**\n * Register multiple tools using a ToolSet (Vercel AI SDK pattern)\n *\n * This is the recommended way to register tools as it follows\n * the Vercel AI SDK pattern with explicit tool definitions.\n *\n * @example\n * ```tsx\n * import { useTools } from '@yourgpt/copilot-sdk-react';\n * import { builtinTools, tool, success } from '../core';\n *\n * function MyApp() {\n * // Register built-in tools\n * useTools({\n * capture_screenshot: builtinTools.capture_screenshot,\n * get_console_logs: builtinTools.get_console_logs,\n * });\n *\n * // Or create custom tools\n * useTools({\n * get_weather: tool({\n * description: 'Get weather for a location',\n * inputSchema: {\n * type: 'object',\n * properties: {\n * location: { type: 'string' },\n * },\n * required: ['location'],\n * },\n * handler: async ({ location }) => {\n * const weather = await fetchWeather(location);\n * return success(weather);\n * },\n * }),\n * });\n *\n * return <CopilotChat />;\n * }\n * ```\n */\nexport function useTools(tools: ToolSet): void {\n const { registerTool, unregisterTool } = useCopilot();\n\n // Track which tools we've registered to clean up properly\n const registeredToolsRef = useRef<string[]>([]);\n const toolsRef = useRef(tools);\n\n // Update ref when tools change\n toolsRef.current = tools;\n\n // Create a stable key from tool names to detect actual changes\n const toolsKey = Object.keys(tools).sort().join(\",\");\n\n useEffect(() => {\n const currentTools = toolsRef.current;\n const toolNames: string[] = [];\n\n // Register all tools from the toolset\n for (const [name, toolDef] of Object.entries(currentTools)) {\n // Create full tool definition with name (override if toolDef has different name)\n const fullTool: ToolDefinition = {\n ...toolDef,\n name, // Use the key as the name\n };\n\n registerTool(fullTool);\n toolNames.push(name);\n }\n\n registeredToolsRef.current = toolNames;\n\n // Cleanup: unregister tools when unmounting or when tools change\n return () => {\n for (const name of registeredToolsRef.current) {\n unregisterTool(name);\n }\n registeredToolsRef.current = [];\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [toolsKey]); // Only re-run when tool names change, not on every render\n}\n\n/**\n * Register multiple client-side tools (legacy array format)\n *\n * @deprecated Use useTools with ToolSet (object) format instead\n *\n * @example\n * ```tsx\n * useToolsArray([\n * { name: \"navigate\", ... },\n * { name: \"open_modal\", ... },\n * ]);\n * ```\n */\nexport function useToolsArray<TParams = Record<string, unknown>>(\n tools: UseToolConfig<TParams>[],\n dependencies: unknown[] = [],\n): void {\n const { registerTool, unregisterTool } = useCopilot();\n const toolsRef = useRef(tools);\n\n // Update ref when tools change\n toolsRef.current = tools;\n\n useEffect(() => {\n // Register all tools\n const toolNames: string[] = [];\n\n for (const config of tools) {\n const tool: ToolDefinition = {\n name: config.name,\n description: config.description,\n location: \"client\",\n inputSchema: config.inputSchema as ToolDefinition[\"inputSchema\"],\n handler: async (params, context) => {\n const currentConfig = toolsRef.current.find(\n (t) => t.name === config.name,\n );\n if (currentConfig) {\n return currentConfig.handler(params as TParams, context);\n }\n return { success: false, error: \"Tool handler not found\" };\n },\n available: config.available ?? true,\n needsApproval: config.needsApproval,\n approvalMessage: config.approvalMessage,\n };\n\n registerTool(tool);\n toolNames.push(config.name);\n }\n\n // Cleanup on unmount\n return () => {\n for (const name of toolNames) {\n unregisterTool(name);\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [tools.map((t) => t.name).join(\",\"), ...dependencies]);\n}\n\nexport type { ToolDefinition, ToolResponse, ToolContext, ToolSet };\n","\"use client\";\n\nimport { createContext, useContext } from \"react\";\nimport type {\n CopilotConfig,\n Message,\n MessageAttachment,\n ActionDefinition,\n Source,\n ToolsConfig,\n ToolType,\n ToolConsentRequest,\n CapturedContext,\n ToolDefinition,\n ToolExecution,\n ToolResponse,\n ToolApprovalStatus,\n PermissionLevel,\n ToolPermission,\n} from \"../../core\";\nimport type { ContextTreeNode } from \"../utils/context-tree\";\n\n/**\n * Chat UI state interface (UI-only state, not message data)\n * Message data is stored in ThreadsState as the single source of truth\n */\nexport interface ChatState {\n /** Whether a response is being generated */\n isLoading: boolean;\n /** Current error if any */\n error: Error | null;\n}\n\n/**\n * Combined chat state for context consumers\n * Includes derived data from threads for convenience\n */\nexport interface CombinedChatState {\n /** All messages in the conversation (from active thread) */\n messages: Message[];\n /** Whether a response is being generated */\n isLoading: boolean;\n /** Current error if any */\n error: Error | null;\n /** Thread/conversation ID (from active thread) */\n threadId: string | null;\n /** Sources from knowledge base (from active thread) */\n sources: Source[];\n}\n\n/**\n * Tools state interface (Smart Context tools)\n */\nexport interface ToolsState {\n /** Whether tools are enabled */\n isEnabled: boolean;\n /** Pending consent request */\n pendingConsent: ToolConsentRequest | null;\n /** Last captured context */\n lastContext: CapturedContext | null;\n /** Currently capturing */\n isCapturing: boolean;\n}\n\n/**\n * Agent loop state interface (Agentic tools)\n */\nexport interface AgentLoopState {\n /** Current tool executions */\n toolExecutions: ToolExecution[];\n /** Current loop iteration */\n iteration: number;\n /** Maximum iterations */\n maxIterations: number;\n /** Whether max iterations was reached */\n maxIterationsReached: boolean;\n /** Whether waiting for server response after tool completion */\n isProcessing: boolean;\n}\n\n/**\n * Chat actions interface\n */\nexport interface ChatActions {\n /** Send a message (with optional attachments) */\n sendMessage: (\n content: string,\n attachments?: MessageAttachment[],\n ) => Promise<void>;\n /** Send a message with context */\n sendMessageWithContext: (\n content: string,\n context: CapturedContext,\n ) => Promise<void>;\n /** Stop generation */\n stopGeneration: () => void;\n /** Clear all messages */\n clearMessages: () => void;\n /** Regenerate last response */\n regenerate: (messageId?: string) => Promise<void>;\n /** Set messages directly */\n setMessages: (messages: Message[]) => void;\n /**\n * Process file to MessageAttachment\n * - Premium: uploads to cloud storage, returns URL-based attachment\n * - Free: converts to base64\n */\n processAttachment: (file: File) => Promise<MessageAttachment>;\n}\n\n/**\n * Tools actions interface\n */\nexport interface ToolsActions {\n /** Request consent for tools */\n requestConsent: (tools: ToolType[], reason?: string) => void;\n /** Respond to consent request */\n respondToConsent: (approved: ToolType[], remember?: boolean) => void;\n /** Capture context */\n captureContext: (tools: ToolType[]) => Promise<CapturedContext>;\n /** Clear pending consent */\n clearConsent: () => void;\n}\n\n/**\n * Copilot context value\n */\nexport interface CopilotContextValue {\n /** SDK configuration */\n config: CopilotConfig;\n /** Tools configuration */\n toolsConfig: ToolsConfig | null;\n /** Chat state (combined from UI state + active thread) */\n chat: CombinedChatState;\n /** Tools state (Smart Context) */\n tools: ToolsState;\n /** Agent loop state (Agentic tools) */\n agentLoop: AgentLoopState;\n /** Chat actions */\n actions: ChatActions;\n /** Tools actions */\n toolsActions: ToolsActions;\n /** Registered actions/tools (legacy) */\n registeredActions: ActionDefinition[];\n /** Register an action (legacy) */\n registerAction: (action: ActionDefinition) => void;\n /** Unregister an action (legacy) */\n unregisterAction: (name: string) => void;\n /** Registered tools (Agentic) */\n registeredTools: ToolDefinition[];\n /** Register a tool */\n registerTool: (tool: ToolDefinition) => void;\n /** Unregister a tool */\n unregisterTool: (name: string) => void;\n /** Add a tool execution record */\n addToolExecution?: (execution: ToolExecution) => void;\n /** Update a tool execution record */\n updateToolExecution?: (id: string, update: Partial<ToolExecution>) => void;\n /** Clear all tool executions */\n clearToolExecutions?: () => void;\n\n // Tool approval handlers (for needsApproval tools)\n\n /**\n * Approve a tool execution with optional extra data.\n * The extraData is passed to the tool handler via context.approvalData.\n *\n * @param executionId - The tool execution ID\n * @param extraData - Optional data from user's action (e.g., selected item)\n * @param permissionLevel - Optional permission level for persistence\n */\n approveToolExecution?: (\n executionId: string,\n extraData?: Record<string, unknown>,\n permissionLevel?: PermissionLevel,\n ) => void;\n /** Reject a tool execution that requires approval */\n rejectToolExecution?: (\n executionId: string,\n reason?: string,\n permissionLevel?: PermissionLevel,\n ) => void;\n /** Tool executions waiting for user approval */\n pendingApprovals: ToolExecution[];\n\n // Permission management (for persistent tool approvals)\n\n /** All stored permissions */\n storedPermissions: ToolPermission[];\n /** Whether permissions have been loaded from storage */\n permissionsLoaded: boolean;\n /** Get permission level for a specific tool */\n getToolPermission: (toolName: string) => Promise<PermissionLevel>;\n /** Set permission level for a tool */\n setToolPermission: (\n toolName: string,\n level: PermissionLevel,\n ) => Promise<void>;\n /** Clear all stored permissions */\n clearAllPermissions: () => Promise<void>;\n /** Add context for AI (returns context ID) */\n addContext: (context: string, parentId?: string) => string;\n /** Remove context by ID */\n removeContext: (id: string) => void;\n /** Get all contexts as tree */\n contextTree: ContextTreeNode[];\n /** Whether user has API key (premium) */\n isPremium: boolean;\n /** Whether cloud storage is available (premium feature) */\n isCloudStorageAvailable: boolean;\n}\n\n/**\n * Initial chat UI state\n */\nexport const initialChatState: ChatState = {\n isLoading: false,\n error: null,\n};\n\n/**\n * Initial tools state\n */\nexport const initialToolsState: ToolsState = {\n isEnabled: false,\n pendingConsent: null,\n lastContext: null,\n isCapturing: false,\n};\n\n/**\n * Initial agent loop state\n */\nexport const initialAgentLoopState: AgentLoopState = {\n toolExecutions: [],\n iteration: 0,\n maxIterations: 20,\n maxIterationsReached: false,\n isProcessing: false,\n};\n\n/**\n * Copilot Context\n */\nexport const CopilotContext = createContext<CopilotContextValue | null>(null);\n\n/**\n * Hook to access Copilot context\n */\nexport function useCopilotContext(): CopilotContextValue {\n const context = useContext(CopilotContext);\n\n if (!context) {\n throw new Error(\"useCopilotContext must be used within a CopilotProvider\");\n }\n\n return context;\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useRef } from \"react\";\nimport * as z from \"zod\";\nimport type {\n ToolDefinition,\n ToolResponse,\n ToolContext,\n ToolRenderProps,\n ToolInputSchema,\n} from \"../../core\";\nimport { zodObjectToInputSchema } from \"../../core\";\nimport { useCopilotContext } from \"../context/CopilotContext\";\n\n/**\n * Zod schema type (minimal interface)\n */\ninterface ZodObjectSchema {\n _output: Record<string, unknown>;\n _def: {\n shape: () => Record<string, unknown>;\n };\n}\n\n/**\n * Convert Zod schema to JSON Schema using Zod's built-in toJSONSchema\n * Falls back to custom implementation for older Zod versions\n */\nfunction convertZodSchema(schema: unknown, _toolName: string): ToolInputSchema {\n // Use Zod's built-in toJSONSchema (available in Zod 3.24+ and all Zod 4.x)\n try {\n const zodWithJsonSchema = z as typeof z & {\n toJSONSchema?: (schema: z.ZodType) => unknown;\n };\n if (typeof zodWithJsonSchema.toJSONSchema === \"function\") {\n const jsonSchema = zodWithJsonSchema.toJSONSchema(\n schema as z.ZodType,\n ) as {\n type?: string;\n properties?: ToolInputSchema[\"properties\"];\n required?: string[];\n };\n if (jsonSchema.type === \"object\") {\n return {\n type: \"object\",\n properties: jsonSchema.properties || {},\n required: jsonSchema.required,\n };\n }\n }\n } catch {\n // toJSONSchema not available or failed, fall through\n }\n\n // Fall back to custom implementation for older Zod versions\n return zodObjectToInputSchema(schema);\n}\n\n/**\n * Configuration for registering a tool with Zod schema\n */\nexport interface UseToolWithSchemaConfig<TSchema extends ZodObjectSchema> {\n /** Unique tool name */\n name: string;\n /** Tool description for LLM */\n description: string;\n /** Zod schema for input parameters */\n schema: TSchema;\n /** Handler function */\n handler: (\n params: TSchema[\"_output\"],\n context?: ToolContext,\n ) => Promise<ToolResponse> | ToolResponse;\n /** Optional render function for UI */\n render?: (props: ToolRenderProps<TSchema[\"_output\"]>) => React.ReactNode;\n /** Whether the tool is available */\n available?: boolean;\n}\n\n/**\n * Register a client-side tool using a Zod schema\n *\n * This hook provides type-safe tool registration using Zod schemas.\n * The Zod schema is automatically converted to JSON Schema for the LLM.\n *\n * @example\n * ```tsx\n * import { z } from \"zod\";\n *\n * useToolWithSchema({\n * name: \"navigate_to_page\",\n * description: \"Navigate to a specific page in the app\",\n * schema: z.object({\n * path: z.string().describe(\"The path to navigate to\"),\n * }),\n * handler: async ({ path }) => {\n * // TypeScript knows `path` is a string!\n * router.push(path);\n * return { success: true, message: `Navigated to ${path}` };\n * },\n * });\n * ```\n */\nexport function useToolWithSchema<TSchema extends ZodObjectSchema>(\n config: UseToolWithSchemaConfig<TSchema>,\n dependencies: unknown[] = [],\n): void {\n const { registerTool, unregisterTool } = useCopilotContext();\n const configRef = useRef(config);\n\n // Update ref when config changes\n configRef.current = config;\n\n // Convert Zod schema to JSON Schema (memoized)\n const inputSchema = useMemo(() => {\n try {\n return convertZodSchema(config.schema, config.name);\n } catch (error) {\n // Fallback to empty schema if conversion fails\n console.warn(\n `[useToolWithSchema] Failed to convert Zod schema for tool \"${config.name}\"`,\n error,\n );\n return {\n type: \"object\" as const,\n properties: {},\n };\n }\n }, [config.schema, config.name]);\n\n useEffect(() => {\n // Create tool definition\n const tool: ToolDefinition<TSchema[\"_output\"]> = {\n name: config.name,\n description: config.description,\n location: \"client\",\n inputSchema,\n handler: async (params, context) => {\n return configRef.current.handler(params as TSchema[\"_output\"], context);\n },\n render: config.render,\n available: config.available ?? true,\n };\n\n // Register tool\n registerTool(tool);\n\n // Cleanup on unmount\n return () => {\n unregisterTool(config.name);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [config.name, inputSchema, ...dependencies]);\n}\n\n/**\n * Register multiple client-side tools using Zod schemas\n *\n * @example\n * ```tsx\n * import { z } from \"zod\";\n *\n * useToolsWithSchema([\n * {\n * name: \"navigate\",\n * description: \"Navigate to page\",\n * schema: z.object({ path: z.string() }),\n * handler: async ({ path }) => { ... },\n * },\n * {\n * name: \"open_modal\",\n * description: \"Open a modal\",\n * schema: z.object({ modalId: z.string() }),\n * handler: async ({ modalId }) => { ... },\n * },\n * ]);\n * ```\n */\nexport function useToolsWithSchema<TSchema extends ZodObjectSchema>(\n tools: UseToolWithSchemaConfig<TSchema>[],\n dependencies: unknown[] = [],\n): void {\n const { registerTool, unregisterTool } = useCopilotContext();\n const toolsRef = useRef(tools);\n\n // Update ref when tools change\n toolsRef.current = tools;\n\n useEffect(() => {\n // Register all tools\n const toolNames: string[] = [];\n\n for (const config of tools) {\n let inputSchema: ToolDefinition[\"inputSchema\"];\n\n try {\n inputSchema = convertZodSchema(config.schema, config.name);\n } catch (error) {\n console.warn(\n `[useToolsWithSchema] Failed to convert Zod schema for tool \"${config.name}\"`,\n error,\n );\n inputSchema = { type: \"object\", properties: {} };\n }\n\n const tool: ToolDefinition = {\n name: config.name,\n description: config.description,\n location: \"client\",\n inputSchema,\n handler: async (params, context) => {\n const currentConfig = toolsRef.current.find(\n (t) => t.name === config.name,\n );\n if (currentConfig) {\n return currentConfig.handler(params as TSchema[\"_output\"], context);\n }\n return { success: false, error: \"Tool handler not found\" };\n },\n available: config.available ?? true,\n };\n\n registerTool(tool);\n toolNames.push(config.name);\n }\n\n // Cleanup on unmount\n return () => {\n for (const name of toolNames) {\n unregisterTool(name);\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [tools.map((t) => t.name).join(\",\"), ...dependencies]);\n}\n","\"use client\";\n\nimport { useCallback, useRef } from \"react\";\nimport type {\n ToolDefinition,\n ToolResponse,\n UnifiedToolCall,\n ToolExecution,\n} from \"../../core\";\nimport { useCopilotContext } from \"../context/CopilotContext\";\n\n/**\n * Tool executor return type\n */\nexport interface UseToolExecutorReturn {\n /**\n * Execute a tool by name with given arguments\n */\n executeTool: (toolCall: UnifiedToolCall) => Promise<ToolResponse>;\n\n /**\n * Send tool result back to server\n */\n sendToolResult: (toolCallId: string, result: ToolResponse) => Promise<void>;\n\n /**\n * Get a registered tool by name\n */\n getTool: (name: string) => ToolDefinition | undefined;\n\n /**\n * Check if a tool is registered\n */\n hasTool: (name: string) => boolean;\n}\n\n/**\n * Internal hook for executing client-side tools\n *\n * This hook is used internally by the CopilotProvider to execute\n * tools when the server requests them via SSE events.\n *\n * It can also be used for custom implementations where you need\n * direct control over tool execution.\n *\n * @example\n * ```tsx\n * const { executeTool, sendToolResult } = useToolExecutor();\n *\n * // When receiving a tool:execute event from server\n * const handleToolExecute = async (event: ToolExecuteEvent) => {\n * const result = await executeTool({\n * id: event.id,\n * name: event.name,\n * input: event.args,\n * });\n *\n * // Send result back to server\n * await sendToolResult(event.id, result);\n * };\n * ```\n */\nexport function useToolExecutor(): UseToolExecutorReturn {\n const {\n registeredTools,\n config,\n chat,\n addToolExecution,\n updateToolExecution,\n } = useCopilotContext();\n\n const toolsRef = useRef(registeredTools);\n toolsRef.current = registeredTools;\n\n /**\n * Execute a tool\n */\n const executeTool = useCallback(\n async (toolCall: UnifiedToolCall): Promise<ToolResponse> => {\n const tool = toolsRef.current.find((t) => t.name === toolCall.name);\n\n if (!tool) {\n return {\n success: false,\n error: `Unknown tool: ${toolCall.name}`,\n };\n }\n\n if (!tool.handler) {\n return {\n success: false,\n error: `Tool \"${toolCall.name}\" has no handler`,\n };\n }\n\n // Create execution record\n const execution: ToolExecution = {\n id: toolCall.id,\n name: toolCall.name,\n args: toolCall.input,\n status: \"executing\",\n timestamp: Date.now(),\n approvalStatus: \"none\",\n };\n\n // Add to execution list\n addToolExecution?.(execution);\n\n try {\n const startTime = Date.now();\n const result = await tool.handler(toolCall.input);\n const duration = Date.now() - startTime;\n\n // Update execution status\n updateToolExecution?.(toolCall.id, {\n status: result.success ? \"completed\" : \"error\",\n result,\n error: result.error,\n duration,\n });\n\n return result;\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Tool execution failed\";\n\n // Update execution status\n updateToolExecution?.(toolCall.id, {\n status: \"error\",\n error: errorMessage,\n });\n\n return {\n success: false,\n error: errorMessage,\n };\n }\n },\n [addToolExecution, updateToolExecution],\n );\n\n /**\n * Send tool result back to server\n */\n const sendToolResult = useCallback(\n async (toolCallId: string, result: ToolResponse): Promise<void> => {\n const runtimeUrl = config.runtimeUrl || config.cloud?.endpoint;\n\n if (!runtimeUrl) {\n console.warn(\n \"[useToolExecutor] No runtime URL configured, cannot send tool result\",\n );\n return;\n }\n\n // Extract base URL (remove /chat if present)\n const baseUrl = runtimeUrl.replace(/\\/chat\\/?$/, \"\");\n\n try {\n const response = await fetch(`${baseUrl}/tool-result`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n threadId: chat.threadId || \"default\",\n toolCallId,\n result,\n }),\n });\n\n if (!response.ok) {\n console.error(\n \"[useToolExecutor] Failed to send tool result:\",\n await response.text(),\n );\n }\n } catch (error) {\n console.error(\"[useToolExecutor] Error sending tool result:\", error);\n }\n },\n [config.runtimeUrl, config.cloud?.endpoint, chat.threadId],\n );\n\n /**\n * Get a registered tool by name\n */\n const getTool = useCallback((name: string): ToolDefinition | undefined => {\n return toolsRef.current.find((t) => t.name === name);\n }, []);\n\n /**\n * Check if a tool is registered\n */\n const hasTool = useCallback((name: string): boolean => {\n return toolsRef.current.some((t) => t.name === name);\n }, []);\n\n return {\n executeTool,\n sendToolResult,\n getTool,\n hasTool,\n };\n}\n","\"use client\";\n\nimport { useState, useCallback, useEffect, useMemo } from \"react\";\nimport { useCopilotContext } from \"../context/CopilotContext\";\n\n/**\n * Suggestion item\n */\nexport interface Suggestion {\n /** Suggestion text */\n text: string;\n /** Optional icon */\n icon?: string;\n}\n\n/**\n * useSuggestions options\n */\nexport interface UseSuggestionsOptions {\n /** Number of suggestions to show */\n count?: number;\n /** Context for generating suggestions */\n context?: string;\n /** Static suggestions (if not using AI-generated) */\n suggestions?: Suggestion[] | string[];\n /** Auto-refresh on conversation change */\n autoRefresh?: boolean;\n}\n\n/**\n * useSuggestions return type\n */\nexport interface UseSuggestionsReturn {\n /** Current suggestions */\n suggestions: Suggestion[];\n /** Whether suggestions are loading */\n isLoading: boolean;\n /** Refresh suggestions */\n refresh: () => Promise<void>;\n /** Select a suggestion (sends as message) */\n select: (suggestion: Suggestion | string) => void;\n}\n\n/**\n * Hook for chat suggestions\n *\n * @example\n * ```tsx\n * const { suggestions, select } = useSuggestions({\n * count: 3,\n * context: 'Help users with product questions',\n * });\n *\n * return (\n * <div>\n * {suggestions.map((s, i) => (\n * <button key={i} onClick={() => select(s)}>{s.text}</button>\n * ))}\n * </div>\n * );\n * ```\n */\nexport function useSuggestions(\n options: UseSuggestionsOptions = {},\n): UseSuggestionsReturn {\n const {\n count = 3,\n context,\n suggestions: staticSuggestions,\n autoRefresh = true,\n } = options;\n\n const { chat, actions, config } = useCopilotContext();\n const [suggestions, setSuggestions] = useState<Suggestion[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n\n // Normalize static suggestions (memoized to prevent infinite loops)\n const normalizedStatic = useMemo(\n () =>\n staticSuggestions?.map((s) => (typeof s === \"string\" ? { text: s } : s)),\n [staticSuggestions],\n );\n\n // Refresh suggestions from API\n const refresh = useCallback(async () => {\n // If static suggestions provided, use those\n if (normalizedStatic) {\n setSuggestions(normalizedStatic.slice(0, count));\n return;\n }\n\n // Skip if no cloud config\n if (!config.cloud) {\n return;\n }\n\n setIsLoading(true);\n\n try {\n const endpoint = config.cloud.endpoint || \"https://api.yourgpt.ai/v1\";\n const response = await fetch(`${endpoint}/suggestions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.cloud.apiKey}`,\n },\n body: JSON.stringify({\n botId: config.cloud.botId,\n count,\n context,\n messages: chat.messages.slice(-5), // Last 5 messages for context\n }),\n });\n\n if (response.ok) {\n const data = await response.json();\n setSuggestions(\n data.suggestions.map((s: string | Suggestion) =>\n typeof s === \"string\" ? { text: s } : s,\n ),\n );\n }\n } catch (error) {\n console.error(\"Failed to fetch suggestions:\", error);\n } finally {\n setIsLoading(false);\n }\n }, [config.cloud, count, context, chat.messages, normalizedStatic]);\n\n // Select a suggestion\n const select = useCallback(\n (suggestion: Suggestion | string) => {\n const text =\n typeof suggestion === \"string\" ? suggestion : suggestion.text;\n actions.sendMessage(text);\n },\n [actions],\n );\n\n // Auto-refresh on conversation start or change\n useEffect(() => {\n if (autoRefresh && chat.messages.length === 0) {\n refresh();\n }\n }, [autoRefresh, chat.messages.length, refresh]);\n\n return {\n suggestions: normalizedStatic?.slice(0, count) || suggestions,\n isLoading,\n refresh,\n select,\n };\n}\n","\"use client\";\n\nimport { useState, useCallback, useRef, useEffect } from \"react\";\nimport { useCopilotContext } from \"../context/CopilotContext\";\nimport type { StreamEvent } from \"../../core\";\nimport { streamSSE } from \"../../core\";\n\n/**\n * useAgent options\n */\nexport interface UseAgentOptions<TState = Record<string, unknown>> {\n /** Agent name */\n name: string;\n /** Initial state */\n initialState?: TState;\n /** Called when agent state changes */\n onStateChange?: (state: TState) => void;\n}\n\n/**\n * useAgent return type\n */\nexport interface UseAgentReturn<TState = Record<string, unknown>> {\n /** Current agent state */\n state: TState;\n /** Whether agent is running */\n isRunning: boolean;\n /** Current node name (for graph-based agents) */\n nodeName: string | null;\n /** Start the agent */\n start: (input?: string | Record<string, unknown>) => Promise<void>;\n /** Stop the agent */\n stop: () => void;\n /** Update agent state */\n setState: (state: Partial<TState>) => void;\n /** Error if any */\n error: Error | null;\n}\n\n/**\n * Hook for connecting to agents (LangGraph, etc.)\n *\n * @example\n * ```tsx\n * const { state, isRunning, start } = useAgent<{ city: string }>({\n * name: 'weather-agent',\n * initialState: { city: '' },\n * });\n *\n * return (\n * <div>\n * <p>City: {state.city}</p>\n * <button onClick={() => start('What is the weather?')}>\n * {isRunning ? 'Running...' : 'Start'}\n * </button>\n * </div>\n * );\n * ```\n */\nexport function useAgent<TState = Record<string, unknown>>(\n options: UseAgentOptions<TState>,\n): UseAgentReturn<TState> {\n const { name, initialState = {} as TState, onStateChange } = options;\n const { config } = useCopilotContext();\n\n const [state, setStateInternal] = useState<TState>(initialState);\n const [isRunning, setIsRunning] = useState(false);\n const [nodeName, setNodeName] = useState<string | null>(null);\n const [error, setError] = useState<Error | null>(null);\n\n const abortControllerRef = useRef<AbortController | null>(null);\n\n // Get agent endpoint\n const getEndpoint = useCallback(() => {\n if (config.cloud) {\n return `${config.cloud.endpoint || \"https://api.yourgpt.ai/v1\"}/agents/${name}`;\n }\n return `${config.runtimeUrl || \"/api\"}/agents/${name}`;\n }, [config, name]);\n\n // Start agent\n const start = useCallback(\n async (input?: string | Record<string, unknown>) => {\n setIsRunning(true);\n setError(null);\n\n abortControllerRef.current = new AbortController();\n\n try {\n const endpoint = getEndpoint();\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n if (config.cloud?.apiKey) {\n headers[\"Authorization\"] = `Bearer ${config.cloud.apiKey}`;\n }\n\n const response = await fetch(`${endpoint}/start`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n input: typeof input === \"string\" ? { message: input } : input,\n state,\n }),\n signal: abortControllerRef.current.signal,\n });\n\n if (!response.ok) {\n throw new Error(`Agent error: ${response.status}`);\n }\n\n // Process stream\n for await (const event of streamSSE(response)) {\n handleAgentEvent(event);\n }\n } catch (err) {\n if ((err as Error).name !== \"AbortError\") {\n setError(err instanceof Error ? err : new Error(\"Unknown error\"));\n }\n } finally {\n setIsRunning(false);\n abortControllerRef.current = null;\n }\n },\n [config, getEndpoint, state],\n );\n\n // Handle agent events\n const handleAgentEvent = useCallback(\n (event: StreamEvent & { state?: TState; nodeName?: string }) => {\n if (event.type === \"error\") {\n setError(new Error(event.message));\n return;\n }\n\n // Handle state updates (custom event)\n if (\"state\" in event && event.state) {\n setStateInternal(event.state);\n onStateChange?.(event.state);\n }\n\n // Handle node changes\n if (\"nodeName\" in event && event.nodeName) {\n setNodeName(event.nodeName);\n }\n },\n [onStateChange],\n );\n\n // Stop agent\n const stop = useCallback(() => {\n abortControllerRef.current?.abort();\n }, []);\n\n // Update state\n const setState = useCallback(\n (partialState: Partial<TState>) => {\n setStateInternal((prev) => {\n const newState = { ...prev, ...partialState };\n onStateChange?.(newState);\n return newState;\n });\n },\n [onStateChange],\n );\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n abortControllerRef.current?.abort();\n };\n }, []);\n\n return {\n state,\n isRunning,\n nodeName,\n start,\n stop,\n setState,\n error,\n };\n}\n","/**\n * Knowledge Base Search Utility\n *\n * Integrates with managed cloud knowledge base API to search indexed documents.\n */\n\nimport type {\n InternalKnowledgeBaseConfig,\n InternalKnowledgeBaseResult,\n InternalKnowledgeBaseSearchResponse,\n} from \"../../core\";\n\nconst KNOWLEDGE_BASE_API =\n \"https://api.yourgpt.ai/chatbot/v1/searchIndexDocument\";\n\n// Re-export types for convenience\nexport type KnowledgeBaseResult = InternalKnowledgeBaseResult;\nexport type KnowledgeBaseConfig = InternalKnowledgeBaseConfig;\n\n// Extended response with page info (client-side specific)\nexport interface KnowledgeBaseSearchResponse extends InternalKnowledgeBaseSearchResponse {\n page?: number;\n}\n\n/**\n * Search the knowledge base\n *\n * @param query - Search query string\n * @param config - Knowledge base configuration\n * @returns Search results\n */\nexport async function searchKnowledgeBase(\n query: string,\n config: KnowledgeBaseConfig,\n): Promise<KnowledgeBaseSearchResponse> {\n try {\n const response = await fetch(KNOWLEDGE_BASE_API, {\n method: \"POST\",\n headers: {\n accept: \"*/*\",\n \"content-type\": \"application/json\",\n authorization: `Bearer ${config.token}`,\n },\n body: JSON.stringify({\n project_uid: config.projectUid,\n query: query,\n page: 1,\n limit: String(config.limit || 10),\n app_id: config.appId || \"1\",\n }),\n });\n\n if (!response.ok) {\n return {\n success: false,\n results: [],\n error: `API error: ${response.status} ${response.statusText}`,\n };\n }\n\n const data = await response.json();\n\n // Transform API response to our format\n // Adjust based on actual API response structure\n const results: KnowledgeBaseResult[] = (\n data.data ||\n data.results ||\n []\n ).map((item: Record<string, unknown>) => ({\n id: item.id || item._id || String(Math.random()),\n title: item.title || item.name || undefined,\n content: item.content || item.text || item.snippet || \"\",\n score: item.score || item.relevance || undefined,\n url: item.url || item.source_url || undefined,\n metadata: item.metadata || {},\n }));\n\n return {\n success: true,\n results,\n total: data.total || results.length,\n page: data.page || 1,\n };\n } catch (error) {\n return {\n success: false,\n results: [],\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n}\n\n/**\n * Format knowledge base results for AI context\n */\nexport function formatKnowledgeResultsForAI(\n results: KnowledgeBaseResult[],\n): string {\n if (results.length === 0) {\n return \"No relevant documents found in the knowledge base.\";\n }\n\n return results\n .map((result, index) => {\n const parts = [`[${index + 1}]`];\n if (result.title) parts.push(`**${result.title}**`);\n parts.push(result.content);\n if (result.url) parts.push(`Source: ${result.url}`);\n return parts.join(\"\\n\");\n })\n .join(\"\\n\\n---\\n\\n\");\n}\n\n/**\n * System instruction for knowledge base usage\n */\nexport const KNOWLEDGE_BASE_SYSTEM_INSTRUCTION = `\nYou have access to a knowledge base tool called \"search_knowledge\". Use this tool to:\n- Answer questions about the product, documentation, or company information\n- Find specific information when the user asks about features, pricing, policies, etc.\n- Retrieve relevant context before answering factual questions\n\nWhen using knowledge base results:\n- Cite the information source when relevant\n- If no results are found, acknowledge this and provide general guidance\n- Combine knowledge base information with your general knowledge when helpful\n`.trim();\n","\"use client\";\n\nimport { useEffect, useRef, useCallback } from \"react\";\nimport { useCopilotContext } from \"../context/CopilotContext\";\nimport {\n searchKnowledgeBase,\n formatKnowledgeResultsForAI,\n type KnowledgeBaseConfig,\n type KnowledgeBaseResult,\n type KnowledgeBaseSearchResponse,\n} from \"../utils/knowledge-base\";\n\n/**\n * Hook configuration for knowledge base\n */\nexport interface UseKnowledgeBaseConfig {\n /** Project UID for the knowledge base */\n projectUid: string;\n /** Auth token for API calls */\n token: string;\n /** App ID (default: \"1\") */\n appId?: string;\n /** Results limit (default: 5) */\n limit?: number;\n /** Whether to enable the tool (default: true) */\n enabled?: boolean;\n}\n\n/**\n * Hook to integrate knowledge base search as a tool\n *\n * Registers a `search_knowledge` tool that the AI can use to search\n * the knowledge base for relevant information.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * useKnowledgeBase({\n * projectUid: \"your-project-uid\",\n * token: \"your-auth-token\",\n * });\n *\n * return <CopilotChat />;\n * }\n * ```\n */\nexport function useKnowledgeBase(config: UseKnowledgeBaseConfig): void {\n const { registerTool, unregisterTool } = useCopilotContext();\n const configRef = useRef(config);\n\n // Update config ref\n configRef.current = config;\n\n // Search handler\n const handleSearch = useCallback(\n async (\n params: Record<string, unknown>,\n ): Promise<{\n success: boolean;\n message?: string;\n data?: unknown;\n error?: string;\n }> => {\n const query = params.query as string;\n if (!query) {\n return {\n success: false,\n error: \"Query is required\",\n };\n }\n\n const currentConfig = configRef.current;\n\n const kbConfig: KnowledgeBaseConfig = {\n projectUid: currentConfig.projectUid,\n token: currentConfig.token,\n appId: currentConfig.appId,\n limit: currentConfig.limit || 5,\n };\n\n const response: KnowledgeBaseSearchResponse = await searchKnowledgeBase(\n query,\n kbConfig,\n );\n\n if (!response.success) {\n return {\n success: false,\n error: response.error || \"Knowledge base search failed\",\n };\n }\n\n const formattedResults = formatKnowledgeResultsForAI(response.results);\n\n return {\n success: true,\n message: formattedResults,\n data: {\n resultCount: response.results.length,\n total: response.total,\n },\n };\n },\n [],\n );\n\n // Register the tool\n useEffect(() => {\n if (config.enabled === false) {\n return;\n }\n\n registerTool({\n name: \"search_knowledge\",\n description:\n \"Search the knowledge base for relevant information about the product, documentation, or company. Use this to answer questions about features, pricing, policies, guides, or any factual information.\",\n location: \"client\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description:\n \"The search query to find relevant information in the knowledge base\",\n },\n },\n required: [\"query\"],\n },\n handler: handleSearch,\n });\n\n return () => {\n unregisterTool(\"search_knowledge\");\n };\n }, [\n config.enabled,\n config.projectUid,\n config.token,\n registerTool,\n unregisterTool,\n handleSearch,\n ]);\n}\n\n/**\n * Standalone function to search knowledge base (without hook)\n *\n * Useful for manual searches outside of the tool system.\n */\nexport { searchKnowledgeBase, formatKnowledgeResultsForAI };\nexport type {\n KnowledgeBaseConfig,\n KnowledgeBaseResult,\n KnowledgeBaseSearchResponse,\n};\n","\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport { useCopilotContext } from \"../context/CopilotContext\";\n\n/**\n * Provider capabilities for UI feature flags\n */\nexport interface ProviderCapabilities {\n /** Supports image inputs */\n supportsVision: boolean;\n /** Supports tool/function calling */\n supportsTools: boolean;\n /** Supports extended thinking (Claude, DeepSeek) */\n supportsThinking: boolean;\n /** Supports streaming responses */\n supportsStreaming: boolean;\n /** Supports PDF document inputs */\n supportsPDF: boolean;\n /** Supports audio inputs */\n supportsAudio: boolean;\n /** Supports video inputs */\n supportsVideo: boolean;\n /** Maximum context tokens */\n maxTokens: number;\n /** Supported image MIME types */\n supportedImageTypes: string[];\n /** Supported audio MIME types */\n supportedAudioTypes?: string[];\n /** Supported video MIME types */\n supportedVideoTypes?: string[];\n /** Supports JSON mode / structured output */\n supportsJsonMode?: boolean;\n /** Supports system messages */\n supportsSystemMessages?: boolean;\n}\n\n/**\n * Capabilities response from the server\n */\nexport interface CapabilitiesResponse {\n /** Provider name */\n provider: string;\n /** Current model ID */\n model: string;\n /** Model capabilities */\n capabilities: ProviderCapabilities;\n /** List of supported models for this provider */\n supportedModels: string[];\n}\n\n/**\n * Default capabilities (used when loading or on error)\n */\nconst DEFAULT_CAPABILITIES: ProviderCapabilities = {\n supportsVision: false,\n supportsTools: true,\n supportsThinking: false,\n supportsStreaming: true,\n supportsPDF: false,\n supportsAudio: false,\n supportsVideo: false,\n maxTokens: 8192,\n supportedImageTypes: [],\n supportsJsonMode: false,\n supportsSystemMessages: true,\n};\n\n/**\n * Hook to access model capabilities from the runtime\n *\n * @returns Capabilities state and actions\n *\n * @example\n * ```tsx\n * function ChatInput() {\n * const { capabilities, isLoading } = useCapabilities();\n *\n * return (\n * <div>\n * {capabilities.supportsVision && (\n * <ImageUploadButton />\n * )}\n * {capabilities.supportsAudio && (\n * <AudioRecordButton />\n * )}\n * </div>\n * );\n * }\n * ```\n */\nexport function useCapabilities() {\n const { config } = useCopilotContext();\n const [capabilities, setCapabilities] =\n useState<ProviderCapabilities>(DEFAULT_CAPABILITIES);\n const [provider, setProvider] = useState<string>(\"unknown\");\n const [model, setModel] = useState<string>(\"unknown\");\n const [supportedModels, setSupportedModels] = useState<string[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n // Build the capabilities URL from the runtime URL\n const capabilitiesUrl = config.runtimeUrl\n ? config.runtimeUrl.replace(/\\/chat\\/?$/, \"/capabilities\")\n : null;\n\n // Fetch capabilities from server\n const fetchCapabilities = useCallback(async () => {\n if (!capabilitiesUrl) {\n setIsLoading(false);\n return;\n }\n\n try {\n setIsLoading(true);\n setError(null);\n\n const response = await fetch(capabilitiesUrl);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch capabilities: ${response.status}`);\n }\n\n const data: CapabilitiesResponse = await response.json();\n\n setCapabilities(data.capabilities);\n setProvider(data.provider);\n setModel(data.model);\n setSupportedModels(data.supportedModels);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(\"Unknown error\"));\n // Keep default capabilities on error\n } finally {\n setIsLoading(false);\n }\n }, [capabilitiesUrl]);\n\n // Fetch on mount\n useEffect(() => {\n fetchCapabilities();\n }, [fetchCapabilities]);\n\n return {\n /** Current model capabilities */\n capabilities,\n /** Current provider name */\n provider,\n /** Current model ID */\n model,\n /** List of supported models for current provider */\n supportedModels,\n /** Whether capabilities are being loaded */\n isLoading,\n /** Error if fetch failed */\n error,\n /** Refetch capabilities */\n refetch: fetchCapabilities,\n };\n}\n\n/**\n * Hook to check if a specific feature is supported\n *\n * @param feature - The feature to check (e.g., 'vision', 'audio', 'video')\n * @returns Whether the feature is supported\n *\n * @example\n * ```tsx\n * function ImageButton() {\n * const supportsVision = useFeatureSupport('vision');\n *\n * if (!supportsVision) return null;\n * return <button>Upload Image</button>;\n * }\n * ```\n */\nexport function useFeatureSupport(\n feature: keyof Pick<\n ProviderCapabilities,\n | \"supportsVision\"\n | \"supportsTools\"\n | \"supportsThinking\"\n | \"supportsStreaming\"\n | \"supportsPDF\"\n | \"supportsAudio\"\n | \"supportsVideo\"\n | \"supportsJsonMode\"\n | \"supportsSystemMessages\"\n >,\n): boolean {\n const { capabilities } = useCapabilities();\n return capabilities[feature] ?? false;\n}\n\n/**\n * Hook to get supported media types\n *\n * @returns Object with supported media types\n *\n * @example\n * ```tsx\n * function MediaUpload() {\n * const { imageTypes, audioTypes, videoTypes } = useSupportedMediaTypes();\n *\n * return (\n * <input\n * type=\"file\"\n * accept={imageTypes.join(',')}\n * />\n * );\n * }\n * ```\n */\nexport function useSupportedMediaTypes() {\n const { capabilities } = useCapabilities();\n\n return {\n /** Supported image MIME types */\n imageTypes: capabilities.supportedImageTypes || [],\n /** Supported audio MIME types */\n audioTypes: capabilities.supportedAudioTypes || [],\n /** Supported video MIME types */\n videoTypes: capabilities.supportedVideoTypes || [],\n /** Whether any image types are supported */\n hasImageSupport: (capabilities.supportedImageTypes?.length ?? 0) > 0,\n /** Whether any audio types are supported */\n hasAudioSupport: (capabilities.supportedAudioTypes?.length ?? 0) > 0,\n /** Whether any video types are supported */\n hasVideoSupport: (capabilities.supportedVideoTypes?.length ?? 0) > 0,\n };\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { useCopilotContext } from \"../context/CopilotContext\";\n\n/**\n * SDK State for DevLogger\n * This type is compatible with DevLoggerState in @yourgpt/copilot-sdk-ui\n */\nexport interface DevLoggerState {\n chat: {\n isLoading: boolean;\n messageCount: number;\n threadId: string;\n error: string | null;\n };\n tools: {\n isEnabled: boolean;\n isCapturing: boolean;\n pendingConsent: boolean;\n };\n agentLoop: {\n toolExecutions: Array<{\n id: string;\n name: string;\n status: string;\n approvalStatus: string;\n }>;\n pendingApprovals: number;\n iteration: number;\n maxIterations: number;\n };\n registered: {\n tools: Array<{ name: string; location: string }>;\n actions: Array<{ name: string }>;\n contextCount: number;\n };\n permissions: {\n stored: Array<{ toolName: string; level: string }>;\n loaded: boolean;\n };\n config: {\n provider: string;\n model: string;\n runtimeUrl: string;\n };\n}\n\n/**\n * Hook to build DevLogger state from SDK context\n *\n * Used internally by CopilotProvider when showLogger is true\n */\nexport function useDevLogger(): DevLoggerState {\n const ctx = useCopilotContext();\n\n return useMemo<DevLoggerState>(() => {\n // Build tool executions from agent loop state\n const toolExecutions = (ctx.agentLoop?.toolExecutions || []).map(\n (exec) => ({\n id: exec.id,\n name: exec.name,\n status: exec.status,\n approvalStatus: exec.approvalStatus || \"not_required\",\n }),\n );\n\n // Count pending approvals\n const pendingApprovalsCount = ctx.pendingApprovals?.length || 0;\n\n // Get registered tools\n const registeredTools = (ctx.registeredTools || []).map((tool) => ({\n name: tool.name,\n location: tool.location || \"client\",\n }));\n\n // Get registered actions\n const registeredActions = (ctx.registeredActions || []).map((action) => ({\n name: action.name,\n }));\n\n // Get stored permissions\n const storedPermissions = (ctx.storedPermissions || []).map((p) => ({\n toolName: p.toolName,\n level: p.level,\n }));\n\n return {\n chat: {\n isLoading: ctx.chat?.isLoading || false,\n messageCount: ctx.chat?.messages?.length || 0,\n threadId: ctx.chat?.threadId || \"none\",\n error: ctx.chat?.error?.message || null,\n },\n tools: {\n isEnabled: !!ctx.toolsConfig,\n isCapturing: ctx.tools?.isCapturing || false,\n pendingConsent: !!ctx.tools?.pendingConsent,\n },\n agentLoop: {\n toolExecutions,\n pendingApprovals: pendingApprovalsCount,\n iteration: ctx.agentLoop?.iteration || 0,\n maxIterations: ctx.agentLoop?.maxIterations || 10,\n },\n registered: {\n tools: registeredTools,\n actions: registeredActions,\n contextCount: ctx.contextTree?.length || 0,\n },\n permissions: {\n stored: storedPermissions,\n loaded: ctx.permissionsLoaded || false,\n },\n config: {\n provider:\n ctx.config?.config?.provider ||\n (ctx.config?.cloud ? \"yourgpt-cloud\" : \"unknown\"),\n model: ctx.config?.config?.model || \"default\",\n runtimeUrl: ctx.config?.runtimeUrl || ctx.config?.cloud?.endpoint || \"\",\n },\n };\n }, [\n ctx.chat,\n ctx.tools,\n ctx.toolsConfig,\n ctx.agentLoop,\n ctx.pendingApprovals,\n ctx.registeredTools,\n ctx.registeredActions,\n ctx.contextTree,\n ctx.storedPermissions,\n ctx.permissionsLoaded,\n ctx.config,\n ]);\n}\n","/**\n * ReactThreadManagerState - React-specific implementation of ThreadManagerState\n *\n * This class implements the ThreadManagerState interface with callback-based\n * reactivity for use with React's useSyncExternalStore.\n *\n * Pattern follows ReactChatState for consistency.\n */\n\nimport type { Thread, ThreadData } from \"../../core/types/thread\";\nimport type {\n ThreadManagerState,\n LoadStatus,\n} from \"../../thread/interfaces/ThreadManagerState\";\n\n/**\n * ReactThreadManagerState implements ThreadManagerState with callback-based reactivity\n *\n * @example\n * ```tsx\n * const state = new ReactThreadManagerState();\n *\n * // Subscribe to changes (for useSyncExternalStore)\n * const unsubscribe = state.subscribe(() => {\n * console.log('State changed');\n * });\n *\n * // Get snapshot (for useSyncExternalStore)\n * const threads = state.threads;\n * ```\n */\nexport class ReactThreadManagerState implements ThreadManagerState {\n private _threads: Thread[] = [];\n private _currentThreadId: string | null = null;\n private _currentThread: ThreadData | null = null;\n private _loadStatus: LoadStatus = \"idle\";\n private _error: Error | undefined = undefined;\n\n // Callbacks for React subscriptions (useSyncExternalStore)\n private subscribers = new Set<() => void>();\n\n constructor(initialThreads?: Thread[]) {\n if (initialThreads) {\n this._threads = initialThreads;\n }\n }\n\n // ============================================\n // Getters\n // ============================================\n\n get threads(): Thread[] {\n return this._threads;\n }\n\n get currentThreadId(): string | null {\n return this._currentThreadId;\n }\n\n get currentThread(): ThreadData | null {\n return this._currentThread;\n }\n\n get loadStatus(): LoadStatus {\n return this._loadStatus;\n }\n\n get error(): Error | undefined {\n return this._error;\n }\n\n // ============================================\n // Setters (trigger reactivity)\n // ============================================\n\n set threads(value: Thread[]) {\n this._threads = value;\n this.notify();\n }\n\n // ============================================\n // Mutations\n // ============================================\n\n setThreads(threads: Thread[]): void {\n this._threads = threads;\n this.notify();\n }\n\n setCurrentThread(thread: ThreadData | null): void {\n this._currentThread = thread;\n this._currentThreadId = thread?.id ?? null;\n this.notify();\n }\n\n setCurrentThreadId(id: string | null): void {\n this._currentThreadId = id;\n this.notify();\n }\n\n addThread(thread: Thread): void {\n // Add to beginning (most recent first)\n this._threads = [thread, ...this._threads];\n this.notify();\n }\n\n updateThread(id: string, updates: Partial<Thread>): void {\n this._threads = this._threads.map((t) =>\n t.id === id ? { ...t, ...updates } : t,\n );\n // Re-sort by updatedAt if it was updated\n if (updates.updatedAt) {\n this._threads = [...this._threads].sort(\n (a, b) => b.updatedAt.getTime() - a.updatedAt.getTime(),\n );\n }\n // Also update current thread if it's the same\n if (this._currentThread?.id === id) {\n this._currentThread = { ...this._currentThread, ...updates };\n }\n this.notify();\n }\n\n removeThread(id: string): void {\n this._threads = this._threads.filter((t) => t.id !== id);\n // Clear current thread if it was deleted\n if (this._currentThreadId === id) {\n this._currentThreadId = null;\n this._currentThread = null;\n }\n this.notify();\n }\n\n setLoadStatus(status: LoadStatus): void {\n this._loadStatus = status;\n this.notify();\n }\n\n setError(error: Error | undefined): void {\n this._error = error;\n this.notify();\n }\n\n // ============================================\n // Subscription (for useSyncExternalStore)\n // ============================================\n\n /**\n * Subscribe to state changes.\n * Returns an unsubscribe function.\n *\n * @example\n * ```tsx\n * const threads = useSyncExternalStore(\n * state.subscribe,\n * () => state.threads\n * );\n * ```\n */\n subscribe = (callback: () => void): (() => void) => {\n this.subscribers.add(callback);\n return () => {\n this.subscribers.delete(callback);\n };\n };\n\n // ============================================\n // Snapshots (for useSyncExternalStore)\n // ============================================\n\n getThreadsSnapshot(): Thread[] {\n return this._threads;\n }\n\n getCurrentThreadSnapshot(): ThreadData | null {\n return this._currentThread;\n }\n\n getLoadStatusSnapshot(): LoadStatus {\n return this._loadStatus;\n }\n\n getErrorSnapshot(): Error | undefined {\n return this._error;\n }\n\n // ============================================\n // Private Methods\n // ============================================\n\n private notify(): void {\n this.subscribers.forEach((cb) => cb());\n }\n\n /**\n * Cleanup subscriptions\n */\n dispose(): void {\n this.subscribers.clear();\n }\n}\n\n/**\n * Create a ReactThreadManagerState instance\n */\nexport function createReactThreadManagerState(\n initialThreads?: Thread[],\n): ReactThreadManagerState {\n return new ReactThreadManagerState(initialThreads);\n}\n","/**\n * ReactThreadManager - React adapter for ThreadManager\n *\n * Extends ThreadManager with React-specific state management.\n */\n\nimport {\n ThreadManager,\n type ThreadManagerConfig,\n type ThreadManagerCallbacks,\n} from \"../../thread/ThreadManager\";\nimport { ReactThreadManagerState } from \"./ReactThreadManagerState\";\nimport type { Thread } from \"../../core/types/thread\";\n\n/**\n * Configuration for ReactThreadManager\n */\nexport interface ReactThreadManagerConfig extends Omit<\n ThreadManagerConfig,\n \"state\"\n> {\n // State is always ReactThreadManagerState for React\n}\n\n/**\n * ReactThreadManager - React adapter for ThreadManager\n *\n * Uses ReactThreadManagerState for React's useSyncExternalStore compatibility.\n *\n * @example\n * ```tsx\n * const manager = createReactThreadManager();\n *\n * // In a component using useSyncExternalStore\n * const threads = useSyncExternalStore(\n * manager.subscribe,\n * manager.getThreadsSnapshot\n * );\n * ```\n */\nexport class ReactThreadManager extends ThreadManager {\n // Override state with React-specific type\n declare protected state: ReactThreadManagerState;\n\n constructor(\n config: ReactThreadManagerConfig = {},\n callbacks: ThreadManagerCallbacks = {},\n ) {\n // Create React state and pass to parent\n const reactState = new ReactThreadManagerState();\n super({ ...config, state: reactState }, callbacks);\n }\n\n // ============================================\n // Subscription Methods (for useSyncExternalStore)\n // ============================================\n\n /**\n * Subscribe to state changes\n * Use with useSyncExternalStore\n */\n subscribe = (callback: () => void): (() => void) => {\n return this.state.subscribe(callback);\n };\n\n // ============================================\n // Snapshot Getters (for useSyncExternalStore)\n // ============================================\n\n /**\n * Get threads snapshot\n */\n getThreadsSnapshot = (): typeof this.threads => {\n return this.state.getThreadsSnapshot();\n };\n\n /**\n * Get current thread snapshot\n */\n getCurrentThreadSnapshot = (): typeof this.currentThread => {\n return this.state.getCurrentThreadSnapshot();\n };\n\n /**\n * Get current thread ID snapshot\n */\n getCurrentThreadIdSnapshot = (): string | null => {\n return this.state.currentThreadId;\n };\n\n /**\n * Get load status snapshot\n */\n getLoadStatusSnapshot = (): typeof this.loadStatus => {\n return this.state.getLoadStatusSnapshot();\n };\n\n /**\n * Get error snapshot\n */\n getErrorSnapshot = (): typeof this.error => {\n return this.state.getErrorSnapshot();\n };\n\n /**\n * Get isLoading snapshot\n */\n getIsLoadingSnapshot = (): boolean => {\n return this.state.getLoadStatusSnapshot() === \"loading\";\n };\n\n // ============================================\n // Server Snapshots (for SSR - stable cached values)\n // ============================================\n\n // Cached values for server snapshots (must be stable references)\n private static readonly EMPTY_THREADS: Thread[] = [];\n private static readonly IDLE_STATUS = \"idle\" as const;\n\n /**\n * Get threads snapshot for server (always empty for hydration consistency)\n */\n getThreadsServerSnapshot = (): Thread[] => {\n return ReactThreadManager.EMPTY_THREADS;\n };\n\n /**\n * Get current thread snapshot for server (always null)\n */\n getCurrentThreadServerSnapshot = (): typeof this.currentThread => {\n return null;\n };\n\n /**\n * Get current thread ID snapshot for server (always null)\n */\n getCurrentThreadIdServerSnapshot = (): string | null => {\n return null;\n };\n\n /**\n * Get load status snapshot for server (always \"idle\")\n */\n getLoadStatusServerSnapshot = (): typeof this.loadStatus => {\n return ReactThreadManager.IDLE_STATUS;\n };\n\n /**\n * Get error snapshot for server (always undefined)\n */\n getErrorServerSnapshot = (): typeof this.error => {\n return undefined;\n };\n\n /**\n * Get isLoading snapshot for server (always false)\n */\n getIsLoadingServerSnapshot = (): boolean => {\n return false;\n };\n\n // ============================================\n // Cleanup\n // ============================================\n\n /**\n * Dispose of the manager\n */\n async dispose(): Promise<void> {\n this.state.dispose();\n await super.dispose();\n }\n}\n\n/**\n * Create a ReactThreadManager instance\n */\nexport function createReactThreadManager(\n config?: ReactThreadManagerConfig,\n callbacks?: ThreadManagerCallbacks,\n): ReactThreadManager {\n return new ReactThreadManager(config, callbacks);\n}\n","/**\n * useThreadManager - React hook for thread management\n *\n * Provides thread CRUD operations with localStorage persistence by default.\n * Uses useSyncExternalStore for optimal React integration.\n */\n\nimport React, {\n useSyncExternalStore,\n useMemo,\n useCallback,\n useEffect,\n} from \"react\";\nimport type { Thread, ThreadData, Message } from \"../../core/types\";\nimport type { LoadStatus } from \"../../thread/interfaces\";\nimport type {\n ThreadStorageAdapter,\n AsyncThreadStorageAdapter,\n} from \"../../thread/adapters\";\nimport {\n ReactThreadManager,\n createReactThreadManager,\n type ReactThreadManagerConfig,\n} from \"../internal/ReactThreadManager\";\nimport type {\n ThreadManagerCallbacks,\n CreateThreadOptions,\n UpdateThreadOptions,\n} from \"../../thread/ThreadManager\";\n\n/**\n * Configuration for useThreadManager hook\n */\nexport interface UseThreadManagerConfig extends ReactThreadManagerConfig {\n /**\n * Storage adapter for persistence\n * @default localStorage adapter\n */\n adapter?: ThreadStorageAdapter | AsyncThreadStorageAdapter;\n\n /**\n * Debounce delay for auto-save (ms)\n * @default 1000\n */\n saveDebounce?: number;\n\n /**\n * Whether to auto-load threads on mount\n * @default true\n */\n autoLoad?: boolean;\n\n /**\n * Whether to auto-restore the last active thread on load\n * Requires adapter to support getLastActiveThreadId/setLastActiveThreadId\n * @default true\n */\n autoRestoreLastThread?: boolean;\n\n /**\n * Callbacks for thread events\n */\n callbacks?: ThreadManagerCallbacks;\n}\n\n/**\n * Return type for useThreadManager hook\n */\nexport interface UseThreadManagerReturn {\n // ============================================\n // State\n // ============================================\n\n /** All threads (metadata only) */\n threads: Thread[];\n\n /** Currently loaded thread (with messages) */\n currentThread: ThreadData | null;\n\n /** Currently selected thread ID */\n currentThreadId: string | null;\n\n /** Whether threads are currently loading */\n isLoading: boolean;\n\n /** Current load status */\n loadStatus: LoadStatus;\n\n /** Current error */\n error: Error | undefined;\n\n // ============================================\n // Actions\n // ============================================\n\n /**\n * Create a new thread\n */\n createThread: (options?: CreateThreadOptions) => Promise<ThreadData>;\n\n /**\n * Switch to a different thread\n */\n switchThread: (id: string) => Promise<ThreadData | null>;\n\n /**\n * Update the current thread\n */\n updateCurrentThread: (updates: UpdateThreadOptions) => Promise<void>;\n\n /**\n * Delete a thread\n */\n deleteThread: (id: string) => Promise<void>;\n\n /**\n * Clear the current thread selection\n */\n clearCurrentThread: () => void;\n\n /**\n * Refresh threads from storage\n */\n refreshThreads: () => Promise<void>;\n\n /**\n * Save changes immediately (bypass debounce)\n */\n saveNow: () => Promise<void>;\n\n /**\n * Clear all threads\n */\n clearAllThreads: () => Promise<void>;\n\n /**\n * Whether there are pending changes waiting to be saved\n */\n hasPendingChanges: boolean;\n\n // ============================================\n // Utilities\n // ============================================\n\n /**\n * Get messages for the current thread (convenience getter)\n */\n messages: Message[];\n\n /**\n * Update messages for the current thread (convenience setter)\n */\n setMessages: (messages: Message[]) => Promise<void>;\n}\n\n// Singleton manager for when no custom config is provided\nlet defaultManager: ReactThreadManager | null = null;\n\nfunction getDefaultManager(): ReactThreadManager {\n if (!defaultManager) {\n defaultManager = createReactThreadManager();\n }\n return defaultManager;\n}\n\n// Singleton manager for internal use (with localStorage persistence)\nlet internalManager: ReactThreadManager | null = null;\n\nfunction getInternalManager(\n config: UseThreadManagerConfig,\n): ReactThreadManager {\n if (!internalManager) {\n internalManager = createReactThreadManager(\n {\n adapter: config.adapter,\n saveDebounce: config.saveDebounce,\n autoLoad: config.autoLoad,\n autoRestoreLastThread: config.autoRestoreLastThread,\n },\n config.callbacks,\n );\n }\n return internalManager;\n}\n\n/**\n * useThreadManager - React hook for thread management\n *\n * Provides thread CRUD operations with localStorage persistence by default.\n *\n * @example Basic usage (localStorage by default)\n * ```tsx\n * function App() {\n * const {\n * threads,\n * currentThread,\n * createThread,\n * switchThread,\n * updateCurrentThread,\n * } = useThreadManager();\n *\n * return (\n * <CopilotProvider\n * runtimeUrl=\"/api/chat\"\n * threadId={currentThread?.id}\n * initialMessages={currentThread?.messages}\n * onMessagesChange={(msgs) => updateCurrentThread({ messages: msgs })}\n * >\n * <ThreadPicker\n * value={currentThread?.id}\n * threads={threads}\n * onSelect={switchThread}\n * onNewThread={() => createThread()}\n * />\n * <Chat />\n * </CopilotProvider>\n * );\n * }\n * ```\n *\n * @example With custom adapter\n * ```tsx\n * const { threads } = useThreadManager({\n * adapter: myDatabaseAdapter,\n * });\n * ```\n *\n * @example With callbacks\n * ```tsx\n * const { threads } = useThreadManager({\n * callbacks: {\n * onThreadCreated: (thread) => console.log('Created:', thread.id),\n * onError: (error) => console.error('Error:', error),\n * },\n * });\n * ```\n */\nexport function useThreadManager(\n config?: UseThreadManagerConfig,\n): UseThreadManagerReturn {\n // Get or create manager - use singletons for stability\n const manager = useMemo(() => {\n // Use default manager if no config provided\n if (!config) {\n return getDefaultManager();\n }\n\n // Use internal singleton for configs without custom adapter\n // This ensures the same manager is used across all components\n if (!config.adapter) {\n return getInternalManager(config);\n }\n\n // For custom adapters, create a new manager\n // (This is rare and usually for server-side persistence)\n console.log(\"[useThreadManager] Creating new manager with custom adapter\");\n return createReactThreadManager(\n {\n adapter: config.adapter,\n saveDebounce: config.saveDebounce,\n autoLoad: config.autoLoad,\n autoRestoreLastThread: config.autoRestoreLastThread,\n },\n config.callbacks,\n );\n }, [\n config?.adapter,\n config?.saveDebounce,\n config?.autoLoad,\n config?.autoRestoreLastThread,\n // Note: callbacks are intentionally not in deps to avoid recreating manager\n ]);\n\n // Subscribe to state changes using useSyncExternalStore\n // Server snapshots return stable initial values to prevent hydration mismatch\n const threads = useSyncExternalStore(\n manager.subscribe,\n manager.getThreadsSnapshot,\n manager.getThreadsServerSnapshot, // SSR - always empty array\n );\n\n const currentThread = useSyncExternalStore(\n manager.subscribe,\n manager.getCurrentThreadSnapshot,\n manager.getCurrentThreadServerSnapshot, // SSR - always null\n );\n\n const currentThreadId = useSyncExternalStore(\n manager.subscribe,\n manager.getCurrentThreadIdSnapshot,\n manager.getCurrentThreadIdServerSnapshot, // SSR - always null\n );\n\n const loadStatus = useSyncExternalStore(\n manager.subscribe,\n manager.getLoadStatusSnapshot,\n manager.getLoadStatusServerSnapshot, // SSR - always \"idle\"\n );\n\n const error = useSyncExternalStore(\n manager.subscribe,\n manager.getErrorSnapshot,\n manager.getErrorServerSnapshot, // SSR - always undefined\n );\n\n const isLoading = useSyncExternalStore(\n manager.subscribe,\n manager.getIsLoadingSnapshot,\n manager.getIsLoadingServerSnapshot, // SSR - always false\n );\n\n // Cleanup on unmount (only for custom adapters, NOT internal singleton)\n useEffect(() => {\n return () => {\n // Don't dispose default or internal singleton managers\n // They should persist across component mounts\n if (\n config?.adapter &&\n manager !== defaultManager &&\n manager !== internalManager\n ) {\n manager.dispose();\n }\n };\n }, [manager, config]);\n\n // Save pending changes before page unload\n useEffect(() => {\n const handleBeforeUnload = () => {\n if (manager.hasPendingChanges) {\n // Synchronous save attempt - saveNow is async but we try anyway\n manager.saveNow().catch(() => {\n // Can't do much here, but at least we tried\n });\n }\n };\n\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"beforeunload\", handleBeforeUnload);\n return () => {\n window.removeEventListener(\"beforeunload\", handleBeforeUnload);\n };\n }\n }, [manager]);\n\n // ============================================\n // Memoized Actions\n // ============================================\n\n const createThread = useCallback(\n (options?: CreateThreadOptions) => manager.createThread(options),\n [manager],\n );\n\n const switchThread = useCallback(\n (id: string) => manager.switchThread(id),\n [manager],\n );\n\n const updateCurrentThread = useCallback(\n (updates: UpdateThreadOptions) => manager.updateCurrentThread(updates),\n [manager],\n );\n\n const deleteThread = useCallback(\n (id: string) => manager.deleteThread(id),\n [manager],\n );\n\n const clearCurrentThread = useCallback(\n () => manager.clearCurrentThread(),\n [manager],\n );\n\n const refreshThreads = useCallback(() => manager.loadThreads(), [manager]);\n\n const saveNow = useCallback(() => manager.saveNow(), [manager]);\n\n const clearAllThreads = useCallback(\n () => manager.clearAllThreads(),\n [manager],\n );\n\n // ============================================\n // Convenience Utilities\n // ============================================\n\n const messages = useMemo(\n () => currentThread?.messages ?? [],\n [currentThread],\n );\n\n const setMessages = useCallback(\n (newMessages: Message[]) => updateCurrentThread({ messages: newMessages }),\n [updateCurrentThread],\n );\n\n // hasPendingChanges is a direct read (not reactive, but useful for save-on-unload)\n const hasPendingChanges = manager.hasPendingChanges;\n\n return {\n // State\n threads,\n currentThread,\n currentThreadId,\n isLoading,\n loadStatus,\n error,\n\n // Actions\n createThread,\n switchThread,\n updateCurrentThread,\n deleteThread,\n clearCurrentThread,\n refreshThreads,\n saveNow,\n clearAllThreads,\n\n // Utilities\n messages,\n setMessages,\n hasPendingChanges,\n };\n}\n","\"use client\";\n\nimport type {\n ToolPermission,\n PermissionStorageAdapter,\n PermissionStorageConfig,\n PermissionLevel,\n} from \"../../core\";\n\nconst DEFAULT_KEY_PREFIX = \"yourgpt-permissions\";\n\n/**\n * Create a permission storage adapter based on config\n */\nexport function createPermissionStorage(\n config: PermissionStorageConfig,\n): PermissionStorageAdapter {\n switch (config.type) {\n case \"localStorage\":\n return createBrowserStorageAdapter(\n typeof window !== \"undefined\" ? localStorage : null,\n config.keyPrefix,\n );\n case \"sessionStorage\":\n return createBrowserStorageAdapter(\n typeof window !== \"undefined\" ? sessionStorage : null,\n config.keyPrefix,\n );\n case \"memory\":\n default:\n return createMemoryStorageAdapter();\n }\n}\n\n/**\n * Browser storage adapter (localStorage or sessionStorage)\n */\nfunction createBrowserStorageAdapter(\n storage: Storage | null,\n keyPrefix = DEFAULT_KEY_PREFIX,\n): PermissionStorageAdapter {\n const getStorageKey = () => keyPrefix;\n\n const loadPermissions = (): Map<string, ToolPermission> => {\n if (!storage) return new Map();\n try {\n const data = storage.getItem(getStorageKey());\n if (!data) return new Map();\n const parsed = JSON.parse(data) as ToolPermission[];\n return new Map(parsed.map((p) => [p.toolName, p]));\n } catch {\n return new Map();\n }\n };\n\n const savePermissions = (permissions: Map<string, ToolPermission>): void => {\n if (!storage) return;\n try {\n storage.setItem(\n getStorageKey(),\n JSON.stringify(Array.from(permissions.values())),\n );\n } catch (e) {\n console.warn(\"[PermissionStorage] Failed to save permissions:\", e);\n }\n };\n\n return {\n async get(toolName: string): Promise<ToolPermission | null> {\n const permissions = loadPermissions();\n return permissions.get(toolName) || null;\n },\n\n async set(permission: ToolPermission): Promise<void> {\n const permissions = loadPermissions();\n permissions.set(permission.toolName, permission);\n savePermissions(permissions);\n },\n\n async remove(toolName: string): Promise<void> {\n const permissions = loadPermissions();\n permissions.delete(toolName);\n savePermissions(permissions);\n },\n\n async getAll(): Promise<ToolPermission[]> {\n const permissions = loadPermissions();\n return Array.from(permissions.values());\n },\n\n async clear(): Promise<void> {\n if (!storage) return;\n storage.removeItem(getStorageKey());\n },\n };\n}\n\n/**\n * In-memory storage adapter (for SSR or testing)\n */\nfunction createMemoryStorageAdapter(): PermissionStorageAdapter {\n const permissions = new Map<string, ToolPermission>();\n\n return {\n async get(toolName: string): Promise<ToolPermission | null> {\n return permissions.get(toolName) || null;\n },\n\n async set(permission: ToolPermission): Promise<void> {\n permissions.set(permission.toolName, permission);\n },\n\n async remove(toolName: string): Promise<void> {\n permissions.delete(toolName);\n },\n\n async getAll(): Promise<ToolPermission[]> {\n return Array.from(permissions.values());\n },\n\n async clear(): Promise<void> {\n permissions.clear();\n },\n };\n}\n\n/**\n * Create a session-only permission cache\n * Used for \"session\" permission level (in-memory, cleared on page close)\n */\nexport function createSessionPermissionCache(): Map<string, PermissionLevel> {\n return new Map<string, PermissionLevel>();\n}\n","/**\n * ReactChat - React-specific wrapper for AbstractChat\n *\n * This class extends the new AbstractChat from @yourgpt/copilot-sdk-chat\n * and injects ReactChatState for React-specific state management.\n *\n * Pattern inspired by Vercel AI SDK's Chat class.\n */\n\nimport {\n AbstractChat,\n type ChatConfig,\n type ChatCallbacks,\n type UIMessage,\n type ChatInit,\n type ChatEventHandler,\n} from \"../../chat\";\nimport { ReactChatState } from \"./ReactChatState\";\n\n/**\n * Chat status for UI state\n */\nexport type ChatStatus = \"ready\" | \"submitted\" | \"streaming\" | \"error\";\n\n/**\n * ReactChat configuration\n */\nexport interface ReactChatConfig {\n /** Runtime API endpoint */\n runtimeUrl: string;\n /** System prompt */\n systemPrompt?: string;\n /** LLM configuration */\n llm?: ChatConfig[\"llm\"];\n /** Thread ID */\n threadId?: string;\n /** Enable streaming (default: true) */\n streaming?: boolean;\n /** Request headers */\n headers?: Record<string, string>;\n /** Initial messages */\n initialMessages?: UIMessage[];\n /** Debug mode */\n debug?: boolean;\n /** Callbacks */\n callbacks?: ChatCallbacks<UIMessage>;\n}\n\n/**\n * ReactChat extends AbstractChat with React-specific state management.\n *\n * Uses ReactChatState which implements ChatState interface with\n * callback-based reactivity for useSyncExternalStore.\n *\n * @example\n * ```tsx\n * const chatRef = useRef(new ReactChat(config));\n *\n * const messages = useSyncExternalStore(\n * chatRef.current.subscribe,\n * () => chatRef.current.messages\n * );\n * ```\n */\nexport class ReactChat extends AbstractChat<UIMessage> {\n private reactState: ReactChatState<UIMessage>;\n\n constructor(config: ReactChatConfig) {\n // Create React-specific state\n const reactState = new ReactChatState<UIMessage>(config.initialMessages);\n\n // Build ChatInit for AbstractChat\n const init: ChatInit<UIMessage> = {\n runtimeUrl: config.runtimeUrl,\n systemPrompt: config.systemPrompt,\n llm: config.llm,\n threadId: config.threadId,\n streaming: config.streaming ?? true,\n headers: config.headers,\n initialMessages: config.initialMessages,\n state: reactState,\n callbacks: config.callbacks,\n debug: config.debug,\n };\n\n super(init);\n this.reactState = reactState;\n }\n\n // ============================================\n // Subscribe (for useSyncExternalStore)\n // ============================================\n\n /**\n * Subscribe to state changes.\n * Returns an unsubscribe function.\n *\n * @example\n * ```tsx\n * const messages = useSyncExternalStore(\n * chat.subscribe,\n * () => chat.messages\n * );\n * ```\n */\n subscribe = (callback: () => void): (() => void) => {\n return this.reactState.subscribe(callback);\n };\n\n // ============================================\n // Event handling shortcuts\n // ============================================\n\n /**\n * Subscribe to tool calls events\n */\n onToolCalls(handler: ChatEventHandler<\"toolCalls\">): () => void {\n return this.on(\"toolCalls\", handler);\n }\n\n /**\n * Subscribe to done events\n */\n onDone(handler: ChatEventHandler<\"done\">): () => void {\n return this.on(\"done\", handler);\n }\n\n /**\n * Subscribe to error events\n */\n onError(handler: ChatEventHandler<\"error\">): () => void {\n return this.on(\"error\", handler);\n }\n\n // ============================================\n // Override dispose to clean up state\n // ============================================\n\n dispose(): void {\n super.dispose();\n this.reactState.dispose();\n }\n}\n\n/**\n * Create a ReactChat instance\n */\nexport function createReactChat(config: ReactChatConfig): ReactChat {\n return new ReactChat(config);\n}\n","\"use client\";\n\n/**\n * useChat - React hook for chat functionality\n *\n * This hook uses ReactChat with useSyncExternalStore for optimal\n * React integration. Inspired by Vercel AI SDK's useChat pattern.\n */\n\nimport {\n useRef,\n useSyncExternalStore,\n useCallback,\n useEffect,\n useState,\n} from \"react\";\nimport { ReactChat, createReactChat, type ReactChatConfig } from \"./ReactChat\";\nimport type { UIMessage, ChatStatus } from \"../../chat\";\nimport type { MessageAttachment } from \"../../core\";\n\n/**\n * Hook configuration\n */\nexport interface UseChatConfig extends Omit<ReactChatConfig, \"callbacks\"> {\n /** Callback when messages change */\n onMessagesChange?: (messages: UIMessage[]) => void;\n /** Callback when error occurs */\n onError?: (error: Error | null) => void;\n /** Callback when generation finishes */\n onFinish?: (messages: UIMessage[]) => void;\n /** Callback when tool calls are received */\n onToolCalls?: (toolCalls: UIMessage[\"toolCalls\"]) => void;\n}\n\n/**\n * Hook return type\n */\nexport interface UseChatReturn {\n /** All messages */\n messages: UIMessage[];\n /** Current status */\n status: ChatStatus;\n /** Current error */\n error: Error | undefined;\n /** Whether loading */\n isLoading: boolean;\n /** Current input value */\n input: string;\n /** Set input value */\n setInput: (input: string) => void;\n /** Send a message */\n sendMessage: (\n content: string,\n attachments?: MessageAttachment[],\n ) => Promise<void>;\n /** Stop generation */\n stop: () => void;\n /** Clear all messages */\n clearMessages: () => void;\n /** Set messages directly */\n setMessages: (messages: UIMessage[]) => void;\n /** Regenerate last response */\n regenerate: (messageId?: string) => Promise<void>;\n /** Continue with tool results */\n continueWithToolResults: (\n toolResults: Array<{ toolCallId: string; result: unknown }>,\n ) => Promise<void>;\n /** Reference to the ReactChat instance */\n chatRef: React.RefObject<ReactChat | null>;\n}\n\n/**\n * useChat - Thin React wrapper using useSyncExternalStore\n *\n * This hook is designed to be minimal (~100 lines like Vercel AI SDK).\n * All business logic lives in ReactChat/AbstractChat.\n *\n * @example\n * ```tsx\n * const { messages, sendMessage, status } = useChat({\n * runtimeUrl: \"/api/chat\",\n * });\n *\n * return (\n * <div>\n * {messages.map(m => <Message key={m.id} message={m} />)}\n * <button onClick={() => sendMessage(\"Hello!\")}>Send</button>\n * </div>\n * );\n * ```\n */\nexport function useChat(config: UseChatConfig): UseChatReturn {\n // Create and store ReactChat instance\n const chatRef = useRef<ReactChat | null>(null);\n\n // Local input state (UI concern)\n const [input, setInput] = useState(\"\");\n\n // Initialize chat on first render\n if (chatRef.current === null) {\n chatRef.current = createReactChat({\n runtimeUrl: config.runtimeUrl,\n systemPrompt: config.systemPrompt,\n llm: config.llm,\n threadId: config.threadId,\n streaming: config.streaming,\n headers: config.headers,\n initialMessages: config.initialMessages,\n debug: config.debug,\n callbacks: {\n onMessagesChange: config.onMessagesChange,\n onError: config.onError,\n onFinish: config.onFinish,\n onToolCalls: config.onToolCalls,\n },\n });\n }\n\n // Subscribe to all state changes with useSyncExternalStore\n const messages = useSyncExternalStore(\n chatRef.current.subscribe,\n () => chatRef.current!.messages,\n () => chatRef.current!.messages, // Server snapshot\n );\n\n const status = useSyncExternalStore(\n chatRef.current.subscribe,\n () => chatRef.current!.status,\n () => \"ready\" as ChatStatus, // Server snapshot\n );\n\n const error = useSyncExternalStore(\n chatRef.current.subscribe,\n () => chatRef.current!.error,\n () => undefined, // Server snapshot\n );\n\n // Derived state\n const isLoading = status === \"streaming\" || status === \"submitted\";\n\n // Actions (stable references)\n const sendMessage = useCallback(\n async (content: string, attachments?: MessageAttachment[]) => {\n await chatRef.current?.sendMessage(content, attachments);\n setInput(\"\"); // Clear input after sending\n },\n [],\n );\n\n const stop = useCallback(() => {\n chatRef.current?.stop();\n }, []);\n\n const clearMessages = useCallback(() => {\n chatRef.current?.clearMessages();\n }, []);\n\n const setMessages = useCallback((messages: UIMessage[]) => {\n chatRef.current?.setMessages(messages);\n }, []);\n\n const regenerate = useCallback(async (messageId?: string) => {\n await chatRef.current?.regenerate(messageId);\n }, []);\n\n const continueWithToolResults = useCallback(\n async (toolResults: Array<{ toolCallId: string; result: unknown }>) => {\n await chatRef.current?.continueWithToolResults(toolResults);\n },\n [],\n );\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n chatRef.current?.dispose();\n };\n }, []);\n\n return {\n messages,\n status,\n error,\n isLoading,\n input,\n setInput,\n sendMessage,\n stop,\n clearMessages,\n setMessages,\n regenerate,\n continueWithToolResults,\n chatRef,\n };\n}\n"]}
|