@yourgpt/copilot-sdk 2.1.3 → 2.1.5-alpha.0

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.
Files changed (103) hide show
  1. package/dist/MessageTree-CoIt_4nB.d.cts +161 -0
  2. package/dist/MessageTree-CzaN9Eul.d.ts +161 -0
  3. package/dist/{ThreadManager-Dkp_eLty.d.ts → ThreadManager-BEAECB7Y.d.ts} +1 -1
  4. package/dist/{ThreadManager-LfFRhr4e.d.cts → ThreadManager-Cw5fwyCN.d.cts} +1 -1
  5. package/dist/{chunk-POZNNKNJ.cjs → chunk-246B6X5D.cjs} +8 -2
  6. package/dist/chunk-246B6X5D.cjs.map +1 -0
  7. package/dist/{chunk-QLH6TSCC.js → chunk-4QXY2PBG.js} +8 -2
  8. package/dist/chunk-4QXY2PBG.js.map +1 -0
  9. package/dist/{chunk-DMBFN7KO.js → chunk-6BMQZIS3.js} +3105 -355
  10. package/dist/chunk-6BMQZIS3.js.map +1 -0
  11. package/dist/{chunk-R6LKHKAI.cjs → chunk-76RE7AJE.cjs} +3277 -509
  12. package/dist/chunk-76RE7AJE.cjs.map +1 -0
  13. package/dist/chunk-BJYA5NDL.cjs +96 -0
  14. package/dist/chunk-BJYA5NDL.cjs.map +1 -0
  15. package/dist/{chunk-LZMBBGWH.js → chunk-ENFWM3EY.js} +4 -4
  16. package/dist/{chunk-LZMBBGWH.js.map → chunk-ENFWM3EY.js.map} +1 -1
  17. package/dist/{chunk-WQSK3Z4K.cjs → chunk-I3SQUNTT.cjs} +81 -31
  18. package/dist/chunk-I3SQUNTT.cjs.map +1 -0
  19. package/dist/{chunk-WAPGTQDR.cjs → chunk-JKGFQUHJ.cjs} +10 -10
  20. package/dist/{chunk-WAPGTQDR.cjs.map → chunk-JKGFQUHJ.cjs.map} +1 -1
  21. package/dist/{chunk-XGITAEXU.js → chunk-LLM7AHMO.js} +2 -2
  22. package/dist/{chunk-XGITAEXU.js.map → chunk-LLM7AHMO.js.map} +1 -1
  23. package/dist/{chunk-ASV6JLYG.cjs → chunk-NUXLAZOE.cjs} +2 -2
  24. package/dist/{chunk-ASV6JLYG.cjs.map → chunk-NUXLAZOE.cjs.map} +1 -1
  25. package/dist/{chunk-VFV5FVVI.js → chunk-UXJ6LIZB.js} +61 -13
  26. package/dist/chunk-UXJ6LIZB.js.map +1 -0
  27. package/dist/chunk-VNLLW3ZI.js +94 -0
  28. package/dist/chunk-VNLLW3ZI.js.map +1 -0
  29. package/dist/core/index.cjs +99 -91
  30. package/dist/core/index.d.cts +21 -10
  31. package/dist/core/index.d.ts +21 -10
  32. package/dist/core/index.js +5 -5
  33. package/dist/{index-BHkRA0mM.d.cts → index-CiExk87c.d.cts} +1 -1
  34. package/dist/{index-tB0qI8my.d.ts → index-Dwrcf-CP.d.ts} +1 -1
  35. package/dist/mcp/index.d.cts +3 -3
  36. package/dist/mcp/index.d.ts +3 -3
  37. package/dist/react/index.cjs +113 -52
  38. package/dist/react/index.d.cts +703 -90
  39. package/dist/react/index.d.ts +703 -90
  40. package/dist/react/index.js +7 -6
  41. package/dist/server/index.cjs +339 -0
  42. package/dist/server/index.cjs.map +1 -0
  43. package/dist/server/index.d.cts +171 -0
  44. package/dist/server/index.d.ts +171 -0
  45. package/dist/server/index.js +332 -0
  46. package/dist/server/index.js.map +1 -0
  47. package/dist/tools/anthropic/index.cjs +3 -3
  48. package/dist/tools/anthropic/index.d.cts +1 -1
  49. package/dist/tools/anthropic/index.d.ts +1 -1
  50. package/dist/tools/anthropic/index.js +3 -3
  51. package/dist/tools/brave/index.cjs +6 -6
  52. package/dist/tools/brave/index.d.cts +1 -1
  53. package/dist/tools/brave/index.d.ts +1 -1
  54. package/dist/tools/brave/index.js +3 -3
  55. package/dist/tools/exa/index.cjs +6 -6
  56. package/dist/tools/exa/index.d.cts +1 -1
  57. package/dist/tools/exa/index.d.ts +1 -1
  58. package/dist/tools/exa/index.js +3 -3
  59. package/dist/tools/google/index.cjs +6 -6
  60. package/dist/tools/google/index.d.cts +1 -1
  61. package/dist/tools/google/index.d.ts +1 -1
  62. package/dist/tools/google/index.js +3 -3
  63. package/dist/tools/openai/index.cjs +6 -6
  64. package/dist/tools/openai/index.d.cts +1 -1
  65. package/dist/tools/openai/index.d.ts +1 -1
  66. package/dist/tools/openai/index.js +3 -3
  67. package/dist/tools/searxng/index.cjs +6 -6
  68. package/dist/tools/searxng/index.d.cts +1 -1
  69. package/dist/tools/searxng/index.d.ts +1 -1
  70. package/dist/tools/searxng/index.js +3 -3
  71. package/dist/tools/serper/index.cjs +6 -6
  72. package/dist/tools/serper/index.d.cts +1 -1
  73. package/dist/tools/serper/index.d.ts +1 -1
  74. package/dist/tools/serper/index.js +3 -3
  75. package/dist/tools/tavily/index.cjs +6 -6
  76. package/dist/tools/tavily/index.d.cts +1 -1
  77. package/dist/tools/tavily/index.d.ts +1 -1
  78. package/dist/tools/tavily/index.js +3 -3
  79. package/dist/tools/web-search/index.cjs +7 -7
  80. package/dist/tools/web-search/index.d.cts +2 -2
  81. package/dist/tools/web-search/index.d.ts +2 -2
  82. package/dist/tools/web-search/index.js +4 -4
  83. package/dist/{tools-coIcskZ4.d.ts → tools-DHZhF5km.d.cts} +161 -1
  84. package/dist/{tools-coIcskZ4.d.cts → tools-DHZhF5km.d.ts} +161 -1
  85. package/dist/{types-rjaSVmEF.d.ts → types-BTyJu0WD.d.ts} +1 -1
  86. package/dist/types-BckL3hiw.d.cts +93 -0
  87. package/dist/types-BckL3hiw.d.ts +93 -0
  88. package/dist/{types-C8t4Ut8f.d.cts → types-BdX7uPj0.d.cts} +1 -1
  89. package/dist/{types-DG2ya08y.d.ts → types-BeFBBZ5i.d.cts} +64 -1
  90. package/dist/{types-DG2ya08y.d.cts → types-BeFBBZ5i.d.ts} +64 -1
  91. package/dist/ui/index.cjs +468 -163
  92. package/dist/ui/index.cjs.map +1 -1
  93. package/dist/ui/index.d.cts +81 -4
  94. package/dist/ui/index.d.ts +81 -4
  95. package/dist/ui/index.js +416 -112
  96. package/dist/ui/index.js.map +1 -1
  97. package/package.json +6 -1
  98. package/dist/chunk-DMBFN7KO.js.map +0 -1
  99. package/dist/chunk-POZNNKNJ.cjs.map +0 -1
  100. package/dist/chunk-QLH6TSCC.js.map +0 -1
  101. package/dist/chunk-R6LKHKAI.cjs.map +0 -1
  102. package/dist/chunk-VFV5FVVI.js.map +0 -1
  103. package/dist/chunk-WQSK3Z4K.cjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/chat/types/tool.ts","../src/chat/interfaces/ChatState.ts","../src/chat/functions/stream/parseSSE.ts","../src/chat/functions/stream/processChunk.ts","../src/chat/functions/message/createMessage.ts","../src/core/utils/resolvable.ts","../src/chat/adapters/HttpTransport.ts","../src/chat/optimizations.ts","../src/chat/classes/AbstractChat.ts","../src/chat/AbstractAgentLoop.ts","../src/chat/ChatWithTools.ts","../src/chat/branching/MessageTree.ts","../src/react/internal/ReactChatState.ts","../src/react/internal/ReactChatWithTools.ts","../src/react/utils/context-tree.ts","../src/react/hooks/useMCPClient.ts","../src/react/hooks/useMCPTools.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/useAIAction.ts","../src/react/hooks/useAITools.ts","../src/react/hooks/useToolWithSchema.ts","../src/react/context/CopilotContext.tsx","../src/react/hooks/useToolExecutor.ts","../src/react/hooks/useSuggestions.ts","../src/react/hooks/useAgent.ts","../src/react/utils/knowledge-base.ts","../src/react/hooks/useKnowledgeBase.ts","../src/react/hooks/useCapabilities.ts","../src/react/hooks/useDevLogger.ts","../src/react/internal/ReactThreadManagerState.ts","../src/react/internal/ReactThreadManager.ts","../src/react/hooks/useThreadManager.ts","../src/react/hooks/useMCPUIIntents.ts","../src/react/hooks/useContextStats.ts","../src/react/hooks/useSkill.ts","../src/react/hooks/useSkillStatus.ts","../src/react/utils/permission-storage.ts","../src/react/internal/ReactChat.ts","../src/react/internal/useChat.ts","../src/react/skill/define-skill.ts"],"names":["tool","createLogger","useRef","useState","useCallback","createMCPClient","useEffect","useMemo","MCPToolAdapter","createContext","useContext","estimateMessageTokens","estimateTokens","zodToJsonSchema","SkillRegistry","jsxs","jsx","error","useSyncExternalStore","skills","messages","React","isConsoleCaptureActive","startConsoleCapture","isNetworkCaptureActive","startNetworkCapture","stopConsoleCapture","stopNetworkCapture","isScreenshotSupported","captureScreenshot","getConsoleLogs","getNetworkRequests","clearConsoleLogs","clearNetworkRequests","formatLogsForAI","formatRequestsForAI","detectIntent","z","zodObjectToInputSchema","CopilotContext","streamSSE","ThreadManager"],"mappings":"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","file":"chunk-76RE7AJE.cjs","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 /** 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 * 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","/**\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 const error = await response.text();\n throw new Error(`HTTP ${response.status}: ${error}`);\n }\n\n const contentType = response.headers.get(\"content-type\") || \"\";\n\n // Handle non-streaming JSON response\n if (contentType.includes(\"application/json\")) {\n this.streaming = false;\n const json = await response.json();\n return json as ChatResponse;\n }\n\n // Handle streaming SSE response\n if (!response.body) {\n throw new Error(\"No response body\");\n }\n\n return this.createStreamIterable(response.body);\n } catch (error) {\n this.streaming = false;\n if ((error as Error).name === \"AbortError\") {\n // Return empty iterable for aborted requests\n return (async function* () {})();\n }\n throw error;\n }\n }\n\n /**\n * Abort the current request\n */\n abort(): void {\n this.abortController?.abort();\n this.abortController = null;\n this.streaming = false;\n }\n\n /**\n * Check if currently streaming\n */\n isStreaming(): boolean {\n return this.streaming;\n }\n\n /**\n * 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","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 {\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\n // Event handlers\n private eventHandlers = new Map<\n ChatEvent[\"type\"],\n Set<ChatEventHandler<ChatEvent[\"type\"]>>\n >();\n\n // Current streaming state\n private streamState: StreamingMessageState | null = null;\n\n constructor(init: ChatInit<T>) {\n this.config = {\n runtimeUrl: init.runtimeUrl,\n llm: init.llm,\n systemPrompt: init.systemPrompt,\n streaming: init.streaming ?? true,\n headers: init.headers,\n body: init.body,\n threadId: init.threadId,\n debug: init.debug,\n optimization: init.optimization,\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 });\n\n // Store callbacks\n this.callbacks = init.callbacks ?? {};\n this.optimizer = new ChatContextOptimizer(init.optimization);\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 const userMessage = createUserMessage(content, attachments, {\n parentId: newParentId,\n }) as T;\n\n // Add to state\n this.state.pushMessage(userMessage);\n this.state.status = \"submitted\";\n this.state.error = undefined;\n\n // Notify callbacks\n this.callbacks.onMessagesChange?.(this._allMessages());\n this.callbacks.onStatusChange?.(\"submitted\");\n\n // Yield to allow UI to render loading state (important for non-streaming)\n await Promise.resolve();\n\n // Send request\n await this.processRequest();\n 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 for (const toolCallId of unresolvedIds) {\n const toolMessage = {\n id: generateMessageId(),\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 } as T;\n\n this.state.pushMessage(toolMessage);\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 for (const { toolCallId, result } of toolResults) {\n // Check if result wants to be added as user message (e.g., screenshot)\n const typedResult = result as {\n success?: boolean;\n message?: string;\n addAsUserMessage?: boolean;\n data?: {\n attachment?: MessageAttachment;\n };\n } | null;\n\n let messageContent: string;\n\n if (typedResult?.addAsUserMessage && typedResult.data?.attachment) {\n this.debug(\n \"Tool result has attachment to add as user message\",\n typedResult.data.attachment.type,\n );\n attachmentsToAdd.push(typedResult.data.attachment);\n\n // Simplified result without base64 data\n messageContent = JSON.stringify({\n success: true,\n message: typedResult.message || \"Content shared in conversation.\",\n });\n } else {\n // Store FULL result in message (Vercel-style)\n // Transformation happens at send time in buildRequest()\n messageContent =\n typeof result === \"string\" ? result : JSON.stringify(result);\n }\n\n const toolMessage = {\n id: generateMessageId(),\n role: \"tool\" as const,\n content: messageContent,\n toolCallId,\n createdAt: new Date(),\n } as T;\n\n this.state.pushMessage(toolMessage);\n }\n\n // If there are attachments (e.g., screenshots), add user message so AI can see them\n if (attachmentsToAdd.length > 0) {\n this.debug(\n \"Adding user message with attachments\",\n attachmentsToAdd.length,\n );\n const userMessage = {\n id: generateMessageId(),\n role: \"user\" as const,\n content: \"Here's my screen:\",\n attachments: attachmentsToAdd,\n createdAt: new Date(),\n } as T;\n\n this.state.pushMessage(userMessage);\n }\n\n this.state.status = \"submitted\";\n this.callbacks.onMessagesChange?.(this._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 * 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(): 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 let preCreatedMessageId: string | undefined;\n if (this.config.streaming !== false) {\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 }\n\n // Send request\n const response = await this.transport.send(request);\n\n // Check if streaming or JSON\n if (this.isAsyncIterable(response)) {\n await this.handleStreamResponse(response, 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 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 * 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 * Build the request payload\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 const optimized = this.optimizer.prepare({\n messages: rawMessages,\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 if (chunk.type === \"message:end\" && this.streamState?.content) {\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 const newMessage = createEmptyAssistantMessage() 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 // 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 this.state.setMessages([\n ...currentMessages.slice(0, insertIdx),\n ...messagesToInsert,\n ...currentMessages.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 // 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 // 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 this.state.setMessages([...currentMessages, ...messagesToInsert]);\n } else {\n this.state.setMessages([\n ...currentMessages.slice(0, currentStreamIndex),\n ...messagesToInsert,\n ...currentMessages.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 // 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 // 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 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 message (can be string or function)\n const approvalMessage =\n typeof tool.approvalMessage === \"function\"\n ? tool.approvalMessage(toolCall.args)\n : tool.approvalMessage;\n\n execution.approvalStatus = \"required\";\n execution.approvalMessage = approvalMessage;\n this.updateToolExecution(toolCall.id, {\n approvalStatus: \"required\",\n approvalMessage,\n });\n this.callbacks.onApprovalRequired?.(execution);\n\n // Wait for approval - now returns { approved, extraData }\n const approvalResult = await this.waitForApproval(toolCall.id, execution);\n\n if (!approvalResult.approved) {\n const rejectedResult: ToolResponse = {\n toolCallId: toolCall.id,\n success: false,\n error: \"Tool execution was rejected by user\",\n };\n this.updateToolExecution(toolCall.id, {\n status: \"rejected\",\n approvalStatus: \"rejected\",\n error: rejectedResult.error,\n completedAt: new Date(),\n });\n return rejectedResult;\n }\n\n // Store approval data for handler\n approvalData = approvalResult.extraData;\n\n // Note: approvalStatus is already set to \"approved\" in approveToolExecution\n }\n\n // Execute the tool\n this.updateToolExecution(toolCall.id, { status: \"executing\" });\n\n try {\n if (!tool.handler) {\n throw new Error(`Tool \"${toolCall.name}\" has no handler`);\n }\n\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 * 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 } 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 /** 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}\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 debug: config.debug,\n initialMessages: config.initialMessages,\n state: config.state,\n transport: config.transport,\n callbacks: {\n onMessagesChange: callbacks.onMessagesChange,\n onStatusChange: callbacks.onStatusChange,\n onError: callbacks.onError,\n onMessageStart: callbacks.onMessageStart,\n onMessageDelta: callbacks.onMessageDelta,\n onMessageFinish: callbacks.onMessageFinish,\n onToolCalls: callbacks.onToolCalls,\n onFinish: callbacks.onFinish,\n onContextUsageChange: callbacks.onContextUsageChange,\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 - still need to add tool_result to prevent API errors\n // Without this, the conversation has tool_use without tool_result\n this.debug(\"Max iterations reached, adding blocked tool results\");\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 await this.chat.continueWithToolResults(blockedResults);\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 * 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 * 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).\n * - All other messages get parentId of the previous non-tool message\n * (or null for the first message).\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 linear parent chain (skip tool messages for parent tracking)\n let prevNonToolId: 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 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 result.push({\n ...msg,\n parentId: ownerAssistantId ?? prevNonToolId,\n childrenIds: [],\n });\n } else {\n result.push({\n ...msg,\n parentId: prevNonToolId,\n childrenIds: [],\n });\n prevNonToolId = 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 * 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","/**\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","\"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","\"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","/**\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 * Phase 4: Persist display history + compaction state across reloads.\n * - compactionState → localStorage (small, fast, sync on init)\n * - displayMessages → IndexedDB (can be large, async)\n */\n\nimport type { DisplayMessage, SessionCompactionState } from \"./types\";\n\nconst IDB_DB_NAME = \"copilot-sdk\";\nconst IDB_STORE = \"sessions\";\nconst IDB_VERSION = 1;\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// ── IndexedDB: display messages ───────────────────────────────────\n\nfunction openDB(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const req = indexedDB.open(IDB_DB_NAME, IDB_VERSION);\n\n req.onupgradeneeded = () => {\n req.result.createObjectStore(IDB_STORE, { keyPath: \"sessionId\" });\n };\n\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n}\n\nexport async function saveDisplayMessages(\n storageKey: string,\n messages: DisplayMessage[],\n): Promise<void> {\n try {\n const db = await openDB();\n const tx = db.transaction(IDB_STORE, \"readwrite\");\n tx.objectStore(IDB_STORE).put({\n sessionId: storageKey,\n messages,\n savedAt: Date.now(),\n });\n await new Promise<void>((res, rej) => {\n tx.oncomplete = () => res();\n tx.onerror = () => rej(tx.error);\n });\n db.close();\n } catch {\n // IndexedDB unavailable — fail silently\n }\n}\n\nexport async function loadDisplayMessages(\n storageKey: string,\n): Promise<DisplayMessage[] | null> {\n try {\n const db = await openDB();\n const tx = db.transaction(IDB_STORE, \"readonly\");\n const req = tx.objectStore(IDB_STORE).get(storageKey);\n\n const result = await new Promise<\n { messages: DisplayMessage[] } | undefined\n >((res, rej) => {\n req.onsuccess = () => res(req.result as { messages: DisplayMessage[] });\n req.onerror = () => rej(req.error);\n });\n\n db.close();\n return result?.messages ?? null;\n } catch {\n return null;\n }\n}\n\nexport async function clearDisplayMessages(storageKey: string): Promise<void> {\n try {\n const db = await openDB();\n const tx = db.transaction(IDB_STORE, \"readwrite\");\n tx.objectStore(IDB_STORE).delete(storageKey);\n await new Promise<void>((res, rej) => {\n tx.oncomplete = () => res();\n tx.onerror = () => rej(tx.error);\n });\n db.close();\n } catch {\n // ignore\n }\n}\n\n// ── Full session clear ────────────────────────────────────────────\n\nexport async function clearSession(storageKey: string): Promise<void> {\n clearCompactionState(storageKey);\n await 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 (async)\n const restoredRef = useRef(false);\n useEffect(() => {\n if (!config.persistSession || restoredRef.current) return;\n restoredRef.current = true;\n loadDisplayMessages(storageKey).then((saved) => {\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 // For now: restored messages are available via displayMessages after setMessages\n }\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(async () => {\n setCompactionState(DEFAULT_COMPACTION_STATE);\n if (config.persistSession) {\n await 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 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 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 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 { UIMessage, ToolExecution } from \"../../chat\";\n\nimport {\n ReactChatWithTools,\n type ReactChatWithToolsConfig,\n} from \"../internal/ReactChatWithTools\";\nimport {\n addNode,\n removeNode,\n printTree,\n type ContextTreeNode,\n} from \"../utils/context-tree\";\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 /** Initial messages to populate the chat */\n initialMessages?: Message[];\n /** Callback when messages change */\n onMessagesChange?: (messages: Message[]) => void;\n /** Callback when an error occurs */\n onError?: (error: Error) => void;\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\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 // Config\n threadId?: string;\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\n// ============================================\n// Context\n// ============================================\n\nconst CopilotContext = createContext<CopilotContextValue | null>(null);\n\nexport function useCopilot(): CopilotContextValue {\n const context = useContext(CopilotContext);\n if (!context) {\n throw new Error(\"useCopilot must be used within CopilotProvider\");\n }\n return context;\n}\n\n// ============================================\n// Provider Component\n// ============================================\n\nexport function CopilotProvider({\n children,\n runtimeUrl,\n systemPrompt,\n tools: toolsConfig,\n threadId,\n initialMessages,\n onMessagesChange,\n onError,\n streaming,\n headers,\n body,\n debug = false,\n maxIterations,\n maxIterationsMessage,\n mcpServers,\n optimization,\n messageHistory,\n skills,\n}: CopilotProviderProps) {\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\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 // Convert initial messages to UIMessage format\n const uiInitialMessages: UIMessage[] | undefined = initialMessages?.map(\n (m) => ({\n id: m.id,\n role: m.role,\n content: m.content ?? \"\",\n createdAt: m.created_at ?? new Date(),\n attachments: m.metadata?.attachments as MessageAttachment[] | undefined,\n toolCalls: m.tool_calls,\n toolCallId: m.tool_call_id,\n }),\n );\n\n chatRef.current = new ReactChatWithTools(\n {\n runtimeUrl,\n systemPrompt,\n threadId,\n initialMessages: uiInitialMessages,\n streaming,\n headers,\n body,\n debug,\n maxIterations,\n maxIterationsMessage,\n optimization,\n },\n {\n onToolExecutionsChange: (executions) => {\n debugLog(\"Tool executions changed:\", executions.length);\n setToolExecutions(executions);\n },\n onApprovalRequired: (execution) => {\n debugLog(\"Tool approval required:\", execution.name);\n },\n onContextUsageChange: (usage) => {\n setContextUsage(usage);\n },\n onError: (error) => {\n if (error) onError?.(error);\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 // 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 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 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\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,\n runtimeUrl,\n toolsConfig,\n }),\n [\n messages,\n status,\n error,\n isLoading,\n sendMessage,\n stop,\n clearMessages,\n setMessages,\n regenerate,\n switchBranch,\n getBranchInfo,\n editMessage,\n hasBranches,\n getAllMessages,\n registerTool,\n unregisterTool,\n registeredTools,\n toolExecutions,\n pendingApprovals,\n approveToolExecution,\n rejectToolExecution,\n registerAction,\n unregisterAction,\n registeredActions,\n addContext,\n removeContext,\n contextChars,\n contextUsage,\n setSystemPrompt,\n setInlineSkills,\n threadId,\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 } from \"react\";\nimport type { ActionDefinition } from \"../../core\";\nimport { useCopilot } from \"../provider/CopilotProvider\";\n\n/**\n * Hook to register multiple AI actions/tools\n *\n * @example\n * ```tsx\n * useAIActions([\n * {\n * name: 'getWeather',\n * description: 'Get weather for a location',\n * parameters: {\n * location: { type: 'string', required: true, description: 'City name' },\n * },\n * handler: async ({ location }) => {\n * const weather = await fetchWeather(location);\n * return weather;\n * },\n * },\n * ]);\n * ```\n */\nexport function useAIActions(actions: ActionDefinition[]): void {\n const { registerAction, unregisterAction } = useCopilot();\n\n useEffect(() => {\n // Register all actions\n for (const action of actions) {\n registerAction(action);\n }\n\n // Cleanup: unregister all actions\n return () => {\n for (const action of actions) {\n unregisterAction(action.name);\n }\n };\n }, [actions, registerAction, unregisterAction]);\n}\n\n/**\n * Hook to register a single AI action/tool\n *\n * @example\n * ```tsx\n * useAIAction({\n * name: 'searchProducts',\n * description: 'Search for products',\n * parameters: {\n * query: { type: 'string', required: true },\n * },\n * handler: async ({ query }) => {\n * return await searchProducts(query);\n * },\n * });\n * ```\n */\nexport function useAIAction(action: ActionDefinition): void {\n useAIActions([action]);\n}\n","\"use client\";\n\nimport { useState, useCallback, useEffect, useRef, useMemo } from \"react\";\nimport type {\n ToolsConfig,\n ToolType,\n CapturedContext,\n ToolConsentRequest,\n ToolConsentResponse,\n IntentDetectionResult,\n ScreenshotOptions,\n ConsoleLogOptions,\n NetworkRequestOptions,\n} from \"../../core\";\nimport {\n // Screenshot\n captureScreenshot,\n isScreenshotSupported,\n // Console\n startConsoleCapture,\n stopConsoleCapture,\n getConsoleLogs,\n clearConsoleLogs,\n isConsoleCaptureActive,\n formatLogsForAI,\n // Network\n startNetworkCapture,\n stopNetworkCapture,\n getNetworkRequests,\n clearNetworkRequests,\n isNetworkCaptureActive,\n formatRequestsForAI,\n // Intent\n detectIntent,\n generateSuggestionReason,\n} from \"../../core\";\n\n/**\n * useAITools options\n */\nexport interface UseAIToolsOptions extends ToolsConfig {\n /** Callback when consent is requested */\n onConsentRequest?: (\n request: ToolConsentRequest,\n ) => Promise<ToolConsentResponse>;\n /** Auto-start capturing when enabled */\n autoStart?: boolean;\n}\n\n/**\n * useAITools return type\n */\nexport interface UseAIToolsReturn {\n /** Whether tools are enabled */\n isEnabled: boolean;\n /** Currently active captures */\n activeCaptures: {\n console: boolean;\n network: boolean;\n };\n /** Capture screenshot */\n captureScreenshot: (\n options?: ScreenshotOptions,\n ) => Promise<CapturedContext[\"screenshot\"]>;\n /** Get console logs */\n getConsoleLogs: (\n options?: ConsoleLogOptions,\n ) => CapturedContext[\"consoleLogs\"];\n /** Get network requests */\n getNetworkRequests: (\n options?: NetworkRequestOptions,\n ) => CapturedContext[\"networkRequests\"];\n /** Capture all enabled context */\n captureContext: (tools?: ToolType[]) => Promise<CapturedContext>;\n /** Detect intent from message */\n detectIntent: (message: string) => IntentDetectionResult;\n /** Request consent for tools */\n requestConsent: (\n tools: ToolType[],\n reason?: string,\n ) => Promise<ToolConsentResponse>;\n /** Start capturing */\n startCapturing: () => void;\n /** Stop capturing */\n stopCapturing: () => void;\n /** Clear captured data */\n clearCaptured: () => void;\n /** Format captured context for AI */\n formatForAI: (context: CapturedContext) => string;\n /** Pending consent request (for UI) */\n pendingConsent: ToolConsentRequest | null;\n /** Respond to consent request */\n respondToConsent: (response: ToolConsentResponse) => void;\n}\n\n/**\n * Hook for AI Smart Context Tools\n *\n * Provides React integration for screenshot, console, and network capture\n * with consent-based UX and intent detection.\n *\n * @example\n * ```tsx\n * const {\n * captureScreenshot,\n * getConsoleLogs,\n * detectIntent,\n * pendingConsent,\n * respondToConsent,\n * } = useAITools({\n * screenshot: true,\n * console: true,\n * network: true,\n * requireConsent: true,\n * });\n *\n * // Detect if tools are needed based on user message\n * const handleMessage = async (message: string) => {\n * const intent = detectIntent(message);\n *\n * if (intent.suggestedTools.length > 0) {\n * const consent = await requestConsent(\n * intent.suggestedTools,\n * generateSuggestionReason(intent)\n * );\n *\n * if (consent.approved.length > 0) {\n * const context = await captureContext(consent.approved);\n * // Include context with message\n * }\n * }\n * };\n * ```\n */\nexport function useAITools(options: UseAIToolsOptions = {}): UseAIToolsReturn {\n const {\n screenshot = false,\n console: consoleCapture = false,\n network = false,\n requireConsent = true,\n screenshotOptions,\n consoleOptions,\n networkOptions,\n onConsentRequest,\n autoStart = true,\n } = options;\n\n // State\n const [isEnabled] = useState(screenshot || consoleCapture || network);\n const [activeCaptures, setActiveCaptures] = useState({\n console: false,\n network: false,\n });\n const [pendingConsent, setPendingConsent] =\n useState<ToolConsentRequest | null>(null);\n\n // Refs for consent resolution\n const consentResolverRef = useRef<\n ((response: ToolConsentResponse) => void) | null\n >(null);\n\n // Remembered consent preferences\n const rememberedConsentRef = useRef<Set<ToolType>>(new Set());\n\n // Start capturing on mount if autoStart\n useEffect(() => {\n if (!autoStart || !isEnabled) return;\n\n if (consoleCapture && !isConsoleCaptureActive()) {\n startConsoleCapture(consoleOptions);\n setActiveCaptures((prev) => ({ ...prev, console: true }));\n }\n\n if (network && !isNetworkCaptureActive()) {\n startNetworkCapture(networkOptions);\n setActiveCaptures((prev) => ({ ...prev, network: true }));\n }\n\n return () => {\n stopConsoleCapture();\n stopNetworkCapture();\n };\n }, [\n autoStart,\n isEnabled,\n consoleCapture,\n network,\n consoleOptions,\n networkOptions,\n ]);\n\n // Capture screenshot\n const captureScreenshotFn = useCallback(\n async (opts?: ScreenshotOptions) => {\n if (!screenshot) {\n throw new Error(\"Screenshot capture is not enabled\");\n }\n\n if (!isScreenshotSupported()) {\n throw new Error(\n \"Screenshot capture is not supported in this environment\",\n );\n }\n\n return captureScreenshot({ ...screenshotOptions, ...opts });\n },\n [screenshot, screenshotOptions],\n );\n\n // Get console logs\n const getConsoleLogsFn = useCallback(\n (opts?: ConsoleLogOptions) => {\n if (!consoleCapture) {\n return { logs: [], totalCaptured: 0 };\n }\n\n return getConsoleLogs({ ...consoleOptions, ...opts });\n },\n [consoleCapture, consoleOptions],\n );\n\n // Get network requests\n const getNetworkRequestsFn = useCallback(\n (opts?: NetworkRequestOptions) => {\n if (!network) {\n return { requests: [], totalCaptured: 0 };\n }\n\n return getNetworkRequests({ ...networkOptions, ...opts });\n },\n [network, networkOptions],\n );\n\n // Request consent\n const requestConsent = useCallback(\n async (tools: ToolType[], reason = \"\"): Promise<ToolConsentResponse> => {\n const enabledTools = tools.filter((tool) => {\n if (tool === \"screenshot\") return screenshot;\n if (tool === \"console\") return consoleCapture;\n if (tool === \"network\") return network;\n return false;\n });\n\n if (enabledTools.length === 0) {\n return { approved: [], denied: [] };\n }\n\n if (!requireConsent) {\n return { approved: enabledTools, denied: [] };\n }\n\n const needsConsent = enabledTools.filter(\n (tool) => !rememberedConsentRef.current.has(tool),\n );\n\n if (needsConsent.length === 0) {\n return { approved: enabledTools, denied: [] };\n }\n\n const request: ToolConsentRequest = {\n tools: needsConsent,\n reason,\n keywords: [],\n };\n\n if (onConsentRequest) {\n const response = await onConsentRequest(request);\n if (response.remember) {\n response.approved.forEach((tool) =>\n rememberedConsentRef.current.add(tool),\n );\n }\n return response;\n }\n\n return new Promise((resolve) => {\n setPendingConsent(request);\n consentResolverRef.current = (response) => {\n if (response.remember) {\n response.approved.forEach((tool) =>\n rememberedConsentRef.current.add(tool),\n );\n }\n resolve(response);\n };\n });\n },\n [screenshot, consoleCapture, network, requireConsent, onConsentRequest],\n );\n\n // Respond to consent\n const respondToConsent = useCallback((response: ToolConsentResponse) => {\n if (consentResolverRef.current) {\n consentResolverRef.current(response);\n consentResolverRef.current = null;\n }\n setPendingConsent(null);\n }, []);\n\n // Capture context\n const captureContext = useCallback(\n async (tools?: ToolType[]): Promise<CapturedContext> => {\n const toolsToCapture =\n tools || ([\"screenshot\", \"console\", \"network\"] as ToolType[]);\n const context: CapturedContext = {\n timestamp: Date.now(),\n };\n\n const captures: Promise<void>[] = [];\n\n if (toolsToCapture.includes(\"screenshot\") && screenshot) {\n captures.push(\n captureScreenshotFn()\n .then((result) => {\n context.screenshot = result;\n })\n .catch(() => {}),\n );\n }\n\n if (toolsToCapture.includes(\"console\") && consoleCapture) {\n context.consoleLogs = getConsoleLogsFn();\n }\n\n if (toolsToCapture.includes(\"network\") && network) {\n context.networkRequests = getNetworkRequestsFn();\n }\n\n await Promise.all(captures);\n return context;\n },\n [\n screenshot,\n consoleCapture,\n network,\n captureScreenshotFn,\n getConsoleLogsFn,\n getNetworkRequestsFn,\n ],\n );\n\n // Start capturing\n const startCapturing = useCallback(() => {\n if (consoleCapture && !isConsoleCaptureActive()) {\n startConsoleCapture(consoleOptions);\n setActiveCaptures((prev) => ({ ...prev, console: true }));\n }\n\n if (network && !isNetworkCaptureActive()) {\n startNetworkCapture(networkOptions);\n setActiveCaptures((prev) => ({ ...prev, network: true }));\n }\n }, [consoleCapture, network, consoleOptions, networkOptions]);\n\n // Stop capturing\n const stopCapturing = useCallback(() => {\n stopConsoleCapture();\n stopNetworkCapture();\n setActiveCaptures({ console: false, network: false });\n }, []);\n\n // Clear captured data\n const clearCaptured = useCallback(() => {\n clearConsoleLogs();\n clearNetworkRequests();\n }, []);\n\n // Format captured context for AI\n const formatForAI = useCallback((context: CapturedContext): string => {\n const parts: string[] = [];\n\n if (context.screenshot) {\n parts.push(\n `Screenshot captured (${context.screenshot.width}x${context.screenshot.height}, ${context.screenshot.format})`,\n );\n }\n\n if (context.consoleLogs && context.consoleLogs.logs.length > 0) {\n parts.push(formatLogsForAI(context.consoleLogs.logs));\n }\n\n if (\n context.networkRequests &&\n context.networkRequests.requests.length > 0\n ) {\n parts.push(formatRequestsForAI(context.networkRequests.requests));\n }\n\n return parts.length > 0\n ? parts.join(\"\\n\\n---\\n\\n\")\n : \"No context captured.\";\n }, []);\n\n // Detect intent wrapper\n const detectIntentFn = useCallback(\n (message: string): IntentDetectionResult => {\n const result = detectIntent(message);\n\n result.suggestedTools = result.suggestedTools.filter((tool) => {\n if (tool === \"screenshot\") return screenshot;\n if (tool === \"console\") return consoleCapture;\n if (tool === \"network\") return network;\n return false;\n });\n\n return result;\n },\n [screenshot, consoleCapture, network],\n );\n\n return useMemo(\n () => ({\n isEnabled,\n activeCaptures,\n captureScreenshot: captureScreenshotFn,\n getConsoleLogs: getConsoleLogsFn,\n getNetworkRequests: getNetworkRequestsFn,\n captureContext,\n detectIntent: detectIntentFn,\n requestConsent,\n startCapturing,\n stopCapturing,\n clearCaptured,\n formatForAI,\n pendingConsent,\n respondToConsent,\n }),\n [\n isEnabled,\n activeCaptures,\n captureScreenshotFn,\n getConsoleLogsFn,\n getNetworkRequestsFn,\n captureContext,\n detectIntentFn,\n requestConsent,\n startCapturing,\n stopCapturing,\n clearCaptured,\n formatForAI,\n pendingConsent,\n respondToConsent,\n ],\n );\n}\n\n// Re-export for convenience\nexport { generateSuggestionReason };\n","\"use client\";\n\nimport { useEffect, useMemo, useRef } from \"react\";\nimport * as z from \"zod\";\nimport type {\n ToolDefinition,\n ToolResponse,\n ToolContext,\n ToolRenderProps,\n ToolInputSchema,\n} from \"../../core\";\nimport { zodObjectToInputSchema } from \"../../core\";\nimport { useCopilot } from \"../provider/CopilotProvider\";\n\n/**\n * Zod schema type (minimal interface)\n */\ninterface ZodObjectSchema {\n _output: Record<string, unknown>;\n _def: {\n shape: () => Record<string, unknown>;\n };\n}\n\n/**\n * Convert Zod schema to JSON Schema using Zod's built-in toJSONSchema\n * Falls back to custom implementation for older Zod versions\n */\nfunction convertZodSchema(schema: unknown, _toolName: string): ToolInputSchema {\n // Use Zod's built-in toJSONSchema (available in Zod 3.24+ and all Zod 4.x)\n try {\n const zodWithJsonSchema = z as typeof z & {\n toJSONSchema?: (schema: z.ZodType) => unknown;\n };\n if (typeof zodWithJsonSchema.toJSONSchema === \"function\") {\n const jsonSchema = zodWithJsonSchema.toJSONSchema(\n schema as z.ZodType,\n ) as {\n type?: string;\n properties?: ToolInputSchema[\"properties\"];\n required?: string[];\n };\n if (jsonSchema.type === \"object\") {\n return {\n type: \"object\",\n properties: jsonSchema.properties || {},\n required: jsonSchema.required,\n };\n }\n }\n } catch {\n // toJSONSchema not available or failed, fall through\n }\n\n // Fall back to custom implementation for older Zod versions\n return zodObjectToInputSchema(schema);\n}\n\n/**\n * Configuration for registering a tool with Zod schema\n */\nexport interface UseToolWithSchemaConfig<TSchema extends ZodObjectSchema> {\n /** Unique tool name */\n name: string;\n /** Tool description for LLM */\n description: string;\n /** Zod schema for input parameters */\n schema: TSchema;\n /** Handler function */\n handler: (\n params: TSchema[\"_output\"],\n context?: ToolContext,\n ) => Promise<ToolResponse> | ToolResponse;\n /** Optional render function for UI */\n render?: (props: ToolRenderProps<TSchema[\"_output\"]>) => React.ReactNode;\n /** Whether the tool is available */\n available?: boolean;\n}\n\n/**\n * Register a client-side tool using a Zod schema\n *\n * This hook provides type-safe tool registration using Zod schemas.\n * The Zod schema is automatically converted to JSON Schema for the LLM.\n *\n * @example\n * ```tsx\n * import { z } from \"zod\";\n *\n * useToolWithSchema({\n * name: \"navigate_to_page\",\n * description: \"Navigate to a specific page in the app\",\n * schema: z.object({\n * path: z.string().describe(\"The path to navigate to\"),\n * }),\n * handler: async ({ path }) => {\n * // TypeScript knows `path` is a string!\n * router.push(path);\n * return { success: true, message: `Navigated to ${path}` };\n * },\n * });\n * ```\n */\nexport function useToolWithSchema<TSchema extends ZodObjectSchema>(\n config: UseToolWithSchemaConfig<TSchema>,\n dependencies: unknown[] = [],\n): void {\n const { registerTool, unregisterTool } = 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 (memoized)\n const inputSchema = useMemo(() => {\n try {\n return convertZodSchema(config.schema, config.name);\n } catch (error) {\n // Fallback to empty schema if conversion fails\n console.warn(\n `[useToolWithSchema] Failed to convert Zod schema for tool \"${config.name}\"`,\n error,\n );\n return {\n type: \"object\" as const,\n properties: {},\n };\n }\n }, [config.schema, config.name]);\n\n useEffect(() => {\n // Create tool definition\n const tool: ToolDefinition<TSchema[\"_output\"]> = {\n name: config.name,\n description: config.description,\n location: \"client\",\n inputSchema,\n handler: async (params, context) => {\n return configRef.current.handler(params as TSchema[\"_output\"], context);\n },\n render: config.render,\n available: config.available ?? true,\n };\n\n // Register tool\n registerTool(tool);\n\n // Cleanup on unmount\n return () => {\n unregisterTool(config.name);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [config.name, inputSchema, ...dependencies]);\n}\n\n/**\n * Register multiple client-side tools using Zod schemas\n *\n * @example\n * ```tsx\n * import { z } from \"zod\";\n *\n * useToolsWithSchema([\n * {\n * name: \"navigate\",\n * description: \"Navigate to page\",\n * schema: z.object({ path: z.string() }),\n * handler: async ({ path }) => { ... },\n * },\n * {\n * name: \"open_modal\",\n * description: \"Open a modal\",\n * schema: z.object({ modalId: z.string() }),\n * handler: async ({ modalId }) => { ... },\n * },\n * ]);\n * ```\n */\nexport function useToolsWithSchema<TSchema extends ZodObjectSchema>(\n tools: UseToolWithSchemaConfig<TSchema>[],\n dependencies: unknown[] = [],\n): void {\n const { registerTool, unregisterTool } = 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 let inputSchema: ToolDefinition[\"inputSchema\"];\n\n try {\n inputSchema = convertZodSchema(config.schema, config.name);\n } catch (error) {\n console.warn(\n `[useToolsWithSchema] Failed to convert Zod schema for tool \"${config.name}\"`,\n error,\n );\n inputSchema = { type: \"object\", properties: {} };\n }\n\n const tool: ToolDefinition = {\n name: config.name,\n description: config.description,\n location: \"client\",\n inputSchema,\n handler: async (params, context) => {\n const currentConfig = toolsRef.current.find(\n (t) => t.name === config.name,\n );\n if (currentConfig) {\n return currentConfig.handler(params as TSchema[\"_output\"], context);\n }\n return { success: false, error: \"Tool handler not found\" };\n },\n available: config.available ?? true,\n };\n\n registerTool(tool);\n toolNames.push(config.name);\n }\n\n // Cleanup on unmount\n return () => {\n for (const name of toolNames) {\n unregisterTool(name);\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [tools.map((t) => t.name).join(\",\"), ...dependencies]);\n}\n","\"use client\";\n\nimport { createContext, useContext } from \"react\";\nimport type {\n CopilotConfig,\n Message,\n MessageAttachment,\n ActionDefinition,\n Source,\n ToolsConfig,\n ToolType,\n ToolConsentRequest,\n CapturedContext,\n ToolDefinition,\n ToolExecution,\n ToolResponse,\n ToolApprovalStatus,\n PermissionLevel,\n ToolPermission,\n} from \"../../core\";\nimport type { ContextTreeNode } from \"../utils/context-tree\";\nimport type { BranchInfo } from \"../../chat/branching\";\n\n/**\n * Chat UI state interface (UI-only state, not message data)\n * Message data is stored in ThreadsState as the single source of truth\n */\nexport interface ChatState {\n /** Whether a response is being generated */\n isLoading: boolean;\n /** Current error if any */\n error: Error | null;\n}\n\n/**\n * Combined chat state for context consumers\n * Includes derived data from threads for convenience\n */\nexport interface CombinedChatState {\n /** All messages in the conversation (from active thread) */\n messages: Message[];\n /** Whether a response is being generated */\n isLoading: boolean;\n /** Current error if any */\n error: Error | null;\n /** Thread/conversation ID (from active thread) */\n threadId: string | null;\n /** Sources from knowledge base (from active thread) */\n sources: Source[];\n}\n\n/**\n * Tools state interface (Smart Context tools)\n */\nexport interface ToolsState {\n /** Whether tools are enabled */\n isEnabled: boolean;\n /** Pending consent request */\n pendingConsent: ToolConsentRequest | null;\n /** Last captured context */\n lastContext: CapturedContext | null;\n /** Currently capturing */\n isCapturing: boolean;\n}\n\n/**\n * Agent loop state interface (Agentic tools)\n */\nexport interface AgentLoopState {\n /** Current tool executions */\n toolExecutions: ToolExecution[];\n /** Current loop iteration */\n iteration: number;\n /** Maximum iterations */\n maxIterations: number;\n /** Whether max iterations was reached */\n maxIterationsReached: boolean;\n /** Whether waiting for server response after tool completion */\n isProcessing: boolean;\n}\n\n/**\n * Chat actions interface\n */\nexport interface ChatActions {\n /** Send a message (with optional attachments) */\n sendMessage: (\n content: string,\n attachments?: MessageAttachment[],\n ) => Promise<void>;\n /** Send a message with context */\n sendMessageWithContext: (\n content: string,\n context: CapturedContext,\n ) => Promise<void>;\n /** Stop generation */\n stopGeneration: () => void;\n /** Clear all messages */\n clearMessages: () => void;\n /** Regenerate last response (branch-aware: preserves original as sibling) */\n regenerate: (messageId?: string) => Promise<void>;\n /** Set messages directly */\n setMessages: (messages: Message[]) => void;\n /**\n * Process file to MessageAttachment\n * - Premium: uploads to cloud storage, returns URL-based attachment\n * - Free: converts to base64\n */\n processAttachment: (file: File) => Promise<MessageAttachment>;\n\n // ============================================\n // Branching Actions\n // ============================================\n\n /** Navigate to a sibling branch (← / → navigation) */\n switchBranch: (messageId: string) => void;\n /** Get branch navigation info for a message */\n getBranchInfo: (messageId: string) => BranchInfo | null;\n /**\n * Edit a user message: sends newContent as a new branch from the same\n * parent as the original message. Preserves the original in place.\n */\n editMessage: (messageId: string, newContent: string) => Promise<void>;\n /** Whether any message has siblings (branching has occurred) */\n hasBranches: boolean;\n}\n\n/**\n * Tools actions interface\n */\nexport interface ToolsActions {\n /** Request consent for tools */\n requestConsent: (tools: ToolType[], reason?: string) => void;\n /** Respond to consent request */\n respondToConsent: (approved: ToolType[], remember?: boolean) => void;\n /** Capture context */\n captureContext: (tools: ToolType[]) => Promise<CapturedContext>;\n /** Clear pending consent */\n clearConsent: () => void;\n}\n\n/**\n * Copilot context value\n */\nexport interface CopilotContextValue {\n /** SDK configuration */\n config: CopilotConfig;\n /** Tools configuration */\n toolsConfig: ToolsConfig | null;\n /** Chat state (combined from UI state + active thread) */\n chat: CombinedChatState;\n /** Tools state (Smart Context) */\n tools: ToolsState;\n /** Agent loop state (Agentic tools) */\n agentLoop: AgentLoopState;\n /** Chat actions */\n actions: ChatActions;\n /** Tools actions */\n toolsActions: ToolsActions;\n /** Registered actions/tools (legacy) */\n registeredActions: ActionDefinition[];\n /** Register an action (legacy) */\n registerAction: (action: ActionDefinition) => void;\n /** Unregister an action (legacy) */\n unregisterAction: (name: string) => void;\n /** Registered tools (Agentic) */\n registeredTools: ToolDefinition[];\n /** Register a tool */\n registerTool: (tool: ToolDefinition) => void;\n /** Unregister a tool */\n unregisterTool: (name: string) => void;\n /** Add a tool execution record */\n addToolExecution?: (execution: ToolExecution) => void;\n /** Update a tool execution record */\n updateToolExecution?: (id: string, update: Partial<ToolExecution>) => void;\n /** Clear all tool executions */\n clearToolExecutions?: () => void;\n\n // Tool approval handlers (for needsApproval tools)\n\n /**\n * Approve a tool execution with optional extra data.\n * The extraData is passed to the tool handler via context.approvalData.\n *\n * @param executionId - The tool execution ID\n * @param extraData - Optional data from user's action (e.g., selected item)\n * @param permissionLevel - Optional permission level for persistence\n */\n approveToolExecution?: (\n executionId: string,\n extraData?: Record<string, unknown>,\n permissionLevel?: PermissionLevel,\n ) => void;\n /** Reject a tool execution that requires approval */\n rejectToolExecution?: (\n executionId: string,\n reason?: string,\n permissionLevel?: PermissionLevel,\n ) => void;\n /** Tool executions waiting for user approval */\n pendingApprovals: ToolExecution[];\n\n // Permission management (for persistent tool approvals)\n\n /** All stored permissions */\n storedPermissions: ToolPermission[];\n /** Whether permissions have been loaded from storage */\n permissionsLoaded: boolean;\n /** Get permission level for a specific tool */\n getToolPermission: (toolName: string) => Promise<PermissionLevel>;\n /** Set permission level for a tool */\n setToolPermission: (\n toolName: string,\n level: PermissionLevel,\n ) => Promise<void>;\n /** Clear all stored permissions */\n clearAllPermissions: () => Promise<void>;\n /** Add context for AI (returns context ID) */\n addContext: (context: string, parentId?: string) => string;\n /** Remove context by ID */\n removeContext: (id: string) => void;\n /** Get all contexts as tree */\n contextTree: ContextTreeNode[];\n /** Whether user has API key (premium) */\n isPremium: boolean;\n /** Whether cloud storage is available (premium feature) */\n isCloudStorageAvailable: boolean;\n}\n\n/**\n * Initial chat UI state\n */\nexport const initialChatState: ChatState = {\n isLoading: false,\n error: null,\n};\n\n/**\n * Initial tools state\n */\nexport const initialToolsState: ToolsState = {\n isEnabled: false,\n pendingConsent: null,\n lastContext: null,\n isCapturing: false,\n};\n\n/**\n * Initial agent loop state\n */\nexport const initialAgentLoopState: AgentLoopState = {\n toolExecutions: [],\n iteration: 0,\n maxIterations: 20,\n maxIterationsReached: false,\n isProcessing: false,\n};\n\n/**\n * Copilot Context\n */\nexport const CopilotContext = createContext<CopilotContextValue | null>(null);\n\n/**\n * Hook to access Copilot context\n */\nexport function useCopilotContext(): CopilotContextValue {\n const context = useContext(CopilotContext);\n\n if (!context) {\n throw new Error(\"useCopilotContext must be used within a CopilotProvider\");\n }\n\n return context;\n}\n","\"use client\";\n\nimport { useCallback, useRef } from \"react\";\nimport type {\n ToolDefinition,\n ToolResponse,\n UnifiedToolCall,\n ToolExecution,\n} from \"../../core\";\nimport { useCopilotContext } from \"../context/CopilotContext\";\n\n/**\n * Tool executor return type\n */\nexport interface UseToolExecutorReturn {\n /**\n * Execute a tool by name with given arguments\n */\n executeTool: (toolCall: UnifiedToolCall) => Promise<ToolResponse>;\n\n /**\n * Send tool result back to server\n */\n sendToolResult: (toolCallId: string, result: ToolResponse) => Promise<void>;\n\n /**\n * Get a registered tool by name\n */\n getTool: (name: string) => ToolDefinition | undefined;\n\n /**\n * Check if a tool is registered\n */\n hasTool: (name: string) => boolean;\n}\n\n/**\n * Internal hook for executing client-side tools\n *\n * This hook is used internally by the CopilotProvider to execute\n * tools when the server requests them via SSE events.\n *\n * It can also be used for custom implementations where you need\n * direct control over tool execution.\n *\n * @example\n * ```tsx\n * const { executeTool, sendToolResult } = useToolExecutor();\n *\n * // When receiving a tool:execute event from server\n * const handleToolExecute = async (event: ToolExecuteEvent) => {\n * const result = await executeTool({\n * id: event.id,\n * name: event.name,\n * input: event.args,\n * });\n *\n * // Send result back to server\n * await sendToolResult(event.id, result);\n * };\n * ```\n */\nexport function useToolExecutor(): UseToolExecutorReturn {\n const {\n registeredTools,\n config,\n chat,\n addToolExecution,\n updateToolExecution,\n } = useCopilotContext();\n\n const toolsRef = useRef(registeredTools);\n toolsRef.current = registeredTools;\n\n /**\n * Execute a tool\n */\n const executeTool = useCallback(\n async (toolCall: UnifiedToolCall): Promise<ToolResponse> => {\n const tool = toolsRef.current.find((t) => t.name === toolCall.name);\n\n if (!tool) {\n return {\n success: false,\n error: `Unknown tool: ${toolCall.name}`,\n };\n }\n\n if (!tool.handler) {\n return {\n success: false,\n error: `Tool \"${toolCall.name}\" has no handler`,\n };\n }\n\n // Create execution record\n const execution: ToolExecution = {\n id: toolCall.id,\n name: toolCall.name,\n args: toolCall.input,\n status: \"executing\",\n timestamp: Date.now(),\n approvalStatus: \"none\",\n hidden: tool.hidden,\n };\n\n // Add to execution list\n addToolExecution?.(execution);\n\n try {\n const startTime = Date.now();\n const result = await tool.handler(toolCall.input);\n const duration = Date.now() - startTime;\n\n // Update execution status\n updateToolExecution?.(toolCall.id, {\n status: result.success ? \"completed\" : \"error\",\n result,\n error: result.error,\n duration,\n });\n\n return result;\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Tool execution failed\";\n\n // Update execution status\n updateToolExecution?.(toolCall.id, {\n status: \"error\",\n error: errorMessage,\n });\n\n return {\n success: false,\n error: errorMessage,\n };\n }\n },\n [addToolExecution, updateToolExecution],\n );\n\n /**\n * Send tool result back to server\n */\n const sendToolResult = useCallback(\n async (toolCallId: string, result: ToolResponse): Promise<void> => {\n const runtimeUrl = config.runtimeUrl || config.cloud?.endpoint;\n\n if (!runtimeUrl) {\n console.warn(\n \"[useToolExecutor] No runtime URL configured, cannot send tool result\",\n );\n return;\n }\n\n // Extract base URL (remove /chat if present)\n const baseUrl = runtimeUrl.replace(/\\/chat\\/?$/, \"\");\n\n try {\n const response = await fetch(`${baseUrl}/tool-result`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n threadId: chat.threadId || \"default\",\n toolCallId,\n result,\n }),\n });\n\n if (!response.ok) {\n console.error(\n \"[useToolExecutor] Failed to send tool result:\",\n await response.text(),\n );\n }\n } catch (error) {\n console.error(\"[useToolExecutor] Error sending tool result:\", error);\n }\n },\n [config.runtimeUrl, config.cloud?.endpoint, chat.threadId],\n );\n\n /**\n * Get a registered tool by name\n */\n const getTool = useCallback((name: string): ToolDefinition | undefined => {\n return toolsRef.current.find((t) => t.name === name);\n }, []);\n\n /**\n * Check if a tool is registered\n */\n const hasTool = useCallback((name: string): boolean => {\n return toolsRef.current.some((t) => t.name === name);\n }, []);\n\n return {\n executeTool,\n sendToolResult,\n getTool,\n hasTool,\n };\n}\n","\"use client\";\n\nimport { useState, useCallback, useEffect, useMemo } from \"react\";\nimport { useCopilotContext } from \"../context/CopilotContext\";\n\n/**\n * Suggestion item\n */\nexport interface Suggestion {\n /** Suggestion text */\n text: string;\n /** Optional icon */\n icon?: string;\n}\n\n/**\n * useSuggestions options\n */\nexport interface UseSuggestionsOptions {\n /** Number of suggestions to show */\n count?: number;\n /** Context for generating suggestions */\n context?: string;\n /** Static suggestions (if not using AI-generated) */\n suggestions?: Suggestion[] | string[];\n /** Auto-refresh on conversation change */\n autoRefresh?: boolean;\n}\n\n/**\n * useSuggestions return type\n */\nexport interface UseSuggestionsReturn {\n /** Current suggestions */\n suggestions: Suggestion[];\n /** Whether suggestions are loading */\n isLoading: boolean;\n /** Refresh suggestions */\n refresh: () => Promise<void>;\n /** Select a suggestion (sends as message) */\n select: (suggestion: Suggestion | string) => void;\n}\n\n/**\n * Hook for chat suggestions\n *\n * @example\n * ```tsx\n * const { suggestions, select } = useSuggestions({\n * count: 3,\n * context: 'Help users with product questions',\n * });\n *\n * return (\n * <div>\n * {suggestions.map((s, i) => (\n * <button key={i} onClick={() => select(s)}>{s.text}</button>\n * ))}\n * </div>\n * );\n * ```\n */\nexport function useSuggestions(\n options: UseSuggestionsOptions = {},\n): UseSuggestionsReturn {\n const {\n count = 3,\n context,\n suggestions: staticSuggestions,\n autoRefresh = true,\n } = options;\n\n const { chat, actions, config } = useCopilotContext();\n const [suggestions, setSuggestions] = useState<Suggestion[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n\n // Normalize static suggestions (memoized to prevent infinite loops)\n const normalizedStatic = useMemo(\n () =>\n staticSuggestions?.map((s) => (typeof s === \"string\" ? { text: s } : s)),\n [staticSuggestions],\n );\n\n // Refresh suggestions from API\n const refresh = useCallback(async () => {\n // If static suggestions provided, use those\n if (normalizedStatic) {\n setSuggestions(normalizedStatic.slice(0, count));\n return;\n }\n\n // Skip if no cloud config\n if (!config.cloud) {\n return;\n }\n\n setIsLoading(true);\n\n try {\n const endpoint = config.cloud.endpoint || \"https://api.yourgpt.ai/v1\";\n const response = await fetch(`${endpoint}/suggestions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.cloud.apiKey}`,\n },\n body: JSON.stringify({\n botId: config.cloud.botId,\n count,\n context,\n messages: chat.messages.slice(-5), // Last 5 messages for context\n }),\n });\n\n if (response.ok) {\n const data = await response.json();\n setSuggestions(\n data.suggestions.map((s: string | Suggestion) =>\n typeof s === \"string\" ? { text: s } : s,\n ),\n );\n }\n } catch (error) {\n console.error(\"Failed to fetch suggestions:\", error);\n } finally {\n setIsLoading(false);\n }\n }, [config.cloud, count, context, chat.messages, normalizedStatic]);\n\n // Select a suggestion\n const select = useCallback(\n (suggestion: Suggestion | string) => {\n const text =\n typeof suggestion === \"string\" ? suggestion : suggestion.text;\n actions.sendMessage(text);\n },\n [actions],\n );\n\n // Auto-refresh on conversation start or change\n useEffect(() => {\n if (autoRefresh && chat.messages.length === 0) {\n refresh();\n }\n }, [autoRefresh, chat.messages.length, refresh]);\n\n return {\n suggestions: normalizedStatic?.slice(0, count) || suggestions,\n isLoading,\n refresh,\n select,\n };\n}\n","\"use client\";\n\nimport { useState, useCallback, useRef, useEffect } from \"react\";\nimport { useCopilotContext } from \"../context/CopilotContext\";\nimport type { StreamEvent } from \"../../core\";\nimport { streamSSE } from \"../../core\";\n\n/**\n * useAgent options\n */\nexport interface UseAgentOptions<TState = Record<string, unknown>> {\n /** Agent name */\n name: string;\n /** Initial state */\n initialState?: TState;\n /** Called when agent state changes */\n onStateChange?: (state: TState) => void;\n}\n\n/**\n * useAgent return type\n */\nexport interface UseAgentReturn<TState = Record<string, unknown>> {\n /** Current agent state */\n state: TState;\n /** Whether agent is running */\n isRunning: boolean;\n /** Current node name (for graph-based agents) */\n nodeName: string | null;\n /** Start the agent */\n start: (input?: string | Record<string, unknown>) => Promise<void>;\n /** Stop the agent */\n stop: () => void;\n /** Update agent state */\n setState: (state: Partial<TState>) => void;\n /** Error if any */\n error: Error | null;\n}\n\n/**\n * Hook for connecting to agents (LangGraph, etc.)\n *\n * @example\n * ```tsx\n * const { state, isRunning, start } = useAgent<{ city: string }>({\n * name: 'weather-agent',\n * initialState: { city: '' },\n * });\n *\n * return (\n * <div>\n * <p>City: {state.city}</p>\n * <button onClick={() => start('What is the weather?')}>\n * {isRunning ? 'Running...' : 'Start'}\n * </button>\n * </div>\n * );\n * ```\n */\nexport function useAgent<TState = Record<string, unknown>>(\n options: UseAgentOptions<TState>,\n): UseAgentReturn<TState> {\n const { name, initialState = {} as TState, onStateChange } = options;\n const { config } = useCopilotContext();\n\n const [state, setStateInternal] = useState<TState>(initialState);\n const [isRunning, setIsRunning] = useState(false);\n const [nodeName, setNodeName] = useState<string | null>(null);\n const [error, setError] = useState<Error | null>(null);\n\n const abortControllerRef = useRef<AbortController | null>(null);\n\n // Get agent endpoint\n const getEndpoint = useCallback(() => {\n if (config.cloud) {\n return `${config.cloud.endpoint || \"https://api.yourgpt.ai/v1\"}/agents/${name}`;\n }\n return `${config.runtimeUrl || \"/api\"}/agents/${name}`;\n }, [config, name]);\n\n // Start agent\n const start = useCallback(\n async (input?: string | Record<string, unknown>) => {\n setIsRunning(true);\n setError(null);\n\n abortControllerRef.current = new AbortController();\n\n try {\n const endpoint = getEndpoint();\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n if (config.cloud?.apiKey) {\n headers[\"Authorization\"] = `Bearer ${config.cloud.apiKey}`;\n }\n\n const response = await fetch(`${endpoint}/start`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n input: typeof input === \"string\" ? { message: input } : input,\n state,\n }),\n signal: abortControllerRef.current.signal,\n });\n\n if (!response.ok) {\n throw new Error(`Agent error: ${response.status}`);\n }\n\n // Process stream\n for await (const event of streamSSE(response)) {\n handleAgentEvent(event);\n }\n } catch (err) {\n if ((err as Error).name !== \"AbortError\") {\n setError(err instanceof Error ? err : new Error(\"Unknown error\"));\n }\n } finally {\n setIsRunning(false);\n abortControllerRef.current = null;\n }\n },\n [config, getEndpoint, state],\n );\n\n // Handle agent events\n const handleAgentEvent = useCallback(\n (event: StreamEvent & { state?: TState; nodeName?: string }) => {\n if (event.type === \"error\") {\n setError(new Error(event.message));\n return;\n }\n\n // Handle state updates (custom event)\n if (\"state\" in event && event.state) {\n setStateInternal(event.state);\n onStateChange?.(event.state);\n }\n\n // Handle node changes\n if (\"nodeName\" in event && event.nodeName) {\n setNodeName(event.nodeName);\n }\n },\n [onStateChange],\n );\n\n // Stop agent\n const stop = useCallback(() => {\n abortControllerRef.current?.abort();\n }, []);\n\n // Update state\n const setState = useCallback(\n (partialState: Partial<TState>) => {\n setStateInternal((prev) => {\n const newState = { ...prev, ...partialState };\n onStateChange?.(newState);\n return newState;\n });\n },\n [onStateChange],\n );\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n abortControllerRef.current?.abort();\n };\n }, []);\n\n return {\n state,\n isRunning,\n nodeName,\n start,\n stop,\n setState,\n error,\n };\n}\n","/**\n * Knowledge Base Search Utility\n *\n * Integrates with managed cloud knowledge base API to search indexed documents.\n */\n\nimport type {\n InternalKnowledgeBaseConfig,\n InternalKnowledgeBaseResult,\n InternalKnowledgeBaseSearchResponse,\n} from \"../../core\";\n\nconst KNOWLEDGE_BASE_API =\n \"https://api.yourgpt.ai/chatbot/v1/searchIndexDocument\";\n\n// Re-export types for convenience\nexport type KnowledgeBaseResult = InternalKnowledgeBaseResult;\nexport type KnowledgeBaseConfig = InternalKnowledgeBaseConfig;\n\n// Extended response with page info (client-side specific)\nexport interface KnowledgeBaseSearchResponse extends InternalKnowledgeBaseSearchResponse {\n page?: number;\n}\n\n/**\n * Search the knowledge base\n *\n * @param query - Search query string\n * @param config - Knowledge base configuration\n * @returns Search results\n */\nexport async function searchKnowledgeBase(\n query: string,\n config: KnowledgeBaseConfig,\n): Promise<KnowledgeBaseSearchResponse> {\n try {\n const response = await fetch(KNOWLEDGE_BASE_API, {\n method: \"POST\",\n headers: {\n accept: \"*/*\",\n \"content-type\": \"application/json\",\n authorization: `Bearer ${config.token}`,\n },\n body: JSON.stringify({\n project_uid: config.projectUid,\n query: query,\n page: 1,\n limit: String(config.limit || 10),\n app_id: config.appId || \"1\",\n }),\n });\n\n if (!response.ok) {\n return {\n success: false,\n results: [],\n error: `API error: ${response.status} ${response.statusText}`,\n };\n }\n\n const data = await response.json();\n\n // Transform API response to our format\n // Adjust based on actual API response structure\n const results: KnowledgeBaseResult[] = (\n data.data ||\n data.results ||\n []\n ).map((item: Record<string, unknown>) => ({\n id: item.id || item._id || String(Math.random()),\n title: item.title || item.name || undefined,\n content: item.content || item.text || item.snippet || \"\",\n score: item.score || item.relevance || undefined,\n url: item.url || item.source_url || undefined,\n metadata: item.metadata || {},\n }));\n\n return {\n success: true,\n results,\n total: data.total || results.length,\n page: data.page || 1,\n };\n } catch (error) {\n return {\n success: false,\n results: [],\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n}\n\n/**\n * Format knowledge base results for AI context\n */\nexport function formatKnowledgeResultsForAI(\n results: KnowledgeBaseResult[],\n): string {\n if (results.length === 0) {\n return \"No relevant documents found in the knowledge base.\";\n }\n\n return results\n .map((result, index) => {\n const parts = [`[${index + 1}]`];\n if (result.title) parts.push(`**${result.title}**`);\n parts.push(result.content);\n if (result.url) parts.push(`Source: ${result.url}`);\n return parts.join(\"\\n\");\n })\n .join(\"\\n\\n---\\n\\n\");\n}\n\n/**\n * System instruction for knowledge base usage\n */\nexport const KNOWLEDGE_BASE_SYSTEM_INSTRUCTION = `\nYou have access to a knowledge base tool called \"search_knowledge\". Use this tool to:\n- Answer questions about the product, documentation, or company information\n- Find specific information when the user asks about features, pricing, policies, etc.\n- Retrieve relevant context before answering factual questions\n\nWhen using knowledge base results:\n- Cite the information source when relevant\n- If no results are found, acknowledge this and provide general guidance\n- Combine knowledge base information with your general knowledge when helpful\n`.trim();\n","\"use client\";\n\nimport { useEffect, useRef, useCallback } from \"react\";\nimport { useCopilot } from \"../provider/CopilotProvider\";\nimport {\n searchKnowledgeBase,\n formatKnowledgeResultsForAI,\n type KnowledgeBaseConfig,\n type KnowledgeBaseResult,\n type KnowledgeBaseSearchResponse,\n} from \"../utils/knowledge-base\";\n\n/**\n * Hook configuration for knowledge base\n */\nexport interface UseKnowledgeBaseConfig {\n /** Project UID for the knowledge base */\n projectUid: string;\n /** Auth token for API calls */\n token: string;\n /** App ID (default: \"1\") */\n appId?: string;\n /** Results limit (default: 5) */\n limit?: number;\n /** Whether to enable the tool (default: true) */\n enabled?: boolean;\n}\n\n/**\n * Hook to integrate knowledge base search as a tool\n *\n * Registers a `search_knowledge` tool that the AI can use to search\n * the knowledge base for relevant information.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * useKnowledgeBase({\n * projectUid: \"your-project-uid\",\n * token: \"your-auth-token\",\n * });\n *\n * return <CopilotChat />;\n * }\n * ```\n */\nexport function useKnowledgeBase(config: UseKnowledgeBaseConfig): void {\n const { registerTool, unregisterTool } = useCopilot();\n const configRef = useRef(config);\n\n // Update config ref\n configRef.current = config;\n\n // Search handler\n const handleSearch = useCallback(\n async (\n params: Record<string, unknown>,\n ): Promise<{\n success: boolean;\n message?: string;\n data?: unknown;\n error?: string;\n }> => {\n const query = params.query as string;\n if (!query) {\n return {\n success: false,\n error: \"Query is required\",\n };\n }\n\n const currentConfig = configRef.current;\n\n const kbConfig: KnowledgeBaseConfig = {\n projectUid: currentConfig.projectUid,\n token: currentConfig.token,\n appId: currentConfig.appId,\n limit: currentConfig.limit || 5,\n };\n\n const response: KnowledgeBaseSearchResponse = await searchKnowledgeBase(\n query,\n kbConfig,\n );\n\n if (!response.success) {\n return {\n success: false,\n error: response.error || \"Knowledge base search failed\",\n };\n }\n\n const formattedResults = formatKnowledgeResultsForAI(response.results);\n\n return {\n success: true,\n message: formattedResults,\n data: {\n resultCount: response.results.length,\n total: response.total,\n },\n };\n },\n [],\n );\n\n // Register the tool\n useEffect(() => {\n if (config.enabled === false) {\n return;\n }\n\n registerTool({\n name: \"search_knowledge\",\n description:\n \"Search the knowledge base for relevant information about the product, documentation, or company. Use this to answer questions about features, pricing, policies, guides, or any factual information.\",\n location: \"client\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description:\n \"The search query to find relevant information in the knowledge base\",\n },\n },\n required: [\"query\"],\n },\n handler: handleSearch,\n });\n\n return () => {\n unregisterTool(\"search_knowledge\");\n };\n }, [\n config.enabled,\n config.projectUid,\n config.token,\n registerTool,\n unregisterTool,\n handleSearch,\n ]);\n}\n\n/**\n * Standalone function to search knowledge base (without hook)\n *\n * Useful for manual searches outside of the tool system.\n */\nexport { searchKnowledgeBase, formatKnowledgeResultsForAI };\nexport type {\n KnowledgeBaseConfig,\n KnowledgeBaseResult,\n KnowledgeBaseSearchResponse,\n};\n","\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport { useCopilotContext } from \"../context/CopilotContext\";\n\n/**\n * Provider capabilities for UI feature flags\n */\nexport interface ProviderCapabilities {\n /** Supports image inputs */\n supportsVision: boolean;\n /** Supports tool/function calling */\n supportsTools: boolean;\n /** Supports extended thinking (Claude, DeepSeek) */\n supportsThinking: boolean;\n /** Supports streaming responses */\n supportsStreaming: boolean;\n /** Supports PDF document inputs */\n supportsPDF: boolean;\n /** Supports audio inputs */\n supportsAudio: boolean;\n /** Supports video inputs */\n supportsVideo: boolean;\n /** Maximum context tokens */\n maxTokens: number;\n /** Supported image MIME types */\n supportedImageTypes: string[];\n /** Supported audio MIME types */\n supportedAudioTypes?: string[];\n /** Supported video MIME types */\n supportedVideoTypes?: string[];\n /** Supports JSON mode / structured output */\n supportsJsonMode?: boolean;\n /** Supports system messages */\n supportsSystemMessages?: boolean;\n}\n\n/**\n * Capabilities response from the server\n */\nexport interface CapabilitiesResponse {\n /** Provider name */\n provider: string;\n /** Current model ID */\n model: string;\n /** Model capabilities */\n capabilities: ProviderCapabilities;\n /** List of supported models for this provider */\n supportedModels: string[];\n}\n\n/**\n * Default capabilities (used when loading or on error)\n */\nconst DEFAULT_CAPABILITIES: ProviderCapabilities = {\n supportsVision: false,\n supportsTools: true,\n supportsThinking: false,\n supportsStreaming: true,\n supportsPDF: false,\n supportsAudio: false,\n supportsVideo: false,\n maxTokens: 8192,\n supportedImageTypes: [],\n supportsJsonMode: false,\n supportsSystemMessages: true,\n};\n\n/**\n * Hook to access model capabilities from the runtime\n *\n * @returns Capabilities state and actions\n *\n * @example\n * ```tsx\n * function ChatInput() {\n * const { capabilities, isLoading } = useCapabilities();\n *\n * return (\n * <div>\n * {capabilities.supportsVision && (\n * <ImageUploadButton />\n * )}\n * {capabilities.supportsAudio && (\n * <AudioRecordButton />\n * )}\n * </div>\n * );\n * }\n * ```\n */\nexport function useCapabilities() {\n const { config } = useCopilotContext();\n const [capabilities, setCapabilities] =\n useState<ProviderCapabilities>(DEFAULT_CAPABILITIES);\n const [provider, setProvider] = useState<string>(\"unknown\");\n const [model, setModel] = useState<string>(\"unknown\");\n const [supportedModels, setSupportedModels] = useState<string[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n // Build the capabilities URL from the runtime URL\n const capabilitiesUrl = config.runtimeUrl\n ? config.runtimeUrl.replace(/\\/chat\\/?$/, \"/capabilities\")\n : null;\n\n // Fetch capabilities from server\n const fetchCapabilities = useCallback(async () => {\n if (!capabilitiesUrl) {\n setIsLoading(false);\n return;\n }\n\n try {\n setIsLoading(true);\n setError(null);\n\n const response = await fetch(capabilitiesUrl);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch capabilities: ${response.status}`);\n }\n\n const data: CapabilitiesResponse = await response.json();\n\n setCapabilities(data.capabilities);\n setProvider(data.provider);\n setModel(data.model);\n setSupportedModels(data.supportedModels);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(\"Unknown error\"));\n // Keep default capabilities on error\n } finally {\n setIsLoading(false);\n }\n }, [capabilitiesUrl]);\n\n // Fetch on mount\n useEffect(() => {\n fetchCapabilities();\n }, [fetchCapabilities]);\n\n return {\n /** Current model capabilities */\n capabilities,\n /** Current provider name */\n provider,\n /** Current model ID */\n model,\n /** List of supported models for current provider */\n supportedModels,\n /** Whether capabilities are being loaded */\n isLoading,\n /** Error if fetch failed */\n error,\n /** Refetch capabilities */\n refetch: fetchCapabilities,\n };\n}\n\n/**\n * Hook to check if a specific feature is supported\n *\n * @param feature - The feature to check (e.g., 'vision', 'audio', 'video')\n * @returns Whether the feature is supported\n *\n * @example\n * ```tsx\n * function ImageButton() {\n * const supportsVision = useFeatureSupport('vision');\n *\n * if (!supportsVision) return null;\n * return <button>Upload Image</button>;\n * }\n * ```\n */\nexport function useFeatureSupport(\n feature: keyof Pick<\n ProviderCapabilities,\n | \"supportsVision\"\n | \"supportsTools\"\n | \"supportsThinking\"\n | \"supportsStreaming\"\n | \"supportsPDF\"\n | \"supportsAudio\"\n | \"supportsVideo\"\n | \"supportsJsonMode\"\n | \"supportsSystemMessages\"\n >,\n): boolean {\n const { capabilities } = useCapabilities();\n return capabilities[feature] ?? false;\n}\n\n/**\n * Hook to get supported media types\n *\n * @returns Object with supported media types\n *\n * @example\n * ```tsx\n * function MediaUpload() {\n * const { imageTypes, audioTypes, videoTypes } = useSupportedMediaTypes();\n *\n * return (\n * <input\n * type=\"file\"\n * accept={imageTypes.join(',')}\n * />\n * );\n * }\n * ```\n */\nexport function useSupportedMediaTypes() {\n const { capabilities } = useCapabilities();\n\n return {\n /** Supported image MIME types */\n imageTypes: capabilities.supportedImageTypes || [],\n /** Supported audio MIME types */\n audioTypes: capabilities.supportedAudioTypes || [],\n /** Supported video MIME types */\n videoTypes: capabilities.supportedVideoTypes || [],\n /** Whether any image types are supported */\n hasImageSupport: (capabilities.supportedImageTypes?.length ?? 0) > 0,\n /** Whether any audio types are supported */\n hasAudioSupport: (capabilities.supportedAudioTypes?.length ?? 0) > 0,\n /** Whether any video types are supported */\n hasVideoSupport: (capabilities.supportedVideoTypes?.length ?? 0) > 0,\n };\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { useCopilotContext } from \"../context/CopilotContext\";\n\n/**\n * SDK State for DevLogger\n * This type is compatible with DevLoggerState in @yourgpt/copilot-sdk-ui\n */\nexport interface DevLoggerState {\n chat: {\n isLoading: boolean;\n messageCount: number;\n threadId: string;\n error: string | null;\n };\n tools: {\n isEnabled: boolean;\n isCapturing: boolean;\n pendingConsent: boolean;\n };\n agentLoop: {\n toolExecutions: Array<{\n id: string;\n name: string;\n status: string;\n approvalStatus: string;\n }>;\n pendingApprovals: number;\n iteration: number;\n maxIterations: number;\n };\n registered: {\n tools: Array<{ name: string; location: string }>;\n actions: Array<{ name: string }>;\n contextCount: number;\n };\n permissions: {\n stored: Array<{ toolName: string; level: string }>;\n loaded: boolean;\n };\n config: {\n runtimeUrl: string;\n };\n}\n\n/**\n * Hook to build DevLogger state from SDK context\n *\n * Used internally by CopilotProvider when showLogger is true\n */\nexport function useDevLogger(): DevLoggerState {\n const ctx = useCopilotContext();\n\n return useMemo<DevLoggerState>(() => {\n // Build tool executions from agent loop state\n const toolExecutions = (ctx.agentLoop?.toolExecutions || []).map(\n (exec) => ({\n id: exec.id,\n name: exec.name,\n status: exec.status,\n approvalStatus: exec.approvalStatus || \"not_required\",\n }),\n );\n\n // Count pending approvals\n const pendingApprovalsCount = ctx.pendingApprovals?.length || 0;\n\n // Get registered tools\n const registeredTools = (ctx.registeredTools || []).map((tool) => ({\n name: tool.name,\n location: tool.location || \"client\",\n }));\n\n // Get registered actions\n const registeredActions = (ctx.registeredActions || []).map((action) => ({\n name: action.name,\n }));\n\n // Get stored permissions\n const storedPermissions = (ctx.storedPermissions || []).map((p) => ({\n toolName: p.toolName,\n level: p.level,\n }));\n\n return {\n chat: {\n isLoading: ctx.chat?.isLoading || false,\n messageCount: ctx.chat?.messages?.length || 0,\n threadId: ctx.chat?.threadId || \"none\",\n error: ctx.chat?.error?.message || null,\n },\n tools: {\n isEnabled: !!ctx.toolsConfig,\n isCapturing: ctx.tools?.isCapturing || false,\n pendingConsent: !!ctx.tools?.pendingConsent,\n },\n agentLoop: {\n toolExecutions,\n pendingApprovals: pendingApprovalsCount,\n iteration: ctx.agentLoop?.iteration || 0,\n maxIterations: ctx.agentLoop?.maxIterations || 10,\n },\n registered: {\n tools: registeredTools,\n actions: registeredActions,\n contextCount: ctx.contextTree?.length || 0,\n },\n permissions: {\n stored: storedPermissions,\n loaded: ctx.permissionsLoaded || false,\n },\n config: {\n runtimeUrl: ctx.config?.runtimeUrl || ctx.config?.cloud?.endpoint || \"\",\n },\n };\n }, [\n ctx.chat,\n ctx.tools,\n ctx.toolsConfig,\n ctx.agentLoop,\n ctx.pendingApprovals,\n ctx.registeredTools,\n ctx.registeredActions,\n ctx.contextTree,\n ctx.storedPermissions,\n ctx.permissionsLoaded,\n ctx.config,\n ]);\n}\n","/**\n * ReactThreadManagerState - React-specific implementation of ThreadManagerState\n *\n * This class implements the ThreadManagerState interface with callback-based\n * reactivity for use with React's useSyncExternalStore.\n *\n * Pattern follows ReactChatState for consistency.\n */\n\nimport type { Thread, ThreadData } from \"../../core/types/thread\";\nimport type {\n ThreadManagerState,\n LoadStatus,\n} from \"../../thread/interfaces/ThreadManagerState\";\n\n/**\n * ReactThreadManagerState implements ThreadManagerState with callback-based reactivity\n *\n * @example\n * ```tsx\n * const state = new ReactThreadManagerState();\n *\n * // Subscribe to changes (for useSyncExternalStore)\n * const unsubscribe = state.subscribe(() => {\n * console.log('State changed');\n * });\n *\n * // Get snapshot (for useSyncExternalStore)\n * const threads = state.threads;\n * ```\n */\nexport class ReactThreadManagerState implements ThreadManagerState {\n private _threads: Thread[] = [];\n private _currentThreadId: string | null = null;\n private _currentThread: ThreadData | null = null;\n private _loadStatus: LoadStatus = \"idle\";\n private _error: Error | undefined = undefined;\n\n // Callbacks for React subscriptions (useSyncExternalStore)\n private subscribers = new Set<() => void>();\n\n constructor(initialThreads?: Thread[]) {\n if (initialThreads) {\n this._threads = initialThreads;\n }\n }\n\n // ============================================\n // Getters\n // ============================================\n\n get threads(): Thread[] {\n return this._threads;\n }\n\n get currentThreadId(): string | null {\n return this._currentThreadId;\n }\n\n get currentThread(): ThreadData | null {\n return this._currentThread;\n }\n\n get loadStatus(): LoadStatus {\n return this._loadStatus;\n }\n\n get error(): Error | undefined {\n return this._error;\n }\n\n // ============================================\n // Setters (trigger reactivity)\n // ============================================\n\n set threads(value: Thread[]) {\n this._threads = value;\n this.notify();\n }\n\n // ============================================\n // Mutations\n // ============================================\n\n setThreads(threads: Thread[]): void {\n this._threads = threads;\n this.notify();\n }\n\n setCurrentThread(thread: ThreadData | null): void {\n this._currentThread = thread;\n this._currentThreadId = thread?.id ?? null;\n this.notify();\n }\n\n setCurrentThreadId(id: string | null): void {\n this._currentThreadId = id;\n this.notify();\n }\n\n addThread(thread: Thread): void {\n // Add to beginning (most recent first)\n this._threads = [thread, ...this._threads];\n this.notify();\n }\n\n updateThread(id: string, updates: Partial<Thread>): void {\n this._threads = this._threads.map((t) =>\n t.id === id ? { ...t, ...updates } : t,\n );\n // Re-sort by updatedAt if it was updated\n if (updates.updatedAt) {\n this._threads = [...this._threads].sort(\n (a, b) => b.updatedAt.getTime() - a.updatedAt.getTime(),\n );\n }\n // Also update current thread if it's the same\n if (this._currentThread?.id === id) {\n this._currentThread = { ...this._currentThread, ...updates };\n }\n this.notify();\n }\n\n removeThread(id: string): void {\n this._threads = this._threads.filter((t) => t.id !== id);\n // Clear current thread if it was deleted\n if (this._currentThreadId === id) {\n this._currentThreadId = null;\n this._currentThread = null;\n }\n this.notify();\n }\n\n setLoadStatus(status: LoadStatus): void {\n this._loadStatus = status;\n this.notify();\n }\n\n setError(error: Error | undefined): void {\n this._error = error;\n this.notify();\n }\n\n // ============================================\n // Subscription (for useSyncExternalStore)\n // ============================================\n\n /**\n * Subscribe to state changes.\n * Returns an unsubscribe function.\n *\n * @example\n * ```tsx\n * const threads = useSyncExternalStore(\n * state.subscribe,\n * () => state.threads\n * );\n * ```\n */\n subscribe = (callback: () => void): (() => void) => {\n this.subscribers.add(callback);\n return () => {\n this.subscribers.delete(callback);\n };\n };\n\n // ============================================\n // Snapshots (for useSyncExternalStore)\n // ============================================\n\n getThreadsSnapshot(): Thread[] {\n return this._threads;\n }\n\n getCurrentThreadSnapshot(): ThreadData | null {\n return this._currentThread;\n }\n\n getLoadStatusSnapshot(): LoadStatus {\n return this._loadStatus;\n }\n\n getErrorSnapshot(): Error | undefined {\n return this._error;\n }\n\n // ============================================\n // Private Methods\n // ============================================\n\n private notify(): void {\n this.subscribers.forEach((cb) => cb());\n }\n\n /**\n * Cleanup subscriptions\n */\n dispose(): void {\n this.subscribers.clear();\n }\n}\n\n/**\n * Create a ReactThreadManagerState instance\n */\nexport function createReactThreadManagerState(\n initialThreads?: Thread[],\n): ReactThreadManagerState {\n return new ReactThreadManagerState(initialThreads);\n}\n","/**\n * ReactThreadManager - React adapter for ThreadManager\n *\n * Extends ThreadManager with React-specific state management.\n */\n\nimport {\n ThreadManager,\n type ThreadManagerConfig,\n type ThreadManagerCallbacks,\n} from \"../../thread/ThreadManager\";\nimport { ReactThreadManagerState } from \"./ReactThreadManagerState\";\nimport type { Thread } from \"../../core/types/thread\";\n\n/**\n * Configuration for ReactThreadManager\n */\nexport interface ReactThreadManagerConfig extends Omit<\n ThreadManagerConfig,\n \"state\"\n> {\n // State is always ReactThreadManagerState for React\n}\n\n/**\n * ReactThreadManager - React adapter for ThreadManager\n *\n * Uses ReactThreadManagerState for React's useSyncExternalStore compatibility.\n *\n * @example\n * ```tsx\n * const manager = createReactThreadManager();\n *\n * // In a component using useSyncExternalStore\n * const threads = useSyncExternalStore(\n * manager.subscribe,\n * manager.getThreadsSnapshot\n * );\n * ```\n */\nexport class ReactThreadManager extends ThreadManager {\n // Override state with React-specific type\n declare protected state: ReactThreadManagerState;\n\n constructor(\n config: ReactThreadManagerConfig = {},\n callbacks: ThreadManagerCallbacks = {},\n ) {\n // Create React state and pass to parent\n const reactState = new ReactThreadManagerState();\n super({ ...config, state: reactState }, callbacks);\n }\n\n // ============================================\n // Subscription Methods (for useSyncExternalStore)\n // ============================================\n\n /**\n * Subscribe to state changes\n * Use with useSyncExternalStore\n */\n subscribe = (callback: () => void): (() => void) => {\n return this.state.subscribe(callback);\n };\n\n // ============================================\n // Snapshot Getters (for useSyncExternalStore)\n // ============================================\n\n /**\n * Get threads snapshot\n */\n getThreadsSnapshot = (): typeof this.threads => {\n return this.state.getThreadsSnapshot();\n };\n\n /**\n * Get current thread snapshot\n */\n getCurrentThreadSnapshot = (): typeof this.currentThread => {\n return this.state.getCurrentThreadSnapshot();\n };\n\n /**\n * Get current thread ID snapshot\n */\n getCurrentThreadIdSnapshot = (): string | null => {\n return this.state.currentThreadId;\n };\n\n /**\n * Get load status snapshot\n */\n getLoadStatusSnapshot = (): typeof this.loadStatus => {\n return this.state.getLoadStatusSnapshot();\n };\n\n /**\n * Get error snapshot\n */\n getErrorSnapshot = (): typeof this.error => {\n return this.state.getErrorSnapshot();\n };\n\n /**\n * Get isLoading snapshot\n */\n getIsLoadingSnapshot = (): boolean => {\n return this.state.getLoadStatusSnapshot() === \"loading\";\n };\n\n // ============================================\n // Server Snapshots (for SSR - stable cached values)\n // ============================================\n\n // Cached values for server snapshots (must be stable references)\n private static readonly EMPTY_THREADS: Thread[] = [];\n private static readonly IDLE_STATUS = \"idle\" as const;\n\n /**\n * Get threads snapshot for server (always empty for hydration consistency)\n */\n getThreadsServerSnapshot = (): Thread[] => {\n return ReactThreadManager.EMPTY_THREADS;\n };\n\n /**\n * Get current thread snapshot for server (always null)\n */\n getCurrentThreadServerSnapshot = (): typeof this.currentThread => {\n return null;\n };\n\n /**\n * Get current thread ID snapshot for server (always null)\n */\n getCurrentThreadIdServerSnapshot = (): string | null => {\n return null;\n };\n\n /**\n * Get load status snapshot for server (always \"idle\")\n */\n getLoadStatusServerSnapshot = (): typeof this.loadStatus => {\n return ReactThreadManager.IDLE_STATUS;\n };\n\n /**\n * Get error snapshot for server (always undefined)\n */\n getErrorServerSnapshot = (): typeof this.error => {\n return undefined;\n };\n\n /**\n * Get isLoading snapshot for server (always false)\n */\n getIsLoadingServerSnapshot = (): boolean => {\n return false;\n };\n\n // ============================================\n // Cleanup\n // ============================================\n\n /**\n * Dispose of the manager\n */\n async dispose(): Promise<void> {\n this.state.dispose();\n await super.dispose();\n }\n}\n\n/**\n * Create a ReactThreadManager instance\n */\nexport function createReactThreadManager(\n config?: ReactThreadManagerConfig,\n callbacks?: ThreadManagerCallbacks,\n): ReactThreadManager {\n return new ReactThreadManager(config, callbacks);\n}\n","/**\n * useThreadManager - React hook for thread management\n *\n * Provides thread CRUD operations with localStorage persistence by default.\n * Uses useSyncExternalStore for optimal React integration.\n */\n\nimport React, {\n useSyncExternalStore,\n useMemo,\n useCallback,\n useEffect,\n} from \"react\";\nimport type { Thread, ThreadData, Message } from \"../../core/types\";\nimport type { LoadStatus } from \"../../thread/interfaces\";\nimport type {\n ThreadStorageAdapter,\n AsyncThreadStorageAdapter,\n} from \"../../thread/adapters\";\nimport {\n ReactThreadManager,\n createReactThreadManager,\n type ReactThreadManagerConfig,\n} from \"../internal/ReactThreadManager\";\nimport type {\n ThreadManagerCallbacks,\n CreateThreadOptions,\n UpdateThreadOptions,\n} from \"../../thread/ThreadManager\";\n\n/**\n * Configuration for useThreadManager hook\n */\nexport interface UseThreadManagerConfig extends ReactThreadManagerConfig {\n /**\n * Storage adapter for persistence\n * @default localStorage adapter\n */\n adapter?: ThreadStorageAdapter | AsyncThreadStorageAdapter;\n\n /**\n * Debounce delay for auto-save (ms)\n * @default 1000\n */\n saveDebounce?: number;\n\n /**\n * Whether to auto-load threads on mount\n * @default true\n */\n autoLoad?: boolean;\n\n /**\n * Whether to auto-restore the last active thread on load\n * Requires adapter to support getLastActiveThreadId/setLastActiveThreadId\n * @default true\n */\n autoRestoreLastThread?: boolean;\n\n /**\n * Callbacks for thread events\n */\n callbacks?: ThreadManagerCallbacks;\n}\n\n/**\n * Return type for useThreadManager hook\n */\nexport interface UseThreadManagerReturn {\n // ============================================\n // State\n // ============================================\n\n /** All threads (metadata only) */\n threads: Thread[];\n\n /** Currently loaded thread (with messages) */\n currentThread: ThreadData | null;\n\n /** Currently selected thread ID */\n currentThreadId: string | null;\n\n /** Whether threads are currently loading */\n isLoading: boolean;\n\n /** Current load status */\n loadStatus: LoadStatus;\n\n /** Current error */\n error: Error | undefined;\n\n // ============================================\n // Actions\n // ============================================\n\n /**\n * Create a new thread\n */\n createThread: (options?: CreateThreadOptions) => Promise<ThreadData>;\n\n /**\n * Switch to a different thread\n */\n switchThread: (id: string) => Promise<ThreadData | null>;\n\n /**\n * Update the current thread\n */\n updateCurrentThread: (updates: UpdateThreadOptions) => Promise<void>;\n\n /**\n * Delete a thread\n */\n deleteThread: (id: string) => Promise<void>;\n\n /**\n * Clear the current thread selection\n */\n clearCurrentThread: () => void;\n\n /**\n * Refresh threads from storage\n */\n refreshThreads: () => Promise<void>;\n\n /**\n * Save changes immediately (bypass debounce)\n */\n saveNow: () => Promise<void>;\n\n /**\n * Clear all threads\n */\n clearAllThreads: () => Promise<void>;\n\n /**\n * Whether there are pending changes waiting to be saved\n */\n hasPendingChanges: boolean;\n\n // ============================================\n // Utilities\n // ============================================\n\n /**\n * Get messages for the current thread (convenience getter)\n */\n messages: Message[];\n\n /**\n * Update messages for the current thread (convenience setter)\n */\n setMessages: (messages: Message[]) => Promise<void>;\n}\n\n// Singleton manager for when no custom config is provided\nlet defaultManager: ReactThreadManager | null = null;\n\nfunction getDefaultManager(): ReactThreadManager {\n if (!defaultManager) {\n defaultManager = createReactThreadManager();\n }\n return defaultManager;\n}\n\n// Singleton manager for internal use (with localStorage persistence)\nlet internalManager: ReactThreadManager | null = null;\n\nfunction getInternalManager(\n config: UseThreadManagerConfig,\n): ReactThreadManager {\n if (!internalManager) {\n internalManager = createReactThreadManager(\n {\n adapter: config.adapter,\n saveDebounce: config.saveDebounce,\n autoLoad: config.autoLoad,\n autoRestoreLastThread: config.autoRestoreLastThread,\n },\n config.callbacks,\n );\n }\n return internalManager;\n}\n\n/**\n * useThreadManager - React hook for thread management\n *\n * Provides thread CRUD operations with localStorage persistence by default.\n *\n * @example Basic usage (localStorage by default)\n * ```tsx\n * function App() {\n * const {\n * threads,\n * currentThread,\n * createThread,\n * switchThread,\n * updateCurrentThread,\n * } = useThreadManager();\n *\n * return (\n * <CopilotProvider\n * runtimeUrl=\"/api/chat\"\n * threadId={currentThread?.id}\n * initialMessages={currentThread?.messages}\n * onMessagesChange={(msgs) => updateCurrentThread({ messages: msgs })}\n * >\n * <ThreadPicker\n * value={currentThread?.id}\n * threads={threads}\n * onSelect={switchThread}\n * onNewThread={() => createThread()}\n * />\n * <Chat />\n * </CopilotProvider>\n * );\n * }\n * ```\n *\n * @example With custom adapter\n * ```tsx\n * const { threads } = useThreadManager({\n * adapter: myDatabaseAdapter,\n * });\n * ```\n *\n * @example With callbacks\n * ```tsx\n * const { threads } = useThreadManager({\n * callbacks: {\n * onThreadCreated: (thread) => console.log('Created:', thread.id),\n * onError: (error) => console.error('Error:', error),\n * },\n * });\n * ```\n */\nexport function useThreadManager(\n config?: UseThreadManagerConfig,\n): UseThreadManagerReturn {\n // Get or create manager - use singletons for stability\n const manager = useMemo(() => {\n // Use default manager if no config provided\n if (!config) {\n return getDefaultManager();\n }\n\n // Use internal singleton for configs without custom adapter\n // This ensures the same manager is used across all components\n if (!config.adapter) {\n return getInternalManager(config);\n }\n\n // For custom adapters, create a new manager\n // (This is rare and usually for server-side persistence)\n return createReactThreadManager(\n {\n adapter: config.adapter,\n saveDebounce: config.saveDebounce,\n autoLoad: config.autoLoad,\n autoRestoreLastThread: config.autoRestoreLastThread,\n },\n config.callbacks,\n );\n }, [\n config?.adapter,\n config?.saveDebounce,\n config?.autoLoad,\n config?.autoRestoreLastThread,\n // Note: callbacks are intentionally not in deps to avoid recreating manager\n ]);\n\n // Subscribe to state changes using useSyncExternalStore\n // Server snapshots return stable initial values to prevent hydration mismatch\n const threads = useSyncExternalStore(\n manager.subscribe,\n manager.getThreadsSnapshot,\n manager.getThreadsServerSnapshot, // SSR - always empty array\n );\n\n const currentThread = useSyncExternalStore(\n manager.subscribe,\n manager.getCurrentThreadSnapshot,\n manager.getCurrentThreadServerSnapshot, // SSR - always null\n );\n\n const currentThreadId = useSyncExternalStore(\n manager.subscribe,\n manager.getCurrentThreadIdSnapshot,\n manager.getCurrentThreadIdServerSnapshot, // SSR - always null\n );\n\n const loadStatus = useSyncExternalStore(\n manager.subscribe,\n manager.getLoadStatusSnapshot,\n manager.getLoadStatusServerSnapshot, // SSR - always \"idle\"\n );\n\n const error = useSyncExternalStore(\n manager.subscribe,\n manager.getErrorSnapshot,\n manager.getErrorServerSnapshot, // SSR - always undefined\n );\n\n const isLoading = useSyncExternalStore(\n manager.subscribe,\n manager.getIsLoadingSnapshot,\n manager.getIsLoadingServerSnapshot, // SSR - always false\n );\n\n // Cleanup on unmount (only for custom adapters, NOT internal singleton)\n useEffect(() => {\n return () => {\n // Don't dispose default or internal singleton managers\n // They should persist across component mounts\n if (\n config?.adapter &&\n manager !== defaultManager &&\n manager !== internalManager\n ) {\n manager.dispose();\n }\n };\n }, [manager, config]);\n\n // Save pending changes before page unload\n useEffect(() => {\n const handleBeforeUnload = () => {\n if (manager.hasPendingChanges) {\n // Synchronous save attempt - saveNow is async but we try anyway\n manager.saveNow().catch(() => {\n // Can't do much here, but at least we tried\n });\n }\n };\n\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"beforeunload\", handleBeforeUnload);\n return () => {\n window.removeEventListener(\"beforeunload\", handleBeforeUnload);\n };\n }\n }, [manager]);\n\n // ============================================\n // Memoized Actions\n // ============================================\n\n const createThread = useCallback(\n (options?: CreateThreadOptions) => manager.createThread(options),\n [manager],\n );\n\n const switchThread = useCallback(\n (id: string) => manager.switchThread(id),\n [manager],\n );\n\n const updateCurrentThread = useCallback(\n (updates: UpdateThreadOptions) => manager.updateCurrentThread(updates),\n [manager],\n );\n\n const deleteThread = useCallback(\n (id: string) => manager.deleteThread(id),\n [manager],\n );\n\n const clearCurrentThread = useCallback(\n () => manager.clearCurrentThread(),\n [manager],\n );\n\n const refreshThreads = useCallback(() => manager.loadThreads(), [manager]);\n\n const saveNow = useCallback(() => manager.saveNow(), [manager]);\n\n const clearAllThreads = useCallback(\n () => manager.clearAllThreads(),\n [manager],\n );\n\n // ============================================\n // Convenience Utilities\n // ============================================\n\n const messages = useMemo(\n () => currentThread?.messages ?? [],\n [currentThread],\n );\n\n const setMessages = useCallback(\n (newMessages: Message[]) => updateCurrentThread({ messages: newMessages }),\n [updateCurrentThread],\n );\n\n // hasPendingChanges is a direct read (not reactive, but useful for save-on-unload)\n const hasPendingChanges = manager.hasPendingChanges;\n\n return {\n // State\n threads,\n currentThread,\n currentThreadId,\n isLoading,\n loadStatus,\n error,\n\n // Actions\n createThread,\n switchThread,\n updateCurrentThread,\n deleteThread,\n clearCurrentThread,\n refreshThreads,\n saveNow,\n clearAllThreads,\n\n // Utilities\n messages,\n setMessages,\n hasPendingChanges,\n };\n}\n","\"use client\";\n\nimport { useCallback, useMemo } from \"react\";\nimport type {\n MCPUIIntent,\n MCPUIIntentContext,\n UseMCPUIIntentsConfig,\n UseMCPUIIntentsReturn,\n} from \"../../mcp/ui/types\";\n\n/**\n * useMCPUIIntents - Hook for handling MCP-UI intents\n *\n * This hook provides a unified handler for all MCP-UI intent types.\n * Use it to handle user interactions from MCP-UI components rendered\n * in the chat interface.\n *\n * @example\n * ```tsx\n * function ChatWithMCPUI() {\n * const { sendMessage, callTool } = useCopilotChat();\n *\n * const { handleIntent } = useMCPUIIntents({\n * // Handle tool calls from UI\n * onToolCall: async (name, args) => {\n * await callTool(name, args);\n * },\n * // Handle semantic actions\n * onIntent: (action, data) => {\n * if (action === \"add_to_cart\") {\n * // Dispatch to state management or send to agent\n * sendMessage(`Add ${data?.productId} to cart`);\n * }\n * },\n * // Pre-fill chat input\n * onPrompt: (text) => {\n * setInputValue(text);\n * },\n * // Show toast notifications\n * onNotify: (message, level) => {\n * toast({ message, type: level });\n * },\n * // Handle link clicks\n * onLink: (url, newTab) => {\n * // Return false to prevent default behavior\n * if (url.startsWith('internal://')) {\n * navigate(url.replace('internal://', '/'));\n * return false;\n * }\n * },\n * });\n *\n * return (\n * <CopilotChat\n * onUIIntent={handleIntent}\n * />\n * );\n * }\n * ```\n */\nexport function useMCPUIIntents(\n config: UseMCPUIIntentsConfig = {},\n): UseMCPUIIntentsReturn {\n const {\n onToolCall,\n onIntent,\n onPrompt,\n onNotify,\n onLink,\n requireConsent = { tool: false, link: true },\n } = config;\n\n const handleIntent = useCallback(\n async (intent: MCPUIIntent, context?: MCPUIIntentContext) => {\n switch (intent.type) {\n case \"tool\": {\n // Tool call intent - invoke another MCP tool\n if (requireConsent.tool) {\n // TODO: Implement consent dialog for tool calls\n // For now, just call the handler\n }\n await onToolCall?.(intent.name, intent.arguments, context);\n break;\n }\n\n case \"intent\": {\n // Semantic action intent - let the agent/app interpret\n await onIntent?.(intent.action, intent.data, context);\n break;\n }\n\n case \"prompt\": {\n // Prompt intent - add text to chat input\n onPrompt?.(intent.text, context);\n break;\n }\n\n case \"notify\": {\n // Notification intent - show toast/alert\n onNotify?.(intent.message, intent.level, context);\n break;\n }\n\n case \"link\": {\n // Link intent - open URL\n const shouldContinue = onLink?.(intent.url, intent.newTab, context);\n\n // If handler returns false, skip default behavior\n if (shouldContinue === false) {\n break;\n }\n\n // Default behavior: open link\n if (requireConsent.link) {\n // TODO: Implement consent dialog for links\n // For now, check if it's a safe URL\n const isSafeUrl =\n intent.url.startsWith(\"https://\") ||\n intent.url.startsWith(\"http://localhost\");\n if (!isSafeUrl) {\n console.warn(\n \"[MCP-UI] Blocked potentially unsafe link:\",\n intent.url,\n );\n break;\n }\n }\n\n // Open the link\n if (typeof window !== \"undefined\") {\n if (intent.newTab !== false) {\n window.open(intent.url, \"_blank\", \"noopener,noreferrer\");\n } else {\n window.location.href = intent.url;\n }\n }\n break;\n }\n\n default: {\n console.warn(\n \"[MCP-UI] Unknown intent type:\",\n (intent as unknown as { type: string }).type,\n );\n }\n }\n },\n [onToolCall, onIntent, onPrompt, onNotify, onLink, requireConsent],\n );\n\n return useMemo(\n () => ({\n handleIntent,\n }),\n [handleIntent],\n );\n}\n\n/**\n * Create a simple intent handler that sends intents as messages\n *\n * This is a convenience function for when you want all intents\n * to be converted to natural language messages sent to the agent.\n *\n * @example\n * ```tsx\n * const { sendMessage } = useCopilotChat();\n * const { handleIntent } = useMCPUIIntents(\n * createMessageIntentHandler(sendMessage)\n * );\n * ```\n */\nexport function createMessageIntentHandler(\n sendMessage: (message: string) => void | Promise<void>,\n): UseMCPUIIntentsConfig {\n return {\n onIntent: async (action, data) => {\n const dataStr = data ? ` with ${JSON.stringify(data)}` : \"\";\n await sendMessage(`User action: ${action}${dataStr}`);\n },\n onPrompt: (text) => {\n sendMessage(text);\n },\n onNotify: (message, level) => {\n // Convert notifications to messages\n if (level === \"error\") {\n sendMessage(`Error: ${message}`);\n }\n },\n };\n}\n\n/**\n * Create an intent handler that integrates with a tool executor\n *\n * This connects MCP-UI tool intents directly to useMCPTools\n * for seamless tool chaining.\n *\n * @example\n * ```tsx\n * const { callTool } = useMCPTools({ ... });\n * const { handleIntent } = useMCPUIIntents(\n * createToolIntentHandler(callTool)\n * );\n * ```\n */\nexport function createToolIntentHandler(\n callTool: (name: string, args?: Record<string, unknown>) => Promise<unknown>,\n): UseMCPUIIntentsConfig {\n return {\n onToolCall: async (name, args) => {\n await callTool(name, args);\n },\n };\n}\n\nexport type { UseMCPUIIntentsConfig, UseMCPUIIntentsReturn };\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { useCopilot } from \"../provider/CopilotProvider\";\nimport type { UIMessage } from \"../../chat\";\nimport type { ContextUsage } from \"../../core\";\n\n/**\n * Per-message token usage returned by the LLM provider.\n */\nexport interface MessageTokenUsage {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n}\n\n/**\n * Context window stats — updated reactively as messages are sent and contexts change.\n */\nexport interface ContextStats {\n /**\n * Full context usage snapshot from the last send — includes token counts and\n * percentages for every budget bucket (systemPrompt, history, toolResults, tools).\n * null until the first message is sent.\n */\n contextUsage: ContextUsage | null;\n\n /**\n * Convenience: total estimated tokens currently in the prompt (from contextUsage).\n * Falls back to a fast chars/3.5 estimate from contextChars before first send.\n */\n totalTokens: number;\n\n /**\n * Convenience: percentage of context window used (0–1).\n * 0 until first send.\n */\n usagePercent: number;\n\n /** Total characters currently in the AI context (system prompt contribution). */\n contextChars: number;\n\n /** Number of tools currently registered in the agent loop. */\n toolCount: number;\n\n /** Number of visible (non-system) messages in the active thread. */\n messageCount: number;\n\n /**\n * Actual token usage from the last assistant message metadata (if provider returned it).\n * null if not available.\n */\n lastResponseUsage: MessageTokenUsage | null;\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction getLastResponseUsage(messages: UIMessage[]): MessageTokenUsage | null {\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i];\n if (msg.role === \"assistant\" && msg.metadata?.usage) {\n const u = msg.metadata.usage as {\n prompt_tokens?: number;\n completion_tokens?: number;\n total_tokens?: number;\n };\n const prompt = u.prompt_tokens ?? 0;\n const completion = u.completion_tokens ?? 0;\n return {\n prompt_tokens: prompt,\n completion_tokens: completion,\n total_tokens: u.total_tokens ?? prompt + completion,\n };\n }\n }\n return null;\n}\n\n// ── Hook ─────────────────────────────────────────────────────────────────────\n\n/**\n * useContextStats — live snapshot of the AI copilot's context window usage.\n *\n * `contextUsage` is the richest field — it has full breakdown by bucket with\n * token counts and percentages, updated on every message send.\n *\n * @example\n * ```tsx\n * const { contextUsage, toolCount, totalTokens, usagePercent } = useContextStats();\n * // contextUsage.breakdown.systemPrompt.percent — % of window used by system prompt\n * // contextUsage.breakdown.history.tokens — tokens from conversation history\n * // usagePercent — overall window fill (0–1)\n * ```\n */\nexport function useContextStats(): ContextStats {\n const { contextChars, contextUsage, registeredTools, messages } =\n useCopilot();\n\n const toolCount = useMemo(() => registeredTools.length, [registeredTools]);\n\n const messageCount = useMemo(\n () => messages.filter((m) => m.role !== \"system\").length,\n [messages],\n );\n\n const totalTokens = useMemo(() => {\n if (contextUsage) return contextUsage.total.tokens;\n // fallback before first send: estimate from context chars\n return Math.ceil(contextChars / 3.5);\n }, [contextUsage, contextChars]);\n\n const usagePercent = useMemo(() => {\n if (contextUsage) return contextUsage.total.percent;\n return 0;\n }, [contextUsage]);\n\n const lastResponseUsage = useMemo(\n () => getLastResponseUsage(messages),\n [messages],\n );\n\n return {\n contextUsage,\n totalTokens,\n usagePercent,\n contextChars,\n toolCount,\n messageCount,\n lastResponseUsage,\n };\n}\n","\"use client\";\n\n/**\n * useSkill — register a skill from a React component\n *\n * Registers the skill on mount, unregisters on unmount.\n * Must be used inside <SkillProvider>.\n *\n * Only inline skills are supported client-side.\n * For file/url skills use loadSkills() on the server.\n *\n * @example\n * ```tsx\n * function CheckoutPage() {\n * useSkill({\n * name: \"checkout-flow\",\n * description: \"Guides the user through checkout\",\n * strategy: \"auto\",\n * source: {\n * type: \"inline\",\n * content: \"When helping with checkout...\",\n * },\n * });\n *\n * return <CheckoutUI />;\n * }\n * ```\n */\n\nimport { useEffect } from \"react\";\nimport { useSkillContext } from \"../skill/SkillContext\";\nimport type { SkillDefinition, ResolvedSkill } from \"../../skill-system/types\";\n\nconst DEV_CONTENT_WARN_THRESHOLD = 2000;\n\nexport function useSkill(skill: SkillDefinition): void {\n const { register, unregister } = useSkillContext();\n\n // Warn in development if inline content is too large\n if (\n process.env.NODE_ENV !== \"production\" &&\n skill.source.type === \"inline\" &&\n skill.source.content.length > DEV_CONTENT_WARN_THRESHOLD\n ) {\n console.warn(\n `[copilot-sdk/skills] Inline skill \"${skill.name}\" has ${skill.source.content.length} characters. ` +\n `Inline skills are sent on every request — keep them under ${DEV_CONTENT_WARN_THRESHOLD} characters. ` +\n `Consider using a file or URL skill instead.`,\n );\n }\n\n useEffect(() => {\n if (skill.source.type !== \"inline\") {\n console.warn(\n `[copilot-sdk/skills] useSkill only supports inline skills client-side. ` +\n `Skill \"${skill.name}\" has source type \"${skill.source.type}\" and will be skipped.`,\n );\n return;\n }\n\n const resolved: ResolvedSkill = {\n ...skill,\n content: skill.source.content,\n };\n\n register(resolved);\n\n return () => {\n unregister(skill.name);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n skill.name,\n skill.source.type === \"inline\" ? skill.source.content : \"\",\n skill.strategy,\n skill.description,\n ]);\n}\n","\"use client\";\n\n/**\n * useSkillStatus — observe the current skill registry state\n *\n * Returns a reactive snapshot of registered skills.\n * Must be used inside <SkillProvider>.\n *\n * @example\n * ```tsx\n * function DebugPanel() {\n * const { skills, count, has } = useSkillStatus();\n *\n * return (\n * <div>\n * <p>{count} skill(s) registered</p>\n * {has(\"code-review\") && <p>Code review skill active</p>}\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useCallback } from \"react\";\nimport { useSkillContext } from \"../skill/SkillContext\";\nimport type { ResolvedSkill } from \"../../skill-system/types\";\n\nexport interface UseSkillStatusReturn {\n /** All currently registered skills */\n skills: ResolvedSkill[];\n /** Number of registered skills */\n count: number;\n /** Check if a skill with the given name is registered */\n has: (name: string) => boolean;\n}\n\nexport function useSkillStatus(): UseSkillStatusReturn {\n const { skills, registry } = useSkillContext();\n\n const has = useCallback(\n (name: string) => registry.has(name),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [skills],\n );\n\n return {\n skills,\n count: skills.length,\n has,\n };\n}\n","\"use client\";\n\nimport type {\n ToolPermission,\n PermissionStorageAdapter,\n PermissionStorageConfig,\n PermissionLevel,\n} from \"../../core\";\n\nconst DEFAULT_KEY_PREFIX = \"yourgpt-permissions\";\n\n/**\n * Create a permission storage adapter based on config\n */\nexport function createPermissionStorage(\n config: PermissionStorageConfig,\n): PermissionStorageAdapter {\n switch (config.type) {\n case \"localStorage\":\n return createBrowserStorageAdapter(\n typeof window !== \"undefined\" ? localStorage : null,\n config.keyPrefix,\n );\n case \"sessionStorage\":\n return createBrowserStorageAdapter(\n typeof window !== \"undefined\" ? sessionStorage : null,\n config.keyPrefix,\n );\n case \"memory\":\n default:\n return createMemoryStorageAdapter();\n }\n}\n\n/**\n * Browser storage adapter (localStorage or sessionStorage)\n */\nfunction createBrowserStorageAdapter(\n storage: Storage | null,\n keyPrefix = DEFAULT_KEY_PREFIX,\n): PermissionStorageAdapter {\n const getStorageKey = () => keyPrefix;\n\n const loadPermissions = (): Map<string, ToolPermission> => {\n if (!storage) return new Map();\n try {\n const data = storage.getItem(getStorageKey());\n if (!data) return new Map();\n const parsed = JSON.parse(data) as ToolPermission[];\n return new Map(parsed.map((p) => [p.toolName, p]));\n } catch {\n return new Map();\n }\n };\n\n const savePermissions = (permissions: Map<string, ToolPermission>): void => {\n if (!storage) return;\n try {\n storage.setItem(\n getStorageKey(),\n JSON.stringify(Array.from(permissions.values())),\n );\n } catch (e) {\n console.warn(\"[PermissionStorage] Failed to save permissions:\", e);\n }\n };\n\n return {\n async get(toolName: string): Promise<ToolPermission | null> {\n const permissions = loadPermissions();\n return permissions.get(toolName) || null;\n },\n\n async set(permission: ToolPermission): Promise<void> {\n const permissions = loadPermissions();\n permissions.set(permission.toolName, permission);\n savePermissions(permissions);\n },\n\n async remove(toolName: string): Promise<void> {\n const permissions = loadPermissions();\n permissions.delete(toolName);\n savePermissions(permissions);\n },\n\n async getAll(): Promise<ToolPermission[]> {\n const permissions = loadPermissions();\n return Array.from(permissions.values());\n },\n\n async clear(): Promise<void> {\n if (!storage) return;\n storage.removeItem(getStorageKey());\n },\n };\n}\n\n/**\n * In-memory storage adapter (for SSR or testing)\n */\nfunction createMemoryStorageAdapter(): PermissionStorageAdapter {\n const permissions = new Map<string, ToolPermission>();\n\n return {\n async get(toolName: string): Promise<ToolPermission | null> {\n return permissions.get(toolName) || null;\n },\n\n async set(permission: ToolPermission): Promise<void> {\n permissions.set(permission.toolName, permission);\n },\n\n async remove(toolName: string): Promise<void> {\n permissions.delete(toolName);\n },\n\n async getAll(): Promise<ToolPermission[]> {\n return Array.from(permissions.values());\n },\n\n async clear(): Promise<void> {\n permissions.clear();\n },\n };\n}\n\n/**\n * Create a session-only permission cache\n * Used for \"session\" permission level (in-memory, cleared on page close)\n */\nexport function createSessionPermissionCache(): Map<string, PermissionLevel> {\n return new Map<string, PermissionLevel>();\n}\n","/**\n * ReactChat - React-specific wrapper for AbstractChat\n *\n * This class extends the new AbstractChat from @yourgpt/copilot-sdk-chat\n * and injects ReactChatState for React-specific state management.\n *\n * Pattern inspired by Vercel AI SDK's Chat class.\n */\n\nimport {\n AbstractChat,\n type ChatConfig,\n type ChatCallbacks,\n type UIMessage,\n type ChatInit,\n type ChatEventHandler,\n} from \"../../chat\";\nimport { ReactChatState } from \"./ReactChatState\";\nimport type { BranchInfo } from \"../../chat/branching\";\n\n/**\n * Chat status for UI state\n */\nexport type ChatStatus = \"ready\" | \"submitted\" | \"streaming\" | \"error\";\n\n/**\n * ReactChat configuration\n */\nexport interface ReactChatConfig {\n /** Runtime API endpoint */\n runtimeUrl: string;\n /** System prompt */\n systemPrompt?: string;\n /** LLM configuration */\n llm?: ChatConfig[\"llm\"];\n /** Thread ID */\n threadId?: string;\n /** Enable streaming (default: true) */\n streaming?: boolean;\n /** Request headers */\n headers?: Record<string, string>;\n /** Initial messages */\n initialMessages?: UIMessage[];\n /** Debug mode */\n debug?: boolean;\n /** Callbacks */\n callbacks?: ChatCallbacks<UIMessage>;\n}\n\n/**\n * ReactChat extends AbstractChat with React-specific state management.\n *\n * Uses ReactChatState which implements ChatState interface with\n * callback-based reactivity for useSyncExternalStore.\n *\n * @example\n * ```tsx\n * const chatRef = useRef(new ReactChat(config));\n *\n * const messages = useSyncExternalStore(\n * chatRef.current.subscribe,\n * () => chatRef.current.messages\n * );\n * ```\n */\nexport class ReactChat extends AbstractChat<UIMessage> {\n private reactState: ReactChatState<UIMessage>;\n\n constructor(config: ReactChatConfig) {\n // Create React-specific state\n const reactState = new ReactChatState<UIMessage>(config.initialMessages);\n\n // Build ChatInit for AbstractChat\n const init: ChatInit<UIMessage> = {\n runtimeUrl: config.runtimeUrl,\n systemPrompt: config.systemPrompt,\n llm: config.llm,\n threadId: config.threadId,\n streaming: config.streaming ?? true,\n headers: config.headers,\n initialMessages: config.initialMessages,\n state: reactState,\n callbacks: config.callbacks,\n debug: config.debug,\n };\n\n super(init);\n this.reactState = reactState;\n }\n\n // ============================================\n // Subscribe (for useSyncExternalStore)\n // ============================================\n\n /**\n * Subscribe to state changes.\n * Returns an unsubscribe function.\n *\n * @example\n * ```tsx\n * const messages = useSyncExternalStore(\n * chat.subscribe,\n * () => chat.messages\n * );\n * ```\n */\n subscribe = (callback: () => void): (() => void) => {\n return this.reactState.subscribe(callback);\n };\n\n // ============================================\n // Event handling shortcuts\n // ============================================\n\n /**\n * Subscribe to tool calls events\n */\n onToolCalls(handler: ChatEventHandler<\"toolCalls\">): () => void {\n return this.on(\"toolCalls\", handler);\n }\n\n /**\n * Subscribe to done events\n */\n onDone(handler: ChatEventHandler<\"done\">): () => void {\n return this.on(\"done\", handler);\n }\n\n /**\n * Subscribe to error events\n */\n onError(handler: ChatEventHandler<\"error\">): () => void {\n return this.on(\"error\", handler);\n }\n\n // ============================================\n // Branching API — pass-throughs to ReactChatState\n // ============================================\n\n /**\n * Navigate to a sibling branch (makes it the active path).\n */\n switchBranch(messageId: string): void {\n this.reactState.switchBranch(messageId);\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.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 // Override dispose to clean up state\n // ============================================\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 ReactChat instance\n */\nexport function createReactChat(config: ReactChatConfig): ReactChat {\n return new ReactChat(config);\n}\n","\"use client\";\n\n/**\n * useChat - React hook for chat functionality\n *\n * This hook uses ReactChat with useSyncExternalStore for optimal\n * React integration. Inspired by Vercel AI SDK's useChat pattern.\n */\n\nimport {\n useRef,\n useSyncExternalStore,\n useCallback,\n useEffect,\n useState,\n} from \"react\";\nimport { ReactChat, createReactChat, type ReactChatConfig } from \"./ReactChat\";\nimport type { UIMessage, ChatStatus } from \"../../chat\";\nimport type { MessageAttachment } from \"../../core\";\nimport type { BranchInfo } from \"../../chat/branching\";\n\n/**\n * Hook configuration\n */\nexport interface UseChatConfig extends Omit<ReactChatConfig, \"callbacks\"> {\n /** Callback when messages change */\n onMessagesChange?: (messages: UIMessage[]) => void;\n /** Callback when error occurs */\n onError?: (error: Error | null) => void;\n /** Callback when generation finishes */\n onFinish?: (messages: UIMessage[]) => void;\n /** Callback when tool calls are received */\n onToolCalls?: (toolCalls: UIMessage[\"toolCalls\"]) => void;\n}\n\n/**\n * Hook return type\n */\nexport interface UseChatReturn {\n /** All messages (visible path — active branch only) */\n messages: UIMessage[];\n /** Current status */\n status: ChatStatus;\n /** Current error */\n error: Error | undefined;\n /** Whether loading */\n isLoading: boolean;\n /** Current input value */\n input: string;\n /** Set input value */\n setInput: (input: string) => void;\n /** Send a message */\n sendMessage: (\n content: string,\n attachments?: MessageAttachment[],\n ) => Promise<void>;\n /** Stop generation */\n stop: () => void;\n /** Clear all messages */\n clearMessages: () => void;\n /** Set messages directly */\n setMessages: (messages: UIMessage[]) => void;\n /** Regenerate last response (branch-aware: preserves original as sibling) */\n regenerate: (messageId?: string) => Promise<void>;\n /** Continue with tool results */\n continueWithToolResults: (\n toolResults: Array<{ toolCallId: string; result: unknown }>,\n ) => Promise<void>;\n /** Reference to the ReactChat instance */\n chatRef: React.RefObject<ReactChat | null>;\n\n // ============================================\n // Branching API\n // ============================================\n\n /**\n * Navigate to a sibling branch (← / → navigation).\n * Only populated when chat is branch-aware.\n */\n switchBranch?: (messageId: string) => void;\n\n /**\n * Get branch navigation info for a message.\n * Returns null if the message has no siblings.\n * Only populated when chat is branch-aware.\n */\n getBranchInfo?: (messageId: string) => BranchInfo | null;\n\n /**\n * Edit a user message: sends newContent as a new branch from the same\n * parent as the original message. Preserves the original message in place.\n * Only populated when chat is branch-aware.\n */\n editMessage?: (messageId: string, newContent: string) => Promise<void>;\n\n /**\n * Whether any message has siblings (branching has occurred).\n */\n hasBranches?: boolean;\n}\n\n/**\n * useChat - Thin React wrapper using useSyncExternalStore\n *\n * This hook is designed to be minimal (~100 lines like Vercel AI SDK).\n * All business logic lives in ReactChat/AbstractChat.\n *\n * @example\n * ```tsx\n * const { messages, sendMessage, status } = useChat({\n * runtimeUrl: \"/api/chat\",\n * });\n *\n * return (\n * <div>\n * {messages.map(m => <Message key={m.id} message={m} />)}\n * <button onClick={() => sendMessage(\"Hello!\")}>Send</button>\n * </div>\n * );\n * ```\n */\nexport function useChat(config: UseChatConfig): UseChatReturn {\n // Create and store ReactChat instance\n const chatRef = useRef<ReactChat | null>(null);\n\n // Local input state (UI concern)\n const [input, setInput] = useState(\"\");\n\n // Revive if disposed (React StrictMode compatibility)\n if (chatRef.current !== null && chatRef.current.disposed) {\n chatRef.current.revive();\n }\n\n // Initialize chat on first render\n if (chatRef.current === null) {\n chatRef.current = createReactChat({\n runtimeUrl: config.runtimeUrl,\n systemPrompt: config.systemPrompt,\n llm: config.llm,\n threadId: config.threadId,\n streaming: config.streaming,\n headers: config.headers,\n initialMessages: config.initialMessages,\n debug: config.debug,\n callbacks: {\n onMessagesChange: config.onMessagesChange,\n onError: config.onError,\n onFinish: config.onFinish,\n onToolCalls: config.onToolCalls,\n },\n });\n }\n\n // Subscribe to all state changes with useSyncExternalStore\n const messages = useSyncExternalStore(\n chatRef.current.subscribe,\n () => chatRef.current!.messages,\n () => chatRef.current!.messages, // Server snapshot\n );\n\n const status = useSyncExternalStore(\n chatRef.current.subscribe,\n () => chatRef.current!.status,\n () => \"ready\" as ChatStatus, // Server snapshot\n );\n\n const error = useSyncExternalStore(\n chatRef.current.subscribe,\n () => chatRef.current!.error,\n () => undefined, // Server snapshot\n );\n\n const hasBranches = useSyncExternalStore(\n chatRef.current.subscribe,\n () => chatRef.current!.hasBranches,\n () => false,\n );\n\n // Derived state\n const isLoading = status === \"streaming\" || status === \"submitted\";\n\n // Actions (stable references)\n const sendMessage = useCallback(\n async (content: string, attachments?: MessageAttachment[]) => {\n await chatRef.current?.sendMessage(content, attachments);\n setInput(\"\"); // Clear input after sending\n },\n [],\n );\n\n const stop = useCallback(() => {\n chatRef.current?.stop();\n }, []);\n\n const clearMessages = useCallback(() => {\n chatRef.current?.clearMessages();\n }, []);\n\n const setMessages = useCallback((messages: UIMessage[]) => {\n chatRef.current?.setMessages(messages);\n }, []);\n\n const regenerate = useCallback(async (messageId?: string) => {\n await chatRef.current?.regenerate(messageId);\n }, []);\n\n const continueWithToolResults = useCallback(\n async (toolResults: Array<{ toolCallId: string; result: unknown }>) => {\n await chatRef.current?.continueWithToolResults(toolResults);\n },\n [],\n );\n\n // Branching actions\n const switchBranch = useCallback((messageId: string) => {\n chatRef.current?.switchBranch(messageId);\n }, []);\n\n const getBranchInfo = useCallback(\n (messageId: string): BranchInfo | null => {\n return chatRef.current?.getBranchInfo(messageId) ?? null;\n },\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 setInput(\"\");\n },\n [],\n );\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n chatRef.current?.dispose();\n };\n }, []);\n\n return {\n messages,\n status,\n error,\n isLoading,\n input,\n setInput,\n sendMessage,\n stop,\n clearMessages,\n setMessages,\n regenerate,\n continueWithToolResults,\n chatRef,\n // Branching\n switchBranch,\n getBranchInfo,\n editMessage,\n hasBranches,\n };\n}\n","/**\n * defineSkill — type-safe skill factory\n *\n * Identity function with type inference. Same pattern as useTool.\n *\n * @example\n * ```ts\n * const brandVoice = defineSkill({\n * name: \"brand-voice\",\n * description: \"Ensures responses match our brand tone\",\n * strategy: \"eager\",\n * source: {\n * type: \"inline\",\n * content: \"Always respond in a friendly, concise tone...\",\n * },\n * });\n *\n * // Use in SkillProvider\n * <SkillProvider skills={[brandVoice]}>\n * <App />\n * </SkillProvider>\n * ```\n */\n\nimport type { SkillDefinition } from \"../../skill-system/types\";\n\nexport function defineSkill(def: SkillDefinition): SkillDefinition {\n return def;\n}\n"]}