UNPKG

@copilotkit/react-core

Version:

<img src="https://github.com/user-attachments/assets/0a6b64d9-e193-4940-a3f6-60334ac34084" alt="banner" style="border-radius: 12px; border: 2px solid #d6d4fa;" />

222 lines (220 loc) • 7.72 kB
import { shouldShowDevConsole } from "./chunk-ICIK2BSB.mjs"; import { useToast } from "./chunk-EFL5OBKN.mjs"; import { useCopilotContext } from "./chunk-YHT6CWIY.mjs"; import { CopilotMessagesContext } from "./chunk-ZLQVRPDS.mjs"; import { __async } from "./chunk-SKC7AJIV.mjs"; // src/components/copilot-provider/copilot-messages.tsx import { useEffect, useState, useRef, useCallback, useMemo, createContext, useContext } from "react"; import { loadMessagesFromJsonRepresentation } from "@copilotkit/runtime-client-gql"; import { ErrorVisibility, CopilotKitApiDiscoveryError, CopilotKitRemoteEndpointDiscoveryError, CopilotKitAgentDiscoveryError, CopilotKitError, CopilotKitErrorCode } from "@copilotkit/shared"; import { jsx } from "react/jsx-runtime"; var MessagesTapContext = createContext(null); function useMessagesTap() { const tap = useContext(MessagesTapContext); if (!tap) throw new Error("useMessagesTap must be used inside <MessagesTapProvider>"); return tap; } function MessagesTapProvider({ children }) { const messagesRef = useRef([]); const tapRef = useRef({ getMessagesFromTap: () => messagesRef.current, updateTapMessages: (messages) => { messagesRef.current = messages; } }); return /* @__PURE__ */ jsx(MessagesTapContext.Provider, { value: tapRef.current, children }); } function CopilotMessages({ children }) { const [messages, setMessages] = useState([]); const lastLoadedThreadId = useRef(); const lastLoadedAgentName = useRef(); const lastLoadedMessages = useRef(); const { updateTapMessages } = useMessagesTap(); const { threadId, agentSession, runtimeClient, showDevConsole, onError, copilotApiConfig } = useCopilotContext(); const { setBannerError } = useToast(); const traceUIError = useCallback( (error, originalError) => __async(this, null, function* () { if (!onError || !copilotApiConfig.publicApiKey) return; try { const traceEvent = { type: "error", timestamp: Date.now(), context: { source: "ui", request: { operation: "loadAgentState", url: copilotApiConfig.chatApiEndpoint, startTime: Date.now() }, technical: { environment: "browser", userAgent: typeof navigator !== "undefined" ? navigator.userAgent : void 0, stackTrace: originalError instanceof Error ? originalError.stack : void 0 } }, error }; yield onError(traceEvent); } catch (traceError) { console.error("Error in CopilotMessages onError handler:", traceError); } }), [onError, copilotApiConfig.publicApiKey, copilotApiConfig.chatApiEndpoint] ); const createStructuredError = (gqlError) => { const extensions = gqlError.extensions; const originalError = extensions == null ? void 0 : extensions.originalError; if (originalError == null ? void 0 : originalError.stack) { if (originalError.stack.includes("CopilotApiDiscoveryError")) { return new CopilotKitApiDiscoveryError({ message: originalError.message }); } if (originalError.stack.includes("CopilotKitRemoteEndpointDiscoveryError")) { return new CopilotKitRemoteEndpointDiscoveryError({ message: originalError.message }); } if (originalError.stack.includes("CopilotKitAgentDiscoveryError")) { return new CopilotKitAgentDiscoveryError({ agentName: "", availableAgents: [] }); } } const message = (originalError == null ? void 0 : originalError.message) || gqlError.message; const code = extensions == null ? void 0 : extensions.code; if (code) { return new CopilotKitError({ message, code }); } return null; }; const handleGraphQLErrors = useCallback( (error) => { var _a; if ((_a = error.graphQLErrors) == null ? void 0 : _a.length) { const graphQLErrors = error.graphQLErrors; const routeError = (gqlError) => { const extensions = gqlError.extensions; const visibility = extensions == null ? void 0 : extensions.visibility; const isDev = shouldShowDevConsole(showDevConsole); if (!isDev) { console.error("CopilotKit Error (hidden in production):", gqlError.message); return; } if (visibility === ErrorVisibility.SILENT) { console.error("CopilotKit Silent Error:", gqlError.message); return; } const ckError = createStructuredError(gqlError); if (ckError) { setBannerError(ckError); traceUIError(ckError, gqlError); } else { const fallbackError = new CopilotKitError({ message: gqlError.message, code: CopilotKitErrorCode.UNKNOWN }); setBannerError(fallbackError); traceUIError(fallbackError, gqlError); } }; graphQLErrors.forEach(routeError); } else { const isDev = shouldShowDevConsole(showDevConsole); if (!isDev) { console.error("CopilotKit Error (hidden in production):", error); } else { const fallbackError = new CopilotKitError({ message: (error == null ? void 0 : error.message) || String(error), code: CopilotKitErrorCode.UNKNOWN }); setBannerError(fallbackError); traceUIError(fallbackError, error); } } }, [setBannerError, showDevConsole, traceUIError] ); useEffect(() => { if (!threadId || threadId === lastLoadedThreadId.current) return; if (threadId === lastLoadedThreadId.current && (agentSession == null ? void 0 : agentSession.agentName) === lastLoadedAgentName.current) { return; } const fetchMessages = () => __async(this, null, function* () { var _a, _b, _c; if (!(agentSession == null ? void 0 : agentSession.agentName)) return; const result = yield runtimeClient.loadAgentState({ threadId, agentName: agentSession == null ? void 0 : agentSession.agentName }); if (result.error) { lastLoadedThreadId.current = threadId; lastLoadedAgentName.current = agentSession == null ? void 0 : agentSession.agentName; handleGraphQLErrors(result.error); return; } const newMessages = (_b = (_a = result.data) == null ? void 0 : _a.loadAgentState) == null ? void 0 : _b.messages; if (newMessages === lastLoadedMessages.current) return; if ((_c = result.data) == null ? void 0 : _c.loadAgentState) { lastLoadedMessages.current = newMessages; lastLoadedThreadId.current = threadId; lastLoadedAgentName.current = agentSession == null ? void 0 : agentSession.agentName; const messages2 = loadMessagesFromJsonRepresentation(JSON.parse(newMessages || "[]")); setMessages(messages2); } }); void fetchMessages(); }, [threadId, agentSession == null ? void 0 : agentSession.agentName]); useEffect(() => { updateTapMessages(messages); }, [messages, updateTapMessages]); const memoizedChildren = useMemo(() => children, [children]); const [suggestions, setSuggestions] = useState([]); return /* @__PURE__ */ jsx( CopilotMessagesContext.Provider, { value: { messages, setMessages, suggestions, setSuggestions }, children: memoizedChildren } ); } export { useMessagesTap, MessagesTapProvider, CopilotMessages }; //# sourceMappingURL=chunk-2MGJO3FY.mjs.map