@yourgpt/copilot-sdk 2.1.6 → 2.1.7

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../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/useThread.ts","../src/react/hooks/useMCPUIIntents.ts","../src/react/hooks/useContextStats.ts","../src/react/hooks/useSkill.ts","../src/react/hooks/useSkillStatus.ts","../src/react/hooks/useMessageCheckpoints.ts","../src/react/utils/permission-storage.ts","../src/react/internal/ReactChat.ts","../src/react/internal/useChat.ts","../src/react/skill/define-skill.ts","../src/react/hooks/useCopilotEvent.ts","../src/react/hooks/useMessageMeta.ts"],"names":["useEffect","tool","useRef","useMemo","useCallback","useState","useSyncExternalStore","messages"],"mappings":"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","file":"chunk-SMNZHZM7.js","sourcesContent":["\"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","/**\n * useThread — Session/thread management hook\n *\n * Provides clean semantics for managing the active session/thread.\n * When yourgptConfig or onCreateSession is configured, the session ID\n * IS the thread ID — they are the same identity.\n *\n * Use this hook instead of calling setActiveThread/renewSession directly.\n */\n\nimport { useCopilot } from \"../provider/CopilotProvider\";\n\nexport interface UseThreadReturn {\n /**\n * Current session/thread ID.\n * undefined until the first session is created (new thread not yet sent).\n */\n threadId: string | undefined;\n\n /**\n * Current session creation status.\n * - \"idle\" — no session config, or threadId already set\n * - \"creating\" — session creation request in flight\n * - \"ready\" — threadId is set and usable\n * - \"error\" — session creation failed\n */\n sessionStatus: \"idle\" | \"creating\" | \"ready\" | \"error\";\n\n /**\n * Switch to an existing thread/session.\n * Pass the session ID from your persistence layer — it is used as-is,\n * no new session creation call is made.\n */\n switchThread: (sessionId: string) => void;\n\n /**\n * Start a fresh thread.\n * Clears the current session; a new session is created on the next sendMessage.\n * onThreadChange fires with the new session ID once it is assigned.\n */\n newThread: () => void;\n\n /**\n * Force a new session to be created on the next sendMessage.\n * Call this when the current session has expired or credits are exhausted.\n * onThreadChange fires with the new session ID once it is assigned.\n */\n renewSession: () => void;\n}\n\n/**\n * useThread — Clean hook for session/thread management\n *\n * @example\n * ```tsx\n * function ChatHeader() {\n * const { threadId, sessionStatus, newThread, switchThread, renewSession } = useThread();\n *\n * const loadThread = (stored: { sessionId: string }) => {\n * switchThread(stored.sessionId); // session ID IS the thread ID\n * };\n *\n * return (\n * <>\n * {sessionStatus === \"creating\" && <Spinner />}\n * <button onClick={newThread}>New Chat</button>\n * </>\n * );\n * }\n * ```\n */\nexport function useThread(): UseThreadReturn {\n const { threadId, setActiveThread, renewSession, sessionStatus } =\n useCopilot();\n\n return {\n threadId,\n sessionStatus,\n switchThread: setActiveThread,\n newThread: () => setActiveThread(null),\n renewSession,\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 { useCallback, useEffect, useMemo, useReducer, useRef } from \"react\";\nimport { useCopilot } from \"../provider/CopilotProvider\";\nimport type { UIMessage } from \"../../chat\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface MessageCheckpoint {\n /** Unique checkpoint ID */\n id: string;\n /** ID of the user message that triggered this checkpoint */\n messageId: string;\n /** When this checkpoint was created */\n timestamp: number;\n /** Optional human-readable label */\n label?: string;\n /** Full message list BEFORE the user message was processed */\n messages: UIMessage[];\n}\n\nexport interface UseMessageCheckpointsReturn {\n /** All saved checkpoints, oldest first */\n checkpoints: MessageCheckpoint[];\n /** True if a checkpoint exists for the given user message ID */\n hasCheckpoint: (messageId: string) => boolean;\n /** Get the checkpoint for a user message ID, or undefined */\n getCheckpoint: (messageId: string) => MessageCheckpoint | undefined;\n /**\n * Restore chat to the state before the user message with the given ID.\n * Returns the checkpoint if found, undefined otherwise.\n * Checkpoints created after this one are pruned.\n */\n restore: (messageId: string) => MessageCheckpoint | undefined;\n /**\n * Manually save a checkpoint for a message ID.\n * Auto-save already runs on every new user message — use this for\n * programmatic checkpoints (e.g. before a destructive tool call).\n */\n save: (messageId: string, label?: string) => MessageCheckpoint | undefined;\n /** Clear all saved checkpoints */\n clear: () => void;\n}\n\n// ─── Hook ─────────────────────────────────────────────────────────────────────\n\n/**\n * useMessageCheckpoints\n *\n * Automatically saves a checkpoint before each user message is sent to the\n * agent. Each checkpoint captures the full chat state that existed BEFORE\n * that user message, so restoring it rolls the conversation back to exactly\n * that point.\n *\n * Generic — works for any agentic app (flow builders, code editors, document\n * assistants, etc.). App-specific side effects (e.g. restoring a canvas or\n * database state) can be layered on top via the returned `restore` value.\n *\n * @example\n * ```tsx\n * // Inside <CopilotChat> children\n * function MyCheckpointActions() {\n * const { hasCheckpoint, restore } = useMessageCheckpoints();\n * return (\n * <CopilotChat.MessageActions role=\"user\">\n * <CopilotChat.Action\n * icon={<RotateCcw className=\"size-3.5\" />}\n * tooltip=\"Restore to before this message\"\n * onClick={({ message }) => restore(message.id)}\n * hidden={({ message }) => !hasCheckpoint(message.id)}\n * />\n * </CopilotChat.MessageActions>\n * );\n * }\n * ```\n */\nexport function useMessageCheckpoints(): UseMessageCheckpointsReturn {\n const { messages, setMessages } = useCopilot();\n\n // messageId → checkpoint\n const checkpointMapRef = useRef<Map<string, MessageCheckpoint>>(new Map());\n // How many user messages we've seen so far\n const prevUserMsgCountRef = useRef(0);\n // Revision counter drives re-renders of consumers\n const [revision, bump] = useReducer((n: number) => n + 1, 0);\n\n // ── Auto-save on new user message ──────────────────────────────────────────\n useEffect(() => {\n const userMessages = messages.filter((m) => m.role === \"user\");\n const count = userMessages.length;\n\n if (count > prevUserMsgCountRef.current) {\n const newUserMsg = userMessages[count - 1];\n\n if (!checkpointMapRef.current.has(newUserMsg.id)) {\n const msgIndex = messages.findIndex((m) => m.id === newUserMsg.id);\n checkpointMapRef.current.set(newUserMsg.id, {\n id: `cp_${newUserMsg.id}`,\n messageId: newUserMsg.id,\n timestamp: Date.now(),\n messages: structuredClone(messages.slice(0, msgIndex)),\n });\n bump();\n }\n\n prevUserMsgCountRef.current = count;\n }\n }, [messages]);\n\n // ── API ────────────────────────────────────────────────────────────────────\n\n const hasCheckpoint = useCallback(\n (messageId: string) => checkpointMapRef.current.has(messageId),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [revision],\n );\n\n const getCheckpoint = useCallback(\n (messageId: string) => checkpointMapRef.current.get(messageId),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [revision],\n );\n\n const restore = useCallback(\n (messageId: string): MessageCheckpoint | undefined => {\n const cp = checkpointMapRef.current.get(messageId);\n if (!cp) return undefined;\n\n // Roll back chat messages\n setMessages(cp.messages);\n\n // Prune checkpoints that came after this point\n checkpointMapRef.current.forEach((c, k) => {\n if (c.timestamp > cp.timestamp) checkpointMapRef.current.delete(k);\n });\n prevUserMsgCountRef.current = cp.messages.filter(\n (m) => m.role === \"user\",\n ).length;\n\n bump();\n return cp;\n },\n [setMessages],\n );\n\n const save = useCallback(\n (messageId: string, label?: string): MessageCheckpoint | undefined => {\n const msgIndex = messages.findIndex((m) => m.id === messageId);\n if (msgIndex === -1) return undefined;\n\n const cp: MessageCheckpoint = {\n id: `cp_${messageId}`,\n messageId,\n timestamp: Date.now(),\n label,\n messages: structuredClone(messages.slice(0, msgIndex)),\n };\n checkpointMapRef.current.set(messageId, cp);\n bump();\n return cp;\n },\n [messages],\n );\n\n const clear = useCallback(() => {\n checkpointMapRef.current.clear();\n prevUserMsgCountRef.current = 0;\n bump();\n }, []);\n\n const checkpoints = useMemo(\n () =>\n Array.from(checkpointMapRef.current.values()).sort(\n (a, b) => a.timestamp - b.timestamp,\n ),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [revision],\n );\n\n return { checkpoints, hasCheckpoint, getCheckpoint, restore, save, clear };\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 type YourGPTConfig,\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 /** Called once before first message to obtain a session/thread ID */\n onCreateSession?: () => string | Promise<string>;\n /** YourGPT config — enables automatic session creation */\n yourgptConfig?: YourGPTConfig;\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 onCreateSession: config.onCreateSession,\n yourgptConfig: config.yourgptConfig,\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 const isThreadIdControlled = Object.prototype.hasOwnProperty.call(\n config,\n \"threadId\",\n );\n const lastControlledThreadIdRef = useRef<{\n controlled: boolean;\n value: string | undefined;\n }>({\n controlled: isThreadIdControlled,\n value: config.threadId,\n });\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 onCreateSession: config.onCreateSession,\n yourgptConfig: config.yourgptConfig,\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 // Keep the chat instance aligned with controlled threadId prop changes.\n useEffect(() => {\n const prev = lastControlledThreadIdRef.current;\n const controlChanged = prev.controlled !== isThreadIdControlled;\n const valueChanged = prev.value !== config.threadId;\n\n if (!controlChanged && !valueChanged) {\n return;\n }\n\n lastControlledThreadIdRef.current = {\n controlled: isThreadIdControlled,\n value: config.threadId,\n };\n\n if (!isThreadIdControlled) {\n return;\n }\n\n chatRef.current?.setActiveThread(config.threadId ?? null);\n }, [config.threadId, isThreadIdControlled]);\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((messageId: string): BranchInfo | null => {\n return chatRef.current?.getBranchInfo(messageId) ?? null;\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","\"use client\";\n\n/**\n * useCopilotEvent — subscribe to raw stream events from the SDK\n *\n * Gives headless consumers direct access to every chunk that flows through\n * the streaming pipeline. Use this to build custom real-time UI without\n * depending on any built-in SDK components.\n *\n * @example — custom thinking step parser\n * ```tsx\n * useCopilotEvent('thinking:delta', (e) => {\n * setThinking(prev => prev + e.content)\n * })\n * ```\n *\n * @example — tool execution badge\n * ```tsx\n * useCopilotEvent('action:start', (e) => setActiveTool(e.name))\n * useCopilotEvent('action:end', (e) => setActiveTool(null))\n * ```\n *\n * @example — loop iteration counter\n * ```tsx\n * useCopilotEvent('loop:iteration', (e) => {\n * setProgress(e.iteration / e.maxIterations)\n * })\n * ```\n *\n * @example — catch-all (every chunk type)\n * ```tsx\n * useCopilotEvent('*', (e) => console.log(e.type, e))\n * ```\n */\n\nimport { useEffect, useRef } from \"react\";\nimport { useCopilot } from \"../provider/CopilotProvider\";\nimport type { StreamChunkWithMessageId } from \"../provider/CopilotProvider\";\nimport type { StreamChunk } from \"../../chat\";\n\n// Extract the 'type' discriminant from StreamChunk\ntype StreamChunkType = StreamChunk[\"type\"];\n\n// Map from event type → the specific chunk shape for that type\ntype ChunkOfType<T extends StreamChunkType | \"*\"> = T extends \"*\"\n ? StreamChunkWithMessageId\n : Extract<StreamChunk, { type: T }> & { messageId?: string };\n\n/**\n * Subscribe to a specific stream event type (or all events with '*').\n *\n * The handler is called synchronously during streaming — keep it fast.\n * Handler identity doesn't need to be stable; the hook re-subscribes\n * automatically when it changes.\n *\n * @param eventType - Stream chunk type to listen for, or '*' for all\n * @param handler - Callback invoked for each matching chunk\n */\nexport function useCopilotEvent<T extends StreamChunkType | \"*\">(\n eventType: T,\n handler: (chunk: ChunkOfType<T>) => void,\n): void {\n const { subscribeToStreamEvents } = useCopilot();\n\n // Always use latest handler without resubscribing\n const handlerRef = useRef(handler);\n handlerRef.current = handler;\n\n useEffect(() => {\n const unsub = subscribeToStreamEvents((chunk) => {\n if (eventType === \"*\" || chunk.type === eventType) {\n handlerRef.current(chunk as ChunkOfType<T>);\n }\n });\n return unsub;\n // eventType changes → resubscribe; handler changes → ref updated, no resubscribe\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [subscribeToStreamEvents, eventType]);\n}\n","\"use client\";\n\n/**\n * useMessageMeta — reactive per-message custom metadata store\n *\n * Attach any data to a message ID and have all components reading that\n * message ID re-render automatically. The SDK has zero opinion on the shape —\n * consumers define their own types via the generic parameter.\n *\n * This is the companion to useCopilotEvent(): events flow in, you store what\n * you need here, and your UI reacts.\n *\n * @example — store thinking steps parsed from stream events\n * ```tsx\n * interface MyMeta {\n * thinkingSteps?: ThinkingStep[]\n * artifacts?: Artifact[]\n * planStatus?: 'pending' | 'approved' | 'rejected'\n * }\n *\n * // Writer — anywhere in your app (e.g. inside useCopilotEvent handler)\n * const { updateMeta } = useMessageMeta<MyMeta>(messageId)\n * updateMeta(prev => ({\n * ...prev,\n * thinkingSteps: [...(prev.thinkingSteps ?? []), newStep]\n * }))\n *\n * // Reader — in your message component\n * const { meta } = useMessageMeta<MyMeta>(message.id)\n * const steps = meta.thinkingSteps ?? []\n * ```\n *\n * @example — artifact tracking\n * ```tsx\n * useCopilotEvent('action:end', (e) => {\n * if (e.name === 'create_artifact' && e.result) {\n * updateMeta(e.messageId!, prev => ({\n * ...prev,\n * artifacts: [...(prev.artifacts ?? []), e.result]\n * }))\n * }\n * })\n * ```\n */\n\nimport { useSyncExternalStore, useCallback } from \"react\";\nimport { useCopilot } from \"../provider/CopilotProvider\";\n\n// Stable empty object for messageId=undefined — avoids new reference each render\nconst EMPTY_META: Record<string, unknown> = {};\n\nexport interface UseMessageMetaReturn<T extends Record<string, unknown>> {\n /** Current metadata for this message. Empty object if nothing set yet. */\n meta: T;\n /**\n * Replace metadata entirely.\n */\n setMeta: (meta: T) => void;\n /**\n * Merge/update metadata using an updater function.\n * Receives previous meta, return next meta.\n */\n updateMeta: (updater: (prev: T) => T) => void;\n}\n\n/**\n * Read and write custom metadata for a specific message ID.\n *\n * @param messageId - The message to attach metadata to.\n * Pass undefined to get a no-op instance (safe for conditional use).\n */\nexport function useMessageMeta<\n T extends Record<string, unknown> = Record<string, unknown>,\n>(messageId: string | undefined): UseMessageMetaReturn<T> {\n const { messageMeta } = useCopilot();\n\n // Subscribe to store changes — only re-render when this messageId's data changes\n const meta = useSyncExternalStore(\n messageMeta.subscribe,\n () =>\n messageId ? (messageMeta.getMeta(messageId) as T) : (EMPTY_META as T),\n () => EMPTY_META as T,\n );\n\n const setMeta = useCallback(\n (next: T) => {\n if (!messageId) return;\n messageMeta.setMeta(messageId, next as Record<string, unknown>);\n },\n [messageMeta, messageId],\n );\n\n const updateMeta = useCallback(\n (updater: (prev: T) => T) => {\n if (!messageId) return;\n messageMeta.updateMeta(\n messageId,\n (prev) => updater(prev as T) as Record<string, unknown>,\n );\n },\n [messageMeta, messageId],\n );\n\n return { meta, setMeta, updateMeta };\n}\n"]}
1
+ {"version":3,"sources":["../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/useThread.ts","../src/react/hooks/useMCPUIIntents.ts","../src/react/hooks/useContextStats.ts","../src/react/hooks/useSkill.ts","../src/react/hooks/useSkillStatus.ts","../src/react/hooks/useMessageCheckpoints.ts","../src/react/utils/permission-storage.ts","../src/react/internal/ReactChat.ts","../src/react/internal/useChat.ts","../src/react/skill/define-skill.ts","../src/react/hooks/useCopilotEvent.ts","../src/react/hooks/useMessageMeta.ts"],"names":["useEffect","tool","useRef","useMemo","useCallback","useState","useSyncExternalStore","messages"],"mappings":"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","file":"chunk-H3LX6FTP.js","sourcesContent":["\"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","/**\n * useThread — Session/thread management hook\n *\n * Provides clean semantics for managing the active session/thread.\n * When yourgptConfig or onCreateSession is configured, the session ID\n * IS the thread ID — they are the same identity.\n *\n * Use this hook instead of calling setActiveThread/renewSession directly.\n */\n\nimport { useCopilot } from \"../provider/CopilotProvider\";\n\nexport interface UseThreadReturn {\n /**\n * Current session/thread ID.\n * undefined until the first session is created (new thread not yet sent).\n */\n threadId: string | undefined;\n\n /**\n * Current session creation status.\n * - \"idle\" — no session config, or threadId already set\n * - \"creating\" — session creation request in flight\n * - \"ready\" — threadId is set and usable\n * - \"error\" — session creation failed\n */\n sessionStatus: \"idle\" | \"creating\" | \"ready\" | \"error\";\n\n /**\n * Switch to an existing thread/session.\n * Pass the session ID from your persistence layer — it is used as-is,\n * no new session creation call is made.\n */\n switchThread: (sessionId: string) => void;\n\n /**\n * Start a fresh thread.\n * Clears the current session; a new session is created on the next sendMessage.\n * onThreadChange fires with the new session ID once it is assigned.\n */\n newThread: () => void;\n\n /**\n * Force a new session to be created on the next sendMessage.\n * Call this when the current session has expired or credits are exhausted.\n * onThreadChange fires with the new session ID once it is assigned.\n */\n renewSession: () => void;\n}\n\n/**\n * useThread — Clean hook for session/thread management\n *\n * @example\n * ```tsx\n * function ChatHeader() {\n * const { threadId, sessionStatus, newThread, switchThread, renewSession } = useThread();\n *\n * const loadThread = (stored: { sessionId: string }) => {\n * switchThread(stored.sessionId); // session ID IS the thread ID\n * };\n *\n * return (\n * <>\n * {sessionStatus === \"creating\" && <Spinner />}\n * <button onClick={newThread}>New Chat</button>\n * </>\n * );\n * }\n * ```\n */\nexport function useThread(): UseThreadReturn {\n const { threadId, setActiveThread, renewSession, sessionStatus } =\n useCopilot();\n\n return {\n threadId,\n sessionStatus,\n switchThread: setActiveThread,\n newThread: () => setActiveThread(null),\n renewSession,\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 { useCallback, useEffect, useMemo, useReducer, useRef } from \"react\";\nimport { useCopilot } from \"../provider/CopilotProvider\";\nimport type { UIMessage } from \"../../chat\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface MessageCheckpoint {\n /** Unique checkpoint ID */\n id: string;\n /** ID of the user message that triggered this checkpoint */\n messageId: string;\n /** When this checkpoint was created */\n timestamp: number;\n /** Optional human-readable label */\n label?: string;\n /** Full message list BEFORE the user message was processed */\n messages: UIMessage[];\n}\n\nexport interface UseMessageCheckpointsReturn {\n /** All saved checkpoints, oldest first */\n checkpoints: MessageCheckpoint[];\n /** True if a checkpoint exists for the given user message ID */\n hasCheckpoint: (messageId: string) => boolean;\n /** Get the checkpoint for a user message ID, or undefined */\n getCheckpoint: (messageId: string) => MessageCheckpoint | undefined;\n /**\n * Restore chat to the state before the user message with the given ID.\n * Returns the checkpoint if found, undefined otherwise.\n * Checkpoints created after this one are pruned.\n */\n restore: (messageId: string) => MessageCheckpoint | undefined;\n /**\n * Manually save a checkpoint for a message ID.\n * Auto-save already runs on every new user message — use this for\n * programmatic checkpoints (e.g. before a destructive tool call).\n */\n save: (messageId: string, label?: string) => MessageCheckpoint | undefined;\n /** Clear all saved checkpoints */\n clear: () => void;\n}\n\n// ─── Hook ─────────────────────────────────────────────────────────────────────\n\n/**\n * useMessageCheckpoints\n *\n * Automatically saves a checkpoint before each user message is sent to the\n * agent. Each checkpoint captures the full chat state that existed BEFORE\n * that user message, so restoring it rolls the conversation back to exactly\n * that point.\n *\n * Generic — works for any agentic app (flow builders, code editors, document\n * assistants, etc.). App-specific side effects (e.g. restoring a canvas or\n * database state) can be layered on top via the returned `restore` value.\n *\n * @example\n * ```tsx\n * // Inside <CopilotChat> children\n * function MyCheckpointActions() {\n * const { hasCheckpoint, restore } = useMessageCheckpoints();\n * return (\n * <CopilotChat.MessageActions role=\"user\">\n * <CopilotChat.Action\n * icon={<RotateCcw className=\"size-3.5\" />}\n * tooltip=\"Restore to before this message\"\n * onClick={({ message }) => restore(message.id)}\n * hidden={({ message }) => !hasCheckpoint(message.id)}\n * />\n * </CopilotChat.MessageActions>\n * );\n * }\n * ```\n */\nexport function useMessageCheckpoints(): UseMessageCheckpointsReturn {\n const { messages, setMessages } = useCopilot();\n\n // messageId → checkpoint\n const checkpointMapRef = useRef<Map<string, MessageCheckpoint>>(new Map());\n // How many user messages we've seen so far\n const prevUserMsgCountRef = useRef(0);\n // Revision counter drives re-renders of consumers\n const [revision, bump] = useReducer((n: number) => n + 1, 0);\n\n // ── Auto-save on new user message ──────────────────────────────────────────\n useEffect(() => {\n const userMessages = messages.filter((m) => m.role === \"user\");\n const count = userMessages.length;\n\n if (count > prevUserMsgCountRef.current) {\n const newUserMsg = userMessages[count - 1];\n\n if (!checkpointMapRef.current.has(newUserMsg.id)) {\n const msgIndex = messages.findIndex((m) => m.id === newUserMsg.id);\n checkpointMapRef.current.set(newUserMsg.id, {\n id: `cp_${newUserMsg.id}`,\n messageId: newUserMsg.id,\n timestamp: Date.now(),\n messages: structuredClone(messages.slice(0, msgIndex)),\n });\n bump();\n }\n\n prevUserMsgCountRef.current = count;\n }\n }, [messages]);\n\n // ── API ────────────────────────────────────────────────────────────────────\n\n const hasCheckpoint = useCallback(\n (messageId: string) => checkpointMapRef.current.has(messageId),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [revision],\n );\n\n const getCheckpoint = useCallback(\n (messageId: string) => checkpointMapRef.current.get(messageId),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [revision],\n );\n\n const restore = useCallback(\n (messageId: string): MessageCheckpoint | undefined => {\n const cp = checkpointMapRef.current.get(messageId);\n if (!cp) return undefined;\n\n // Roll back chat messages\n setMessages(cp.messages);\n\n // Prune checkpoints that came after this point\n checkpointMapRef.current.forEach((c, k) => {\n if (c.timestamp > cp.timestamp) checkpointMapRef.current.delete(k);\n });\n prevUserMsgCountRef.current = cp.messages.filter(\n (m) => m.role === \"user\",\n ).length;\n\n bump();\n return cp;\n },\n [setMessages],\n );\n\n const save = useCallback(\n (messageId: string, label?: string): MessageCheckpoint | undefined => {\n const msgIndex = messages.findIndex((m) => m.id === messageId);\n if (msgIndex === -1) return undefined;\n\n const cp: MessageCheckpoint = {\n id: `cp_${messageId}`,\n messageId,\n timestamp: Date.now(),\n label,\n messages: structuredClone(messages.slice(0, msgIndex)),\n };\n checkpointMapRef.current.set(messageId, cp);\n bump();\n return cp;\n },\n [messages],\n );\n\n const clear = useCallback(() => {\n checkpointMapRef.current.clear();\n prevUserMsgCountRef.current = 0;\n bump();\n }, []);\n\n const checkpoints = useMemo(\n () =>\n Array.from(checkpointMapRef.current.values()).sort(\n (a, b) => a.timestamp - b.timestamp,\n ),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [revision],\n );\n\n return { checkpoints, hasCheckpoint, getCheckpoint, restore, save, clear };\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 type YourGPTConfig,\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 /** Called once before first message to obtain a session/thread ID */\n onCreateSession?: () => string | Promise<string>;\n /** YourGPT config — enables automatic session creation */\n yourgptConfig?: YourGPTConfig;\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 onCreateSession: config.onCreateSession,\n yourgptConfig: config.yourgptConfig,\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 const isThreadIdControlled = Object.prototype.hasOwnProperty.call(\n config,\n \"threadId\",\n );\n const lastControlledThreadIdRef = useRef<{\n controlled: boolean;\n value: string | undefined;\n }>({\n controlled: isThreadIdControlled,\n value: config.threadId,\n });\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 onCreateSession: config.onCreateSession,\n yourgptConfig: config.yourgptConfig,\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 // Keep the chat instance aligned with controlled threadId prop changes.\n useEffect(() => {\n const prev = lastControlledThreadIdRef.current;\n const controlChanged = prev.controlled !== isThreadIdControlled;\n const valueChanged = prev.value !== config.threadId;\n\n if (!controlChanged && !valueChanged) {\n return;\n }\n\n lastControlledThreadIdRef.current = {\n controlled: isThreadIdControlled,\n value: config.threadId,\n };\n\n if (!isThreadIdControlled) {\n return;\n }\n\n chatRef.current?.setActiveThread(config.threadId ?? null);\n }, [config.threadId, isThreadIdControlled]);\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((messageId: string): BranchInfo | null => {\n return chatRef.current?.getBranchInfo(messageId) ?? null;\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","\"use client\";\n\n/**\n * useCopilotEvent — subscribe to raw stream events from the SDK\n *\n * Gives headless consumers direct access to every chunk that flows through\n * the streaming pipeline. Use this to build custom real-time UI without\n * depending on any built-in SDK components.\n *\n * @example — custom thinking step parser\n * ```tsx\n * useCopilotEvent('thinking:delta', (e) => {\n * setThinking(prev => prev + e.content)\n * })\n * ```\n *\n * @example — tool execution badge\n * ```tsx\n * useCopilotEvent('action:start', (e) => setActiveTool(e.name))\n * useCopilotEvent('action:end', (e) => setActiveTool(null))\n * ```\n *\n * @example — loop iteration counter\n * ```tsx\n * useCopilotEvent('loop:iteration', (e) => {\n * setProgress(e.iteration / e.maxIterations)\n * })\n * ```\n *\n * @example — catch-all (every chunk type)\n * ```tsx\n * useCopilotEvent('*', (e) => console.log(e.type, e))\n * ```\n */\n\nimport { useEffect, useRef } from \"react\";\nimport { useCopilot } from \"../provider/CopilotProvider\";\nimport type { StreamChunkWithMessageId } from \"../provider/CopilotProvider\";\nimport type { StreamChunk } from \"../../chat\";\n\n// Extract the 'type' discriminant from StreamChunk\ntype StreamChunkType = StreamChunk[\"type\"];\n\n// Map from event type → the specific chunk shape for that type\ntype ChunkOfType<T extends StreamChunkType | \"*\"> = T extends \"*\"\n ? StreamChunkWithMessageId\n : Extract<StreamChunk, { type: T }> & { messageId?: string };\n\n/**\n * Subscribe to a specific stream event type (or all events with '*').\n *\n * The handler is called synchronously during streaming — keep it fast.\n * Handler identity doesn't need to be stable; the hook re-subscribes\n * automatically when it changes.\n *\n * @param eventType - Stream chunk type to listen for, or '*' for all\n * @param handler - Callback invoked for each matching chunk\n */\nexport function useCopilotEvent<T extends StreamChunkType | \"*\">(\n eventType: T,\n handler: (chunk: ChunkOfType<T>) => void,\n): void {\n const { subscribeToStreamEvents } = useCopilot();\n\n // Always use latest handler without resubscribing\n const handlerRef = useRef(handler);\n handlerRef.current = handler;\n\n useEffect(() => {\n const unsub = subscribeToStreamEvents((chunk) => {\n if (eventType === \"*\" || chunk.type === eventType) {\n handlerRef.current(chunk as ChunkOfType<T>);\n }\n });\n return unsub;\n // eventType changes → resubscribe; handler changes → ref updated, no resubscribe\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [subscribeToStreamEvents, eventType]);\n}\n","\"use client\";\n\n/**\n * useMessageMeta — reactive per-message custom metadata store\n *\n * Attach any data to a message ID and have all components reading that\n * message ID re-render automatically. The SDK has zero opinion on the shape —\n * consumers define their own types via the generic parameter.\n *\n * This is the companion to useCopilotEvent(): events flow in, you store what\n * you need here, and your UI reacts.\n *\n * @example — store thinking steps parsed from stream events\n * ```tsx\n * interface MyMeta {\n * thinkingSteps?: ThinkingStep[]\n * artifacts?: Artifact[]\n * planStatus?: 'pending' | 'approved' | 'rejected'\n * }\n *\n * // Writer — anywhere in your app (e.g. inside useCopilotEvent handler)\n * const { updateMeta } = useMessageMeta<MyMeta>(messageId)\n * updateMeta(prev => ({\n * ...prev,\n * thinkingSteps: [...(prev.thinkingSteps ?? []), newStep]\n * }))\n *\n * // Reader — in your message component\n * const { meta } = useMessageMeta<MyMeta>(message.id)\n * const steps = meta.thinkingSteps ?? []\n * ```\n *\n * @example — artifact tracking\n * ```tsx\n * useCopilotEvent('action:end', (e) => {\n * if (e.name === 'create_artifact' && e.result) {\n * updateMeta(e.messageId!, prev => ({\n * ...prev,\n * artifacts: [...(prev.artifacts ?? []), e.result]\n * }))\n * }\n * })\n * ```\n */\n\nimport { useSyncExternalStore, useCallback } from \"react\";\nimport { useCopilot } from \"../provider/CopilotProvider\";\n\n// Stable empty object for messageId=undefined — avoids new reference each render\nconst EMPTY_META: Record<string, unknown> = {};\n\nexport interface UseMessageMetaReturn<T extends Record<string, unknown>> {\n /** Current metadata for this message. Empty object if nothing set yet. */\n meta: T;\n /**\n * Replace metadata entirely.\n */\n setMeta: (meta: T) => void;\n /**\n * Merge/update metadata using an updater function.\n * Receives previous meta, return next meta.\n */\n updateMeta: (updater: (prev: T) => T) => void;\n}\n\n/**\n * Read and write custom metadata for a specific message ID.\n *\n * @param messageId - The message to attach metadata to.\n * Pass undefined to get a no-op instance (safe for conditional use).\n */\nexport function useMessageMeta<\n T extends Record<string, unknown> = Record<string, unknown>,\n>(messageId: string | undefined): UseMessageMetaReturn<T> {\n const { messageMeta } = useCopilot();\n\n // Subscribe to store changes — only re-render when this messageId's data changes\n const meta = useSyncExternalStore(\n messageMeta.subscribe,\n () =>\n messageId ? (messageMeta.getMeta(messageId) as T) : (EMPTY_META as T),\n () => EMPTY_META as T,\n );\n\n const setMeta = useCallback(\n (next: T) => {\n if (!messageId) return;\n messageMeta.setMeta(messageId, next as Record<string, unknown>);\n },\n [messageMeta, messageId],\n );\n\n const updateMeta = useCallback(\n (updater: (prev: T) => T) => {\n if (!messageId) return;\n messageMeta.updateMeta(\n messageId,\n (prev) => updater(prev as T) as Record<string, unknown>,\n );\n },\n [messageMeta, messageId],\n );\n\n return { meta, setMeta, updateMeta };\n}\n"]}