@yourgpt/copilot-sdk 2.1.6 → 2.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-SMNZHZM7.js → chunk-H3LX6FTP.js} +3 -3
- package/dist/{chunk-SMNZHZM7.js.map → chunk-H3LX6FTP.js.map} +1 -1
- package/dist/{chunk-6ZTITCKU.cjs → chunk-IDAQU3FP.cjs} +16 -3
- package/dist/chunk-IDAQU3FP.cjs.map +1 -0
- package/dist/{chunk-2JNH3T6H.js → chunk-ISOMZAYN.js} +16 -3
- package/dist/chunk-ISOMZAYN.js.map +1 -0
- package/dist/{chunk-HIVSXIER.cjs → chunk-JFVTY757.cjs} +16 -16
- package/dist/{chunk-HIVSXIER.cjs.map → chunk-JFVTY757.cjs.map} +1 -1
- package/dist/experimental/index.cjs +2 -2
- package/dist/experimental/index.js +1 -1
- package/dist/react/index.cjs +62 -62
- package/dist/react/index.d.cts +4 -0
- package/dist/react/index.d.ts +4 -0
- package/dist/react/index.js +2 -2
- package/dist/styles.css +21 -0
- package/dist/ui/index.cjs +5 -5
- package/dist/ui/index.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-2JNH3T6H.js.map +0 -1
- package/dist/chunk-6ZTITCKU.cjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/chat/types/tool.ts","../src/chat/functions/stream/parseSSE.ts","../src/chat/functions/stream/processChunk.ts","../src/chat/functions/message/createMessage.ts","../src/core/utils/resolvable.ts","../src/chat/adapters/HttpTransport.ts","../src/chat/interfaces/ChatState.ts","../src/chat/optimizations.ts","../src/chat/classes/AbstractChat.ts","../src/chat/AbstractAgentLoop.ts","../src/chat/branching/MessageTree.ts","../src/chat/ChatWithTools.ts","../src/react/internal/ReactChatState.ts","../src/react/hooks/useMCPClient.ts","../src/react/internal/ReactChatWithTools.ts","../src/react/utils/context-tree.ts","../src/react/message-history/context.ts","../src/react/message-history/message-utils.ts","../src/react/message-history/token-counter.ts","../src/react/message-history/strategies/sliding-window.ts","../src/react/message-history/strategies/selective-prune.ts","../src/react/message-history/strategies/summary-buffer.ts","../src/react/message-history/session-persistence.ts","../src/react/message-history/useMessageHistory.ts","../src/react/skill/SkillContext.tsx","../src/react/hooks/useAIContext.ts","../src/react/hooks/useTool.ts","../src/react/skill/SkillProvider.tsx","../src/react/provider/CopilotProvider.tsx","../src/react/hooks/useMCPTools.ts"],"names":["visibleMessages","estimateMessageTokens","estimateTokens","useState","useRef","useEffect","useCallback","createContext","useContext","useMemo","error","status","skills","messages","React","jsx","jsxs"],"mappings":"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","file":"chunk-2JNH3T6H.js","sourcesContent":["/**\n * Tool Types\n *\n * Types for tool execution and agent loop.\n */\n\nimport type { ToolDefinition, PermissionLevel, ToolSource } 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 /**\n * Source/origin of the tool.\n * Used to distinguish MCP tools from native/custom tools for UI rendering.\n */\n source?: ToolSource;\n result?: unknown;\n error?: string;\n startedAt?: Date;\n completedAt?: Date;\n /** Title shown in approval UI (from tool's approvalTitle) */\n approvalTitle?: string;\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 * Whether this tool execution should be hidden from the UI.\n * When true, the tool won't appear in the chat, but still executes normally.\n */\n hidden?: boolean;\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 * 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 // Don't overwrite messageId - keep the client-generated ID\n // since that's what's stored in the messages array.\n // The server's ID is ignored to maintain consistency with updateMessageById.\n return state;\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 // Handle tool action events from server\n case \"action:start\": {\n const newResults = new Map(state.toolResults);\n newResults.set(chunk.id, {\n id: chunk.id,\n name: chunk.name,\n status: \"executing\",\n hidden: chunk.hidden,\n });\n return { ...state, toolResults: newResults };\n }\n\n case \"action:args\": {\n const existing = state.toolResults.get(chunk.id);\n if (existing) {\n const newResults = new Map(state.toolResults);\n try {\n newResults.set(chunk.id, {\n ...existing,\n args: JSON.parse(chunk.args),\n });\n } catch {\n // Keep existing args if parse fails\n }\n return { ...state, toolResults: newResults };\n }\n return state;\n }\n\n case \"action:end\": {\n const existing = state.toolResults.get(chunk.id);\n const newResults = new Map(state.toolResults);\n newResults.set(chunk.id, {\n id: chunk.id,\n name: chunk.name,\n status: chunk.error ? \"failed\" : \"completed\",\n args: existing?.args,\n result: chunk.result,\n error: chunk.error,\n });\n return { ...state, toolResults: newResults };\n }\n\n case \"tool:result\": {\n const existing = state.toolResults.get(chunk.id);\n const newResults = new Map(state.toolResults);\n newResults.set(chunk.id, {\n id: chunk.id,\n name: chunk.name,\n status: chunk.result?.success ? \"completed\" : \"failed\",\n args: existing?.args,\n result: chunk.result,\n error: chunk.result?.error,\n });\n return { ...state, toolResults: newResults };\n }\n\n case \"citation\": {\n // Append new citations to existing ones\n return {\n ...state,\n citations: [...state.citations, ...chunk.citations],\n };\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 toolResults: new Map(),\n citations: [],\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 * @param options - Optional branching options\n * @returns New user message\n */\nexport function createUserMessage(\n content: string,\n attachments?: MessageAttachment[],\n options?: {\n parentId?: string | null;\n },\n): UIMessage {\n return {\n id: generateMessageId(),\n role: \"user\",\n content,\n attachments,\n createdAt: new Date(),\n ...(options?.parentId !== undefined ? { parentId: options.parentId } : {}),\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 // Convert tool results to toolExecutions format for UI\n // This enables server-side tool results to be used by components like SourceGroup\n const toolExecutions =\n state.toolResults.size > 0\n ? Array.from(state.toolResults.values()).map((tr) => ({\n id: tr.id,\n name: tr.name,\n args: tr.args ?? {},\n status: tr.status,\n result: tr.result,\n error: tr.error,\n timestamp: Date.now(),\n }))\n : undefined;\n\n // Build metadata object\n const metadata: Record<string, unknown> = {};\n if (toolExecutions) {\n metadata.toolExecutions = toolExecutions;\n }\n if (state.citations && state.citations.length > 0) {\n metadata.citations = state.citations;\n }\n\n return {\n id: state.messageId,\n role: \"assistant\" as const,\n content: state.content,\n thinking: state.thinking || undefined,\n toolCalls,\n createdAt: new Date(),\n // Store tool executions and citations in metadata for UI components\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n };\n}\n\n/**\n * Create an empty assistant message (for streaming)\n *\n * @param id - Optional message ID\n * @param options - Optional branching options\n * @returns Empty assistant message\n */\nexport function createEmptyAssistantMessage(\n id?: string,\n options?: {\n parentId?: string | null;\n },\n): UIMessage {\n return {\n id: id ?? generateMessageId(),\n role: \"assistant\",\n content: \"\",\n createdAt: new Date(),\n ...(options?.parentId !== undefined ? { parentId: options.parentId } : {}),\n };\n}\n","/**\n * Resolvable - Type utility for values that can be static or dynamic\n *\n * This pattern allows SDK consumers to pass either:\n * - Static value: `headers: { \"x-api-key\": \"abc123\" }`\n * - Getter function: `headers: () => ({ \"x-api-key\": getToken() })`\n *\n * Values are resolved at request time, ensuring fresh data on every API call.\n * This is the modern pattern used by tanstack-query, tRPC, and axios interceptors.\n *\n * @example\n * ```tsx\n * // Static (for values that never change)\n * <CopilotProvider headers={{ \"x-api-key\": \"static-key\" }} />\n *\n * // Dynamic (for values that change at runtime)\n * <CopilotProvider\n * headers={() => ({\n * Authorization: `Bearer ${getToken()}`,\n * ...getCustomHeaders(),\n * })}\n * />\n * ```\n */\n\n/**\n * A value that can be either static or a getter function\n * Getter can be sync or async for flexibility\n */\nexport type Resolvable<T> = T | (() => T) | (() => Promise<T>);\n\n/**\n * Check if a value is a getter function\n */\nexport function isGetter<T>(\n value: Resolvable<T>,\n): value is (() => T) | (() => Promise<T>) {\n return typeof value === \"function\";\n}\n\n/**\n * Resolve a potentially dynamic value\n * Handles: static value, sync getter, or async getter\n * Optimized: skips async overhead for static values\n */\nexport async function resolveValue<T>(value: Resolvable<T>): Promise<T> {\n if (!isGetter(value)) {\n return value;\n }\n try {\n return await value();\n } catch (error) {\n console.error(\"[Copilot SDK] Error resolving dynamic config value:\", error);\n throw error;\n }\n}\n\n/**\n * Resolve multiple values in parallel\n * Optimized: only uses Promise.all if there are actual getters\n */\nexport async function resolveValues<\n T extends Record<string, Resolvable<unknown>>,\n>(\n values: T,\n): Promise<{ [K in keyof T]: T[K] extends Resolvable<infer U> ? U : T[K] }> {\n const entries = Object.entries(values);\n const hasGetters = entries.some(([, v]) => isGetter(v));\n\n if (!hasGetters) {\n // Fast path: no getters, return as-is\n return values as {\n [K in keyof T]: T[K] extends Resolvable<infer U> ? U : T[K];\n };\n }\n\n // Resolve all values in parallel\n const resolved = await Promise.all(\n entries.map(async ([key, val]) => [key, await resolveValue(val)]),\n );\n\n return Object.fromEntries(resolved) as {\n [K in keyof T]: T[K] extends Resolvable<infer U> ? U : T[K];\n };\n}\n\n/**\n * Resolve a potentially dynamic value (sync only)\n * Use when you know the getter is synchronous\n */\nexport function resolveValueSync<T>(value: T | (() => T)): T {\n if (typeof value === \"function\") {\n return (value as () => T)();\n }\n return value;\n}\n\n/**\n * Type to extract the resolved type from a Resolvable\n */\nexport type ResolvedType<T> = T extends Resolvable<infer U> ? U : T;\n","/**\n * HttpTransport - HTTP/SSE implementation of ChatTransport\n *\n * Uses fetch with streaming for SSE responses.\n * Supports dynamic configuration via getter functions.\n */\n\nimport type {\n ChatTransport,\n ChatRequest,\n ChatResponse,\n StreamChunk,\n TransportConfig,\n} from \"../interfaces\";\nimport { parseSSELine } from \"../functions\";\nimport { resolveValues } from \"../../core/utils/resolvable\";\n\n/**\n * HTTP Transport for chat API\n *\n * Supports both static and dynamic configuration. When using getter functions,\n * values are resolved fresh on every request.\n *\n * @example\n * ```typescript\n * // Static config\n * const transport = new HttpTransport({\n * url: '/api/chat',\n * headers: { \"x-api-key\": \"static\" },\n * });\n *\n * // Dynamic config (recommended for auth/runtime values)\n * const transport = new HttpTransport({\n * url: () => getApiEndpoint(),\n * headers: () => ({\n * Authorization: `Bearer ${getToken()}`,\n * ...getCustomHeaders(),\n * }),\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 * Resolves dynamic config values (url, headers, body) fresh at request time\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 // Resolve dynamic values at request time (not constructor time)\n // This ensures fresh values on every request\n // Optimized: skips async overhead if all values are static\n const resolved = await resolveValues({\n url: this.config.url,\n headers: this.config.headers ?? {},\n configBody: this.config.body ?? {},\n });\n\n const response = await fetch(resolved.url as string, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(resolved.headers as Record<string, string>),\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 __skills: request.__skills,\n ...(resolved.configBody as Record<string, unknown>),\n ...request.body,\n }),\n signal: this.abortController.signal,\n });\n\n if (!response.ok) {\n let errorMessage = `HTTP ${response.status}`;\n try {\n const errorBody = await response.json();\n // Try user-provided parser first, then fall back to default extraction\n const custom = this.config.parseError?.(response.status, errorBody);\n errorMessage =\n custom ??\n errorBody?.message ??\n errorBody?.error ??\n JSON.stringify(errorBody);\n } catch {\n const text = await response.text();\n if (text) errorMessage = text;\n }\n throw new Error(errorMessage);\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 * Update headers configuration\n * Can be static headers or a getter function for dynamic resolution\n *\n * @example\n * ```typescript\n * // Static\n * transport.setHeaders({ \"x-api-key\": \"new-key\" });\n *\n * // Dynamic (resolved fresh on each request)\n * transport.setHeaders(() => ({ Authorization: `Bearer ${getToken()}` }));\n * ```\n */\n setHeaders(headers: TransportConfig[\"headers\"]): void {\n this.config.headers = headers;\n }\n\n /**\n * Update URL configuration\n * Can be static URL or a getter function for dynamic resolution\n */\n setUrl(url: TransportConfig[\"url\"]): void {\n this.config.url = url;\n }\n\n /**\n * Update body configuration\n * Additional properties merged into every request body\n */\n setBody(body: TransportConfig[\"body\"]): void {\n this.config.body = body;\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 * 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\";\nimport type { BranchInfo } from \"../branching\";\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 * Update a specific message by ID\n * Returns true if message was found and updated, false otherwise\n */\n updateMessageById(id: string, updater: (message: T) => T): boolean;\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 // Branching Extensions (optional — only ReactChatState implements these)\n // ============================================\n\n /**\n * Set the current leaf message ID.\n * Used by regenerate() to rewind the active path before pushing a new response.\n */\n setCurrentLeaf?(leafId: string | null): void;\n\n /**\n * Get all messages across all branches (for persistence).\n * The base messages getter returns only the visible path.\n */\n getAllMessages?(): T[];\n\n /**\n * Get branch navigation info for a message.\n * Returns null if the message has no siblings.\n */\n getBranchInfo?(messageId: string): BranchInfo | null;\n\n /**\n * Navigate to a specific message variant (sibling branch).\n * Updates the active path to go through messageId.\n */\n switchBranch?(messageId: string): void;\n\n /**\n * Whether any message has siblings (branching has occurred).\n */\n readonly hasBranches?: boolean;\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 updateMessageById(id: string, updater: (message: T) => T): boolean {\n const index = this._messages.findIndex((m) => m.id === id);\n if (index === -1) return false;\n this.replaceMessage(index, updater(this._messages[index]));\n return true;\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","import type {\n ContextUsage,\n ContextSummarizationConfig,\n ToolDefinition,\n ToolOptimizationConfig,\n ToolResultTruncationConfig,\n ToolTruncationStrategy,\n} from \"../core\";\nimport type { ChatRequest } from \"./interfaces\";\nimport type { UIMessage } from \"./types\";\n\nconst DEFAULT_CHARS_PER_TOKEN = 4;\nconst DEFAULT_SAFETY_MARGIN = 1.2;\nconst DEFAULT_INPUT_HEADROOM_RATIO = 0.75;\nconst DEFAULT_SYSTEM_PROMPT_SHARE = 0.15;\nconst DEFAULT_HISTORY_SHARE = 0.5;\nconst DEFAULT_TOOL_RESULTS_SHARE = 0.3;\nconst DEFAULT_TOOL_DEFINITIONS_SHARE = 0.05;\nconst DEFAULT_MAX_TOOL_RESULT_CONTEXT_SHARE = 0.3;\nconst DEFAULT_TOOL_RESULT_HARD_MAX_CHARS = 400_000;\nconst DEFAULT_TOOL_RESULT_MIN_KEEP_CHARS = 2_000;\nconst DEFAULT_TOOL_RESULT_STRATEGY: ToolTruncationStrategy = \"head-tail\";\nconst DEFAULT_RECENT_HISTORY_PRESERVE = 6;\nconst TOOL_RESULT_TRUNCATION_NOTICE =\n \"\\n\\n[tool result truncated to fit prompt budget]\";\nconst TOOL_RESULT_COMPACTION_NOTICE =\n \"[tool result compacted to preserve context budget]\";\nconst SYSTEM_PROMPT_TRUNCATION_NOTICE =\n \"\\n\\n[system prompt truncated to fit prompt budget]\";\nconst HISTORY_SUMMARY_HEADER = \"Conversation summary of earlier context:\";\nconst HISTORY_SUMMARY_COMPACTION_NOTICE =\n \"\\n\\n[summary compacted to preserve context continuity]\";\nconst DEFAULT_SUMMARY_TRIGGER = 12;\nconst DEFAULT_SUMMARY_CHUNK_SIZE = 10;\nconst DEFAULT_SUMMARY_MAX_CHARS = 1_600;\nconst SUMMARY_STOP_WORDS = new Set([\n \"about\",\n \"after\",\n \"again\",\n \"also\",\n \"because\",\n \"been\",\n \"before\",\n \"being\",\n \"could\",\n \"from\",\n \"have\",\n \"into\",\n \"just\",\n \"more\",\n \"need\",\n \"only\",\n \"over\",\n \"same\",\n \"some\",\n \"than\",\n \"that\",\n \"their\",\n \"them\",\n \"then\",\n \"there\",\n \"these\",\n \"they\",\n \"this\",\n \"those\",\n \"through\",\n \"under\",\n \"very\",\n \"want\",\n \"were\",\n \"what\",\n \"when\",\n \"where\",\n \"which\",\n \"while\",\n \"with\",\n \"would\",\n \"your\",\n]);\n\ntype RequestMessage = ChatRequest[\"messages\"][number];\ntype RequestTool = {\n name: string;\n description: string;\n category?: string;\n group?: string;\n deferLoading?: boolean;\n profiles?: string[];\n searchKeywords?: string[];\n inputSchema: unknown;\n};\n\ntype PreparedBuckets = {\n systemPrompt: string | undefined;\n transformedMessages: RequestMessage[];\n historyMessages: RequestMessage[];\n toolResultMessages: RequestMessage[];\n requestTools: RequestTool[] | undefined;\n};\n\nfunction clampRatio(value: number | undefined, fallback: number): number {\n if (!Number.isFinite(value)) {\n return fallback;\n }\n return Math.min(1, Math.max(0, value as number));\n}\n\nfunction unique<T>(values: T[]): T[] {\n return [...new Set(values)];\n}\n\nfunction stringifyContent(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n if (value == null) {\n return \"\";\n }\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nfunction normalizeWhitespace(text: string): string {\n return text.replace(/\\s+/g, \" \").trim();\n}\n\nfunction abbreviateText(text: string, maxChars = 220): string {\n const normalized = normalizeWhitespace(text);\n if (!normalized) {\n return \"\";\n }\n if (normalized.length <= maxChars) {\n return normalized;\n }\n return `${normalized.slice(0, Math.max(1, maxChars - 3)).trimEnd()}...`;\n}\n\nfunction tokenize(text: string): string[] {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9_\\s-]/g, \" \")\n .split(/\\s+/)\n .filter((token) => token.length > 1);\n}\n\nfunction estimateTokens(\n text: string,\n charsPerToken = DEFAULT_CHARS_PER_TOKEN,\n): number {\n if (!text) {\n return 0;\n }\n return Math.ceil(text.length / Math.max(1, charsPerToken));\n}\n\nfunction estimateMessageTokens(\n message: RequestMessage,\n charsPerToken = DEFAULT_CHARS_PER_TOKEN,\n): number {\n const content =\n typeof message.content === \"string\"\n ? message.content\n : JSON.stringify(message.content ?? \"\");\n const toolCalls = message.tool_calls\n ? JSON.stringify(message.tool_calls)\n : \"\";\n const attachments = message.attachments\n ? JSON.stringify(message.attachments)\n : \"\";\n return estimateTokens(\n `${message.role}\\n${content}\\n${toolCalls}\\n${attachments}`,\n charsPerToken,\n );\n}\n\nfunction estimateToolTokens(\n tool: RequestTool,\n charsPerToken = DEFAULT_CHARS_PER_TOKEN,\n): number {\n return estimateTokens(JSON.stringify(tool), charsPerToken);\n}\n\nfunction buildToolQuery(messages: UIMessage[]): string {\n return messages\n .filter(\n (message) => message.role === \"user\" || message.role === \"assistant\",\n )\n .slice(-3)\n .map((message) => message.content)\n .filter(Boolean)\n .join(\" \");\n}\n\nfunction matchesSelector(\n tool: ToolDefinition,\n selector: string,\n activeProfile?: string,\n): boolean {\n const normalized = selector.trim().toLowerCase();\n if (!normalized) {\n return false;\n }\n\n if (normalized === \"*\" || normalized === \"all\") {\n return true;\n }\n if (normalized === tool.name.toLowerCase()) {\n return true;\n }\n if (normalized.startsWith(\"group:\")) {\n return (tool.group ?? \"\").toLowerCase() === normalized.slice(6);\n }\n if (normalized.startsWith(\"category:\")) {\n return (tool.category ?? \"\").toLowerCase() === normalized.slice(9);\n }\n if (normalized.startsWith(\"profile:\")) {\n return (tool.profiles ?? [])\n .map((value) => value.toLowerCase())\n .includes(normalized.slice(8));\n }\n if (activeProfile && normalized === activeProfile.toLowerCase()) {\n return (tool.profiles ?? [])\n .map((value) => value.toLowerCase())\n .includes(normalized);\n }\n return false;\n}\n\nfunction scoreTool(\n tool: ToolDefinition,\n queryTokens: string[],\n activeProfile?: string,\n): number {\n const haystack = [\n tool.name,\n tool.description,\n tool.category,\n tool.group,\n ...(tool.profiles ?? []),\n ...(tool.searchKeywords ?? []),\n ]\n .filter(Boolean)\n .join(\" \")\n .toLowerCase();\n\n let score = tool.deferLoading ? 0 : 2;\n if (activeProfile && tool.profiles?.includes(activeProfile)) {\n score += 2;\n }\n for (const token of queryTokens) {\n if (tool.name.toLowerCase() === token) {\n score += 6;\n } else if (tool.name.toLowerCase().includes(token)) {\n score += 4;\n } else if (haystack.includes(token)) {\n score += 2;\n }\n }\n return score;\n}\n\nfunction truncateText(\n text: string,\n maxChars: number,\n strategy: ToolTruncationStrategy,\n notice = TOOL_RESULT_TRUNCATION_NOTICE,\n): string {\n if (text.length <= maxChars) {\n return text;\n }\n\n const bodyBudget = Math.max(1, maxChars - notice.length);\n if (strategy === \"head\") {\n return text.slice(0, bodyBudget) + notice;\n }\n\n if (strategy === \"head-tail\" || strategy === \"smart\") {\n const tailLooksImportant =\n strategy === \"smart\"\n ? /\\b(error|exception|failed|traceback|summary|result|done|complete)\\b/i.test(\n text.slice(-2000),\n )\n : true;\n if (tailLooksImportant && bodyBudget > 32) {\n const tailBudget = Math.min(Math.floor(bodyBudget * 0.3), 4_000);\n const headBudget = Math.max(1, bodyBudget - tailBudget - 32);\n return (\n text.slice(0, headBudget) +\n \"\\n\\n[... omitted ...]\\n\\n\" +\n text.slice(-tailBudget) +\n notice\n );\n }\n }\n\n return text.slice(0, bodyBudget) + notice;\n}\n\nfunction isHistorySummaryMessage(message: RequestMessage): boolean {\n return (\n message.role === \"system\" &&\n typeof message.content === \"string\" &&\n message.content.startsWith(HISTORY_SUMMARY_HEADER)\n );\n}\n\nfunction collectTopKeywords(messages: RequestMessage[]): string[] {\n const counts = new Map<string, number>();\n for (const message of messages) {\n if (message.role !== \"user\") {\n continue;\n }\n for (const token of tokenize(stringifyContent(message.content))) {\n if (token.length < 3 || SUMMARY_STOP_WORDS.has(token)) {\n continue;\n }\n counts.set(token, (counts.get(token) ?? 0) + 1);\n }\n }\n\n return [...counts.entries()]\n .sort((left, right) => {\n const countDiff = right[1] - left[1];\n if (countDiff !== 0) {\n return countDiff;\n }\n return left[0].localeCompare(right[0]);\n })\n .slice(0, 5)\n .map(([token]) => token);\n}\n\nfunction collectToolCallNames(messages: RequestMessage[]): Map<string, string> {\n const toolCallNames = new Map<string, string>();\n for (const message of messages) {\n if (message.role !== \"assistant\" || !message.tool_calls?.length) {\n continue;\n }\n for (const toolCall of message.tool_calls) {\n const parsedToolCall = toolCall as {\n id?: string;\n function?: { name?: string };\n };\n if (parsedToolCall.id && parsedToolCall.function?.name) {\n toolCallNames.set(parsedToolCall.id, parsedToolCall.function.name);\n }\n }\n }\n return toolCallNames;\n}\n\nfunction compressSummaryContent(\n content: string,\n maxChars: number,\n fallbackBehavior: ContextSummarizationConfig[\"fallbackBehavior\"] | undefined,\n): string {\n if (content.length <= maxChars) {\n return content;\n }\n if (fallbackBehavior === \"error\") {\n throw new Error(\"History summary exceeded configured continuity budget.\");\n }\n if (fallbackBehavior === \"statistical\") {\n const lines = content.split(\"\\n\");\n const retained = lines.filter((line) =>\n /^(Conversation summary|Stats:|- Messages compacted:|- User turns compacted:|- Assistant turns compacted:|- Tool results compacted:|- Latest user request before preserved window:|- Latest assistant response before preserved window:)/.test(\n line,\n ),\n );\n const statistical = retained.join(\"\\n\");\n if (statistical.length <= maxChars) {\n return statistical;\n }\n }\n return truncateText(\n content,\n maxChars,\n \"head\",\n HISTORY_SUMMARY_COMPACTION_NOTICE,\n );\n}\n\nfunction buildHistorySummary(\n messages: RequestMessage[],\n summarization?: ContextSummarizationConfig,\n maxChars = DEFAULT_SUMMARY_MAX_CHARS,\n): RequestMessage | null {\n if (messages.length === 0) {\n return null;\n }\n\n if (summarization?.enabled === false) {\n return null;\n }\n\n const previousSummaries = messages.filter(isHistorySummaryMessage);\n const rawMessages = messages.filter(\n (message) => !isHistorySummaryMessage(message),\n );\n const focusWindowSize = Math.max(\n 1,\n summarization?.chunkSize ?? DEFAULT_SUMMARY_CHUNK_SIZE,\n );\n const detailedThreshold = Math.max(\n 1,\n summarization?.triggerAt ?? DEFAULT_SUMMARY_TRIGGER,\n );\n const focusMessages = rawMessages.slice(-focusWindowSize);\n const userMessages = rawMessages.filter((message) => message.role === \"user\");\n const assistantMessages = rawMessages.filter(\n (message) => message.role === \"assistant\",\n );\n const toolMessages = rawMessages.filter((message) => message.role === \"tool\");\n const recentUser =\n abbreviateText(stringifyContent(userMessages.at(-1)?.content), 240) ||\n \"n/a\";\n const recentAssistant =\n abbreviateText(stringifyContent(assistantMessages.at(-1)?.content), 240) ||\n \"n/a\";\n const recentUserGoals = userMessages\n .slice(-3)\n .map((message) => abbreviateText(stringifyContent(message.content), 180))\n .filter(Boolean);\n const recentAssistantNotes = assistantMessages\n .map((message) => abbreviateText(stringifyContent(message.content), 180))\n .filter(Boolean)\n .slice(-2);\n const toolCallNames = collectToolCallNames(rawMessages);\n const toolActivity = unique([\n ...focusMessages\n .filter((message) => message.role === \"assistant\")\n .flatMap((message) =>\n (message.tool_calls ?? [])\n .map((toolCall) => {\n const parsedToolCall = toolCall as {\n function?: { name?: string };\n };\n return parsedToolCall.function?.name;\n })\n .filter((name): name is string => Boolean(name)),\n ),\n ...toolMessages\n .slice(-2)\n .map((message) => {\n const toolName = message.tool_call_id\n ? toolCallNames.get(message.tool_call_id)\n : undefined;\n const snippet = abbreviateText(stringifyContent(message.content), 120);\n return toolName && snippet\n ? `${toolName}: ${snippet}`\n : (toolName ?? snippet);\n })\n .filter(Boolean),\n ]).slice(-4);\n const priorSummaryCarryForward = previousSummaries\n .map((message) =>\n abbreviateText(\n stringifyContent(message.content).replace(\n `${HISTORY_SUMMARY_HEADER}\\n`,\n \"\",\n ),\n 180,\n ),\n )\n .filter(Boolean)\n .slice(-2);\n const topKeywords =\n rawMessages.length >= detailedThreshold\n ? collectTopKeywords(\n focusMessages.length > 0 ? focusMessages : rawMessages,\n )\n : [];\n\n const lines = [\n HISTORY_SUMMARY_HEADER,\n \"Stats:\",\n `- Messages compacted: ${messages.length}`,\n `- User turns compacted: ${userMessages.length}`,\n `- Assistant turns compacted: ${assistantMessages.length}`,\n `- Tool results compacted: ${toolMessages.length}`,\n ];\n\n if (previousSummaries.length > 0) {\n lines.push(`- Previous summaries merged: ${previousSummaries.length}`);\n }\n if (rawMessages.length > focusMessages.length) {\n lines.push(\n `- Older compacted messages outside the detailed window: ${rawMessages.length - focusMessages.length}`,\n );\n }\n if (topKeywords.length > 0) {\n lines.push(`- Recurring user topics: ${topKeywords.join(\", \")}`);\n }\n if (recentUser !== \"n/a\") {\n lines.push(`- Latest user request before preserved window: ${recentUser}`);\n }\n if (recentAssistant !== \"n/a\") {\n lines.push(\n `- Latest assistant response before preserved window: ${recentAssistant}`,\n );\n }\n if (recentUserGoals.length > 0) {\n lines.push(\"Carry forward user goals:\");\n for (const goal of recentUserGoals) {\n lines.push(`- ${goal}`);\n }\n }\n if (recentAssistantNotes.length > 0) {\n lines.push(\"Carry forward assistant commitments:\");\n for (const note of recentAssistantNotes) {\n lines.push(`- ${note}`);\n }\n }\n if (toolActivity.length > 0) {\n lines.push(\"Recent tool activity:\");\n for (const item of toolActivity) {\n lines.push(`- ${item}`);\n }\n }\n if (priorSummaryCarryForward.length > 0) {\n lines.push(\"Earlier carried-forward context:\");\n for (const item of priorSummaryCarryForward) {\n lines.push(`- ${item}`);\n }\n }\n\n const content = compressSummaryContent(\n lines.join(\"\\n\"),\n maxChars,\n summarization?.fallbackBehavior,\n );\n\n return {\n role: \"system\",\n content,\n };\n}\n\nfunction buildToolDefinitions(\n selectedTools: ToolDefinition[],\n): RequestTool[] | undefined {\n if (selectedTools.length === 0) {\n return undefined;\n }\n\n return selectedTools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n category: tool.category,\n group: tool.group,\n deferLoading: tool.deferLoading,\n profiles: tool.profiles,\n searchKeywords: tool.searchKeywords,\n inputSchema: tool.inputSchema,\n }));\n}\n\nfunction resolveTruncationConfig(params: {\n tool?: ToolDefinition;\n config?: ToolOptimizationConfig;\n}): Required<ToolResultTruncationConfig> {\n const charsPerToken =\n params.config?.contextManagement?.tokenEstimation?.charsPerToken ??\n DEFAULT_CHARS_PER_TOKEN;\n const contextWindowTokens =\n params.config?.contextBudget?.budget?.contextWindowTokens;\n const globalConfig = params.config?.toolResultConfig?.truncation;\n const perToolConfig = params.tool?.resultConfig?.truncation;\n const merged = { ...globalConfig, ...perToolConfig };\n const hardMaxChars =\n merged.hardMaxChars ??\n (contextWindowTokens\n ? Math.floor(\n contextWindowTokens *\n clampRatio(\n merged.maxContextShare,\n DEFAULT_MAX_TOOL_RESULT_CONTEXT_SHARE,\n ) *\n charsPerToken,\n )\n : DEFAULT_TOOL_RESULT_HARD_MAX_CHARS);\n\n return {\n enabled: merged.enabled ?? true,\n maxContextShare: clampRatio(\n merged.maxContextShare,\n DEFAULT_MAX_TOOL_RESULT_CONTEXT_SHARE,\n ),\n hardMaxChars: Math.max(1, hardMaxChars),\n minKeepChars: Math.max(\n 256,\n merged.minKeepChars ?? DEFAULT_TOOL_RESULT_MIN_KEEP_CHARS,\n ),\n strategy: merged.strategy ?? DEFAULT_TOOL_RESULT_STRATEGY,\n preserveErrors: merged.preserveErrors ?? true,\n };\n}\n\nfunction buildToolResultContent(\n result: unknown,\n tool?: ToolDefinition,\n args?: Record<string, unknown>,\n): string {\n if (typeof result === \"string\") {\n return result;\n }\n\n const typedResult = (result ?? null) as\n | ({\n _aiResponseMode?: \"none\" | \"brief\" | \"full\";\n _aiContext?: string;\n _aiContent?: unknown;\n _uiResources?: unknown;\n } & Record<string, unknown>)\n | null;\n const responseMode =\n typedResult?._aiResponseMode ?? tool?.aiResponseMode ?? \"full\";\n\n if (typedResult?._aiContent) {\n return JSON.stringify(typedResult._aiContent);\n }\n\n let aiContext = typedResult?._aiContext;\n if (!aiContext && tool?.aiContext) {\n aiContext =\n typeof tool.aiContext === \"function\"\n ? tool.aiContext(\n (typedResult ?? { success: true }) as never,\n args ?? {},\n )\n : tool.aiContext;\n }\n\n switch (responseMode) {\n case \"none\":\n return aiContext ?? \"[Result displayed to user]\";\n case \"brief\":\n return aiContext ?? \"[Tool executed successfully]\";\n case \"full\":\n default: {\n if (aiContext) {\n const {\n _aiResponseMode,\n _aiContext,\n _aiContent,\n _uiResources,\n ...dataOnly\n } = typedResult ?? {};\n return `${aiContext}\\n\\nFull data: ${JSON.stringify(dataOnly)}`;\n }\n if (typedResult?._uiResources) {\n const { _uiResources, ...dataOnly } = typedResult;\n return JSON.stringify(dataOnly);\n }\n return JSON.stringify(result);\n }\n }\n}\n\nexport function buildToolResultContentForPrompt(\n result: unknown,\n tool: ToolDefinition | undefined,\n args: Record<string, unknown>,\n config: ToolOptimizationConfig | undefined,\n): string {\n const text = buildToolResultContent(result, tool, args);\n const truncation = resolveTruncationConfig({ tool, config });\n if (!truncation.enabled) {\n return text;\n }\n\n if (\n truncation.preserveErrors &&\n typeof result === \"object\" &&\n result !== null &&\n \"error\" in result &&\n typeof (result as { error?: unknown }).error === \"string\"\n ) {\n return text;\n }\n\n const maxChars = Math.max(truncation.minKeepChars, truncation.hardMaxChars);\n return truncateText(text, maxChars, truncation.strategy);\n}\n\nfunction sliceHistoryToMaxMessages(params: {\n historyMessages: RequestMessage[];\n maxMessages: number | undefined;\n pruneStrategy: \"oldest\" | \"least-relevant\" | \"summarize\" | undefined;\n summarization?: ContextSummarizationConfig;\n}): RequestMessage[] {\n const { historyMessages, maxMessages, pruneStrategy, summarization } = params;\n if (!maxMessages || historyMessages.length <= maxMessages) {\n return historyMessages;\n }\n\n const dropped = historyMessages.slice(\n 0,\n historyMessages.length - maxMessages,\n );\n const kept = historyMessages.slice(-maxMessages);\n if (pruneStrategy === \"summarize\") {\n const summary = buildHistorySummary(dropped, summarization);\n return summary ? [summary, ...kept] : kept;\n }\n return kept;\n}\n\nfunction compactHistoryToTokenBudget(params: {\n historyMessages: RequestMessage[];\n maxTokens: number | undefined;\n preserveRecent: number;\n charsPerToken: number;\n pruneStrategy: \"oldest\" | \"least-relevant\" | \"summarize\" | undefined;\n summarization?: ContextSummarizationConfig;\n}): RequestMessage[] {\n const {\n maxTokens,\n preserveRecent,\n charsPerToken,\n pruneStrategy,\n summarization,\n } = params;\n let historyMessages = params.historyMessages;\n if (!maxTokens) {\n return historyMessages;\n }\n\n const getHistoryTokens = () =>\n historyMessages.reduce(\n (sum, message) => sum + estimateMessageTokens(message, charsPerToken),\n 0,\n );\n\n while (historyMessages.length > 1 && getHistoryTokens() > maxTokens) {\n const prunableCount = Math.max(0, historyMessages.length - preserveRecent);\n if (prunableCount <= 0) {\n const firstMessage = historyMessages[0];\n if (\n isHistorySummaryMessage(firstMessage) &&\n typeof firstMessage.content === \"string\"\n ) {\n const compactedSummary = compressSummaryContent(\n firstMessage.content,\n Math.max(400, Math.floor(maxTokens * charsPerToken * 0.25)),\n summarization?.fallbackBehavior,\n );\n if (compactedSummary !== firstMessage.content) {\n historyMessages = [\n { ...firstMessage, content: compactedSummary },\n ...historyMessages.slice(1),\n ];\n continue;\n }\n }\n historyMessages = historyMessages.slice(1);\n continue;\n }\n\n const pruned = historyMessages.slice(0, prunableCount);\n const kept = historyMessages.slice(prunableCount);\n if (pruneStrategy === \"summarize\") {\n const summary = buildHistorySummary(\n pruned,\n summarization,\n Math.max(500, Math.floor(maxTokens * charsPerToken * 0.35)),\n );\n historyMessages = summary ? [summary, ...kept] : kept;\n } else {\n historyMessages = kept;\n }\n }\n\n return historyMessages;\n}\n\nfunction compactToolResultsToBudget(params: {\n toolResultMessages: RequestMessage[];\n maxTokens: number | undefined;\n charsPerToken: number;\n}): RequestMessage[] {\n let toolResultMessages = params.toolResultMessages;\n if (!params.maxTokens) {\n return toolResultMessages;\n }\n\n const getToolResultTokens = () =>\n toolResultMessages.reduce(\n (sum, message) =>\n sum + estimateMessageTokens(message, params.charsPerToken),\n 0,\n );\n\n while (\n toolResultMessages.length > 0 &&\n getToolResultTokens() > params.maxTokens\n ) {\n const index = toolResultMessages.findIndex(\n (message) => message.content !== TOOL_RESULT_COMPACTION_NOTICE,\n );\n if (index === -1) {\n break;\n }\n\n toolResultMessages = toolResultMessages.map((message, currentIndex) =>\n currentIndex === index\n ? { ...message, content: TOOL_RESULT_COMPACTION_NOTICE }\n : message,\n );\n }\n\n return toolResultMessages;\n}\n\nfunction fitToolsToBudget(params: {\n tools: RequestTool[] | undefined;\n maxTokens: number | undefined;\n charsPerToken: number;\n}): RequestTool[] | undefined {\n let tools = params.tools;\n if (!tools?.length || !params.maxTokens) {\n return tools;\n }\n\n const getToolTokens = () =>\n tools!.reduce(\n (sum, tool) => sum + estimateToolTokens(tool, params.charsPerToken),\n 0,\n );\n\n while (tools.length > 0 && getToolTokens() > params.maxTokens) {\n tools = tools.slice(0, -1);\n }\n\n return tools;\n}\n\nfunction truncateSystemPromptToBudget(params: {\n systemPrompt: string | undefined;\n maxTokens: number | undefined;\n charsPerToken: number;\n}): string | undefined {\n const { systemPrompt, maxTokens, charsPerToken } = params;\n if (!systemPrompt || !maxTokens) {\n return systemPrompt;\n }\n\n const maxChars = maxTokens * charsPerToken;\n if (systemPrompt.length <= maxChars) {\n return systemPrompt;\n }\n\n return truncateText(\n systemPrompt,\n maxChars,\n \"head\",\n SYSTEM_PROMPT_TRUNCATION_NOTICE,\n );\n}\n\nfunction calculateBuckets(params: {\n systemPrompt: string | undefined;\n historyMessages: RequestMessage[];\n toolResultMessages: RequestMessage[];\n requestTools: RequestTool[] | undefined;\n charsPerToken: number;\n availableBudget: number;\n warnings: string[];\n}): ContextUsage {\n const systemPromptTokens = estimateTokens(\n params.systemPrompt ?? \"\",\n params.charsPerToken,\n );\n const historyTokens = params.historyMessages.reduce(\n (sum, message) =>\n sum + estimateMessageTokens(message, params.charsPerToken),\n 0,\n );\n const toolResultsTokens = params.toolResultMessages.reduce(\n (sum, message) =>\n sum + estimateMessageTokens(message, params.charsPerToken),\n 0,\n );\n const toolDefinitionTokens = (params.requestTools ?? []).reduce(\n (sum, tool) => sum + estimateToolTokens(tool, params.charsPerToken),\n 0,\n );\n const total =\n systemPromptTokens +\n historyTokens +\n toolResultsTokens +\n toolDefinitionTokens;\n const budget = Number.isFinite(params.availableBudget)\n ? params.availableBudget\n : total;\n const toPart = (tokens: number) => ({\n tokens,\n percent: budget > 0 ? Number(((tokens / budget) * 100).toFixed(2)) : 0,\n });\n\n return {\n total: toPart(total),\n breakdown: {\n systemPrompt: toPart(systemPromptTokens),\n history: toPart(historyTokens),\n toolResults: toPart(toolResultsTokens),\n tools: toPart(toolDefinitionTokens),\n },\n budget: {\n available: budget,\n remaining: Math.max(0, budget - total),\n },\n warnings: unique(params.warnings),\n };\n}\n\nfunction mergeBucketsInOriginalOrder(params: {\n transformedMessages: RequestMessage[];\n historyMessages: RequestMessage[];\n toolResultMessages: RequestMessage[];\n}): RequestMessage[] {\n const historyQueue = [...params.historyMessages];\n const toolQueue = [...params.toolResultMessages];\n\n return params.transformedMessages.flatMap((message) => {\n if (message.role === \"tool\") {\n const nextTool = toolQueue.shift();\n return nextTool ? [nextTool] : [];\n }\n const nextHistory = historyQueue.shift();\n return nextHistory ? [nextHistory] : [];\n });\n}\n\nexport class ChatContextOptimizer {\n private config: ToolOptimizationConfig | undefined;\n private activeProfile: string | undefined;\n private lastContextUsage: ContextUsage | null = null;\n\n constructor(config?: ToolOptimizationConfig) {\n this.config = config;\n this.activeProfile = config?.toolProfiles?.defaultProfile;\n }\n\n updateConfig(config?: ToolOptimizationConfig): void {\n this.config = config;\n if (!this.activeProfile) {\n this.activeProfile = config?.toolProfiles?.defaultProfile;\n }\n }\n\n setActiveProfile(profile?: string): void {\n this.activeProfile = profile?.trim() || undefined;\n }\n\n getContextUsage(): ContextUsage | null {\n return this.lastContextUsage;\n }\n\n prepare(params: {\n messages: UIMessage[];\n tools?: ToolDefinition[];\n systemPrompt?: string;\n }): {\n messages: RequestMessage[];\n tools?: RequestTool[];\n contextUsage: ContextUsage;\n warnings: string[];\n } {\n const charsPerToken =\n this.config?.contextManagement?.tokenEstimation?.charsPerToken ??\n DEFAULT_CHARS_PER_TOKEN;\n const safetyMargin =\n this.config?.contextManagement?.tokenEstimation?.safetyMargin ??\n DEFAULT_SAFETY_MARGIN;\n const warnings: string[] = [];\n const contextManagement = this.config?.contextManagement;\n const contextBudget = this.config?.contextBudget;\n const allTools = params.tools ?? [];\n const selectedTools = this.selectTools(allTools, params.messages);\n const transformedMessages = this.transformMessages(\n params.messages,\n allTools,\n );\n const preserveRecent =\n contextManagement?.summarization?.preserveRecent ??\n DEFAULT_RECENT_HISTORY_PRESERVE;\n\n let buckets: PreparedBuckets = {\n systemPrompt: params.systemPrompt,\n transformedMessages,\n historyMessages: transformedMessages.filter(\n (message) => message.role !== \"tool\",\n ),\n toolResultMessages: transformedMessages.filter(\n (message) => message.role === \"tool\",\n ),\n requestTools: buildToolDefinitions(selectedTools),\n };\n\n if (contextManagement?.enabled) {\n buckets.historyMessages = sliceHistoryToMaxMessages({\n historyMessages: buckets.historyMessages,\n maxMessages: contextManagement.history?.maxMessages,\n pruneStrategy: contextManagement.history?.pruneStrategy,\n summarization: contextManagement?.summarization,\n });\n }\n\n const budgetConfig = contextBudget?.budget;\n const contextWindowTokens = budgetConfig?.contextWindowTokens;\n const inputHeadroomRatio = clampRatio(\n budgetConfig?.inputHeadroomRatio,\n DEFAULT_INPUT_HEADROOM_RATIO,\n );\n const availableBudget = contextWindowTokens\n ? Math.max(1, Math.floor(contextWindowTokens * inputHeadroomRatio))\n : Number.POSITIVE_INFINITY;\n\n const sharedBudget = Number.isFinite(availableBudget)\n ? availableBudget\n : undefined;\n const systemPromptBudget = sharedBudget\n ? Math.max(\n 1,\n Math.floor(\n sharedBudget *\n clampRatio(\n budgetConfig?.systemPromptShare,\n DEFAULT_SYSTEM_PROMPT_SHARE,\n ),\n ),\n )\n : undefined;\n const historyBudgetByShare = sharedBudget\n ? Math.max(\n 1,\n Math.floor(\n sharedBudget *\n clampRatio(budgetConfig?.historyShare, DEFAULT_HISTORY_SHARE),\n ),\n )\n : undefined;\n const historyBudgetByConfig =\n contextManagement?.enabled && contextManagement.history?.maxTokens\n ? Math.floor(contextManagement.history.maxTokens / safetyMargin)\n : undefined;\n const historyBudget =\n historyBudgetByShare && historyBudgetByConfig\n ? Math.min(historyBudgetByShare, historyBudgetByConfig)\n : (historyBudgetByShare ?? historyBudgetByConfig);\n const toolResultsBudget = sharedBudget\n ? Math.max(\n 1,\n Math.floor(\n sharedBudget *\n clampRatio(\n budgetConfig?.toolResultsShare,\n DEFAULT_TOOL_RESULTS_SHARE,\n ),\n ),\n )\n : undefined;\n const toolDefinitionsBudget = sharedBudget\n ? Math.max(\n 1,\n Math.floor(\n sharedBudget *\n clampRatio(\n budgetConfig?.toolDefinitionsShare,\n DEFAULT_TOOL_DEFINITIONS_SHARE,\n ),\n ),\n )\n : undefined;\n\n if (contextBudget?.enabled) {\n buckets.systemPrompt = truncateSystemPromptToBudget({\n systemPrompt: buckets.systemPrompt,\n maxTokens: systemPromptBudget,\n charsPerToken,\n });\n }\n\n buckets.historyMessages = compactHistoryToTokenBudget({\n historyMessages: buckets.historyMessages,\n maxTokens: historyBudget,\n preserveRecent,\n charsPerToken,\n pruneStrategy: contextManagement?.history?.pruneStrategy,\n summarization: contextManagement?.summarization,\n });\n\n buckets.toolResultMessages = compactToolResultsToBudget({\n toolResultMessages: buckets.toolResultMessages,\n maxTokens: toolResultsBudget,\n charsPerToken,\n });\n\n buckets.requestTools = fitToolsToBudget({\n tools: buckets.requestTools,\n maxTokens: toolDefinitionsBudget,\n charsPerToken,\n });\n\n let usage = calculateBuckets({\n ...buckets,\n charsPerToken,\n availableBudget,\n warnings,\n });\n\n if (\n Number.isFinite(availableBudget) &&\n usage.total.tokens > availableBudget\n ) {\n // Final global fallback: preserve recent history, compact tool results first, then trim history and tools.\n buckets.toolResultMessages = compactToolResultsToBudget({\n toolResultMessages: buckets.toolResultMessages,\n maxTokens: Math.max(\n 1,\n usage.breakdown.toolResults.tokens -\n usage.total.tokens +\n availableBudget,\n ),\n charsPerToken,\n });\n\n usage = calculateBuckets({\n ...buckets,\n charsPerToken,\n availableBudget,\n warnings,\n });\n\n if (usage.total.tokens > availableBudget) {\n const overflow = usage.total.tokens - availableBudget;\n buckets.historyMessages = compactHistoryToTokenBudget({\n historyMessages: buckets.historyMessages,\n maxTokens: Math.max(1, usage.breakdown.history.tokens - overflow),\n preserveRecent,\n charsPerToken,\n pruneStrategy: contextManagement?.history?.pruneStrategy,\n });\n usage = calculateBuckets({\n ...buckets,\n charsPerToken,\n availableBudget,\n warnings,\n });\n }\n\n if (usage.total.tokens > availableBudget) {\n buckets.requestTools = fitToolsToBudget({\n tools: buckets.requestTools,\n maxTokens: Math.max(\n 1,\n usage.breakdown.tools.tokens -\n (usage.total.tokens - availableBudget),\n ),\n charsPerToken,\n });\n usage = calculateBuckets({\n ...buckets,\n charsPerToken,\n availableBudget,\n warnings,\n });\n }\n }\n\n if (\n Number.isFinite(availableBudget) &&\n usage.total.tokens > availableBudget\n ) {\n warnings.push(\n `Prompt budget exceeded: using ${usage.total.tokens} tokens of ${availableBudget}.`,\n );\n usage = {\n ...usage,\n warnings: unique(warnings),\n };\n if (contextBudget?.enforcement?.mode === \"error\") {\n throw new Error(warnings[warnings.length - 1]);\n }\n contextBudget?.enforcement?.onBudgetExceeded?.(usage);\n } else {\n usage = {\n ...usage,\n warnings: unique(warnings),\n };\n }\n\n contextBudget?.monitoring?.onUsageUpdate?.(usage);\n this.lastContextUsage = usage;\n\n return {\n messages: mergeBucketsInOriginalOrder(buckets),\n tools: buckets.requestTools,\n contextUsage: usage,\n warnings: usage.warnings,\n };\n }\n\n private selectTools(\n tools: ToolDefinition[],\n messages: UIMessage[],\n ): ToolDefinition[] {\n if (!tools.length) {\n return [];\n }\n\n const available = tools.filter((tool) => tool.available !== false);\n const profileConfig = this.config?.toolProfiles;\n if (!profileConfig?.enabled) {\n return available;\n }\n\n const activeProfile = this.activeProfile ?? profileConfig.defaultProfile;\n const includeUnprofiled = profileConfig.includeUnprofiled ?? true;\n const profile = activeProfile\n ? profileConfig.profiles?.[activeProfile]\n : undefined;\n let filtered = available;\n\n if (profile?.include?.length) {\n filtered = filtered.filter(\n (tool) =>\n profile.include!.some((selector) =>\n matchesSelector(tool, selector, activeProfile),\n ) ||\n (!!activeProfile && tool.profiles?.includes(activeProfile)),\n );\n } else if (activeProfile) {\n filtered = filtered.filter((tool) => {\n if (tool.profiles?.length) {\n return tool.profiles.includes(activeProfile);\n }\n return includeUnprofiled;\n });\n }\n\n if (profile?.exclude?.length) {\n filtered = filtered.filter(\n (tool) =>\n !profile.exclude!.some((selector) =>\n matchesSelector(tool, selector, activeProfile),\n ),\n );\n }\n\n if (!profileConfig.dynamicSelection?.enabled) {\n return filtered;\n }\n\n const maxTools = Math.max(\n 1,\n Math.min(\n profileConfig.dynamicSelection.maxTools ?? filtered.length,\n filtered.length,\n ),\n );\n const queryTokens = tokenize(buildToolQuery(messages));\n return [...filtered]\n .sort((left, right) => {\n const scoreDiff =\n scoreTool(right, queryTokens, activeProfile) -\n scoreTool(left, queryTokens, activeProfile);\n if (scoreDiff !== 0) {\n return scoreDiff;\n }\n return left.name.localeCompare(right.name);\n })\n .slice(0, maxTools);\n }\n\n private transformMessages(\n messages: UIMessage[],\n allTools: ToolDefinition[],\n ): RequestMessage[] {\n const toolCallMap = new Map<\n string,\n { toolName: string; args: Record<string, unknown> }\n >();\n for (const message of messages) {\n if (message.role !== \"assistant\" || !message.toolCalls?.length) {\n continue;\n }\n for (const toolCall of message.toolCalls) {\n try {\n toolCallMap.set(toolCall.id, {\n toolName: toolCall.function.name,\n args: JSON.parse(toolCall.function.arguments),\n });\n } catch {\n toolCallMap.set(toolCall.id, {\n toolName: toolCall.function.name,\n args: {},\n });\n }\n }\n }\n\n const toolDefMap = new Map(\n allTools.map((tool) => [tool.name, tool] as const),\n );\n\n return messages.map((message) => {\n if (message.role !== \"tool\") {\n return {\n role: message.role,\n content: message.content,\n tool_calls: message.toolCalls,\n tool_call_id: message.toolCallId,\n attachments: message.attachments,\n };\n }\n\n const toolCall = message.toolCallId\n ? toolCallMap.get(message.toolCallId)\n : undefined;\n const tool = toolCall ? toolDefMap.get(toolCall.toolName) : undefined;\n let content = message.content;\n\n try {\n const parsed = JSON.parse(message.content);\n content = buildToolResultContentForPrompt(\n parsed,\n tool,\n toolCall?.args ?? {},\n this.config,\n );\n } catch {\n content = buildToolResultContentForPrompt(\n message.content,\n tool,\n toolCall?.args ?? {},\n this.config,\n );\n }\n\n return {\n role: message.role,\n content,\n tool_call_id: message.toolCallId,\n };\n });\n }\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 ContextUsage,\n MessageAttachment,\n ToolDefinition,\n ToolOptimizationConfig,\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 { generateThreadId } from \"../../core/utils/id\";\nimport { resolveValue } from \"../../core/utils/resolvable\";\nimport {\n createStreamState,\n processStreamChunk,\n isStreamDone,\n} from \"../functions/stream\";\nimport { SimpleChatState } from \"../interfaces/ChatState\";\nimport { ChatContextOptimizer } from \"../optimizations\";\nimport { createLogger } from \"../../core/utils/logger\";\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 protected optimizer: ChatContextOptimizer;\n protected lastContextUsage: ContextUsage | null = null;\n private onCreateSession?: () => string | Promise<string>;\n private sessionInitPromise: Promise<string> | null = null;\n private sessionStatus: \"idle\" | \"creating\" | \"ready\" | \"error\" = \"idle\";\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 // ID of the pending assistant placeholder pushed before a request.\n // Used by handleError() to pop (remove) the placeholder on failure so it\n // doesn't stay frozen. Error is surfaced via state.error only — never written\n // into message history.\n private _activePlaceholderMessageId: string | undefined = undefined;\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 body: init.body,\n threadId: init.threadId,\n debug: init.debug,\n optimization: init.optimization,\n yourgptConfig: init.yourgptConfig,\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 // Pass Resolvable values - they are resolved at request time\n this.transport =\n init.transport ??\n new HttpTransport({\n url: init.runtimeUrl,\n headers: init.headers,\n body: init.body,\n streaming: init.streaming ?? true,\n parseError: init.parseError,\n });\n\n // Store callbacks\n this.callbacks = init.callbacks ?? {};\n this.optimizer = new ChatContextOptimizer(init.optimization);\n this.onCreateSession = init.onCreateSession;\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 * Check if a request is currently in progress\n */\n get isBusy(): boolean {\n return (\n this.state.status === \"submitted\" || this.state.status === \"streaming\"\n );\n }\n\n /**\n * Send a message\n * Returns false if a request is already in progress\n *\n * @param content - Message content\n * @param attachments - Optional attachments\n * @param options - Optional branching options\n * @param options.editMessageId - Edit flow: new message branches from the\n * same parent as this message ID, creating a parallel conversation path\n */\n async sendMessage(\n content: string,\n attachments?: MessageAttachment[],\n options?: {\n editMessageId?: string;\n },\n ): Promise<boolean> {\n // Guard: Don't send if already processing\n if (this.isBusy) {\n this.debug(\"sendMessage\", \"Blocked - request already in progress\");\n return false;\n }\n\n this.debug(\"sendMessage\", { content, attachments, options });\n\n try {\n // IMPORTANT: Resolve any pending tool_calls before sending\n // This prevents Anthropic API errors: \"tool_use without tool_result\"\n this.resolveUnresolvedToolCalls();\n\n // Determine parentId for the new user message\n let newParentId: string | null | undefined;\n const visibleMessages = this.state.messages;\n\n if (options?.editMessageId && this.state.setCurrentLeaf) {\n // Edit flow: branch from the same parent as the edited message\n const allMessages =\n this.state.getAllMessages?.() ?? this.state.messages;\n const target = allMessages.find((m) => m.id === options.editMessageId);\n if (target && target.parentId !== undefined) {\n newParentId = target.parentId;\n // Rewind active path to just before the original message\n this.state.setCurrentLeaf(\n typeof target.parentId === \"string\" ? target.parentId : null,\n );\n }\n } else if (visibleMessages.length > 0) {\n // Normal follow-up: new message is a child of the current leaf\n newParentId = visibleMessages[visibleMessages.length - 1].id;\n }\n\n // Create user message with parentId for correct tree placement\n // Text file attachments (CSV, TXT, etc.) are kept as attachments for UI display.\n // The optimizer inlines their content into the message text before sending to the LLM.\n const userMessage = createUserMessage(content, attachments, {\n parentId: newParentId,\n }) as T;\n\n // Add user message + placeholder to state FIRST so the UI transitions to\n // chat view immediately — session init (createSession network request) runs\n // concurrently while the user already sees their message and the loader.\n this.state.pushMessage(userMessage);\n this.state.status = \"submitted\";\n this.state.error = undefined;\n\n // For streaming: push placeholder assistant message NOW (before microtask yield)\n // so the loader appears immediately with zero blank-state flash between user\n // message submission and the first stream event arriving.\n let preCreatedMessageId: string | undefined;\n if (this.config.streaming !== false) {\n const visibleMessages = this.state.messages;\n const currentLeafId =\n visibleMessages.length > 0\n ? visibleMessages[visibleMessages.length - 1].id\n : undefined;\n const preMsg = createEmptyAssistantMessage(undefined, {\n parentId: currentLeafId,\n }) as T;\n this.state.pushMessage(preMsg);\n preCreatedMessageId = preMsg.id;\n this._activePlaceholderMessageId = preMsg.id;\n }\n\n // Notify callbacks (single batch: user message + status + optional placeholder)\n this.callbacks.onMessagesChange?.(this._allMessages());\n this.callbacks.onStatusChange?.(\"submitted\");\n\n // Lazy session init — only when threadId is not set AND session config is present.\n // threadId IS the session ID: if it's set (from setActiveThread or a previous session),\n // it is trusted as-is and no session creation call is made.\n const needsSession =\n !this.config.threadId &&\n (!!this.config.yourgptConfig || !!this.onCreateSession);\n if (needsSession) {\n if (!this.sessionInitPromise) {\n this.setSessionStatus(\"creating\");\n this.sessionInitPromise = (\n this.onCreateSession\n ? Promise.resolve(this.onCreateSession())\n : this._defaultCreateSession()\n )\n .then((id) => {\n this.callbacks.onThreadChange?.(id);\n this.setSessionStatus(\"ready\");\n return id;\n })\n .catch((err) => {\n this.setSessionStatus(\"error\");\n this.sessionInitPromise = null;\n throw err;\n });\n }\n this.config.threadId = await this.sessionInitPromise;\n this.debug(\"sendMessage\", { threadId: this.config.threadId });\n }\n // No threadId at this point — that's OK.\n // If the server has a storage adapter, it will create a session and return\n // the threadId in the response. The SDK adopts it automatically via\n // handleJsonResponse / handleStreamResponse.\n // Local thread IDs for CopilotChat persistence are managed independently\n // by useInternalThreadManager.\n\n // Yield to allow UI to render loading state (important for non-streaming)\n await Promise.resolve();\n\n // Send request — pass pre-created ID so processRequest reuses it\n await this.processRequest({ preCreatedMessageId });\n return true;\n } catch (error) {\n this.handleError(error as Error);\n return false;\n }\n }\n\n /**\n * Resolve any tool_calls that don't have corresponding tool_results.\n * This prevents Anthropic API errors when tool_use has no tool_result.\n * Can happen when max iterations is reached or tool execution is interrupted.\n */\n private resolveUnresolvedToolCalls(): void {\n const messages = this.state.messages;\n\n // Collect all tool_call IDs from assistant messages\n const allToolCallIds = new Set<string>();\n // Collect resolved tool_call IDs from tool messages\n const resolvedIds = new Set<string>();\n\n for (const msg of messages) {\n if (msg.role === \"assistant\" && msg.toolCalls?.length) {\n for (const tc of msg.toolCalls) {\n allToolCallIds.add(tc.id);\n }\n }\n if (msg.role === \"tool\" && msg.toolCallId) {\n resolvedIds.add(msg.toolCallId);\n }\n }\n\n // Find unresolved tool_calls\n const unresolvedIds = [...allToolCallIds].filter(\n (id) => !resolvedIds.has(id),\n );\n\n if (unresolvedIds.length > 0) {\n this.debug(\n \"resolveUnresolvedToolCalls\",\n `Adding ${unresolvedIds.length} missing tool results`,\n );\n\n // Add error result for each unresolved tool_call.\n // Chain parentId so these messages are placed correctly in the branch tree.\n const visibleMsgs = this.state.messages;\n let errorChainParentId: string | undefined =\n visibleMsgs.length > 0\n ? visibleMsgs[visibleMsgs.length - 1].id\n : undefined;\n\n for (const toolCallId of unresolvedIds) {\n const toolMessageId = generateMessageId();\n const toolMessage = {\n id: toolMessageId,\n role: \"tool\" as const,\n content: JSON.stringify({\n success: false,\n error: \"Tool execution was interrupted. Please try again.\",\n }),\n toolCallId,\n createdAt: new Date(),\n ...(errorChainParentId !== undefined\n ? { parentId: errorChainParentId }\n : {}),\n } as T;\n\n this.state.pushMessage(toolMessage);\n errorChainParentId = toolMessageId;\n }\n\n this.callbacks.onMessagesChange?.(this._allMessages());\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 // Capture current leaf so tool messages are chained under the assistant\n // message that triggered the tool calls, not placed at tree root.\n // Without this, MessageTree.addMessage() assigns parentKey = ROOT_KEY,\n // which hijacks getVisibleMessages() and breaks the conversation path.\n const visibleMessages = this.state.messages;\n let chainParentId: string | undefined =\n visibleMessages.length > 0\n ? visibleMessages[visibleMessages.length - 1].id\n : undefined;\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 toolMessageId = generateMessageId();\n const toolMessage = {\n id: toolMessageId,\n role: \"tool\" as const,\n content: messageContent,\n toolCallId,\n createdAt: new Date(),\n ...(chainParentId !== undefined ? { parentId: chainParentId } : {}),\n } as T;\n\n this.state.pushMessage(toolMessage);\n // Next tool message (if any) chains off this one\n chainParentId = toolMessageId;\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 ...(chainParentId !== undefined ? { parentId: chainParentId } : {}),\n } as T;\n\n this.state.pushMessage(userMessage);\n }\n\n this.state.status = \"submitted\";\n this.state.error = undefined;\n this.callbacks.onMessagesChange?.(this._allMessages());\n this.callbacks.onStatusChange?.(\"submitted\");\n\n // Yield a full macrotask so React can flush the \"submitted\" status\n // before the next request fires. Promise.resolve() is a microtask and\n // is not enough for React 18 to render the loading state.\n await new Promise((resolve) => setTimeout(resolve, 0));\n\n // Continue request\n await this.processRequest();\n } catch (error) {\n this.handleError(error as Error);\n }\n }\n\n /**\n * Add tool result messages to history and stop — does NOT trigger a new LLM request.\n *\n * Use this instead of continueWithToolResults when you want to close out pending\n * tool_use blocks (so the history stays valid) without letting the AI continue.\n * Optionally appends a final assistant message (e.g. an iteration-limit notice).\n */\n async addToolResultMessages(\n toolResults: Array<{ toolCallId: string; result: unknown }>,\n finalAssistantContent?: string,\n ): Promise<void> {\n const visibleMessages = this.state.messages;\n let chainParentId: string | undefined =\n visibleMessages.length > 0\n ? visibleMessages[visibleMessages.length - 1].id\n : undefined;\n\n for (const { toolCallId, result } of toolResults) {\n const messageContent =\n typeof result === \"string\" ? result : JSON.stringify(result);\n\n const toolMessageId = generateMessageId();\n const toolMessage = {\n id: toolMessageId,\n role: \"tool\" as const,\n content: messageContent,\n toolCallId,\n createdAt: new Date(),\n ...(chainParentId !== undefined ? { parentId: chainParentId } : {}),\n } as T;\n\n this.state.pushMessage(toolMessage);\n chainParentId = toolMessageId;\n }\n\n if (finalAssistantContent) {\n const assistantMsg = {\n id: generateMessageId(),\n role: \"assistant\" as const,\n content: finalAssistantContent,\n createdAt: new Date(),\n ...(chainParentId !== undefined ? { parentId: chainParentId } : {}),\n } as T;\n this.state.pushMessage(assistantMsg);\n }\n\n this.callbacks.onMessagesChange?.(this._allMessages());\n this.state.status = \"ready\";\n this.callbacks.onStatusChange?.(\"ready\");\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 * Branch-aware: when the state supports branching (setCurrentLeaf is available),\n * regenerate creates a new sibling response instead of destroying the original.\n * The old response is preserved and navigable via switchBranch().\n *\n * Legacy fallback: when branching is not available, uses old slice() behavior.\n */\n async regenerate(messageId?: string): Promise<void> {\n if (this.isBusy) return;\n\n const messages = this.state.messages; // visible path\n let targetMessage: T | undefined;\n\n if (messageId) {\n targetMessage = messages.find((m) => m.id === messageId);\n // Not on visible path — check inactive branches too\n if (!targetMessage) {\n targetMessage = this.state\n .getAllMessages?.()\n .find((m) => m.id === messageId);\n }\n } else {\n // Find last assistant message in the visible path\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i].role === \"assistant\") {\n targetMessage = messages[i];\n break;\n }\n }\n }\n\n if (!targetMessage) return;\n\n // Branch-aware regenerate: preserve old response as inactive sibling\n if (targetMessage.parentId !== undefined && this.state.setCurrentLeaf) {\n // Rewind active path to target's parent\n // The new assistant response will be pushed as a new child (sibling)\n this.state.setCurrentLeaf(targetMessage.parentId ?? null);\n this.callbacks.onMessagesChange?.(this._allMessages());\n this.state.status = \"submitted\";\n await Promise.resolve();\n await this.processRequest();\n return;\n }\n\n // Legacy fallback: old slice() behavior for non-tree-aware state\n const targetIndex = messages.indexOf(targetMessage);\n if (targetIndex > 0) {\n this.state.setMessages(messages.slice(0, targetIndex));\n this.callbacks.onMessagesChange?.(this._allMessages());\n await this.processRequest();\n }\n }\n\n // ============================================\n // Event Handling\n // ============================================\n\n /**\n * Returns all messages across all branches when the state supports it\n * (branch-aware), otherwise returns the visible path.\n * Use this whenever firing onMessagesChange so inactive branches are not lost.\n */\n private _allMessages(): T[] {\n return this.state.getAllMessages?.() ?? this.state.messages;\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 const handlers = this.eventHandlers.get(type);\n if (type === \"toolCalls\") {\n this.debug(`emit(toolCalls): ${handlers?.size || 0} handlers registered`);\n }\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(options?: {\n preCreatedMessageId?: string;\n }): Promise<void> {\n // Build request\n const request = this.buildRequest();\n\n // For streaming: pre-push an empty assistant message BEFORE the HTTP\n // round-trip so the UI shows a loading bubble immediately (e.g. between\n // tool execution and the continuation stream starting).\n // Skip if sendMessage already pushed a placeholder (preCreatedMessageId set).\n let preCreatedMessageId = options?.preCreatedMessageId;\n if (this.config.streaming !== false && !preCreatedMessageId) {\n // Use the current leaf (last visible message) as parent so the assistant\n // message is correctly placed as a child in the branch tree.\n const visibleMessages = this.state.messages;\n const currentLeafId =\n visibleMessages.length > 0\n ? visibleMessages[visibleMessages.length - 1].id\n : undefined;\n const preMsg = createEmptyAssistantMessage(undefined, {\n parentId: currentLeafId,\n }) as T;\n this.state.pushMessage(preMsg);\n this.callbacks.onMessagesChange?.(this._allMessages());\n preCreatedMessageId = preMsg.id;\n this._activePlaceholderMessageId = preMsg.id;\n }\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 // _activePlaceholderMessageId stays set throughout streaming so that\n // handleError() can pop the placeholder if an error chunk arrives mid-stream.\n // handleStreamResponse clears it on successful completion.\n await this.handleStreamResponse(response, preCreatedMessageId);\n } else {\n // Non-streaming: remove the pre-pushed placeholder (not needed).\n // Use getAllMessages() so inactive branch messages are preserved when\n // tree.reset() is called — this.state.messages only returns visible path.\n // Also capture + restore the intended active path: tree.reset() rebuilds\n // activeChildMap using \"last child at each fork\", which would snap back to\n // the wrong branch if we're mid-edit on an inactive branch.\n if (preCreatedMessageId) {\n const id = preCreatedMessageId;\n // The placeholder is the last visible message; the one before it is the\n // intended leaf after removal.\n const visibleMsgs = this.state.messages;\n const placeholderIdx = visibleMsgs.findIndex((m) => m.id === id);\n const intendedLeafId =\n placeholderIdx > 0 ? visibleMsgs[placeholderIdx - 1].id : null;\n\n const allMsgs = this.state.getAllMessages?.() ?? this.state.messages;\n this.state.setMessages(allMsgs.filter((m) => m.id !== id));\n\n // Restore the correct active branch after tree.reset()\n if (intendedLeafId && this.state.setCurrentLeaf) {\n this.state.setCurrentLeaf(intendedLeafId);\n }\n }\n // Placeholder removed — clear the tracker before handling the response\n this._activePlaceholderMessageId = undefined;\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 * Update prompt/tool optimization behavior.\n */\n setOptimizationConfig(config?: ToolOptimizationConfig): void {\n this.config.optimization = config;\n this.optimizer.updateConfig(config);\n }\n\n /**\n * Select the active tool profile for future requests.\n */\n setToolProfile(profile?: string): void {\n this.optimizer.setActiveProfile(profile);\n }\n\n /**\n * Get the most recent prompt context usage snapshot.\n */\n getContextUsage(): ContextUsage | null {\n return this.lastContextUsage;\n }\n\n /**\n * Inline skills from the client (sent on every request for server to merge)\n */\n protected inlineSkills: Array<{\n name: string;\n description: string;\n content: string;\n strategy?: string;\n }> = [];\n\n /**\n * Set inline skills (called by SkillProvider via React layer)\n */\n setInlineSkills(\n skills: Array<{\n name: string;\n description: string;\n content: string;\n strategy?: string;\n }>,\n ): void {\n this.inlineSkills = skills;\n this.debug(\"Inline skills updated\", { count: skills.length });\n }\n\n /**\n * Dynamic context from useAIContext hook\n */\n protected dynamicContext: string = \"\";\n\n /**\n * Optional transform applied to messages just before building the HTTP request.\n * Used by the message-history / compaction system to send a pruned message list\n * without mutating the in-memory store (which keeps the full history for display).\n */\n private requestMessageTransform:\n | ((messages: UIMessage[]) => UIMessage[])\n | null = null;\n\n /**\n * Set (or clear) the per-request message transform.\n * Pass null to disable.\n */\n setRequestMessageTransform(\n fn: ((messages: UIMessage[]) => UIMessage[]) | null,\n ): void {\n this.requestMessageTransform = fn;\n }\n\n /**\n * Set dynamic context (appended to system prompt)\n */\n setContext(context: string): void {\n this.dynamicContext = context;\n }\n\n /**\n * Switch to a different thread (or start a new one).\n *\n * - Pass the session/thread ID from persistence → used as-is, no session creation call.\n * - Pass null → threadId cleared, new session created on first sendMessage.\n *\n * The session ID IS the thread ID: whatever is stored in persistence is passed here directly.\n */\n setActiveThread(id: string | null): void {\n this.config.threadId = id ?? undefined;\n this.sessionInitPromise = null;\n this.setSessionStatus(id ? \"ready\" : \"idle\");\n }\n\n /**\n * Force a new session to be created on the next sendMessage.\n * Call this when the current session has expired or credits are exhausted.\n * After calling this, the next sendMessage will invoke onCreateSession/yourgptConfig\n * again and onThreadChange will fire with the new session ID.\n */\n renewSession(): void {\n this.config.threadId = undefined;\n this.sessionInitPromise = null;\n this.setSessionStatus(\"idle\");\n }\n\n private setSessionStatus(\n status: \"idle\" | \"creating\" | \"ready\" | \"error\",\n ): void {\n if (this.sessionStatus !== status) {\n this.sessionStatus = status;\n this.callbacks.onSessionStatusChange?.(status);\n }\n }\n\n /**\n * Get the current session creation status.\n */\n getSessionStatus(): \"idle\" | \"creating\" | \"ready\" | \"error\" {\n return this.sessionStatus;\n }\n\n /**\n * Set system prompt dynamically\n * This allows updating the system prompt after initialization\n */\n setSystemPrompt(prompt: string): void {\n this.config.systemPrompt = prompt;\n }\n\n /**\n * Set headers configuration\n * Can be static headers or a getter function for dynamic resolution\n */\n setHeaders(headers: ChatConfig[\"headers\"]): void {\n this.config.headers = headers;\n if (this.transport.setHeaders && headers !== undefined) {\n this.transport.setHeaders(headers);\n }\n }\n\n /**\n * Set URL configuration\n * Can be static URL or a getter function for dynamic resolution\n */\n setUrl(url: ChatConfig[\"runtimeUrl\"]): void {\n this.config.runtimeUrl = url;\n if (this.transport.setUrl) {\n this.transport.setUrl(url);\n }\n }\n\n /**\n * Set body configuration\n * Additional properties merged into every request body\n */\n setBody(body: ChatConfig[\"body\"]): void {\n this.config.body = body;\n if (this.transport.setBody && body !== undefined) {\n this.transport.setBody(body);\n }\n }\n\n /**\n * Default session creation via yourgptConfig.\n * Only called when yourgptConfig is set and no onCreateSession is provided.\n * The returned session_uid IS the thread ID going forward.\n */\n private async _defaultCreateSession(): Promise<string> {\n if (!this.config.yourgptConfig) {\n throw new Error(\n \"[copilot-sdk] _defaultCreateSession called without yourgptConfig\",\n );\n }\n const {\n apiKey,\n widgetUid,\n endpoint = \"https://api.yourgpt.ai\",\n } = this.config.yourgptConfig;\n const base = endpoint.replace(/\\/$/, \"\");\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 10_000);\n try {\n const res = await fetch(`${base}/chatbot/v1/copilot-sdk/createSession`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"api-key\": apiKey,\n },\n body: JSON.stringify({ widget_uid: widgetUid }),\n signal: controller.signal,\n });\n const data = await res.json();\n const d = data?.data ?? data;\n const id = d?.session_uid ?? d?.id;\n if (!id)\n throw new Error(\n \"[copilot-sdk] createSession failed: \" + JSON.stringify(data),\n );\n return String(id);\n } catch (err) {\n if ((err as Error)?.name === \"AbortError\") {\n throw new Error(\n \"[copilot-sdk] createSession timed out after 10s — check your endpoint/network\",\n );\n }\n throw err;\n } finally {\n clearTimeout(timeout);\n }\n }\n\n /**\n * Build the request payload\n */\n /** Inline text-file attachments into message content for the LLM */\n private inlineTextAttachments(messages: T[]): T[] {\n const textMimeTypes = new Set([\n \"text/csv\",\n \"text/plain\",\n \"text/markdown\",\n \"text/x-markdown\",\n \"application/json\",\n \"application/csv\",\n ]);\n const textExts = new Set([\"csv\", \"txt\", \"md\", \"json\"]);\n\n return messages.map((msg) => {\n if (msg.role !== \"user\" || !msg.attachments?.length) return msg;\n\n const textFiles: MessageAttachment[] = [];\n const binaryFiles: MessageAttachment[] = [];\n\n for (const att of msg.attachments) {\n const ext = att.filename?.toLowerCase().split(\".\").pop();\n const isText =\n textMimeTypes.has(att.mimeType) || (ext && textExts.has(ext));\n if (isText && att.data && !att.url) {\n textFiles.push(att);\n } else {\n binaryFiles.push(att);\n }\n }\n\n if (textFiles.length === 0) return msg;\n\n // Inline text file contents into the message\n const fileParts = textFiles.map((f) => {\n const ext = f.filename?.split(\".\").pop()?.toLowerCase() || \"txt\";\n return `\\n\\n--- ${f.filename || \"file\"} ---\\n\\`\\`\\`${ext}\\n${f.data}\\n\\`\\`\\``;\n });\n\n return {\n ...msg,\n content: (msg.content || \"\") + fileParts.join(\"\"),\n attachments: binaryFiles.length > 0 ? binaryFiles : undefined,\n };\n });\n }\n\n protected buildRequest() {\n const systemPrompt = this.dynamicContext\n ? `${this.config.systemPrompt || \"\"}\\n\\n## Current App Context:\\n${this.dynamicContext}`.trim()\n : this.config.systemPrompt;\n const rawMessages = this.requestMessageTransform\n ? (this.requestMessageTransform(\n this.state.messages as UIMessage[],\n ) as T[])\n : this.state.messages;\n\n // Inline text-file attachments before optimization\n const processedMessages = this.inlineTextAttachments(rawMessages);\n const optimized = this.optimizer.prepare({\n messages: processedMessages,\n tools: this.config.tools,\n systemPrompt,\n });\n this.lastContextUsage = optimized.contextUsage;\n this.callbacks.onContextUsageChange?.(optimized.contextUsage);\n\n return {\n messages: optimized.messages,\n threadId: this.config.threadId,\n systemPrompt,\n llm: this.config.llm,\n tools: this.config.tools?.length\n ? this.config.tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n category: tool.category,\n group: tool.group,\n deferLoading: tool.deferLoading,\n profiles: tool.profiles,\n searchKeywords: tool.searchKeywords,\n inputSchema: tool.inputSchema,\n }))\n : undefined,\n __skills: this.inlineSkills.length ? this.inlineSkills : undefined,\n };\n }\n\n /**\n * Handle streaming response\n */\n protected async handleStreamResponse(\n stream: AsyncIterable<StreamChunk>,\n preCreatedMessageId?: string,\n ): Promise<void> {\n this.state.status = \"streaming\";\n this.callbacks.onStatusChange?.(\"streaming\");\n\n // Reuse the pre-pushed empty assistant message (created in processRequest\n // before the HTTP round-trip) so there's no blank gap waiting for stream start.\n // Fall back to pushing a new one if not provided.\n let assistantMessage: T;\n if (preCreatedMessageId) {\n const existing = this.state.messages.find(\n (m) => m.id === preCreatedMessageId,\n );\n if (existing) {\n assistantMessage = existing;\n } else {\n assistantMessage = createEmptyAssistantMessage() as T;\n this.state.pushMessage(assistantMessage);\n }\n } else {\n assistantMessage = createEmptyAssistantMessage() as T;\n this.state.pushMessage(assistantMessage);\n }\n\n // Initialize stream state\n this.streamState = createStreamState(assistantMessage.id);\n this.callbacks.onMessageStart?.(assistantMessage.id);\n\n this.debugGroup(\"handleStreamResponse\");\n this.debug(\"Starting to process stream\");\n\n let chunkCount = 0;\n let toolCallsEmitted = false; // Guard to prevent emitting toolCalls twice\n // Holds client tool calls received via a tool_calls chunk AFTER a\n // mid-stream message:end nulled streamState.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let pendingClientToolCalls: any[] | undefined;\n\n // Process stream chunks\n for await (const chunk of stream) {\n chunkCount++;\n // Skip high-frequency delta chunks from the chunk log to reduce noise\n if (chunk.type !== \"message:delta\") {\n this.debug(\"chunk\", { count: chunkCount, type: chunk.type });\n }\n\n // Handle error chunks immediately\n if (chunk.type === \"error\") {\n const error = new Error(chunk.message || \"Stream error\");\n this.handleError(error);\n return;\n }\n\n // Handle message:end mid-stream (server-side agent loop turn completed)\n // This creates separate messages for each turn instead of combining them\n // Split on text content OR server-side tool executions (no text, tool-only turns)\n if (\n chunk.type === \"message:end\" &&\n this.streamState !== null &&\n (this.streamState.content ||\n (this.streamState.toolResults?.size ?? 0) > 0)\n ) {\n this.debug(\"message:end mid-stream\", {\n messageId: this.streamState.messageId,\n contentLength: this.streamState.content.length,\n toolCallsInState: this.streamState.toolCalls?.length ?? 0,\n chunkCount,\n });\n\n // Finalize current message with its content and tool calls\n const turnMessage = streamStateToMessage(this.streamState) as T;\n\n // Add toolCallsHidden metadata if applicable\n const toolCallsHidden: Record<string, boolean> = {};\n for (const [id, result] of this.streamState.toolResults) {\n if (result.hidden !== undefined) {\n toolCallsHidden[id] = result.hidden;\n }\n }\n if (\n turnMessage.toolCalls?.length &&\n Object.keys(toolCallsHidden).length > 0\n ) {\n (turnMessage as T & { metadata?: Record<string, unknown> }).metadata =\n {\n ...(turnMessage as T & { metadata?: Record<string, unknown> })\n .metadata,\n toolCallsHidden,\n };\n }\n\n this.state.updateMessageById(\n this.streamState.messageId,\n (existing) => ({\n ...turnMessage,\n ...(existing.parentId !== undefined\n ? { parentId: existing.parentId }\n : {}),\n ...(existing.childrenIds !== undefined\n ? { childrenIds: existing.childrenIds }\n : {}),\n }),\n );\n this.callbacks.onMessageFinish?.(turnMessage);\n\n // Reset stream state for next turn - will be initialized on next message:start\n this.streamState = null;\n continue;\n }\n\n // Handle message:start after a mid-stream finalization\n if (chunk.type === \"message:start\" && this.streamState === null) {\n this.debug(\"message:start after mid-stream end - creating new message\");\n // Capture the current leaf BEFORE pushing the new message so the\n // continuation turn is chained as a child in the branch tree.\n // Without this parentId the new message becomes a ROOT orphan, which\n // hijacks getVisibleMessages() and wipes the prior conversation from\n // the active path on every subsequent buildRequest() call.\n const currentLeaf = this.state.messages;\n const currentLeafId =\n currentLeaf.length > 0\n ? currentLeaf[currentLeaf.length - 1].id\n : undefined;\n const newMessage = createEmptyAssistantMessage(undefined, {\n parentId: currentLeafId,\n }) as T;\n this.state.pushMessage(newMessage);\n this.streamState = createStreamState(newMessage.id);\n this.callbacks.onMessageStart?.(newMessage.id);\n continue;\n }\n\n // Update stream state (pure function)\n // Skip most chunks if streamState is null.\n // EXCEPTION: after a mid-stream message:end the server can still send\n // tool_calls + done for client-side tool dispatch. Handle those directly.\n if (!this.streamState) {\n if (chunk.type === \"tool_calls\") {\n // Store for emission when done arrives. Do NOT update message state\n // here — done.messages carries the assistant message with tool_calls\n // in proper OpenAI format, which we use in the done handler below.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n pendingClientToolCalls = (chunk as { toolCalls: any[] }).toolCalls;\n this.debug(\"tool_calls (post-message:end, stored as pending)\", {\n count: pendingClientToolCalls?.length,\n ids: pendingClientToolCalls?.map((tc: { id?: string }) => tc.id),\n });\n continue;\n }\n\n if (chunk.type === \"done\") {\n this.debug(\"done (post-message:end)\", {\n hasPendingToolCalls: !!pendingClientToolCalls?.length,\n pendingCount: pendingClientToolCalls?.length ?? 0,\n doneMessagesCount: chunk.messages?.length ?? 0,\n requiresAction: (chunk as { requiresAction?: boolean })\n .requiresAction,\n toolCallsEmitted,\n });\n // Process done.messages to:\n // 1. Insert any server-side tool results missing from state\n // 2. Merge OpenAI-format tool_calls into the finalized assistant message\n if (chunk.messages?.length) {\n const pendingIds = new Set(\n ((pendingClientToolCalls ?? []) as Array<{ id?: string }>)\n .filter((tc) => tc?.id)\n .map((tc) => tc.id as string),\n );\n const messagesToInsert: T[] = [];\n let clientAssistantToolCalls: unknown[] | undefined;\n\n for (const msg of chunk.messages) {\n // This is the client-tool assistant message already in state\n // (finalized by message:end but without toolCalls).\n // Capture its OpenAI-format tool_calls to merge into state.\n if (\n msg.role === \"assistant\" &&\n msg.tool_calls?.length &&\n pendingIds.size > 0 &&\n (msg.tool_calls as Array<{ id?: string }>).every((tc) =>\n pendingIds.has(tc?.id ?? \"\"),\n )\n ) {\n clientAssistantToolCalls = msg.tool_calls as unknown[];\n continue; // Already in state — don't insert a duplicate\n }\n // Skip plain assistant text — already streamed\n if (msg.role === \"assistant\" && !msg.tool_calls?.length) continue;\n // Skip server-side tool assistant messages — already represented in streamed toolExecutions\n if (\n msg.role === \"assistant\" &&\n msg.tool_calls?.length &&\n pendingIds.size === 0\n )\n continue;\n // Everything else (server tool results) needs inserting\n messagesToInsert.push({\n id: generateMessageId(),\n role: msg.role as T[\"role\"],\n content: msg.content ?? \"\",\n toolCalls: msg.tool_calls as T[\"toolCalls\"],\n toolCallId: msg.tool_call_id,\n createdAt: new Date(),\n } as T);\n }\n\n // Merge OpenAI-format tool_calls into the existing last assistant message\n if (clientAssistantToolCalls) {\n const currentMessages = this.state.messages;\n for (let i = currentMessages.length - 1; i >= 0; i--) {\n if (currentMessages[i].role === \"assistant\") {\n this.state.updateMessageById(\n currentMessages[i].id,\n (m) =>\n ({\n ...m,\n toolCalls: clientAssistantToolCalls,\n }) as T,\n );\n break;\n }\n }\n }\n\n if (messagesToInsert.length > 0) {\n // Insert server tool results before the last assistant message\n const currentMessages = this.state.messages;\n let insertIdx = currentMessages.length;\n for (let i = currentMessages.length - 1; i >= 0; i--) {\n if (currentMessages[i].role === \"assistant\") {\n insertIdx = i;\n break;\n }\n }\n // Assign parentIds so inserted messages form a proper chain in the\n // MessageTree. Without this they become orphan root-level children,\n // which breaks the active-path walk and causes the visible message\n // count to drop on subsequent turns.\n const insertParentId =\n insertIdx > 0 ? currentMessages[insertIdx - 1].id : undefined;\n const linkedToInsert = messagesToInsert.map((msg, i) => ({\n ...msg,\n parentId: i === 0 ? insertParentId : messagesToInsert[i - 1].id,\n }));\n const lastInsertedId =\n linkedToInsert[linkedToInsert.length - 1].id;\n // Re-parent the message at insertIdx to chain from the last inserted\n const updatedCurrent = currentMessages.map((m, idx) =>\n idx === insertIdx ? { ...m, parentId: lastInsertedId } : m,\n );\n this.state.setMessages([\n ...updatedCurrent.slice(0, insertIdx),\n ...linkedToInsert,\n ...updatedCurrent.slice(insertIdx),\n ]);\n }\n }\n\n // Emit client tool calls so ChatWithTools executes them\n if (!toolCallsEmitted && pendingClientToolCalls?.length) {\n toolCallsEmitted = true;\n this.debug(\"emit toolCalls (post-message:end path)\", {\n count: pendingClientToolCalls.length,\n names: pendingClientToolCalls.map(\n (tc: { function?: { name: string }; name?: string }) =>\n tc.function?.name ?? tc.name,\n ),\n });\n this.emit(\"toolCalls\", { toolCalls: pendingClientToolCalls });\n } else {\n this.debug(\"skip emit toolCalls (post-message:end path)\", {\n toolCallsEmitted,\n hasPending: !!pendingClientToolCalls?.length,\n });\n }\n continue;\n }\n\n this.debug(\"warning\", \"streamState is null, skipping chunk\");\n continue;\n }\n this.streamState = processStreamChunk(chunk, this.streamState);\n\n // Emit server tool callbacks for action events\n if (chunk.type === \"action:start\") {\n this.callbacks.onServerToolStart?.({\n id: chunk.id,\n name: chunk.name,\n hidden: chunk.hidden,\n });\n } else if (chunk.type === \"action:args\") {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(chunk.args);\n } catch {\n // Keep empty args\n }\n // Get name from toolResults (set by action:start)\n const existingResult = this.streamState?.toolResults.get(chunk.id);\n if (existingResult) {\n this.callbacks.onServerToolArgs?.({\n id: chunk.id,\n name: existingResult.name,\n args,\n });\n }\n } else if (chunk.type === \"action:end\") {\n this.callbacks.onServerToolEnd?.({\n id: chunk.id,\n name: chunk.name,\n result: chunk.result,\n error: chunk.error,\n });\n }\n\n // Update message in state BY ID (not last position)\n // This is critical: when tool calls trigger nested streams,\n // updateLastMessage would update the wrong message\n const updatedMessage = streamStateToMessage(this.streamState) as T;\n this.state.updateMessageById(\n this.streamState.messageId,\n // Preserve parentId/childrenIds from the existing placeholder so the\n // branch tree structure (activeChildMap) is not corrupted when\n // setCurrentLeaf() walks up the chain later.\n (existing) => ({\n ...updatedMessage,\n ...(existing.parentId !== undefined\n ? { parentId: existing.parentId }\n : {}),\n ...(existing.childrenIds !== undefined\n ? { childrenIds: existing.childrenIds }\n : {}),\n }),\n );\n\n // Fire raw stream chunk callback — powers useCopilotEvent hook\n this.callbacks.onStreamChunk?.({\n ...chunk,\n messageId: assistantMessage.id,\n });\n\n // Notify delta callback\n if (chunk.type === \"message:delta\") {\n this.callbacks.onMessageDelta?.(assistantMessage.id, chunk.content);\n }\n\n // Check for completion\n if (isStreamDone(chunk)) {\n this.debug(\"streamDone\", {\n chunkType: chunk.type,\n requiresAction: (chunk as { requiresAction?: boolean })\n .requiresAction,\n doneMessagesCount:\n (chunk as { messages?: unknown[] }).messages?.length ?? 0,\n streamToolCallsCount: this.streamState?.toolCalls?.length ?? 0,\n toolCallsEmitted,\n chunkCount,\n });\n\n // Adopt threadId from server storage adapter (if present)\n if (\n chunk.type === \"done\" &&\n (chunk as { threadId?: string }).threadId\n ) {\n const serverThreadId = (chunk as { threadId?: string }).threadId!;\n if (\n !this.config.threadId ||\n this.config.threadId !== serverThreadId\n ) {\n this.config.threadId = serverThreadId;\n this.sessionInitPromise = null;\n this.setSessionStatus(\"ready\");\n this.callbacks.onThreadChange?.(serverThreadId);\n }\n }\n\n // CRITICAL: Process messages from done event (server-side tool results)\n // Without this, tool_call_id is lost and causes Anthropic API errors\n if (chunk.type === \"done\" && chunk.messages?.length) {\n this.debug(\"processDoneMessages\", {\n count: chunk.messages.length,\n roles: chunk.messages.map(\n (m) =>\n `${m.role}${m.tool_calls?.length ? `[${(m.tool_calls as unknown[]).length}tc]` : \"\"}`,\n ),\n });\n\n const currentStreamToolCallIds = new Set(\n this.streamState?.toolCalls?.map((toolCall) => toolCall.id) ?? [],\n );\n const messagesToInsert: T[] = [];\n\n // Build hidden map from stream state's toolResults\n const toolCallsHidden: Record<string, boolean> = {};\n if (this.streamState?.toolResults) {\n for (const [id, result] of this.streamState.toolResults) {\n if (result.hidden !== undefined) {\n toolCallsHidden[id] = result.hidden;\n }\n }\n }\n\n for (const msg of chunk.messages) {\n // Skip plain assistant text messages because they are already represented\n // by streamed message:start/message:delta/message:end events. Preserve\n // assistant messages that carry tool_calls so tool results keep a valid\n // preceding assistant tool_call message in local state.\n if (msg.role === \"assistant\" && !msg.tool_calls?.length) {\n continue;\n }\n\n // The current streamed turn already becomes an assistant message from\n // streamState/tool_calls handling. Skip the duplicate copy from the\n // done payload, but keep assistant tool_call messages from earlier\n // recursive turns (for example search_tools followed by a later client\n // tool call).\n if (\n msg.role === \"assistant\" &&\n msg.tool_calls?.length &&\n (msg.tool_calls as Array<{ id: string }>).every((toolCall) =>\n currentStreamToolCallIds.has(toolCall.id),\n )\n ) {\n continue;\n }\n\n // For assistant messages with tool_calls, add hidden metadata\n let metadata: Record<string, unknown> | undefined;\n if (\n msg.role === \"assistant\" &&\n msg.tool_calls?.length &&\n Object.keys(toolCallsHidden).length > 0\n ) {\n metadata = { toolCallsHidden };\n }\n\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 toolCallId: msg.tool_call_id,\n createdAt: new Date(),\n metadata,\n } as T;\n\n messagesToInsert.push(message);\n }\n\n if (messagesToInsert.length > 0) {\n const currentMessages = this.state.messages;\n const currentStreamIndex = this.streamState\n ? currentMessages.findIndex(\n (message) => message.id === this.streamState!.messageId,\n )\n : -1;\n\n if (currentStreamIndex === -1) {\n // Append at end — chain from the last existing message\n const appendParentId =\n currentMessages.length > 0\n ? currentMessages[currentMessages.length - 1].id\n : undefined;\n const linkedToInsert = messagesToInsert.map((msg, i) => ({\n ...msg,\n parentId: i === 0 ? appendParentId : messagesToInsert[i - 1].id,\n }));\n this.state.setMessages([...currentMessages, ...linkedToInsert]);\n } else {\n // Insert before the current streaming message — chain from the\n // message immediately before it, then re-parent the streaming\n // message to chain from the last inserted.\n const insertParentId =\n currentStreamIndex > 0\n ? currentMessages[currentStreamIndex - 1].id\n : undefined;\n const linkedToInsert = messagesToInsert.map((msg, i) => ({\n ...msg,\n parentId: i === 0 ? insertParentId : messagesToInsert[i - 1].id,\n }));\n const lastInsertedId =\n linkedToInsert[linkedToInsert.length - 1].id;\n // Re-parent the streaming message to chain from the last inserted\n const updatedCurrent = currentMessages.map((m, idx) =>\n idx === currentStreamIndex\n ? { ...m, parentId: lastInsertedId }\n : m,\n );\n this.state.setMessages([\n ...updatedCurrent.slice(0, currentStreamIndex),\n ...linkedToInsert,\n ...updatedCurrent.slice(currentStreamIndex),\n ]);\n }\n }\n\n // Only execute client tools once the full done payload has been\n // merged into local state. Emitting earlier on the first tool_calls\n // chunk can race with recursive server-tool turns and produce an\n // invalid continuation order for OpenAI-compatible providers.\n this.debug(\"requiresAction check\", {\n requiresAction: chunk.requiresAction,\n toolCallsEmitted,\n updatedMessageToolCallsCount: updatedMessage.toolCalls?.length ?? 0,\n messagesToInsertCount: messagesToInsert.length,\n });\n\n if (chunk.requiresAction && !toolCallsEmitted) {\n // When the server runs a multi-turn agent loop before handing off\n // to the client, the client tool calls arrive via done.messages\n // (messagesToInsert), NOT in the current streaming message's\n // toolCalls (which is always empty because action:start/args/end\n // chunks only fire callbacks and never update streamState.toolCalls).\n // Find the last assistant message in the inserted batch that carries\n // tool calls — that is the pending client tool dispatch.\n let clientToolCalls = updatedMessage.toolCalls;\n if (!clientToolCalls?.length && messagesToInsert.length > 0) {\n for (let i = messagesToInsert.length - 1; i >= 0; i--) {\n const m = messagesToInsert[i];\n if (m.role === \"assistant\" && m.toolCalls?.length) {\n clientToolCalls = m.toolCalls;\n this.debug(\"clientToolCalls from messagesToInsert\", {\n index: i,\n count: clientToolCalls?.length,\n });\n break;\n }\n }\n }\n\n if (clientToolCalls?.length) {\n toolCallsEmitted = true;\n this.debug(\"emit toolCalls (normal done path)\", {\n count: clientToolCalls.length,\n names: (\n clientToolCalls as Array<{\n function?: { name: string };\n name?: string;\n }>\n ).map((tc) => tc.function?.name ?? tc.name),\n });\n this.emit(\"toolCalls\", { toolCalls: clientToolCalls });\n } else {\n this.debug(\"requiresAction=true but no clientToolCalls found\", {\n updatedMessageToolCalls: updatedMessage.toolCalls,\n messagesToInsert: messagesToInsert.map((m) => ({\n role: m.role,\n hasToolCalls: !!m.toolCalls?.length,\n })),\n });\n }\n }\n }\n\n break;\n }\n }\n\n this.debug(\"handleStreamResponse\", `Processed ${chunkCount} chunks`);\n\n // If streamState was already finalized (via message:end mid-stream), skip finalization\n if (!this.streamState) {\n this.debug(\"streamState already finalized via message:end\");\n } else {\n // Build hidden map from stream state's toolResults for final message metadata\n const toolCallsHidden: Record<string, boolean> = {};\n if (this.streamState.toolResults) {\n for (const [id, result] of this.streamState.toolResults) {\n if (result.hidden !== undefined) {\n toolCallsHidden[id] = result.hidden;\n }\n }\n }\n\n // Finalize - update by ID to ensure we update the correct message\n const finalMessage = streamStateToMessage(this.streamState) as T;\n\n // Add toolCallsHidden metadata if we have tool calls with hidden flags\n if (\n finalMessage.toolCalls?.length &&\n Object.keys(toolCallsHidden).length > 0\n ) {\n (finalMessage as T & { metadata?: Record<string, unknown> }).metadata =\n {\n ...(finalMessage as T & { metadata?: Record<string, unknown> })\n .metadata,\n toolCallsHidden,\n };\n }\n\n this.state.updateMessageById(this.streamState.messageId, (existing) => ({\n ...finalMessage,\n ...(existing.parentId !== undefined\n ? { parentId: existing.parentId }\n : {}),\n ...(existing.childrenIds !== undefined\n ? { childrenIds: existing.childrenIds }\n : {}),\n }));\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\n this.callbacks.onMessagesChange?.(this._allMessages());\n\n // Stream completed successfully — placeholder is now a real message, clear tracker\n this._activePlaceholderMessageId = undefined;\n\n // Close the stream group opened at the start of handleStreamResponse\n this.debugGroupEnd();\n\n // Only set status to \"ready\" if NO tool calls were emitted\n // If tool calls were emitted, the async handler will manage status\n // (it will set \"submitted\" then \"streaming\" for the continuation)\n this.debug(\"stream end\", {\n toolCallsEmitted,\n totalChunks: chunkCount,\n messagesInState: this.state.messages.length,\n });\n if (!toolCallsEmitted) {\n this.state.status = \"ready\";\n this.callbacks.onStatusChange?.(\"ready\");\n this.callbacks.onFinish?.(this.state.messages);\n }\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 // Adopt threadId from server storage adapter (if present)\n if (\n response.threadId &&\n (!this.config.threadId || this.config.threadId !== response.threadId)\n ) {\n this.config.threadId = response.threadId;\n this.sessionInitPromise = null;\n this.setSessionStatus(\"ready\");\n this.callbacks.onThreadChange?.(response.threadId);\n }\n\n // Build a map of tool call hidden flags from response.toolCalls\n const toolCallHiddenMap = new Map<string, boolean>();\n if (response.toolCalls) {\n for (const tc of response.toolCalls) {\n if (tc.hidden !== undefined) {\n toolCallHiddenMap.set(tc.id, tc.hidden);\n }\n }\n }\n\n // Add response messages\n // Track the current leaf as we insert messages so each message in a\n // multi-message response is correctly chained (child of the previous).\n let currentParentId: string | null | undefined =\n this.state.messages.length > 0\n ? this.state.messages[this.state.messages.length - 1].id\n : undefined;\n\n for (const msg of response.messages ?? []) {\n // For assistant messages with tool_calls, add hidden info to metadata\n let metadata: Record<string, unknown> | undefined;\n if (\n msg.role === \"assistant\" &&\n msg.tool_calls &&\n toolCallHiddenMap.size > 0\n ) {\n const toolCallsHidden: Record<string, boolean> = {};\n for (const tc of msg.tool_calls as Array<{ id: string }>) {\n const hidden = toolCallHiddenMap.get(tc.id);\n if (hidden !== undefined) {\n toolCallsHidden[tc.id] = hidden;\n }\n }\n if (Object.keys(toolCallsHidden).length > 0) {\n metadata = { toolCallsHidden };\n }\n }\n\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 // CRITICAL: Preserve toolCallId for tool messages (fixes Anthropic API errors)\n toolCallId: msg.tool_call_id,\n createdAt: new Date(),\n metadata,\n // Preserve branch tree structure: each message is a child of the\n // current leaf so the tree is not corrupted for non-streaming mode.\n ...(currentParentId !== undefined ? { parentId: currentParentId } : {}),\n } as T;\n\n this.state.pushMessage(message);\n // Next message in this batch is a child of the one we just pushed\n currentParentId = message.id;\n }\n\n this.callbacks.onMessagesChange?.(this._allMessages());\n\n // Check for tool calls BEFORE setting status to ready\n // If tool calls exist, the async handler will manage status\n const hasToolCalls =\n response.requiresAction &&\n this.state.messages.length > 0 &&\n this.state.messages[this.state.messages.length - 1]?.toolCalls?.length;\n\n if (hasToolCalls) {\n const lastMessage = this.state.messages[this.state.messages.length - 1];\n this.emit(\"toolCalls\", { toolCalls: lastMessage.toolCalls });\n } else {\n // Only set ready if no tool calls\n this.state.status = \"ready\";\n this.callbacks.onStatusChange?.(\"ready\");\n this.callbacks.onFinish?.(this.state.messages);\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\n // Remove the pending loading placeholder so it doesn't stay frozen.\n // The error is surfaced through state.error → UI banner only —\n // never written into the message history.\n if (this._activePlaceholderMessageId) {\n this.state.popMessage();\n this._activePlaceholderMessageId = undefined;\n this.callbacks.onMessagesChange?.(this._allMessages());\n }\n\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 // ─── Debug helpers ────────────────────────────────────────────────────────\n\n private _log?: import(\"../../core/utils/logger\").ScopedLogger;\n\n private get log(): import(\"../../core/utils/logger\").ScopedLogger {\n if (!this._log) {\n this._log = createLogger(\"streaming\", () => this.config.debug ?? false);\n }\n return this._log;\n }\n\n protected debug(action: string, data?: unknown): void {\n this.log(action, data);\n }\n\n protected debugGroup(label: string, collapsed = true): void {\n if (collapsed) {\n this.log.groupCollapsed(label);\n } else {\n this.log.group(label);\n }\n }\n\n protected debugGroupEnd(): void {\n this.log.groupEnd();\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 private _isDisposed = false;\n\n /**\n * Whether this instance has been disposed\n */\n get disposed(): boolean {\n return this._isDisposed;\n }\n\n /**\n * Dispose and cleanup\n * Note: Event handlers are NOT cleared to support React StrictMode revive()\n */\n dispose(): void {\n if (this._isDisposed) {\n this.debug(\"dispose() called but already disposed - ignoring\");\n return;\n }\n this.debug(\"dispose() - stopping active requests\");\n this._isDisposed = true;\n this.stop();\n // Event handlers persist for React StrictMode revive()\n }\n\n /**\n * Revive a disposed instance (for React StrictMode compatibility)\n * This allows reusing an instance after dispose() was called\n */\n revive(): void {\n if (!this._isDisposed) {\n return;\n }\n this.debug(\"revive() - restoring disposed instance\");\n this._isDisposed = false;\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 private _isCancelled = false;\n\n // Cancellation support\n private abortController: AbortController | null = null;\n\n // Registered tools with reference counting for React StrictMode compatibility\n // Tools are never fully removed during a session - only marked as inactive\n private registeredTools: Map<\n string,\n { tool: ToolDefinition; refCount: number; active: boolean }\n > = 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 isCancelled(): boolean {\n return this._isCancelled;\n }\n\n get signal(): AbortSignal | undefined {\n return this.abortController?.signal;\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 // Only return active tools for API requests\n return Array.from(this.registeredTools.values())\n .filter((entry) => entry.active)\n .map((entry) => entry.tool);\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 // Check for duplicate by ID - skip if already exists\n const existingIndex = this._toolExecutions.findIndex(\n (e) => e.id === execution.id,\n );\n if (existingIndex !== -1) {\n // Skip duplicate - don't add or merge\n return;\n }\n\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 /**\n * Update a tool execution with partial data\n */\n updateToolExecution(id: string, update: Partial<ToolExecution>): 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 (reference counted for React StrictMode compatibility)\n * Tools are never fully removed - ref counting ensures StrictMode works correctly\n */\n registerTool(tool: ToolDefinition): void {\n const existing = this.registeredTools.get(tool.name);\n if (existing) {\n // Update the tool definition and increment ref count\n existing.tool = tool;\n existing.refCount++;\n existing.active = true;\n } else {\n // New tool\n this.registeredTools.set(tool.name, {\n tool,\n refCount: 1,\n active: true,\n });\n }\n }\n\n /**\n * Unregister a tool (reference counted for React StrictMode compatibility)\n * Tool is only marked inactive when refCount reaches 0, never deleted\n */\n unregisterTool(name: string): void {\n const entry = this.registeredTools.get(name);\n if (entry) {\n entry.refCount = Math.max(0, entry.refCount - 1);\n if (entry.refCount === 0) {\n entry.active = false;\n }\n }\n }\n\n /**\n * Get a registered tool (returns active tools, or inactive if forExecution=true)\n */\n getTool(name: string): ToolDefinition | undefined {\n const entry = this.registeredTools.get(name);\n // Always return the tool if it exists - handler execution should work\n // even if the component temporarily unmounted (StrictMode)\n return entry?.tool;\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 if cancelled\n if (this._isCancelled) {\n return [];\n }\n\n // Check iteration limit\n if (this._iteration >= this._maxIterations) {\n this._maxIterationsReached = true;\n this.callbacks.onMaxIterationsReached?.();\n return [];\n }\n\n // Create new abort controller for this batch\n this.abortController = new AbortController();\n this._isCancelled = false;\n this._isProcessing = true;\n\n this.setIteration(this._iteration + 1);\n\n // Run all tools in parallel so approval-required tools don't block\n // non-approval tools. All results are still collected together before\n // returning (Anthropic API requires results for every tool_use block).\n const results = await Promise.all(\n toolCalls.map((toolCall) => {\n if (this._isCancelled || this.abortController!.signal.aborted) {\n return Promise.resolve<ToolResponse>({\n toolCallId: toolCall.id,\n success: false,\n error: \"Tool execution cancelled\",\n });\n }\n return this.executeSingleTool(toolCall);\n }),\n );\n\n this._isProcessing = false;\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.getTool(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 hidden: tool?.hidden,\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 title and message (can be string or function)\n const approvalTitle =\n typeof tool.approvalTitle === \"function\"\n ? tool.approvalTitle(toolCall.args)\n : tool.approvalTitle;\n\n const approvalMessage =\n typeof tool.approvalMessage === \"function\"\n ? tool.approvalMessage(toolCall.args)\n : tool.approvalMessage;\n\n execution.approvalStatus = \"required\";\n execution.approvalTitle = approvalTitle;\n execution.approvalMessage = approvalMessage;\n this.updateToolExecution(toolCall.id, {\n approvalStatus: \"required\",\n approvalTitle,\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\n // Check if cancelled before executing\n if (this._isCancelled || this.abortController?.signal.aborted) {\n throw new Error(\"Tool execution cancelled\");\n }\n\n // Pass signal and approvalData to handler via context\n const result = await tool.handler(toolCall.args, {\n signal: this.abortController?.signal,\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 // Server-Side Tool Tracking\n // ============================================\n\n /**\n * Add a server-side tool execution (from streaming action:start event)\n * Used to track tools executed on the server (not client-side)\n */\n addServerToolExecution(info: {\n id: string;\n name: string;\n hidden?: boolean;\n }): void {\n const execution: ToolExecution = {\n id: info.id,\n toolCallId: info.id,\n name: info.name,\n args: {},\n status: \"executing\",\n approvalStatus: \"none\",\n startedAt: new Date(),\n hidden: info.hidden,\n };\n this.addToolExecution(execution);\n }\n\n /**\n * Update a server-side tool execution with args (from action:args event)\n */\n updateServerToolArgs(id: string, args: Record<string, unknown>): void {\n this.updateToolExecution(id, { args });\n }\n\n /**\n * Complete a server-side tool execution (from action:end event)\n */\n completeServerToolExecution(info: {\n id: string;\n result?: unknown;\n error?: string;\n }): void {\n this.updateToolExecution(info.id, {\n status: info.error ? \"failed\" : \"completed\",\n result: info.result,\n error: info.error,\n completedAt: new Date(),\n });\n }\n\n /**\n * Cancel all pending and executing tools\n * This will:\n * 1. Abort the current abort controller (signals tools to stop)\n * 2. Reject all pending approvals\n * 3. Mark executing tools as cancelled\n */\n cancel(): void {\n this._isCancelled = true;\n this._isProcessing = false;\n\n // Abort the controller to signal tools\n this.abortController?.abort();\n\n // Reject all pending approvals\n for (const [id, pending] of this.pendingApprovals) {\n pending.resolve({ approved: false });\n this.updateToolExecution(id, {\n status: \"failed\",\n approvalStatus: \"rejected\",\n error: \"Cancelled by user\",\n completedAt: new Date(),\n });\n }\n this.pendingApprovals.clear();\n\n // Mark any executing tools as failed\n for (const exec of this._toolExecutions) {\n if (exec.status === \"executing\" || exec.status === \"pending\") {\n this.updateToolExecution(exec.id, {\n status: \"failed\",\n error: \"Cancelled by user\",\n completedAt: new Date(),\n });\n }\n }\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 this._isCancelled = false;\n this.abortController = null;\n }\n\n /**\n * Reset iteration counter only (allows continuing after max iterations)\n * Called when user sends a new message\n */\n resetIterations(): void {\n this.setIteration(0);\n this._maxIterationsReached = false;\n this._isCancelled = false;\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 private _isDisposed = false;\n\n /**\n * Whether this instance has been disposed\n */\n get disposed(): boolean {\n return this._isDisposed;\n }\n\n /**\n * Dispose and cleanup\n * Note: Tools are NOT cleared to support React StrictMode revive()\n */\n dispose(): void {\n if (this._isDisposed) {\n return;\n }\n this._isDisposed = true;\n\n // Reject all pending approvals\n for (const [_id, pending] of this.pendingApprovals) {\n pending.resolve({ approved: false });\n }\n this.pendingApprovals.clear();\n\n // Tools persist for React StrictMode revive() - ref counting handles lifecycle\n this._toolExecutions = [];\n }\n\n /**\n * Revive a disposed instance (for React StrictMode compatibility)\n * Tools are preserved across dispose/revive cycle\n */\n revive(): void {\n if (!this._isDisposed) {\n return;\n }\n this._isDisposed = false;\n this._isCancelled = false;\n this._maxIterationsReached = false;\n }\n}\n","/**\n * MessageTree — Bidirectional flat-map message tree for conversation branching.\n *\n * Industry-standard data structure used by ChatGPT, Claude.ai, and Gemini:\n * - parentId + childrenIds[] for O(1) navigation\n * - activeChildMap tracks the active path through the tree\n *\n * Zero React dependency — pure TypeScript, works in any environment.\n */\n\nimport type { UIMessage } from \"../types/message\";\n\n// ============================================\n// Types\n// ============================================\n\n/**\n * Branch navigation info for the UI navigator (← N/M →)\n */\nexport interface BranchInfo {\n /** 0-based index of this message among its siblings */\n siblingIndex: number;\n /** Total number of sibling variants at this fork */\n totalSiblings: number;\n /** Ordered IDs of all siblings (oldest-first) */\n siblingIds: string[];\n hasPrevious: boolean;\n hasNext: boolean;\n}\n\n// ============================================\n// MessageTree\n// ============================================\n\nexport class MessageTree<T extends UIMessage = UIMessage> {\n /** All messages by ID */\n private nodeMap: Map<string, T> = new Map();\n /** parentKey → ordered list of child IDs (insertion order = oldest-first) */\n private childrenOf: Map<string, string[]> = new Map();\n /** parentKey → currently-active child ID */\n private activeChildMap: Map<string, string> = new Map();\n /** Current leaf message ID (tip of the active path) */\n private _currentLeafId: string | null = null;\n /** Cached visible messages — invalidated on every mutation */\n private _visibleCache: T[] | null = null;\n\n /** Sentinel key used for root-level messages (parentId === null) */\n static readonly ROOT_KEY = \"__root__\";\n\n constructor(messages?: T[]) {\n if (messages?.length) {\n this._buildFromMessages(messages);\n }\n }\n\n // ============================================\n // Static Migration Helpers\n // ============================================\n\n /**\n * Convert a legacy flat array (no parentId) to a tree-linked array.\n *\n * Rules:\n * - Tool messages get parentId = the owning assistant message's id\n * (matched via toolCallId → toolCall.id), chained in sequence.\n * - All other messages get parentId = the previous message in the linear\n * chain (including tool messages, so the next non-tool after tool results\n * is a child of the last tool result, not a sibling).\n *\n * Returns a new array with parentId/childrenIds filled in.\n * Does NOT mutate the original messages.\n */\n static fromFlatArray<T extends UIMessage>(messages: T[]): T[] {\n if (messages.length === 0) return messages;\n\n // If already tree-linked (any message has parentId defined), return as-is\n const alreadyLinked = messages.some((m) => m.parentId !== undefined);\n if (alreadyLinked) return messages;\n\n const result: T[] = [];\n // Track the previous message id for linear chain (includes tool messages\n // so that the next non-tool message becomes a child of the last tool result)\n let prevId: string | null = null;\n\n // Build assistant id → assistant message map for tool pairing\n const assistantById = new Map<string, T>();\n for (const msg of messages) {\n if (msg.role === \"assistant\") {\n assistantById.set(msg.id, msg);\n }\n }\n\n // Track the last tool message id per owning assistant, so consecutive tool\n // results from the same turn are chained (tool_result_1 → tool_result_2).\n const lastToolIdByAssistant = new Map<string, string>();\n\n for (const msg of messages) {\n if (msg.role === \"tool\" && msg.toolCallId) {\n // Find owning assistant message by matching toolCallId → toolCall.id\n let ownerAssistantId: string | null = null;\n for (const [, assistant] of assistantById) {\n if (assistant.toolCalls?.some((tc) => tc.id === msg.toolCallId)) {\n ownerAssistantId = assistant.id;\n break;\n }\n }\n // Chain multiple tool results for the same assistant turn\n const chainParent = ownerAssistantId\n ? (lastToolIdByAssistant.get(ownerAssistantId) ?? ownerAssistantId)\n : (prevId ?? null);\n result.push({\n ...msg,\n parentId: chainParent,\n childrenIds: [],\n });\n if (ownerAssistantId) {\n lastToolIdByAssistant.set(ownerAssistantId, msg.id);\n }\n // Advance prevId so the next non-tool message is a child of this result\n prevId = msg.id;\n } else {\n result.push({\n ...msg,\n parentId: prevId,\n childrenIds: [],\n });\n prevId = msg.id;\n }\n }\n\n // Second pass: fill in childrenIds based on parentId assignments\n const childrenMap = new Map<string, string[]>();\n for (const msg of result) {\n const parentKey =\n msg.parentId == null ? MessageTree.ROOT_KEY : msg.parentId;\n if (!childrenMap.has(parentKey)) {\n childrenMap.set(parentKey, []);\n }\n childrenMap.get(parentKey)!.push(msg.id);\n }\n\n return result.map((msg) => ({\n ...msg,\n childrenIds: childrenMap.get(msg.id) ?? [],\n }));\n }\n\n // ============================================\n // Core Queries\n // ============================================\n\n /**\n * Returns the visible path (root → current leaf) — what the UI renders\n * and what gets sent to the API.\n *\n * Backward-compat: if NO message has parentId set (all undefined),\n * falls back to insertion order (legacy linear mode).\n */\n getVisibleMessages(): T[] {\n if (this._visibleCache !== null) return this._visibleCache;\n\n if (this.nodeMap.size === 0) {\n this._visibleCache = [];\n return this._visibleCache;\n }\n\n // Legacy linear fallback: no parentId on any message\n const hasTreeStructure = Array.from(this.nodeMap.values()).some(\n (m) => m.parentId !== undefined,\n );\n this._visibleCache = hasTreeStructure\n ? this._getActivePath().map((id) => this.nodeMap.get(id)!)\n : Array.from(this.nodeMap.values());\n\n return this._visibleCache;\n }\n\n private _invalidateCache(): void {\n this._visibleCache = null;\n }\n\n /**\n * Returns ALL messages across every branch (for persistence / ThreadManager).\n */\n getAllMessages(): T[] {\n return Array.from(this.nodeMap.values());\n }\n\n /**\n * Branch navigation info for the UI navigator.\n * Returns null if the message has no siblings (only child).\n */\n getBranchInfo(messageId: string): BranchInfo | null {\n const msg = this.nodeMap.get(messageId);\n if (!msg) return null;\n\n const parentKey = this._parentKey(msg.parentId);\n const siblings = this.childrenOf.get(parentKey) ?? [];\n\n if (siblings.length <= 1) return null;\n\n const siblingIndex = siblings.indexOf(messageId);\n return {\n siblingIndex,\n totalSiblings: siblings.length,\n siblingIds: [...siblings],\n hasPrevious: siblingIndex > 0,\n hasNext: siblingIndex < siblings.length - 1,\n };\n }\n\n get currentLeafId(): string | null {\n return this._currentLeafId;\n }\n\n get hasBranches(): boolean {\n for (const children of this.childrenOf.values()) {\n if (children.length > 1) return true;\n }\n return false;\n }\n\n // ============================================\n // Mutations\n // ============================================\n\n /**\n * Insert a new message.\n * - Updates childrenOf and nodeMap.\n * - New branch becomes active (activeChildMap updated).\n * - Updates current leaf.\n */\n addMessage(message: T): T {\n this.nodeMap.set(message.id, message);\n\n const parentKey = this._parentKey(message.parentId);\n if (!this.childrenOf.has(parentKey)) {\n this.childrenOf.set(parentKey, []);\n }\n const siblings = this.childrenOf.get(parentKey)!;\n if (!siblings.includes(message.id)) {\n siblings.push(message.id);\n }\n\n // New message becomes active at its parent fork\n this.activeChildMap.set(parentKey, message.id);\n\n // Update current leaf (walk forward from this message)\n this._currentLeafId = this._walkToLeaf(message.id);\n this._invalidateCache();\n\n return message;\n }\n\n /**\n * Navigate: make messageId the active child at its parent fork,\n * then walk to its leaf and update currentLeafId.\n */\n switchBranch(messageId: string): void {\n const msg = this.nodeMap.get(messageId);\n if (!msg) return;\n\n const parentKey = this._parentKey(msg.parentId);\n this.activeChildMap.set(parentKey, messageId);\n this._currentLeafId = this._walkToLeaf(messageId);\n this._invalidateCache();\n }\n\n /**\n * Update message content in-place (streaming updates).\n * No tree structure change.\n */\n updateMessage(id: string, updater: (msg: T) => T): boolean {\n const existing = this.nodeMap.get(id);\n if (!existing) return false;\n this.nodeMap.set(id, updater(existing));\n this._invalidateCache();\n return true;\n }\n\n /**\n * Set current leaf explicitly.\n * Used by regenerate() to rewind the active path before pushing a new message.\n */\n setCurrentLeaf(leafId: string | null): void {\n this._currentLeafId = leafId;\n\n if (leafId === null) return;\n\n // Ensure the active path points to this leaf\n const msg = this.nodeMap.get(leafId);\n if (!msg) return;\n\n // Walk up and set activeChildMap entries so getVisibleMessages() is consistent\n let current: T | undefined = msg;\n while (current) {\n const parentKey = this._parentKey(current.parentId);\n this.activeChildMap.set(parentKey, current.id);\n if (current.parentId == null || current.parentId === undefined) break;\n current = this.nodeMap.get(current.parentId);\n }\n this._invalidateCache();\n }\n\n /**\n * Rebuild entire tree from a message array.\n * Used by setMessages().\n */\n reset(messages: T[]): void {\n this.nodeMap.clear();\n this.childrenOf.clear();\n this.activeChildMap.clear();\n this._currentLeafId = null;\n this._invalidateCache();\n\n if (messages.length > 0) {\n this._buildFromMessages(messages);\n }\n }\n\n // ============================================\n // Private Helpers\n // ============================================\n\n private _buildFromMessages(messages: T[]): void {\n // Auto-migrate legacy flat arrays\n const linked = messages.some((m) => m.parentId !== undefined)\n ? messages\n : MessageTree.fromFlatArray(messages);\n\n for (const msg of linked) {\n this.nodeMap.set(msg.id, msg);\n\n const parentKey = this._parentKey(msg.parentId);\n if (!this.childrenOf.has(parentKey)) {\n this.childrenOf.set(parentKey, []);\n }\n const siblings = this.childrenOf.get(parentKey)!;\n if (!siblings.includes(msg.id)) {\n siblings.push(msg.id);\n }\n }\n\n // Build activeChildMap: default to last child at each fork\n // (last child = most recently added = what was active when saved)\n for (const [parentKey, children] of this.childrenOf) {\n if (children.length > 0) {\n this.activeChildMap.set(parentKey, children[children.length - 1]);\n }\n }\n\n // Set current leaf by walking the active path from root\n const path = this._getActivePath();\n this._currentLeafId = path.length > 0 ? path[path.length - 1] : null;\n }\n\n private _parentKey(parentId: string | null | undefined): string {\n if (parentId == null || parentId === undefined) {\n return MessageTree.ROOT_KEY;\n }\n return parentId;\n }\n\n /**\n * Walk forward from a message along active children to find the leaf.\n */\n private _walkToLeaf(fromId: string): string {\n let current = fromId;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const children = this.childrenOf.get(current);\n if (!children || children.length === 0) break;\n const activeChild = this.activeChildMap.get(current);\n if (!activeChild) break;\n if (!this.nodeMap.has(activeChild)) break;\n current = activeChild;\n }\n return current;\n }\n\n /**\n * Walk the active path from root to the current leaf.\n */\n private _getActivePath(): string[] {\n const path: string[] = [];\n const visited = new Set<string>();\n\n // Start from root children\n const rootChildren = this.childrenOf.get(MessageTree.ROOT_KEY) ?? [];\n if (rootChildren.length === 0) return path;\n\n // Pick active root child\n let activeId = this.activeChildMap.get(MessageTree.ROOT_KEY);\n if (!activeId) {\n // Fall back to last root child\n activeId = rootChildren[rootChildren.length - 1];\n }\n\n // Walk forward along active children\n let current: string | undefined = activeId;\n while (current && !visited.has(current)) {\n if (!this.nodeMap.has(current)) break;\n visited.add(current);\n path.push(current);\n\n // Check if this message has an override active child set\n // (used when setCurrentLeaf rewinds the active path)\n const activeChild = this.activeChildMap.get(current);\n if (!activeChild || !this.nodeMap.has(activeChild)) break;\n current = activeChild;\n }\n\n return path;\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 ContextUsage,\n ToolDefinition,\n MessageAttachment,\n PermissionLevel,\n} from \"../core\";\nimport type { Resolvable } from \"../core/utils/resolvable\";\nimport { createLogger } from \"../core/utils/logger\";\nimport { AbstractChat } from \"./classes/AbstractChat\";\nimport { AbstractAgentLoop } from \"./AbstractAgentLoop\";\nimport type { ChatConfig, ChatCallbacks, YourGPTConfig } 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 *\n * Supports both static values and getter functions for dynamic configuration.\n * Getter functions are resolved at request time, ensuring fresh values.\n */\nexport interface ChatWithToolsConfig {\n /** Runtime API endpoint - can be static or getter function */\n runtimeUrl: Resolvable<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 - can be static or getter function */\n headers?: Resolvable<Record<string, string>>;\n /** Additional body properties - can be static or getter function */\n body?: Resolvable<Record<string, unknown>>;\n /** Thread ID for conversation persistence */\n threadId?: string;\n /**\n * Called once before the first message on a new thread to create a session.\n * The returned value IS the thread ID. Only called when threadId is not set.\n */\n onCreateSession?: () => string | Promise<string>;\n /** YourGPT config — enables automatic session creation */\n yourgptConfig?: YourGPTConfig;\n /** Enable debug logging */\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 /** Optional prompt/tool optimization controls */\n optimization?: ChatConfig[\"optimization\"];\n /** Custom error message when max iterations reached (sent to AI as tool result) */\n maxIterationsMessage?: string;\n /** State implementation (injected by framework adapter) */\n state?: ChatState<UIMessage>;\n /** Transport implementation */\n transport?: ChatTransport;\n /** Custom error message extractor for non-2xx API responses */\n parseError?: (status: number, body: unknown) => string | null | undefined;\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 /** Called when prompt context usage changes */\n onContextUsageChange?: (usage: ContextUsage) => 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 body: config.body,\n optimization: config.optimization,\n threadId: config.threadId,\n onCreateSession: config.onCreateSession,\n yourgptConfig: config.yourgptConfig,\n debug: config.debug,\n initialMessages: config.initialMessages,\n state: config.state,\n transport: config.transport,\n parseError: config.parseError,\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 onContextUsageChange: callbacks.onContextUsageChange,\n onThreadChange: callbacks.onThreadChange,\n onSessionStatusChange: callbacks.onSessionStatusChange,\n // Server-side tool callbacks - track in agentLoop for UI display\n // IMPORTANT: Only track tools that are NOT registered client-side\n // Client-side tools are tracked via executeToolCalls() path\n onServerToolStart: (info) => {\n // Check if execution with this ID already exists\n const existingExecution = this.agentLoop.toolExecutions.find(\n (e) => e.id === info.id,\n );\n if (existingExecution) {\n // Update hidden flag if this event has it (agent-loop sends hidden, adapter doesn't)\n if (\n info.hidden !== undefined &&\n existingExecution.hidden !== info.hidden\n ) {\n this.debug(\n \"Updating hidden flag for existing execution:\",\n info.name,\n info.hidden,\n );\n this.agentLoop.updateToolExecution(info.id, {\n hidden: info.hidden,\n });\n }\n return;\n }\n // Skip if this tool is registered client-side (will be tracked via executeToolCalls)\n const isClientTool = this.agentLoop.tools.some(\n (t) => t.name === info.name && t.location === \"client\",\n );\n if (isClientTool) {\n this.debug(\"Skipping server tracking for client tool:\", info.name);\n return;\n }\n this.debug(\"Server tool started:\", info.name, {\n hidden: info.hidden,\n id: info.id,\n });\n this.agentLoop.addServerToolExecution(info);\n },\n onServerToolArgs: (info) => {\n // Skip if this tool is registered client-side\n const isClientTool = this.agentLoop.tools.some(\n (t) => t.name === info.name && t.location === \"client\",\n );\n if (isClientTool) return;\n this.debug(\"Server tool args:\", info.name, info.args);\n this.agentLoop.updateServerToolArgs(info.id, info.args ?? {});\n },\n onServerToolEnd: (info) => {\n // Skip if this tool is registered client-side\n const isClientTool = this.agentLoop.tools.some(\n (t) => t.name === info.name && t.location === \"client\",\n );\n if (isClientTool) return;\n this.debug(\"Server tool ended:\", info.name, {\n error: info.error,\n hasResult: !!info.result,\n });\n this.agentLoop.completeServerToolExecution(info);\n },\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 this.debug(\"Wiring up toolCalls event handler\");\n\n // Handle tool calls from chat\n this.chat.on(\"toolCalls\", async (event) => {\n const toolCalls = event.toolCalls;\n if (!toolCalls?.length) {\n return;\n }\n\n this.debug(\"Tool calls received:\", toolCalls.length);\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 } else if (\n this.agentLoop.maxIterationsReached &&\n toolCallInfos.length > 0\n ) {\n // Max iterations reached — close out the pending tool_use blocks (so the\n // conversation history stays valid for the next request) but do NOT trigger\n // another LLM call. Previously we called continueWithToolResults() here,\n // which sent the error to the AI and started a new LLM request; the AI\n // responded \"let me retry\" + new tool_use blocks → the same limit fired\n // again → continueWithToolResults again → infinite loop.\n this.debug(\n \"Max iterations reached, stopping loop without new LLM request\",\n );\n\n const errorMessage =\n this.config.maxIterationsMessage ||\n \"Tool execution paused: iteration limit reached. User can say 'continue' to resume.\";\n\n const blockedResults = toolCallInfos.map((tc) => ({\n toolCallId: tc.id,\n result: {\n success: false,\n error: errorMessage,\n },\n }));\n\n // Adds tool_result messages + a final assistant stop-message, then sets\n // status → \"ready\". No new API request is made.\n await this.chat.addToolResultMessages(blockedResults, errorMessage);\n }\n } catch (error) {\n this.debug(\"Error executing tools:\", error);\n console.error(\"[ChatWithTools] Tool execution error:\", error);\n }\n });\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 * Whether any operation is in progress (chat or tools)\n * Use this to show loading indicators and disable send button\n */\n get isLoading(): boolean {\n const chatBusy = this.status === \"submitted\" || this.status === \"streaming\";\n const toolsBusy = this.agentLoop.isProcessing;\n const hasPendingApprovals =\n this.agentLoop.pendingApprovalExecutions.length > 0;\n return chatBusy || toolsBusy || hasPendingApprovals;\n }\n\n /**\n * Check if a request is currently in progress (excludes pending approvals)\n * Use this to prevent sending new messages\n */\n get isBusy(): boolean {\n const chatBusy = this.status === \"submitted\" || this.status === \"streaming\";\n const toolsBusy = this.agentLoop.isProcessing;\n return chatBusy || toolsBusy;\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 * Returns false if a request is already in progress\n *\n * @param options.editMessageId - Edit flow: new message branches from the\n * same parent as this message ID\n */\n async sendMessage(\n content: string,\n attachments?: MessageAttachment[],\n options?: { editMessageId?: string },\n ): Promise<boolean> {\n // Guard: Don't send if already processing\n if (this.isLoading) {\n this.debug(\"sendMessage blocked - request already in progress\");\n return false;\n }\n\n // Reset iteration counter so user can continue after max iterations\n this.agentLoop.resetIterations();\n return await this.chat.sendMessage(content, attachments, options);\n }\n\n /**\n * Stop generation and cancel any running tools\n */\n stop(): void {\n // 1. Cancel all pending/executing tools\n this.agentLoop.cancel();\n\n // 2. Stop the HTTP stream\n this.chat.stop();\n\n this.debug(\"Stopped - cancelled tools and aborted stream\");\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 * Update prompt/tool optimization controls.\n */\n setOptimizationConfig(config?: ChatConfig[\"optimization\"]): void {\n this.config.optimization = config;\n this.chat.setOptimizationConfig(config);\n }\n\n /**\n * Set the active tool profile used for request-time tool selection.\n */\n setToolProfile(profile?: string): void {\n this.chat.setToolProfile(profile);\n }\n\n /**\n * Get the most recent prompt context usage snapshot.\n */\n getContextUsage(): ContextUsage | null {\n return this.chat.getContextUsage();\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 * Switch to a different thread (or start a new one).\n * Pass the session/thread ID from persistence to reuse it, or null to start fresh.\n */\n setActiveThread(id: string | null): void {\n this.chat.setActiveThread(id);\n }\n\n /**\n * Force a new session on the next sendMessage.\n * Call this when the current session has expired or credits are exhausted.\n */\n renewSession(): void {\n this.chat.renewSession();\n }\n\n /**\n * Current session creation status.\n */\n getSessionStatus(): \"idle\" | \"creating\" | \"ready\" | \"error\" {\n return this.chat.getSessionStatus();\n }\n\n /**\n * Set system prompt dynamically\n */\n setSystemPrompt(prompt: string): void {\n this.chat.setSystemPrompt(prompt);\n }\n\n /**\n * Set headers configuration\n * Can be static headers or a getter function for dynamic resolution\n */\n setHeaders(headers: ChatWithToolsConfig[\"headers\"]): void {\n this.chat.setHeaders(headers);\n }\n\n /**\n * Set URL configuration\n * Can be static URL or a getter function for dynamic resolution\n */\n setUrl(url: ChatWithToolsConfig[\"runtimeUrl\"]): void {\n this.chat.setUrl(url);\n }\n\n /**\n * Set body configuration\n * Additional properties merged into every request body\n */\n setBody(body: ChatWithToolsConfig[\"body\"]): void {\n this.chat.setBody(body);\n }\n\n setRequestMessageTransform(\n fn: ((messages: UIMessage[]) => UIMessage[]) | null,\n ): void {\n this.chat.setRequestMessageTransform(fn);\n }\n\n /**\n * Set inline skills (forwarded to underlying chat instance)\n */\n setInlineSkills(\n skills: Array<{\n name: string;\n description: string;\n content: string;\n strategy?: string;\n }>,\n ): void {\n this.chat.setInlineSkills(skills);\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 * Whether this instance has been disposed\n */\n get disposed(): boolean {\n return this.chat.disposed;\n }\n\n /**\n * Revive a disposed instance (for React StrictMode compatibility)\n * This allows reusing an instance after dispose() was called,\n * preserving registered tools and state\n */\n revive(): void {\n this.chat.revive();\n this.agentLoop.revive();\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 createLogger(\"tools\", () => this.config.debug ?? false)(\n message,\n args.length === 1 ? args[0] : args.length > 1 ? args : undefined,\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 * Backed by MessageTree for conversation branching support.\n * The `messages` getter returns only the visible path (active branch).\n * Use `getAllMessages()` for full persistence.\n *\n * Pattern inspired by Vercel AI SDK's useSyncExternalStore pattern.\n */\n\nimport type { ChatState, UIMessage, ChatStatus } from \"../../chat\";\nimport { MessageTree, type BranchInfo } from \"../../chat/branching\";\n\n/**\n * ReactChatState implements ChatState with callback-based reactivity\n * and full conversation branching support via MessageTree.\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 visible path (active branch only)\n * const messages = state.messages;\n *\n * // Get all messages across branches (for persistence)\n * const all = state.getAllMessages();\n * ```\n */\nexport class ReactChatState<\n T extends UIMessage = UIMessage,\n> implements ChatState<T> {\n private tree: MessageTree<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 this.tree = new MessageTree<T>(initialMessages);\n }\n\n // ============================================\n // Getters — visible path only\n // ============================================\n\n /**\n * Returns the VISIBLE PATH (active branch) — what the UI renders\n * and what gets sent to the API.\n *\n * For all messages across all branches, use getAllMessages().\n */\n get messages(): T[] {\n return this.tree.getVisibleMessages();\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.tree.reset(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.tree.addMessage(message);\n this.notify();\n }\n\n popMessage(): void {\n // Remove current leaf from tree\n const leafId = this.tree.currentLeafId;\n if (!leafId) return;\n\n const allMessages = this.tree.getAllMessages().filter((m) => m.id !== leafId);\n // Walk up to the parent to set it as new leaf\n const leaf = this.tree.getAllMessages().find((m) => m.id === leafId);\n const newLeafId =\n leaf && leaf.parentId !== undefined && leaf.parentId !== null\n ? leaf.parentId\n : null;\n\n this.tree.reset(allMessages);\n if (newLeafId) {\n this.tree.setCurrentLeaf(newLeafId);\n }\n this.notify();\n }\n\n replaceMessage(index: number, message: T): void {\n // replaceMessage operates on the visible path\n const visible = this.tree.getVisibleMessages();\n const target = visible[index];\n if (!target) return;\n this.tree.updateMessage(target.id, () => message);\n this.notify();\n }\n\n updateLastMessage(updater: (message: T) => T): void {\n const leafId = this.tree.currentLeafId;\n if (!leafId) return;\n this.tree.updateMessage(leafId, updater);\n this.notify();\n }\n\n updateMessageById(id: string, updater: (message: T) => T): boolean {\n const updated = this.tree.updateMessage(id, updater);\n if (updated) this.notify();\n return updated;\n }\n\n setMessages(messages: T[]): void {\n this.tree.reset(messages);\n this.notify();\n }\n\n clearMessages(): void {\n this.tree.reset([]);\n this.notify();\n }\n\n // ============================================\n // Branching API\n // ============================================\n\n /**\n * Returns ALL messages across all branches.\n * Use this for persistence (ThreadManager save).\n */\n getAllMessages(): T[] {\n return this.tree.getAllMessages();\n }\n\n /**\n * Get branch navigation info for a message.\n * Returns null if the message has no siblings.\n */\n getBranchInfo(messageId: string): BranchInfo | null {\n return this.tree.getBranchInfo(messageId);\n }\n\n /**\n * Navigate to a sibling branch.\n * Triggers re-render via notify().\n */\n switchBranch(messageId: string): void {\n this.tree.switchBranch(messageId);\n this.notify();\n }\n\n /**\n * Set the current leaf (used by regenerate() to rewind active path).\n * Triggers re-render via notify().\n */\n setCurrentLeaf(leafId: string | null): void {\n this.tree.setCurrentLeaf(leafId);\n this.notify();\n }\n\n get hasBranches(): boolean {\n return this.tree.hasBranches;\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 * Revive after dispose (for React StrictMode compatibility)\n * Subscribers will be re-added automatically via useSyncExternalStore\n */\n revive(): void {\n // No-op: subscribers are re-added automatically\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","\"use client\";\n\nimport { useState, useCallback, useRef, useEffect } from \"react\";\nimport { MCPClient, createMCPClient } from \"../../mcp/client/MCPClient\";\nimport type {\n UseMCPClientConfig,\n UseMCPClientReturn,\n MCPClientState,\n MCPToolDefinition,\n MCPToolCallResult,\n MCPConnectionState,\n} from \"../../mcp/types\";\n\n/**\n * React hook for managing an MCP client connection\n *\n * This hook provides a managed MCP client that handles connection lifecycle,\n * tool discovery, and state management automatically.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const {\n * state,\n * connect,\n * disconnect,\n * callTool,\n * isConnected,\n * isLoading,\n * } = useMCPClient({\n * name: \"github\",\n * transport: \"http\",\n * url: \"https://mcp.github.com\",\n * headers: { Authorization: `Bearer ${token}` },\n * autoConnect: true,\n * });\n *\n * if (isLoading) return <div>Connecting...</div>;\n * if (!isConnected) return <button onClick={connect}>Connect</button>;\n *\n * return (\n * <div>\n * <p>Connected to {state.serverInfo?.name}</p>\n * <p>{state.tools.length} tools available</p>\n * </div>\n * );\n * }\n * ```\n */\nexport function useMCPClient(config: UseMCPClientConfig): UseMCPClientReturn {\n const {\n autoConnect = true,\n onConnectionStateChange,\n onToolsChange,\n onElicitationRequest,\n onError,\n onNotification,\n ...clientConfig\n } = config;\n\n // Track client instance\n const clientRef = useRef<MCPClient | null>(null);\n const mountedRef = useRef(true);\n\n // State\n const [state, setState] = useState<MCPClientState>({\n connectionState: \"disconnected\",\n tools: [],\n });\n\n // Create or get client instance\n const getClient = useCallback((): MCPClient => {\n if (!clientRef.current) {\n clientRef.current = createMCPClient(clientConfig, {\n onConnectionStateChange: (newState: MCPConnectionState) => {\n if (mountedRef.current) {\n setState((prev) => ({ ...prev, connectionState: newState }));\n onConnectionStateChange?.(newState);\n }\n },\n onToolsChange: (tools: MCPToolDefinition[]) => {\n if (mountedRef.current) {\n setState((prev) => ({ ...prev, tools }));\n onToolsChange?.(tools);\n }\n },\n onElicitationRequest,\n onError: (error: Error) => {\n if (mountedRef.current) {\n setState((prev) => ({ ...prev, error: error.message }));\n onError?.(error);\n }\n },\n onNotification,\n });\n }\n return clientRef.current;\n }, [\n clientConfig,\n onConnectionStateChange,\n onToolsChange,\n onElicitationRequest,\n onError,\n onNotification,\n ]);\n\n // Connect function\n const connect = useCallback(async (): Promise<void> => {\n const client = getClient();\n try {\n setState((prev) => ({\n ...prev,\n connectionState: \"connecting\",\n error: undefined,\n }));\n await client.connect();\n if (mountedRef.current) {\n const clientState = client.getState();\n setState({\n connectionState: \"connected\",\n tools: clientState.tools,\n serverInfo: clientState.serverInfo,\n serverCapabilities: clientState.serverCapabilities,\n lastActivity: Date.now(),\n });\n }\n } catch (error) {\n if (mountedRef.current) {\n const errorMessage =\n error instanceof Error ? error.message : \"Connection failed\";\n setState((prev) => ({\n ...prev,\n connectionState: \"error\",\n error: errorMessage,\n }));\n }\n throw error;\n }\n }, [getClient]);\n\n // Disconnect function\n const disconnect = useCallback(async (): Promise<void> => {\n const client = clientRef.current;\n if (client) {\n await client.disconnect();\n if (mountedRef.current) {\n setState({\n connectionState: \"disconnected\",\n tools: [],\n });\n }\n }\n }, []);\n\n // Call tool function\n const callTool = useCallback(\n async (\n name: string,\n args?: Record<string, unknown>,\n ): Promise<MCPToolCallResult> => {\n const client = clientRef.current;\n if (!client || !client.isConnected()) {\n throw new Error(\"MCP client not connected\");\n }\n const result = await client.callTool(name, args);\n if (mountedRef.current) {\n setState((prev) => ({ ...prev, lastActivity: Date.now() }));\n }\n return result;\n },\n [],\n );\n\n // Refresh tools function\n const refreshTools = useCallback(async (): Promise<MCPToolDefinition[]> => {\n const client = clientRef.current;\n if (!client || !client.isConnected()) {\n throw new Error(\"MCP client not connected\");\n }\n const tools = await client.refreshTools();\n if (mountedRef.current) {\n setState((prev) => ({ ...prev, tools, lastActivity: Date.now() }));\n }\n return tools;\n }, []);\n\n // Auto-connect on mount if enabled\n useEffect(() => {\n mountedRef.current = true;\n\n if (autoConnect) {\n connect().catch(() => {\n // Error is already handled in connect function\n });\n }\n\n return () => {\n mountedRef.current = false;\n // Disconnect on unmount\n const client = clientRef.current;\n if (client) {\n client.disconnect().catch(() => {\n // Ignore disconnect errors on unmount\n });\n clientRef.current = null;\n }\n };\n // Only run on mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Computed values\n const isConnected = state.connectionState === \"connected\";\n const isLoading = state.connectionState === \"connecting\";\n\n return {\n state,\n connect,\n disconnect,\n callTool,\n refreshTools,\n isConnected,\n isLoading,\n };\n}\n\nexport type { UseMCPClientConfig, UseMCPClientReturn, MCPClientState };\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\";\nimport type { BranchInfo } from \"../../chat/branching\";\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 // Branching API — pass-throughs to ReactChatState\n // ============================================\n\n /**\n * Navigate to a sibling branch.\n */\n switchBranch(messageId: string): void {\n this.reactState.switchBranch(messageId);\n }\n\n /**\n * Get branch navigation info for a message.\n */\n getBranchInfo(messageId: string): BranchInfo | null {\n return this.reactState.getBranchInfo(messageId);\n }\n\n /**\n * Get all messages across all branches (for persistence).\n */\n getAllMessages(): UIMessage[] {\n return this.reactState.getAllMessages();\n }\n\n /**\n * Whether any message has siblings (branching has occurred).\n */\n get hasBranches(): boolean {\n return this.reactState.hasBranches;\n }\n\n /**\n * Dispose and cleanup\n */\n dispose(): void {\n super.dispose();\n this.reactState.dispose();\n }\n\n /**\n * Revive a disposed instance (for React StrictMode compatibility)\n */\n revive(): void {\n super.revive();\n this.reactState.revive();\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","/**\n * MessageHistoryContext\n *\n * React context for sharing MessageHistory config and state\n * across the component tree. Optional — useMessageHistory() works\n * standalone without this provider.\n */\n\nimport { createContext, useContext } from \"react\";\nimport type {\n MessageHistoryConfig,\n SessionCompactionState,\n TokenUsage,\n} from \"./types\";\n\nexport interface MessageHistoryContextValue {\n /** Merged config (provider defaults, overridable per-component) */\n config: Required<\n Pick<\n MessageHistoryConfig,\n | \"strategy\"\n | \"maxContextTokens\"\n | \"reserveForResponse\"\n | \"compactionThreshold\"\n | \"recentBuffer\"\n | \"toolResultMaxChars\"\n | \"persistSession\"\n | \"storageKey\"\n >\n > &\n MessageHistoryConfig;\n /** Current token usage (updated after each AI response) */\n tokenUsage: TokenUsage;\n /** Current compaction state */\n compactionState: SessionCompactionState;\n}\n\nconst defaultTokenUsage: TokenUsage = {\n current: 0,\n max: 128000,\n percentage: 0,\n isApproaching: false,\n};\n\nconst defaultCompactionState: SessionCompactionState = {\n rollingSummary: null,\n lastCompactionAt: null,\n compactionCount: 0,\n totalTokensSaved: 0,\n workingMemory: [],\n displayMessageCount: 0,\n llmMessageCount: 0,\n};\n\nexport const defaultMessageHistoryConfig = {\n strategy: \"none\" as const,\n maxContextTokens: 128000,\n reserveForResponse: 4096,\n compactionThreshold: 0.75,\n recentBuffer: 10,\n toolResultMaxChars: 10000,\n persistSession: false,\n storageKey: \"copilot-session\",\n};\n\nexport const MessageHistoryContext = createContext<MessageHistoryContextValue>({\n config: defaultMessageHistoryConfig,\n tokenUsage: defaultTokenUsage,\n compactionState: defaultCompactionState,\n});\n\nexport function useMessageHistoryContext(): MessageHistoryContextValue {\n return useContext(MessageHistoryContext);\n}\n","/**\n * Message Utilities\n *\n * Conversion helpers between UIMessage / DisplayMessage / LLMMessage.\n * Core invariant: tool-call pairs are always kept atomic.\n */\n\nimport type { UIMessage } from \"../../chat/types/message\";\nimport type { DisplayMessage, LLMMessage, CompactionMarker } from \"./types\";\n\n// ── Conversion ────────────────────────────────────────────────────\n\n/**\n * Promote a UIMessage to a DisplayMessage.\n * Safe to call on an existing DisplayMessage (idempotent).\n */\nexport function toDisplayMessage(msg: UIMessage): DisplayMessage {\n return {\n ...msg,\n timestamp:\n msg.createdAt instanceof Date ? msg.createdAt.getTime() : Date.now(),\n };\n}\n\n/**\n * Convert a DisplayMessage to the LLMMessage format sent to the model.\n * CompactionMarkers are converted to system messages with the rolling summary.\n */\nexport function toLLMMessage(msg: DisplayMessage): LLMMessage {\n // CompactionMarkers become system messages in LLM context\n if (isCompactionMarker(msg)) {\n return {\n role: \"system\",\n content: `[Previous conversation summary]\\n${msg.content}`,\n };\n }\n\n const base: LLMMessage = {\n role: msg.role,\n content: msg.content,\n };\n\n if (msg.toolCalls?.length) {\n base.tool_calls = msg.toolCalls;\n }\n\n if (msg.toolCallId) {\n base.tool_call_id = msg.toolCallId;\n }\n\n return base;\n}\n\n/**\n * Convert an array of DisplayMessages to LLMMessages.\n */\nexport function toLLMMessages(messages: DisplayMessage[]): LLMMessage[] {\n return messages.map(toLLMMessage);\n}\n\n// ── Atomic tool-call pair enforcement ────────────────────────────\n\n/**\n * Keep tool-call pairs atomic — an assistant message with tool_calls\n * must always be followed by its tool-result messages.\n *\n * When slicing/pruning, call this to ensure the window boundary never\n * splits an assistant message from its tool results.\n *\n * Returns the input array with any split pairs re-attached at the start.\n */\nexport function keepToolPairsAtomic(\n messages: DisplayMessage[],\n): DisplayMessage[] {\n if (messages.length === 0) return messages;\n\n // Find the first message that has pending tool-call results following it\n const firstIdx = messages.findIndex((msg, i) => {\n if (msg.role !== \"assistant\" || !msg.toolCalls?.length) return false;\n const toolCallIds = new Set(msg.toolCalls.map((tc) => tc.id));\n // Check if ALL tool results for this message are present in the slice\n const resultIds = new Set(\n messages\n .slice(i + 1)\n .filter((m) => m.role === \"tool\" && m.toolCallId)\n .map((m) => m.toolCallId as string),\n );\n return [...toolCallIds].some((id) => !resultIds.has(id));\n });\n\n // No orphaned tool calls\n if (firstIdx === -1) return messages;\n\n // Drop back to before the split assistant message\n return messages.slice(firstIdx);\n}\n\n/**\n * Find the safe window boundary — the index after which all tool-call\n * pairs are complete. Used by sliding-window to avoid splits.\n *\n * Returns the earliest index we can safely start a window from.\n */\nexport function findSafeWindowStart(\n messages: DisplayMessage[],\n desiredStart: number,\n): number {\n // Walk backward from desiredStart to find an assistant message with tool_calls\n // whose results fall inside the window\n for (let i = desiredStart; i < messages.length; i++) {\n const msg = messages[i];\n if (\n msg.role === \"user\" ||\n (msg.role === \"assistant\" && !msg.toolCalls?.length)\n ) {\n return i;\n }\n }\n return desiredStart;\n}\n\n// ── Type guards ───────────────────────────────────────────────────\n\nexport function isCompactionMarker(\n msg: DisplayMessage,\n): msg is CompactionMarker {\n return (\n msg.role === \"system\" &&\n (msg as CompactionMarker).type === \"compaction-marker\"\n );\n}\n\nexport function isToolMessage(msg: DisplayMessage): boolean {\n return msg.role === \"tool\";\n}\n\nexport function isAssistantWithToolCalls(msg: DisplayMessage): boolean {\n return msg.role === \"assistant\" && !!msg.toolCalls?.length;\n}\n","/**\n * Token Counter\n *\n * Phase 2: Two-tier token estimation.\n * - Tier 1: estimateTokensFast() — zero deps, chars/3.5, always available (~85-90% accurate)\n * - Tier 2: countTokensAccurate() — lazy-loads gpt-tokenizer only when near threshold\n */\n\nimport type { LLMMessage } from \"./types\";\n\n// ── Tier 1: Fast (zero deps) ──────────────────────────────────────\n\n/**\n * Fast token estimate using chars/3.5 heuristic.\n * ~85-90% accurate for English. Zero dependencies.\n */\nexport function estimateTokensFast(text: string): number {\n return Math.ceil(text.length / 3.5);\n}\n\n/**\n * Estimate tokens for a single LLMMessage.\n */\nexport function estimateMessageTokens(msg: LLMMessage): number {\n let chars = msg.content?.length ?? 0;\n\n if (msg.tool_calls?.length) {\n for (const tc of msg.tool_calls) {\n chars += JSON.stringify(tc).length;\n }\n }\n\n // ~4 tokens overhead per message (role, formatting)\n return Math.ceil(chars / 3.5) + 4;\n}\n\n/**\n * Estimate total tokens for an array of LLMMessages.\n */\nexport function estimateMessagesTokens(messages: LLMMessage[]): number {\n return messages.reduce((sum, msg) => sum + estimateMessageTokens(msg), 0);\n}\n\n// ── Tier 2: Accurate (lazy-loaded) ───────────────────────────────\n\nlet _encoder: ((text: string) => number[]) | undefined = undefined;\n\n/**\n * Accurate token count using gpt-tokenizer.\n * Lazy-loaded only when near threshold to avoid bundle cost.\n * Falls back to fast estimation if tokenizer unavailable.\n */\nexport async function countTokensAccurate(text: string): Promise<number> {\n if (!_encoder) {\n try {\n const mod = await import(\"gpt-tokenizer/encoding/o200k_base\" as string);\n _encoder = mod.encode as (text: string) => number[];\n } catch {\n // gpt-tokenizer not installed — fall back to fast\n return estimateTokensFast(text);\n }\n }\n return (_encoder as (text: string) => number[])(text).length;\n}\n\n/**\n * Accurate token count for all messages combined.\n * Falls back to fast estimation if tokenizer unavailable.\n */\nexport async function countMessagesTokensAccurate(\n messages: LLMMessage[],\n): Promise<number> {\n const text = messages\n .map(\n (m) =>\n `${m.role}: ${m.content ?? \"\"} ${JSON.stringify(m.tool_calls ?? \"\")}`,\n )\n .join(\"\\n\");\n return countTokensAccurate(text);\n}\n\n// ── Dispatcher ────────────────────────────────────────────────────\n\nexport type TokenEstimationMode = \"fast\" | \"accurate\" | \"off\";\n\n/**\n * Estimate tokens for messages using the specified mode.\n */\nexport function estimateTokens(\n messages: LLMMessage[],\n mode: TokenEstimationMode = \"fast\",\n): number {\n if (mode === \"off\") return 0;\n return estimateMessagesTokens(messages);\n}\n","/**\n * Sliding Window Strategy\n *\n * Keeps system prompt + most recent messages within token budget.\n * Tool-call pairs are always kept atomic (never split).\n */\n\nimport { findSafeWindowStart, isCompactionMarker } from \"../message-utils\";\nimport { estimateMessagesTokens } from \"../token-counter\";\nimport type { DisplayMessage, LLMMessage } from \"../types\";\nimport { toLLMMessages } from \"../message-utils\";\n\nexport interface SlidingWindowOptions {\n /** Total token budget (maxContextTokens - reserveForResponse) */\n tokenBudget: number;\n /** Minimum recent messages to always keep verbatim */\n recentBuffer: number;\n}\n\n/**\n * Apply sliding window to a set of display messages.\n * Returns the subset of messages that fit within the token budget.\n *\n * Guarantees:\n * - recentBuffer messages are always included\n * - Tool-call pairs are never split\n * - System messages and compaction markers are always included\n */\nexport function applySlidingWindow(\n messages: DisplayMessage[],\n options: SlidingWindowOptions,\n): DisplayMessage[] {\n const { tokenBudget, recentBuffer } = options;\n\n if (messages.length === 0) return messages;\n\n // Always keep system/compaction messages\n const systemMessages = messages.filter(\n (m) => m.role === \"system\" || isCompactionMarker(m),\n );\n const conversationMessages = messages.filter(\n (m) => m.role !== \"system\" && !isCompactionMarker(m),\n );\n\n // Estimate system tokens\n const systemTokens = estimateMessagesTokens(toLLMMessages(systemMessages));\n const remainingBudget = tokenBudget - systemTokens;\n\n if (conversationMessages.length === 0) return systemMessages;\n\n // Always include the last recentBuffer messages\n const recentStart = Math.max(0, conversationMessages.length - recentBuffer);\n const recent = conversationMessages.slice(recentStart);\n const older = conversationMessages.slice(0, recentStart);\n\n // Check if everything fits\n const allTokens = estimateMessagesTokens(toLLMMessages(conversationMessages));\n if (allTokens <= remainingBudget) {\n return messages; // Everything fits, no trimming needed\n }\n\n // Greedily include older messages from newest-to-oldest until budget fills\n const recentTokens = estimateMessagesTokens(toLLMMessages(recent));\n let available = remainingBudget - recentTokens;\n const included: DisplayMessage[] = [];\n\n for (let i = older.length - 1; i >= 0; i--) {\n const msgTokens = estimateMessagesTokens(toLLMMessages([older[i]]));\n if (available - msgTokens < 0) break;\n included.unshift(older[i]);\n available -= msgTokens;\n }\n\n // Ensure the window start is safe (no split tool-call pairs)\n const combined = [...included, ...recent];\n const safeStart = findSafeWindowStart(combined, 0);\n const safeWindow = combined.slice(safeStart);\n\n // Reconstruct: system messages first, then windowed conversation\n return [...systemMessages, ...safeWindow];\n}\n\n/**\n * Apply toolResultMaxChars truncation to LLMMessages before sending.\n */\nexport function truncateToolResults(\n messages: LLMMessage[],\n maxChars: number,\n): LLMMessage[] {\n if (maxChars === 0) return messages;\n\n return messages.map((msg) => {\n if (msg.role !== \"tool\") return msg;\n if (!msg.content || msg.content.length <= maxChars) return msg;\n\n return {\n ...msg,\n content:\n msg.content.slice(0, maxChars) +\n `\\n[truncated — original ${msg.content.length} chars, limit ${maxChars}]`,\n };\n });\n}\n","/**\n * Selective Prune Strategy\n *\n * Removes high-cost, low-value content from older messages without\n * losing the conversation thread:\n * - Tool results older than N turns → compact stub\n * - Reasoning/thinking blocks in older turns → stripped\n * - Repeated skill injections → deduplicated\n */\n\nimport type { DisplayMessage, LLMMessage, CompactedToolResult } from \"../types\";\nimport { estimateMessageTokens } from \"../token-counter\";\nimport { toLLMMessage } from \"../message-utils\";\n\nexport interface SelectivePruneOptions {\n /** Tool results older than this many turns are compacted. @default 3 */\n toolResultAgeTurns?: number;\n /** Strip reasoning/thinking content from older messages. @default true */\n stripOldReasoning?: boolean;\n /** Deduplicate repeated skill injections. @default true */\n deduplicateSkills?: boolean;\n}\n\n/**\n * Apply selective pruning to LLMMessages.\n * Only touches messages older than recentBuffer.\n */\nexport function applySelectivePrune(\n displayMessages: DisplayMessage[],\n recentBuffer: number,\n options: SelectivePruneOptions = {},\n): LLMMessage[] {\n const {\n toolResultAgeTurns = 3,\n stripOldReasoning = true,\n deduplicateSkills = true,\n } = options;\n\n const cutoff = Math.max(0, displayMessages.length - recentBuffer);\n const seenSkillContent = new Set<string>();\n\n return displayMessages.map((msg, idx): LLMMessage => {\n const llm = toLLMMessage(msg);\n const isOld = idx < cutoff;\n\n // Deduplicate skill injections (system messages with skill content)\n if (deduplicateSkills && msg.role === \"system\" && llm.content) {\n const key = llm.content.slice(0, 100); // fingerprint on first 100 chars\n if (seenSkillContent.has(key)) {\n return { ...llm, content: \"[skill instruction — deduplicated]\" };\n }\n seenSkillContent.add(key);\n }\n\n if (!isOld) return llm;\n\n // Strip reasoning/thinking from old assistant messages\n if (stripOldReasoning && msg.role === \"assistant\" && msg.thinking) {\n llm.content = llm.content; // content stays, thinking stripped (not in LLMMessage)\n }\n\n // Compact old tool results\n if (msg.role === \"tool\" && llm.content) {\n const originalSize = llm.content.length;\n if (originalSize > 500) {\n const stub = buildToolResultStub(msg, llm.content);\n return {\n role: \"tool\",\n tool_call_id: llm.tool_call_id,\n content: JSON.stringify(stub),\n };\n }\n }\n\n return llm;\n });\n}\n\nfunction buildToolResultStub(\n msg: DisplayMessage,\n content: string,\n): CompactedToolResult {\n return {\n type: \"compacted-tool-result\",\n toolName: (msg.metadata?.toolName as string) ?? \"tool\",\n toolCallId: msg.toolCallId ?? \"\",\n args: (msg.metadata?.toolArgs as Record<string, unknown>) ?? {},\n executedAt: msg.timestamp,\n status: content.includes('\"error\"') ? \"error\" : \"success\",\n originalSize: content.length,\n summary: buildSummary(content),\n extract: content.slice(0, 200),\n };\n}\n\nfunction buildSummary(content: string): string {\n try {\n const parsed = JSON.parse(content);\n if (parsed?.message) return String(parsed.message).slice(0, 120);\n if (parsed?.error) return `Error: ${String(parsed.error).slice(0, 100)}`;\n if (Array.isArray(parsed)) return `Array result — ${parsed.length} items`;\n const keys = Object.keys(parsed).slice(0, 3).join(\", \");\n return `Object result — keys: ${keys}`;\n } catch {\n return content.slice(0, 120);\n }\n}\n","/**\n * Summary Buffer Strategy\n *\n * Keeps the most recent recentBuffer messages verbatim.\n * Everything older is summarized into a rolling summary\n * injected as the first system message.\n *\n * Requires a /api/compact endpoint or custom summarizer.\n */\n\nimport type {\n DisplayMessage,\n LLMMessage,\n SessionCompactionState,\n} from \"../types\";\nimport { isCompactionMarker, toLLMMessages } from \"../message-utils\";\nimport { estimateMessagesTokens } from \"../token-counter\";\n\nexport interface SummaryBufferOptions {\n recentBuffer: number;\n tokenBudget: number;\n compactionThreshold: number;\n compactionUrl?: string;\n summarizer?: (messages: LLMMessage[]) => Promise<string>;\n}\n\nexport interface SummaryBufferResult {\n llmMessages: LLMMessage[];\n newSummary?: string;\n tokensSaved?: number;\n messagesSummarized?: number;\n}\n\n/**\n * Build LLM context using summary-buffer strategy.\n * Does NOT trigger compaction — call triggerCompaction() for that.\n * Just injects existing rollingSummary + recent messages.\n */\nexport function buildSummaryBufferContext(\n displayMessages: DisplayMessage[],\n compactionState: SessionCompactionState,\n options: SummaryBufferOptions,\n): LLMMessage[] {\n const { recentBuffer } = options;\n\n // Always include system/compaction messages\n const systemMessages = displayMessages.filter(\n (m) => m.role === \"system\" || isCompactionMarker(m),\n );\n const conversationMessages = displayMessages.filter(\n (m) => m.role !== \"system\" && !isCompactionMarker(m),\n );\n\n const recentStart = Math.max(0, conversationMessages.length - recentBuffer);\n const recentMessages = conversationMessages.slice(recentStart);\n\n const result: LLMMessage[] = [];\n\n // 1. Inject working memory (always first)\n if (compactionState.workingMemory.length > 0) {\n result.push({\n role: \"system\",\n content: `[Working memory — always active]\\n${compactionState.workingMemory.join(\"\\n\")}`,\n });\n }\n\n // 2. Inject rolling summary if it exists\n if (compactionState.rollingSummary) {\n result.push({\n role: \"system\",\n content: `[Previous conversation summary]\\n${compactionState.rollingSummary}`,\n });\n }\n\n // 3. System messages\n result.push(...toLLMMessages(systemMessages));\n\n // 4. Recent messages verbatim\n result.push(...toLLMMessages(recentMessages));\n\n return result;\n}\n\n/**\n * Determine if compaction should fire based on current token usage.\n */\nexport function shouldCompact(\n currentTokens: number,\n maxTokens: number,\n threshold: number,\n): boolean {\n return currentTokens / maxTokens >= threshold;\n}\n\n/**\n * Run compaction: summarize older messages and return new rolling summary.\n * Called by useMessageHistory when threshold is crossed.\n */\nexport async function runCompaction(\n displayMessages: DisplayMessage[],\n compactionState: SessionCompactionState,\n options: SummaryBufferOptions,\n): Promise<SummaryBufferResult> {\n const { recentBuffer, compactionUrl, summarizer } = options;\n\n const conversationMessages = displayMessages.filter(\n (m) => m.role !== \"system\" && !isCompactionMarker(m),\n );\n\n const cutoff = Math.max(0, conversationMessages.length - recentBuffer);\n const toSummarize = conversationMessages.slice(0, cutoff);\n\n if (toSummarize.length === 0) {\n return { llmMessages: toLLMMessages(displayMessages) };\n }\n\n const llmToSummarize = toLLMMessages(toSummarize);\n const originalTokens = estimateMessagesTokens(llmToSummarize);\n\n let newSummary: string;\n\n if (summarizer) {\n newSummary = await summarizer(llmToSummarize);\n } else if (compactionUrl) {\n newSummary = await fetchSummary(compactionUrl, {\n messages: llmToSummarize,\n existingSummary: compactionState.rollingSummary,\n workingMemory: compactionState.workingMemory,\n });\n } else {\n // Fallback: plain concatenation (no LLM summarization)\n newSummary = buildFallbackSummary(\n llmToSummarize,\n compactionState.rollingSummary,\n );\n }\n\n const summaryTokens = Math.ceil(newSummary.length / 3.5);\n const tokensSaved = Math.max(0, originalTokens - summaryTokens);\n\n return {\n llmMessages: buildSummaryBufferContext(\n displayMessages,\n { ...compactionState, rollingSummary: newSummary },\n options,\n ),\n newSummary,\n tokensSaved,\n messagesSummarized: toSummarize.length,\n };\n}\n\nasync function fetchSummary(\n url: string,\n body: {\n messages: LLMMessage[];\n existingSummary: string | null;\n workingMemory: string[];\n },\n): Promise<string> {\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n throw new Error(`Compaction endpoint returned ${res.status}`);\n }\n\n const data = await res.json();\n if (!data?.summary) {\n throw new Error(\"Compaction endpoint did not return { summary: string }\");\n }\n\n return data.summary as string;\n}\n\nfunction buildFallbackSummary(\n messages: LLMMessage[],\n existingSummary: string | null,\n): string {\n const lines = messages\n .filter((m) => m.role === \"user\" || m.role === \"assistant\")\n .map((m) => `${m.role}: ${(m.content ?? \"\").slice(0, 200)}`)\n .join(\"\\n\");\n\n return existingSummary\n ? `${existingSummary}\\n\\n[Additional context]\\n${lines}`\n : lines;\n}\n","/**\n * Session Persistence\n *\n * Persist display history + compaction state across reloads.\n * Everything uses localStorage — no IndexedDB.\n */\n\nimport type { DisplayMessage, SessionCompactionState } from \"./types\";\n\n// ── localStorage: compaction state ───────────────────────────────\n\nexport function saveCompactionState(\n storageKey: string,\n state: SessionCompactionState,\n): void {\n try {\n localStorage.setItem(\n `${storageKey}-state`,\n JSON.stringify({ ...state, _savedAt: Date.now() }),\n );\n } catch {\n // localStorage unavailable (SSR, private mode, quota exceeded)\n }\n}\n\nexport function loadCompactionState(\n storageKey: string,\n): SessionCompactionState | null {\n try {\n const raw = localStorage.getItem(`${storageKey}-state`);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as SessionCompactionState & {\n _savedAt?: number;\n };\n delete (parsed as { _savedAt?: number })._savedAt;\n return parsed;\n } catch {\n return null;\n }\n}\n\nexport function clearCompactionState(storageKey: string): void {\n try {\n localStorage.removeItem(`${storageKey}-state`);\n } catch {\n // ignore\n }\n}\n\n// ── localStorage: display messages ───────────────────────────────\n\nexport function saveDisplayMessages(\n storageKey: string,\n messages: DisplayMessage[],\n): void {\n try {\n localStorage.setItem(\n `${storageKey}-messages`,\n JSON.stringify({ messages, savedAt: Date.now() }),\n );\n } catch {\n // localStorage unavailable or quota exceeded — fail silently\n }\n}\n\nexport function loadDisplayMessages(\n storageKey: string,\n): DisplayMessage[] | null {\n try {\n const raw = localStorage.getItem(`${storageKey}-messages`);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as { messages: DisplayMessage[] };\n return parsed?.messages ?? null;\n } catch {\n return null;\n }\n}\n\nexport function clearDisplayMessages(storageKey: string): void {\n try {\n localStorage.removeItem(`${storageKey}-messages`);\n } catch {\n // ignore\n }\n}\n\n// ── Full session clear ────────────────────────────────────────────\n\nexport function clearSession(storageKey: string): void {\n clearCompactionState(storageKey);\n clearDisplayMessages(storageKey);\n}\n","/**\n * useMessageHistory\n *\n * Dual-layer message access with optional compaction.\n * Strategy 'none' (default) = zero-config, 100% backward-compat.\n */\n\nimport { useMemo, useState, useCallback, useEffect, useRef } from \"react\";\nimport { useCopilot } from \"../provider/CopilotProvider\";\nimport { toDisplayMessage, toLLMMessages } from \"./message-utils\";\nimport {\n useMessageHistoryContext,\n defaultMessageHistoryConfig,\n} from \"./context\";\nimport { estimateTokens } from \"./token-counter\";\nimport {\n applySlidingWindow,\n truncateToolResults,\n applySelectivePrune,\n buildSummaryBufferContext,\n runCompaction,\n shouldCompact,\n} from \"./strategies\";\nimport {\n saveCompactionState,\n loadCompactionState,\n saveDisplayMessages,\n loadDisplayMessages,\n clearSession,\n} from \"./session-persistence\";\nimport type {\n UseMessageHistoryOptions,\n UseMessageHistoryReturn,\n DisplayMessage,\n LLMMessage,\n SessionCompactionState,\n TokenUsage,\n CompactionEvent,\n} from \"./types\";\n\nconst DEFAULT_COMPACTION_STATE: SessionCompactionState = {\n rollingSummary: null,\n lastCompactionAt: null,\n compactionCount: 0,\n totalTokensSaved: 0,\n workingMemory: [],\n displayMessageCount: 0,\n llmMessageCount: 0,\n};\n\nexport function useMessageHistory(\n options: UseMessageHistoryOptions = {},\n): UseMessageHistoryReturn {\n const { messages } = useCopilot();\n const ctx = useMessageHistoryContext();\n\n const config = useMemo(\n () => ({ ...defaultMessageHistoryConfig, ...ctx.config, ...options }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n ctx.config,\n options.strategy,\n options.maxContextTokens,\n options.recentBuffer,\n options.compactionThreshold,\n ],\n );\n\n const storageKey = config.storageKey ?? \"copilot-session\";\n const strategy = options.skipCompaction\n ? \"none\"\n : (config.strategy ?? \"none\");\n\n // ── Compaction state ──────────────────────────────────────────\n const [compactionState, setCompactionState] =\n useState<SessionCompactionState>(() => {\n if (config.persistSession) {\n return loadCompactionState(storageKey) ?? DEFAULT_COMPACTION_STATE;\n }\n return DEFAULT_COMPACTION_STATE;\n });\n\n // ── Display messages: UIMessage → DisplayMessage ──────────────\n const displayMessages: DisplayMessage[] = useMemo(\n () => messages.map(toDisplayMessage),\n [messages],\n );\n\n // Restore persisted display messages on cold start\n const restoredRef = useRef(false);\n useEffect(() => {\n if (!config.persistSession || restoredRef.current) return;\n restoredRef.current = true;\n const saved = loadDisplayMessages(storageKey);\n if (saved?.length && messages.length === 0) {\n // Only restore if current session is empty\n // (useCopilot().setMessages would be called here in a real integration)\n }\n }, [config.persistSession, storageKey, messages.length]);\n\n // Persist display messages when they change\n useEffect(() => {\n if (!config.persistSession || displayMessages.length === 0) return;\n saveDisplayMessages(storageKey, displayMessages);\n }, [config.persistSession, storageKey, displayMessages]);\n\n // ── Build LLM context ─────────────────────────────────────────\n const llmMessages: LLMMessage[] = useMemo(() => {\n const maxTokens = config.maxContextTokens ?? 128000;\n const reserve = config.reserveForResponse ?? 4096;\n const tokenBudget = maxTokens - reserve;\n const recentBuffer = config.recentBuffer ?? 10;\n const maxChars = config.toolResultMaxChars ?? 10000;\n\n let result: LLMMessage[];\n\n switch (strategy) {\n case \"sliding-window\": {\n const windowed = applySlidingWindow(displayMessages, {\n tokenBudget,\n recentBuffer,\n });\n result = truncateToolResults(toLLMMessages(windowed), maxChars);\n break;\n }\n case \"selective-prune\": {\n result = truncateToolResults(\n applySelectivePrune(displayMessages, recentBuffer),\n maxChars,\n );\n break;\n }\n case \"summary-buffer\": {\n result = truncateToolResults(\n buildSummaryBufferContext(displayMessages, compactionState, {\n recentBuffer,\n tokenBudget,\n compactionThreshold: config.compactionThreshold ?? 0.75,\n compactionUrl: config.compactionUrl,\n summarizer: options.summarizer,\n }),\n maxChars,\n );\n break;\n }\n default:\n // 'none' — no compaction, just type conversion + optional truncation\n result = truncateToolResults(toLLMMessages(displayMessages), maxChars);\n }\n\n return result;\n }, [displayMessages, compactionState, strategy, config, options.summarizer]);\n\n // ── Token usage ───────────────────────────────────────────────\n // Count full history (not pruned llmMessages) so the threshold reflects\n // actual accumulated tokens, not the already-windowed output.\n const tokenUsage: TokenUsage = useMemo(() => {\n const mode = options.tokenEstimation ?? \"fast\";\n const current = estimateTokens(toLLMMessages(displayMessages), mode);\n const max = config.maxContextTokens ?? 128000;\n const threshold = config.compactionThreshold ?? 0.75;\n const percentage = current / max;\n return { current, max, percentage, isApproaching: percentage >= threshold };\n }, [\n displayMessages,\n config.maxContextTokens,\n config.compactionThreshold,\n options.tokenEstimation,\n ]);\n\n // Notify via callback\n useEffect(() => {\n if (config.onTokenUsage && tokenUsage.current > 0) {\n config.onTokenUsage(tokenUsage);\n }\n }, [tokenUsage, config.onTokenUsage]);\n\n // Persist compaction state when it changes\n useEffect(() => {\n if (config.persistSession) {\n saveCompactionState(storageKey, {\n ...compactionState,\n displayMessageCount: displayMessages.length,\n llmMessageCount: llmMessages.length,\n });\n }\n }, [\n config.persistSession,\n storageKey,\n compactionState,\n displayMessages.length,\n llmMessages.length,\n ]);\n\n // Auto-compaction trigger for summary-buffer\n const isCompactingRef = useRef(false);\n const [isCompacting, setIsCompacting] = useState(false);\n useEffect(() => {\n if (\n strategy !== \"summary-buffer\" ||\n options.skipCompaction ||\n isCompactingRef.current ||\n !tokenUsage.isApproaching\n )\n return;\n\n isCompactingRef.current = true;\n setIsCompacting(true);\n runCompaction(displayMessages, compactionState, {\n recentBuffer: config.recentBuffer ?? 10,\n tokenBudget:\n (config.maxContextTokens ?? 128000) -\n (config.reserveForResponse ?? 4096),\n compactionThreshold: config.compactionThreshold ?? 0.75,\n compactionUrl: config.compactionUrl,\n summarizer: options.summarizer,\n })\n .then((result) => {\n if (result.newSummary) {\n const event: CompactionEvent = {\n type: \"auto\",\n compactionCount: compactionState.compactionCount + 1,\n messagesSummarized: result.messagesSummarized ?? 0,\n tokensSaved: result.tokensSaved ?? 0,\n timestamp: Date.now(),\n };\n setCompactionState((prev) => ({\n ...prev,\n rollingSummary: result.newSummary!,\n lastCompactionAt: Date.now(),\n compactionCount: prev.compactionCount + 1,\n totalTokensSaved: prev.totalTokensSaved + (result.tokensSaved ?? 0),\n }));\n config.onCompaction?.(event);\n }\n })\n .finally(() => {\n isCompactingRef.current = false;\n setIsCompacting(false);\n });\n }, [tokenUsage.isApproaching, strategy]);\n\n // ── Public API ────────────────────────────────────────────────\n\n const compactSession = useCallback(\n async (instructions?: string) => {\n if (strategy !== \"summary-buffer\") return;\n\n const result = await runCompaction(displayMessages, compactionState, {\n recentBuffer: config.recentBuffer ?? 10,\n tokenBudget:\n (config.maxContextTokens ?? 128000) -\n (config.reserveForResponse ?? 4096),\n compactionThreshold: config.compactionThreshold ?? 0.75,\n compactionUrl: config.compactionUrl,\n summarizer: options.summarizer\n ? (msgs) => options.summarizer!(msgs)\n : instructions\n ? (msgs) =>\n fetchWithInstructions(config.compactionUrl!, msgs, instructions)\n : undefined,\n });\n\n if (result.newSummary) {\n const event: CompactionEvent = {\n type: \"manual\",\n compactionCount: compactionState.compactionCount + 1,\n messagesSummarized: result.messagesSummarized ?? 0,\n tokensSaved: result.tokensSaved ?? 0,\n timestamp: Date.now(),\n };\n setCompactionState((prev) => ({\n ...prev,\n rollingSummary: result.newSummary!,\n lastCompactionAt: Date.now(),\n compactionCount: prev.compactionCount + 1,\n totalTokensSaved: prev.totalTokensSaved + (result.tokensSaved ?? 0),\n }));\n config.onCompaction?.(event);\n }\n },\n [displayMessages, compactionState, config, strategy, options.summarizer],\n );\n\n const addToWorkingMemory = useCallback((fact: string) => {\n setCompactionState((prev) => ({\n ...prev,\n workingMemory: [...prev.workingMemory, fact],\n }));\n }, []);\n\n const clearWorkingMemory = useCallback(() => {\n setCompactionState((prev) => ({ ...prev, workingMemory: [] }));\n }, []);\n\n const resetSession = useCallback(() => {\n setCompactionState(DEFAULT_COMPACTION_STATE);\n if (config.persistSession) {\n clearSession(storageKey);\n }\n }, [config.persistSession, storageKey]);\n\n return {\n displayMessages,\n llmMessages,\n tokenUsage,\n isCompacting,\n compactionState: {\n ...compactionState,\n displayMessageCount: displayMessages.length,\n llmMessageCount: llmMessages.length,\n },\n compactSession,\n addToWorkingMemory,\n clearWorkingMemory,\n resetSession,\n };\n}\n\nasync function fetchWithInstructions(\n url: string,\n messages: LLMMessage[],\n instructions: string,\n): Promise<string> {\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ messages, instructions }),\n });\n const data = await res.json();\n return data.summary as string;\n}\n","\"use client\";\n\n/**\n * SkillContext — React context holding the client-side SkillRegistry\n */\n\nimport { createContext, useContext } from \"react\";\nimport type { SkillRegistry } from \"../../skill-system/registry\";\nimport type { ResolvedSkill } from \"../../skill-system/types\";\n\nexport interface SkillContextValue {\n registry: SkillRegistry;\n /** Register a skill and trigger re-render */\n register: (skill: ResolvedSkill) => void;\n /** Unregister a skill by name and trigger re-render */\n unregister: (name: string) => void;\n /** Reactive snapshot of all registered skills */\n skills: ResolvedSkill[];\n}\n\nexport const SkillContext = createContext<SkillContextValue | null>(null);\n\nexport function useSkillContext(): SkillContextValue {\n const ctx = useContext(SkillContext);\n if (!ctx) {\n throw new Error(\"useSkillContext must be used within <SkillProvider>\");\n }\n return ctx;\n}\n\n/** Returns null instead of throwing when used outside SkillProvider */\nexport function useSkillContextOptional(): SkillContextValue | null {\n return useContext(SkillContext);\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 { useEffect, useRef, useMemo } from \"react\";\nimport type {\n ToolDefinition,\n ToolResponse,\n ToolContext,\n ToolRenderProps,\n ToolSet,\n ToolInputSchema,\n AIResponseMode,\n ToolResultConfig,\n} from \"../../core\";\nimport { zodToJsonSchema } from \"../../core\";\nimport { useCopilot } from \"../provider/CopilotProvider\";\n\n/**\n * Check if value is a Zod schema\n */\nfunction isZodSchema(value: unknown): boolean {\n if (value === null || typeof value !== \"object\") return false;\n const obj = value as Record<string, unknown>;\n return (\n (\"_def\" in obj && typeof obj._def === \"object\") ||\n (\"_zod\" in obj && typeof obj._zod === \"object\") ||\n \"~standard\" in obj\n );\n}\n\n/**\n * Configuration for registering a tool\n */\nexport interface UseToolConfig<TParams = Record<string, unknown>> {\n /** Unique tool name */\n name: string;\n /** Tool description for LLM */\n description: string;\n /**\n * Input schema - accepts either:\n * - Zod schema: z.object({ name: z.string() })\n * - JSON Schema: { type: \"object\", properties: { name: { type: \"string\" } } }\n *\n * Zod schemas are automatically converted to JSON Schema at runtime.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n inputSchema: any;\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 title shown in the approval UI */\n approvalTitle?: string | ((params: TParams) => string);\n /** Custom approval message (can be string or function that receives params) */\n approvalMessage?: string | ((params: TParams) => string);\n /**\n * Hide this tool from the chat UI.\n * Tool will still execute, but won't show in tool execution display.\n * @default false\n */\n hidden?: boolean;\n /** Deferred tools stay out of the default request payload; discovered only when query matches */\n deferLoading?: boolean;\n /** Profile memberships for selective tool loading */\n profiles?: string[];\n /** Extra keywords for dynamic tool-selection scoring */\n searchKeywords?: string[];\n /** Optional group for profile-based selection */\n group?: string;\n /** Optional category for search, filtering, and budgets */\n category?: string;\n /** Per-tool prompt/result shaping controls */\n resultConfig?: ToolResultConfig;\n /** Human-readable title for UI display */\n title?: string | ((args: TParams) => string);\n /** Title shown while executing */\n executingTitle?: string | ((args: TParams) => string);\n /** Title shown after completion */\n completedTitle?: string | ((args: TParams) => string);\n /** How the AI should respond when this tool's result is rendered as UI */\n aiResponseMode?: AIResponseMode;\n /** Context/summary sent to AI instead of full result */\n aiContext?:\n | string\n | ((result: ToolResponse, args: Record<string, unknown>) => 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 * Supports both Zod schemas and JSON schemas for inputSchema.\n *\n * @example\n * ```tsx\n * // Using Zod schema (recommended)\n * import { z } from \"zod\";\n *\n * useTool({\n * name: \"navigate_to_page\",\n * description: \"Navigate to a specific page in the app\",\n * inputSchema: z.object({\n * path: z.string().describe(\"The path to navigate to\"),\n * }),\n * handler: async ({ path }) => {\n * router.push(path);\n * return { success: true, message: `Navigated to ${path}` };\n * },\n * });\n *\n * // Using JSON Schema\n * useTool({\n * name: \"open_modal\",\n * description: \"Open a modal dialog\",\n * inputSchema: {\n * type: \"object\",\n * properties: {\n * modalId: { type: \"string\" },\n * },\n * required: [\"modalId\"],\n * },\n * handler: async ({ modalId }) => { ... },\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 // Convert Zod schema to JSON Schema if needed (memoized)\n const inputSchema = useMemo(() => {\n if (isZodSchema(config.inputSchema)) {\n return zodToJsonSchema(config.inputSchema);\n }\n return config.inputSchema as ToolInputSchema;\n }, [config.inputSchema]);\n\n useEffect(() => {\n // Create tool definition\n const tool: ToolDefinition = {\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 TParams, context);\n },\n render: config.render as ToolDefinition[\"render\"],\n available: config.available ?? true,\n needsApproval: config.needsApproval,\n approvalTitle: config.approvalTitle as ToolDefinition[\"approvalTitle\"],\n approvalMessage:\n config.approvalMessage as ToolDefinition[\"approvalMessage\"],\n hidden: config.hidden,\n deferLoading: config.deferLoading,\n profiles: config.profiles,\n searchKeywords: config.searchKeywords,\n group: config.group,\n category: config.category,\n resultConfig: config.resultConfig,\n title: config.title as ToolDefinition[\"title\"],\n executingTitle: config.executingTitle as ToolDefinition[\"executingTitle\"],\n completedTitle: config.completedTitle as ToolDefinition[\"completedTitle\"],\n aiResponseMode: config.aiResponseMode,\n aiContext: config.aiContext as ToolDefinition[\"aiContext\"],\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 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 // Convert Zod schema if needed\n const inputSchema = isZodSchema(config.inputSchema)\n ? zodToJsonSchema(config.inputSchema)\n : (config.inputSchema as ToolInputSchema);\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 TParams, context);\n }\n return { success: false, error: \"Tool handler not found\" };\n },\n available: config.available ?? true,\n needsApproval: config.needsApproval,\n approvalTitle: config.approvalTitle as ToolDefinition[\"approvalTitle\"],\n approvalMessage:\n config.approvalMessage as ToolDefinition[\"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\n/**\n * SkillProvider — React provider for the client-side skill system\n *\n * Responsibilities:\n * 1. Creates and holds a client SkillRegistry\n * 2. Pre-registers skills passed as props\n * 3. Injects skill catalog into AI context (useAIContext)\n * 4. Registers the load_skill tool (useTool)\n * 5. Exposes SkillContext for useSkill() hooks\n *\n * Must be placed inside <CopilotProvider>.\n */\n\nimport React, {\n useRef,\n useState,\n useCallback,\n useEffect,\n useMemo,\n} from \"react\";\nimport { SkillRegistry } from \"../../skill-system/registry\";\nimport type { SkillDefinition, ResolvedSkill } from \"../../skill-system/types\";\nimport { SkillContext } from \"./SkillContext\";\nimport { useAIContext } from \"../hooks/useAIContext\";\nimport { useTool } from \"../hooks/useTool\";\nimport { useCopilot } from \"../provider/CopilotProvider\";\n\n// ============================================\n// Types\n// ============================================\n\nexport interface SkillProviderProps {\n children: React.ReactNode;\n /** Pre-register skills (eager or auto strategies) */\n skills?: SkillDefinition[];\n /**\n * Future: URL to fetch a remote skill manifest\n * @experimental\n */\n remoteManifest?: string;\n}\n\n// ============================================\n// Internal: Context injectors and tool registrar\n// Must be separate components to call hooks at top level\n// ============================================\n\nfunction SkillContextInjector({\n registry,\n skills,\n}: {\n registry: SkillRegistry;\n skills: ResolvedSkill[];\n}) {\n const catalog = useMemo(() => registry.buildCatalog(), [skills]);\n const eagerContent = useMemo(() => registry.buildEagerContent(), [skills]);\n\n // Inject auto skill catalog into AI context\n useAIContext({\n key: \"__skill_catalog__\",\n description: \"Skills the AI can load on demand\",\n data: catalog\n ? `You have access to specialized skills. Call load_skill({ name }) when relevant.\\n\\n${catalog}`\n : \"\",\n });\n\n // Inject eager skill content (always active)\n useAIContext({\n key: \"__skill_eager__\",\n description: \"Always-active skill instructions\",\n data: eagerContent,\n });\n\n return null;\n}\n\nfunction SkillRequestSync({ skills }: { skills: ResolvedSkill[] }) {\n const { setInlineSkills } = useCopilot();\n\n useEffect(() => {\n const inlineSkills = skills\n .filter((s) => s.source.type === \"inline\")\n .map((s) => ({\n name: s.name,\n description: s.description,\n content: s.content,\n strategy: s.strategy,\n }));\n setInlineSkills(inlineSkills);\n }, [skills, setInlineSkills]);\n\n return null;\n}\n\nfunction SkillToolRegistrar({\n registry,\n skills,\n}: {\n registry: SkillRegistry;\n skills: ResolvedSkill[];\n}) {\n useTool(\n {\n name: \"load_skill\",\n description:\n \"Load a skill by name to get full instructions for a specialized task.\",\n inputSchema: {\n type: \"object\",\n properties: {\n name: {\n type: \"string\",\n description: \"The name of the skill to load.\",\n },\n },\n required: [\"name\"],\n },\n handler: async ({ name }: { name: string }) => {\n const skill = registry.get(name);\n if (!skill) {\n const available =\n registry\n .getAuto()\n .map((s) => s.name)\n .join(\", \") || \"none\";\n return {\n success: false,\n error: `Skill \"${name}\" not found. Available skills: ${available}`,\n };\n }\n const sourceTypeMap = {\n inline: \"client-inline\",\n url: \"remote-url\",\n file: \"server-dir\",\n } as const;\n return {\n success: true,\n name: skill.name,\n description: skill.description,\n strategy: skill.strategy ?? \"auto\",\n content: skill.content,\n source: sourceTypeMap[skill.source.type],\n };\n },\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [skills],\n );\n\n return null;\n}\n\n// ============================================\n// Main SkillProvider\n// ============================================\n\nexport function SkillProvider({\n children,\n skills: skillsProp,\n}: SkillProviderProps) {\n // Stable registry instance\n const registryRef = useRef<SkillRegistry | null>(null);\n if (registryRef.current === null) {\n registryRef.current = new SkillRegistry();\n }\n const registry = registryRef.current;\n\n // Reactive skills snapshot (triggers re-renders when skills change)\n const [skills, setSkills] = useState<ResolvedSkill[]>([]);\n\n // Register skills passed as props\n useEffect(() => {\n if (!skillsProp?.length) return;\n\n for (const def of skillsProp) {\n if (def.source.type !== \"inline\") {\n // url/file skills need content resolved — not supported client-side\n console.warn(\n `[copilot-sdk/skills] Client-side SkillProvider only supports inline skills. ` +\n `Skill \"${def.name}\" has source type \"${def.source.type}\" and will be skipped. ` +\n `Use loadSkills() on the server for file/url skills.`,\n );\n continue;\n }\n\n const resolved: ResolvedSkill = {\n ...def,\n content: def.source.content,\n };\n\n registry.register(resolved);\n }\n\n setSkills(registry.getAll());\n\n // Cleanup prop-provided skills on unmount or prop change\n return () => {\n for (const def of skillsProp ?? []) {\n registry.unregister(def.name);\n }\n setSkills(registry.getAll());\n };\n }, [skillsProp]);\n\n // Context-exposed register/unregister (for useSkill hook)\n const register = useCallback((skill: ResolvedSkill) => {\n registry.register(skill);\n setSkills(registry.getAll());\n }, []);\n\n const unregister = useCallback((name: string) => {\n registry.unregister(name);\n setSkills(registry.getAll());\n }, []);\n\n const contextValue = useMemo(\n () => ({ registry, register, unregister, skills }),\n [register, unregister, skills],\n );\n\n return (\n <SkillContext.Provider value={contextValue}>\n <SkillContextInjector registry={registry} skills={skills} />\n <SkillToolRegistrar registry={registry} skills={skills} />\n <SkillRequestSync skills={skills} />\n {children}\n </SkillContext.Provider>\n );\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 ToolsConfig,\n ToolDefinition,\n ActionDefinition,\n MessageAttachment,\n PermissionLevel,\n ToolOptimizationConfig,\n ContextUsage,\n} from \"../../core\";\n\nimport type { MCPServerConfig } from \"../../mcp/types\";\nimport type { Resolvable } from \"../../core/utils/resolvable\";\nimport { createLogger } from \"../../core/utils/logger\";\n\nimport type {\n UIMessage,\n ToolExecution,\n StreamChunk,\n YourGPTConfig,\n} 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\";\nimport { useMCPTools } from \"../hooks/useMCPTools\";\nimport {\n MessageHistoryContext,\n defaultMessageHistoryConfig,\n useMessageHistoryContext,\n} from \"../message-history/context\";\nimport { useMessageHistory } from \"../message-history/useMessageHistory\";\nimport type { MessageHistoryConfig } from \"../message-history/types\";\nimport { SkillProvider } from \"../skill/SkillProvider\";\nimport type { SkillDefinition } from \"../../skill-system/types\";\n\n// ============================================\n// Internal MCP Connection Component\n// ============================================\n\nfunction MCPConnection({ config }: { config: MCPServerConfig }) {\n useMCPTools({\n name: config.name,\n transport: config.transport,\n url: config.url,\n headers: config.headers,\n autoConnect: true,\n prefixToolNames: config.prefixToolNames ?? true,\n timeout: config.timeout,\n });\n return null;\n}\n\n// ============================================\n// MessageHistoryBridge — wires useMessageHistory into AbstractChat.buildRequest()\n// ============================================\n\nconst COMPACTING_MARKER_ID = \"__compacting-in-progress__\";\n\nfunction MessageHistoryBridge({\n chatRef,\n}: {\n chatRef: React.MutableRefObject<InstanceType<\n typeof ReactChatWithTools\n > | null>;\n}) {\n const { compactionState, tokenUsage } = useMessageHistory();\n const ctx = useMessageHistoryContext();\n\n // Track whether we've already added the loading marker for the current compaction cycle\n const loaderAddedRef = useRef(false);\n const prevCompactionCountRef = useRef(compactionState.compactionCount);\n\n // When threshold is first crossed → add loading indicator\n useEffect(() => {\n if (!tokenUsage.isApproaching) {\n loaderAddedRef.current = false;\n return;\n }\n if (loaderAddedRef.current) return;\n const chat = chatRef.current;\n if (!chat) return;\n const alreadyAdded = chat.messages.some(\n (m) => m.id === COMPACTING_MARKER_ID,\n );\n if (alreadyAdded) return;\n loaderAddedRef.current = true;\n const loading: UIMessage = {\n id: COMPACTING_MARKER_ID,\n role: \"system\",\n content: \"Compacting conversation…\",\n createdAt: new Date(),\n metadata: { type: \"compaction-marker\", compacting: true },\n };\n chat.setMessages([...chat.messages, loading]);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [tokenUsage.isApproaching]);\n\n // When compaction count increases → replace loader with permanent marker\n useEffect(() => {\n if (compactionState.compactionCount <= prevCompactionCountRef.current)\n return;\n prevCompactionCountRef.current = compactionState.compactionCount;\n loaderAddedRef.current = false;\n const chat = chatRef.current;\n if (!chat) return;\n const hasLoader = chat.messages.some((m) => m.id === COMPACTING_MARKER_ID);\n const base = hasLoader\n ? chat.messages.map((m) =>\n m.id === COMPACTING_MARKER_ID\n ? {\n ...m,\n id: `compaction-marker-${compactionState.compactionCount}`,\n content: `Conversation compacted — context window refreshed`,\n metadata: { type: \"compaction-marker\", compacting: false },\n }\n : m,\n )\n : [\n ...chat.messages,\n {\n id: `compaction-marker-${compactionState.compactionCount}`,\n role: \"system\" as const,\n content: `Conversation compacted — context window refreshed`,\n createdAt: new Date(),\n metadata: { type: \"compaction-marker\", compacting: false },\n },\n ];\n chat.setMessages(base);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [compactionState.compactionCount]);\n\n // Keep latest compaction state + config in refs so the transform\n // (called synchronously inside AbstractChat) always sees fresh values.\n const compactionStateRef = useRef(compactionState);\n compactionStateRef.current = compactionState;\n const configRef = useRef(ctx.config);\n configRef.current = ctx.config;\n\n useEffect(() => {\n const chat = chatRef.current;\n if (!chat) return;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (chat as any).setRequestMessageTransform((allMessages: UIMessage[]) => {\n if (allMessages.length === 0) return allMessages;\n\n // Find the last user message — everything from here is the \"current turn\"\n // (user msg + any assistant tool-calls + tool results).\n // This is ALWAYS kept verbatim so we never send an invalid payload.\n let lastUserIdx = -1;\n for (let i = allMessages.length - 1; i >= 0; i--) {\n if (allMessages[i].role === \"user\") {\n lastUserIdx = i;\n break;\n }\n }\n\n // No user message at all — pass through untouched (safety valve)\n if (lastUserIdx === -1) return allMessages;\n\n const historyMessages = allMessages.slice(0, lastUserIdx);\n const currentTurn = allMessages.slice(lastUserIdx);\n\n // Nothing to compact\n if (historyMessages.length === 0) return allMessages;\n\n const cfg = configRef.current;\n\n // Apply summary-buffer windowing to history, keeping UIMessage format.\n //\n // WHY NOT buildSummaryBufferContext here:\n // buildSummaryBufferContext returns LLMMessage[] (snake_case: tool_calls,\n // tool_call_id). The optimizer's transformMessages() only reads camelCase\n // (toolCalls, toolCallId), so mixing LLMMessage into this array causes it\n // to silently strip tool call data → \"Missing call_id\" API errors.\n // The optimizer must own the UIMessage → RequestMessage conversion.\n const cs = compactionStateRef.current;\n const recentBuffer = cfg.recentBuffer ?? 10;\n\n // Identify compaction marker messages (UI-only, already represented by rollingSummary)\n const isCompactionMsg = (m: UIMessage) =>\n m.metadata?.[\"type\"] === \"compaction-marker\";\n\n const windowedHistory: UIMessage[] = [];\n\n // 1. Working memory (always first)\n if (cs.workingMemory.length > 0) {\n windowedHistory.push({\n id: \"working-memory\",\n role: \"system\",\n content: `[Working memory — always active]\\n${cs.workingMemory.join(\"\\n\")}`,\n createdAt: new Date(),\n } as UIMessage);\n }\n\n // 2. Rolling summary replaces older history\n if (cs.rollingSummary) {\n windowedHistory.push({\n id: \"rolling-summary\",\n role: \"system\",\n content: `[Previous conversation summary]\\n${cs.rollingSummary}`,\n createdAt: new Date(),\n } as UIMessage);\n }\n\n // 3. Non-compaction system messages (e.g. injected context)\n const systemMsgs = historyMessages.filter(\n (m) => m.role === \"system\" && !isCompactionMsg(m),\n );\n windowedHistory.push(...systemMsgs);\n\n // 4. Recent conversation messages (windowed to recentBuffer)\n const conversationMsgs = historyMessages.filter(\n (m) => m.role !== \"system\",\n );\n const recentStart = Math.max(0, conversationMsgs.length - recentBuffer);\n windowedHistory.push(...conversationMsgs.slice(recentStart));\n\n return [...windowedHistory, ...currentTurn];\n });\n return () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (chatRef.current as any)?.setRequestMessageTransform(null);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return null;\n}\n\n// ============================================\n// Types\n// ============================================\n\nexport interface CopilotProviderProps {\n children: React.ReactNode;\n /**\n * Runtime API endpoint URL\n * Can be static string or getter function for dynamic resolution.\n */\n runtimeUrl: Resolvable<string>;\n /** System prompt sent with each request */\n systemPrompt?: string;\n /** @deprecated Use useTools() hook instead */\n tools?: ToolsConfig;\n /** Thread ID for conversation persistence */\n threadId?: string;\n /**\n * Called once before the first message on a new thread to create a session.\n * The returned value IS the thread ID — session and thread are the same identity.\n * Only called when `threadId` is not set. If `threadId` is provided, this is skipped.\n * Takes priority over `yourgptConfig`.\n *\n * @example\n * ```tsx\n * onCreateSession={async () => {\n * const res = await fetch('/api/sessions', { method: 'POST', headers })\n * return (await res.json()).id\n * }}\n * ```\n */\n onCreateSession?: () => string | Promise<string>;\n /**\n * Called when a new session/thread ID is assigned (new thread created).\n * Use this to persist the session ID in your storage layer.\n */\n onThreadChange?: (id: string) => void;\n /**\n * YourGPT config — enables automatic session creation with zero boilerplate.\n * The SDK calls YourGPT's createSession API before the first message and\n * uses the returned session_uid as `threadId`.\n *\n * @example\n * ```tsx\n * yourgptConfig={{ apiKey: \"your-api-key\", widgetUid: widgetUid }}\n * ```\n */\n yourgptConfig?: YourGPTConfig;\n /** Initial messages to populate the chat */\n initialMessages?: UIMessage[];\n /** Callback when messages change */\n onMessagesChange?: (messages: Message[]) => void;\n /** Callback when an error occurs */\n onError?: (error: Error) => void;\n /**\n * Custom error message extractor for non-2xx API responses.\n * Receives the HTTP status and parsed response body.\n * Return a string to override the default message, or null to use the default.\n *\n * @example\n * parseError: (status, body) => body?.errors?.[0]?.message ?? body?.detail ?? null\n */\n parseError?: (status: number, body: unknown) => string | null | undefined;\n /** Enable/disable streaming (default: true) */\n streaming?: boolean;\n /**\n * Custom headers to send with each request\n * Can be static object or getter function for dynamic resolution.\n */\n headers?: Resolvable<Record<string, string>>;\n /**\n * Additional body properties to include in each request\n * Can be static object or getter function for dynamic resolution.\n */\n body?: Resolvable<Record<string, unknown>>;\n /** Enable debug logging */\n debug?: boolean;\n /** Max tool execution iterations (default: 20) */\n maxIterations?: number;\n /** Custom message when max iterations reached (sent to AI as tool result) */\n maxIterationsMessage?: string;\n /** MCP servers to connect to automatically */\n mcpServers?: MCPServerConfig[];\n /** Optional prompt/tool optimization controls (tool profiles, context budgets, etc.) */\n optimization?: ToolOptimizationConfig;\n /**\n * Context window management config. Controls compaction strategy, token budgets,\n * session persistence, and working memory.\n * @default strategy: 'none' — current behaviour, zero breaking changes\n */\n messageHistory?: MessageHistoryConfig;\n /**\n * Convenience prop to pre-register inline skills.\n * Wraps children with <SkillProvider skills={skills}>.\n * Only inline skills (source.type === \"inline\") are supported client-side.\n */\n skills?: SkillDefinition[];\n}\n\n// ============================================\n// MessageMetaStore — reactive per-message key-value store\n// ============================================\n\nexport type StreamChunkWithMessageId = StreamChunk & { messageId?: string };\nexport type StreamEventHandler = (chunk: StreamChunkWithMessageId) => void;\n\n/**\n * Reactive store for custom per-message metadata.\n * Powers useMessageMeta() — consumers write any shape they want,\n * all components reading the same messageId react automatically.\n */\nexport class MessageMetaStore {\n private store = new Map<string, Record<string, unknown>>();\n private listeners = new Set<() => void>();\n // Stable empty object — returned for unknown messageIds so useSyncExternalStore\n // sees the same reference and doesn't trigger infinite re-renders.\n private static readonly EMPTY: Record<string, unknown> = {};\n\n subscribe = (cb: () => void): (() => void) => {\n this.listeners.add(cb);\n return () => this.listeners.delete(cb);\n };\n\n getSnapshot = (): Map<string, Record<string, unknown>> => this.store;\n\n getMeta = (messageId: string): Record<string, unknown> =>\n this.store.get(messageId) ?? MessageMetaStore.EMPTY;\n\n setMeta = (messageId: string, meta: Record<string, unknown>): void => {\n this.store.set(messageId, meta);\n this.listeners.forEach((cb) => cb());\n };\n\n updateMeta = (\n messageId: string,\n updater: (prev: Record<string, unknown>) => Record<string, unknown>,\n ): void => {\n const prev = this.store.get(messageId) ?? {};\n this.store.set(messageId, updater(prev));\n this.listeners.forEach((cb) => cb());\n };\n\n clear = (): void => {\n this.store.clear();\n this.listeners.forEach((cb) => cb());\n };\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 // Branching actions\n switchBranch: (messageId: string) => void;\n getBranchInfo: (\n messageId: string,\n ) => import(\"../../chat/branching\").BranchInfo | null;\n editMessage: (messageId: string, newContent: string) => Promise<void>;\n hasBranches: boolean;\n /** Get ALL messages across all branches (for persistence). Visible path only when no branches. */\n getAllMessages: () => UIMessage[];\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 // System Prompt\n setSystemPrompt: (prompt: string) => void;\n\n // Context stats (reactive — updates when useAIContext adds/removes context)\n /** Total characters currently registered in the AI context tree (system prompt contribution). */\n contextChars: number;\n /**\n * Live prompt context usage snapshot — updated on every message send.\n * Includes token counts and percentages for systemPrompt, history, toolResults, tools buckets.\n * null until the first message is sent.\n */\n contextUsage: ContextUsage | null;\n\n // Skills (for SkillProvider — sends inline skills to server on every request)\n setInlineSkills: (\n skills: Array<{\n name: string;\n description: string;\n content: string;\n strategy?: string;\n }>,\n ) => void;\n\n // Agent loop iteration (increments each time the AI calls a tool batch; resets on sendMessage)\n agentIteration: number;\n\n // Config\n threadId?: string;\n /**\n * Switch to a different thread (or start a new one).\n * Pass the session/thread ID from persistence to reuse it (no new session call),\n * or null to start a fresh thread (new session created on first sendMessage).\n */\n setActiveThread: (id: string | null) => void;\n /**\n * Force a new session to be created on the next sendMessage.\n * Call when the current session has expired or credits are exhausted.\n */\n renewSession: () => void;\n /** Current session creation status */\n sessionStatus: \"idle\" | \"creating\" | \"ready\" | \"error\";\n /**\n * Runtime URL configuration.\n * Can be a static string or getter function (matches what was passed to provider).\n */\n runtimeUrl: Resolvable<string>;\n toolsConfig?: ToolsConfig;\n\n // ── Headless primitives ──────────────────────────────────────────────────\n\n /**\n * Subscribe to raw stream chunks as they arrive.\n * Returns an unsubscribe function. Use useCopilotEvent() for the hook API.\n *\n * @example\n * ```ts\n * const unsub = subscribeToStreamEvents((chunk) => {\n * if (chunk.type === 'thinking:delta') { ... }\n * })\n * return unsub // cleanup\n * ```\n */\n subscribeToStreamEvents: (handler: StreamEventHandler) => () => void;\n\n /**\n * Reactive per-message metadata store.\n * Use useMessageMeta(messageId) for the hook API.\n */\n messageMeta: MessageMetaStore;\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(props: CopilotProviderProps) {\n const {\n children,\n runtimeUrl,\n systemPrompt,\n tools: toolsConfig,\n threadId,\n onCreateSession,\n onThreadChange,\n yourgptConfig,\n initialMessages,\n onMessagesChange,\n onError,\n parseError,\n streaming,\n headers,\n body,\n debug = false,\n maxIterations,\n maxIterationsMessage,\n mcpServers,\n optimization,\n messageHistory,\n skills,\n } = props;\n const isThreadIdControlled = Object.prototype.hasOwnProperty.call(\n props,\n \"threadId\",\n );\n\n // ── Headless primitives ──────────────────────────────────────────────────\n\n // Stream event listeners — Set of handlers subscribed via useCopilotEvent()\n const streamListenersRef = useRef<Set<StreamEventHandler>>(new Set());\n\n const subscribeToStreamEvents = useCallback(\n (handler: StreamEventHandler): (() => void) => {\n streamListenersRef.current.add(handler);\n return () => streamListenersRef.current.delete(handler);\n },\n [],\n );\n\n // Per-message metadata store — stable instance, never re-created\n const messageMetaStoreRef = useRef<MessageMetaStore>(new MessageMetaStore());\n\n // Debug logger — scoped to \"provider\" namespace\n const debugLog = useCallback(\n (action: string, data?: unknown) => {\n createLogger(\"provider\", () => debug ?? false)(action, data);\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 const [sessionStatus, setSessionStatus] = useState<\n \"idle\" | \"creating\" | \"ready\" | \"error\"\n >(() => (threadId ? \"ready\" : \"idle\"));\n const [agentIteration, setAgentIteration] = useState(0);\n // Track the ACTUAL thread/session ID assigned by the chat instance.\n // This is different from the `threadId` prop — it updates reactively when\n // onCreateSession fires and a new session ID is assigned.\n const [actualThreadId, setActualThreadId] = useState<string | undefined>(\n threadId,\n );\n const lastControlledThreadIdRef = useRef<{\n controlled: boolean;\n value: string | undefined;\n }>({\n controlled: isThreadIdControlled,\n value: threadId,\n });\n\n // ============================================\n // ChatWithTools Instance\n // ============================================\n\n const chatRef = useRef<ReactChatWithTools | null>(null);\n\n // Initialize chat on first render\n // If disposed (React StrictMode), revive instead of recreate to preserve tools\n if (chatRef.current !== null && chatRef.current.disposed) {\n chatRef.current.revive();\n debugLog(\"Revived disposed instance (React StrictMode)\");\n }\n\n if (chatRef.current === null) {\n const uiInitialMessages = initialMessages;\n\n chatRef.current = new ReactChatWithTools(\n {\n runtimeUrl,\n systemPrompt,\n threadId,\n onCreateSession,\n yourgptConfig,\n initialMessages: uiInitialMessages,\n streaming,\n headers,\n body,\n parseError,\n debug,\n maxIterations,\n maxIterationsMessage,\n optimization,\n },\n {\n onToolExecutionsChange: (executions) => {\n debugLog(\"Tool executions changed:\", executions.length);\n setToolExecutions(executions);\n // Sync the agent loop iteration count at the same time — it increments\n // once per executeToolCalls() call, which is what triggers this callback.\n setAgentIteration(chatRef.current?.iteration ?? 0);\n },\n onApprovalRequired: (execution) => {\n debugLog(\"Tool approval required:\", execution.name);\n },\n onContextUsageChange: (usage) => {\n setContextUsage(usage);\n },\n onError: (error) => {\n if (error) onError?.(error);\n },\n onThreadChange: (id) => {\n debugLog(\"Thread/session ID assigned:\", id);\n setActualThreadId(id);\n onThreadChange?.(id);\n },\n onSessionStatusChange: (status) => {\n debugLog(\"Session status:\", status);\n setSessionStatus(status);\n },\n onStreamChunk: (chunk) => {\n // Broadcast to all useCopilotEvent() subscribers\n if (streamListenersRef.current.size > 0) {\n for (const handler of streamListenersRef.current) {\n handler(chunk);\n }\n }\n },\n },\n );\n }\n\n // ============================================\n // System Prompt Reactivity\n // ============================================\n\n // Watch for systemPrompt prop changes and update chat\n useEffect(() => {\n if (chatRef.current && systemPrompt !== undefined) {\n chatRef.current.setSystemPrompt(systemPrompt);\n debugLog(\"System prompt updated from prop\");\n }\n }, [systemPrompt, debugLog]);\n\n // ============================================\n // Headers & Body Reactivity\n // ============================================\n\n // Watch for headers prop changes and update chat\n useEffect(() => {\n if (chatRef.current && headers !== undefined) {\n chatRef.current.setHeaders(headers);\n debugLog(\"Headers config updated from prop\");\n }\n }, [headers, debugLog]);\n\n // Watch for body prop changes\n useEffect(() => {\n if (chatRef.current && body !== undefined) {\n chatRef.current.setBody(body);\n debugLog(\"Body config updated from prop\");\n }\n }, [body, debugLog]);\n\n // Watch for runtimeUrl prop changes\n useEffect(() => {\n if (chatRef.current && runtimeUrl !== undefined) {\n chatRef.current.setUrl(runtimeUrl);\n debugLog(\"URL config updated from prop\");\n }\n }, [runtimeUrl, debugLog]);\n\n // Keep the chat instance aligned with controlled threadId prop changes.\n useEffect(() => {\n const prev = lastControlledThreadIdRef.current;\n const controlChanged = prev.controlled !== isThreadIdControlled;\n const valueChanged = prev.value !== threadId;\n\n if (!controlChanged && !valueChanged) {\n return;\n }\n\n lastControlledThreadIdRef.current = {\n controlled: isThreadIdControlled,\n value: threadId,\n };\n\n if (!isThreadIdControlled) {\n return;\n }\n\n chatRef.current?.setActiveThread(threadId ?? null);\n setActualThreadId(threadId);\n setSessionStatus(threadId ? \"ready\" : \"idle\");\n debugLog(\"Thread/session synced from prop\", { threadId });\n }, [debugLog, isThreadIdControlled, threadId]);\n\n // Stable snapshot callbacks for useSyncExternalStore\n // getServerSnapshot must return a cached/stable value to avoid infinite loops\n const EMPTY_MESSAGES = useRef<UIMessage[]>([]);\n const getMessagesSnapshot = useCallback(() => chatRef.current!.messages, []);\n const getServerMessagesSnapshot = useCallback(\n () => EMPTY_MESSAGES.current,\n [],\n );\n const getStatusSnapshot = useCallback(() => chatRef.current!.status, []);\n const getErrorSnapshot = useCallback(() => chatRef.current!.error, []);\n\n // Subscribe to chat state with useSyncExternalStore\n const messages = useSyncExternalStore(\n chatRef.current.subscribe,\n getMessagesSnapshot,\n getServerMessagesSnapshot,\n );\n\n const status = useSyncExternalStore(\n chatRef.current.subscribe,\n getStatusSnapshot,\n () => \"ready\" as const,\n );\n\n const errorFromChat = useSyncExternalStore(\n chatRef.current.subscribe,\n getErrorSnapshot,\n () => undefined,\n );\n const error = errorFromChat ?? null;\n\n const isLoading = status === \"streaming\" || status === \"submitted\";\n\n // ============================================\n // Actions\n // ============================================\n\n const setActiveThread = useCallback((id: string | null) => {\n chatRef.current?.setActiveThread(id);\n // Sync React state: known ID → expose it; null (new thread) → clear until onThreadChange fires\n setActualThreadId(id ?? undefined);\n }, []);\n\n const renewSession = useCallback(() => {\n chatRef.current?.renewSession();\n setActualThreadId(undefined);\n setSessionStatus(\"idle\");\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 = useMemo(\n () => chatRef.current?.tools ?? [],\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [toolExecutions], // re-derive when tool executions change (tools change alongside)\n );\n const pendingApprovals = useMemo(\n () => toolExecutions.filter((e) => e.approvalStatus === \"required\"),\n [toolExecutions],\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 const [contextChars, setContextChars] = useState(0);\n const [contextUsage, setContextUsage] = useState<ContextUsage | null>(null);\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 setContextChars(contextString.length);\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 setContextChars(contextString.length);\n debugLog(\"Context removed:\", id);\n },\n [debugLog],\n );\n\n // ============================================\n // System Prompt\n // ============================================\n\n const setSystemPrompt = useCallback(\n (prompt: string): void => {\n chatRef.current?.setSystemPrompt(prompt);\n debugLog(\"System prompt updated via function\");\n },\n [debugLog],\n );\n\n const setInlineSkills = useCallback(\n (\n skills: Array<{\n name: string;\n description: string;\n content: string;\n strategy?: string;\n }>,\n ): void => {\n chatRef.current?.setInlineSkills(skills);\n debugLog(\"Inline skills updated\", { count: skills.length });\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 setAgentIteration(0); // reset before each new user message\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 const switchBranch = useCallback((messageId: string) => {\n chatRef.current?.switchBranch(messageId);\n }, []);\n\n const getBranchInfo = useCallback(\n (messageId: string) => chatRef.current?.getBranchInfo(messageId) ?? null,\n [],\n );\n\n const editMessage = useCallback(\n async (messageId: string, newContent: string) => {\n await chatRef.current?.sendMessage(newContent, undefined, {\n editMessageId: messageId,\n });\n },\n [],\n );\n\n const getHasBranchesSnapshot = useCallback(\n () => chatRef.current!.hasBranches,\n [],\n );\n const hasBranches = useSyncExternalStore(\n chatRef.current.subscribe,\n getHasBranchesSnapshot,\n () => false,\n );\n\n const getAllMessages = useCallback(\n () => chatRef.current?.getAllMessages?.() ?? [],\n [],\n );\n\n // ============================================\n // Callbacks\n // ============================================\n\n // Notify external callbacks\n useEffect(() => {\n if (onMessagesChange && messages.length > 0) {\n // Use getAllMessages() to persist all branches, not just the visible path\n const allUIMessages = chatRef.current?.getAllMessages?.() ?? messages;\n const coreMessages: Message[] = allUIMessages.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 parent_id: m.parentId,\n children_ids: m.childrenIds,\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 // Branching\n switchBranch,\n getBranchInfo,\n editMessage,\n hasBranches,\n getAllMessages,\n\n // Tool execution\n registerTool,\n unregisterTool,\n registeredTools,\n toolExecutions,\n pendingApprovals,\n approveToolExecution,\n rejectToolExecution,\n agentIteration,\n\n // Actions\n registerAction,\n unregisterAction,\n registeredActions,\n\n // AI Context\n addContext,\n removeContext,\n contextChars,\n contextUsage,\n\n // System Prompt\n setSystemPrompt,\n\n // Skills\n setInlineSkills,\n\n // Config\n threadId: actualThreadId,\n setActiveThread,\n renewSession,\n sessionStatus,\n runtimeUrl,\n toolsConfig,\n\n // Headless primitives\n subscribeToStreamEvents,\n messageMeta: messageMetaStoreRef.current,\n }),\n [\n messages,\n status,\n error,\n isLoading,\n sendMessage,\n stop,\n clearMessages,\n setMessages,\n regenerate,\n switchBranch,\n getBranchInfo,\n editMessage,\n hasBranches,\n getAllMessages,\n registerTool,\n unregisterTool,\n registeredTools,\n toolExecutions,\n pendingApprovals,\n approveToolExecution,\n rejectToolExecution,\n agentIteration,\n registerAction,\n unregisterAction,\n registeredActions,\n addContext,\n removeContext,\n contextChars,\n contextUsage,\n setSystemPrompt,\n setInlineSkills,\n actualThreadId,\n setActiveThread,\n renewSession,\n sessionStatus,\n runtimeUrl,\n toolsConfig,\n ],\n );\n\n const messageHistoryContextValue = React.useMemo(\n () => ({\n config: { ...defaultMessageHistoryConfig, ...messageHistory },\n tokenUsage: {\n current: 0,\n max: messageHistory?.maxContextTokens ?? 128000,\n percentage: 0,\n isApproaching: false,\n },\n compactionState: {\n rollingSummary: null,\n lastCompactionAt: null,\n compactionCount: 0,\n totalTokensSaved: 0,\n workingMemory: [],\n displayMessageCount: 0,\n llmMessageCount: 0,\n },\n }),\n [messageHistory],\n );\n\n return (\n <MessageHistoryContext.Provider value={messageHistoryContextValue}>\n <CopilotContext.Provider value={contextValue}>\n {mcpServers?.map((config) => (\n <MCPConnection key={config.name} config={config} />\n ))}\n {messageHistory?.strategy && messageHistory.strategy !== \"none\" && (\n <MessageHistoryBridge chatRef={chatRef} />\n )}\n {skills ? (\n <SkillProvider skills={skills}>{children}</SkillProvider>\n ) : (\n children\n )}\n </CopilotContext.Provider>\n </MessageHistoryContext.Provider>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef, useMemo } from \"react\";\nimport { useCopilot } from \"../provider/CopilotProvider\";\nimport { useMCPClient } from \"./useMCPClient\";\nimport { MCPToolAdapter } from \"../../mcp/tools/MCPToolAdapter\";\nimport type {\n UseMCPToolsConfig,\n UseMCPToolsReturn,\n MCPToolDefinition,\n} from \"../../mcp/types\";\nimport type { ToolDefinition } from \"../../core/types/tools\";\n\n/**\n * React hook for connecting to an MCP server and auto-registering its tools\n *\n * This hook combines the MCP client management with automatic tool registration\n * to the CopilotProvider. When connected, all MCP tools become available to\n * the AI assistant automatically.\n *\n * @example\n * ```tsx\n * function CopilotWithGitHub() {\n * const {\n * state,\n * isConnected,\n * isLoading,\n * toolDefinitions,\n * } = useMCPTools({\n * name: \"github\",\n * transport: \"http\",\n * url: \"https://mcp.github.com\",\n * headers: { Authorization: `Bearer ${token}` },\n * autoConnect: true,\n * prefixToolNames: true, // Tools named: github_create_issue, etc.\n * onElicitationRequest: async (request) => {\n * // Show custom approval UI\n * const approved = await showApprovalDialog(request);\n * return { requestId: request.requestId, accepted: approved };\n * },\n * });\n *\n * return (\n * <div>\n * {isLoading && <div>Connecting to GitHub MCP...</div>}\n * {isConnected && (\n * <div>{toolDefinitions.length} GitHub tools available</div>\n * )}\n * <CopilotChat />\n * </div>\n * );\n * }\n * ```\n */\nexport function useMCPTools(config: UseMCPToolsConfig): UseMCPToolsReturn {\n const {\n prefixToolNames = true,\n autoRegister = true,\n hidden = false,\n source = \"mcp\",\n ...clientConfig\n } = config;\n\n // Get copilot context for tool registration\n const { registerTool, unregisterTool } = useCopilot();\n\n // Track registered tool names for cleanup\n const registeredToolsRef = useRef<string[]>([]);\n\n // Use the base MCP client hook\n const mcpClient = useMCPClient(clientConfig);\n\n // Create tool adapter\n const toolAdapter = useMemo(\n () => new MCPToolAdapter(clientConfig.name),\n [clientConfig.name],\n );\n\n // Convert MCP tools to ToolDefinitions\n const toolDefinitions = useMemo((): ToolDefinition[] => {\n if (!mcpClient.isConnected || mcpClient.state.tools.length === 0) {\n return [];\n }\n\n return mcpClient.state.tools.map((tool) =>\n toolAdapter.toToolDefinition(tool, {\n prefix: prefixToolNames,\n asServerTool: true, // MCP tools execute remotely\n callTool: mcpClient.callTool,\n hidden, // Hide from chat UI\n source, // Tool source for UI differentiation\n }),\n );\n }, [\n mcpClient.isConnected,\n mcpClient.state.tools,\n mcpClient.callTool,\n toolAdapter,\n prefixToolNames,\n hidden,\n source,\n ]);\n\n // Auto-register/unregister tools with CopilotProvider\n useEffect(() => {\n if (!autoRegister) {\n return;\n }\n\n // Unregister previously registered tools\n for (const toolName of registeredToolsRef.current) {\n unregisterTool(toolName);\n }\n registeredToolsRef.current = [];\n\n // Register new tools\n if (mcpClient.isConnected && toolDefinitions.length > 0) {\n for (const tool of toolDefinitions) {\n registerTool(tool);\n registeredToolsRef.current.push(tool.name);\n }\n }\n\n // Cleanup on unmount\n return () => {\n for (const toolName of registeredToolsRef.current) {\n unregisterTool(toolName);\n }\n registeredToolsRef.current = [];\n };\n }, [\n autoRegister,\n mcpClient.isConnected,\n toolDefinitions,\n registerTool,\n unregisterTool,\n ]);\n\n return {\n ...mcpClient,\n toolDefinitions,\n };\n}\n\n/**\n * Hook for using multiple MCP servers simultaneously\n *\n * @example\n * ```tsx\n * function CopilotWithMultipleMCP() {\n * const github = useMCPTools({\n * name: \"github\",\n * transport: \"http\",\n * url: \"https://mcp.github.com\",\n * });\n *\n * const slack = useMCPTools({\n * name: \"slack\",\n * transport: \"http\",\n * url: \"https://mcp.slack.com\",\n * });\n *\n * const allConnected = github.isConnected && slack.isConnected;\n * const totalTools = github.toolDefinitions.length + slack.toolDefinitions.length;\n *\n * return (\n * <div>\n * {allConnected && <div>{totalTools} tools available</div>}\n * <CopilotChat />\n * </div>\n * );\n * }\n * ```\n */\n\nexport type { UseMCPToolsConfig, UseMCPToolsReturn };\n"]}
|