@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
JavaScript
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