UNPKG

@copilotkit/react-core

Version:

<div align="center"> <a href="https://copilotkit.ai" target="_blank"> <img src="https://github.com/copilotkit/copilotkit/raw/main/assets/banner.png" alt="CopilotKit Logo"> </a>

1,399 lines (1,377 loc) 46.9 kB
"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __defProps = Object.defineProperties; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropDescs = Object.getOwnPropertyDescriptors; var __getOwnPropNames = Object.getOwnPropertyNames; var __getOwnPropSymbols = Object.getOwnPropertySymbols; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __propIsEnum = Object.prototype.propertyIsEnumerable; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp.call(b, prop)) __defNormalProp(a, prop, b[prop]); if (__getOwnPropSymbols) for (var prop of __getOwnPropSymbols(b)) { if (__propIsEnum.call(b, prop)) __defNormalProp(a, prop, b[prop]); } return a; }; var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); var __restKey = (key) => typeof key === "symbol" ? key : key + ""; var __objRest = (source, exclude) => { var target = {}; for (var prop in source) if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0) target[prop] = source[prop]; if (source != null && __getOwnPropSymbols) for (var prop of __getOwnPropSymbols(source)) { if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop)) target[prop] = source[prop]; } return target; }; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var __async = (__this, __arguments, generator) => { return new Promise((resolve, reject) => { var fulfilled = (value) => { try { step(generator.next(value)); } catch (e) { reject(e); } }; var rejected = (value) => { try { step(generator.throw(value)); } catch (e) { reject(e); } }; var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); step((generator = generator.apply(__this, __arguments)).next()); }); }; // src/components/index.ts var components_exports = {}; __export(components_exports, { CopilotKit: () => CopilotKit, defaultCopilotContextCategories: () => defaultCopilotContextCategories }); module.exports = __toCommonJS(components_exports); // src/components/copilot-provider/copilotkit.tsx var import_react10 = require("react"); // src/context/copilot-context.tsx var import_react = __toESM(require("react")); var emptyCopilotContext = { actions: {}, setAction: () => { }, removeAction: () => { }, coAgentStateRenders: {}, setCoAgentStateRender: () => { }, removeCoAgentStateRender: () => { }, chatComponentsCache: { current: { actions: {}, coAgentStateRenders: {} } }, getContextString: (documents, categories) => returnAndThrowInDebug(""), addContext: () => "", removeContext: () => { }, getFunctionCallHandler: () => returnAndThrowInDebug(() => __async(void 0, null, function* () { })), isLoading: false, setIsLoading: () => returnAndThrowInDebug(false), chatInstructions: "", setChatInstructions: () => returnAndThrowInDebug(""), additionalInstructions: [], setAdditionalInstructions: () => returnAndThrowInDebug([]), getDocumentsContext: (categories) => returnAndThrowInDebug([]), addDocumentContext: () => returnAndThrowInDebug(""), removeDocumentContext: () => { }, runtimeClient: {}, copilotApiConfig: new class { get chatApiEndpoint() { throw new Error("Remember to wrap your app in a `<CopilotKit> {...} </CopilotKit>` !!!"); } get headers() { return {}; } get body() { return {}; } }(), chatSuggestionConfiguration: {}, addChatSuggestionConfiguration: () => { }, removeChatSuggestionConfiguration: () => { }, showDevConsole: "auto", coagentStates: {}, setCoagentStates: () => { }, coagentStatesRef: { current: {} }, setCoagentStatesWithRef: () => { }, agentSession: null, setAgentSession: () => { }, forwardedParameters: {}, agentLock: null, threadId: "", setThreadId: () => { }, runId: null, setRunId: () => { }, chatAbortControllerRef: { current: null }, availableAgents: [], extensions: {}, setExtensions: () => { }, langGraphInterruptAction: null, setLangGraphInterruptAction: () => null, removeLangGraphInterruptAction: () => null }; var CopilotContext = import_react.default.createContext(emptyCopilotContext); function useCopilotContext() { const context = import_react.default.useContext(CopilotContext); if (context === emptyCopilotContext) { throw new Error("Remember to wrap your app in a `<CopilotKit> {...} </CopilotKit>` !!!"); } return context; } function returnAndThrowInDebug(_value) { throw new Error("Remember to wrap your app in a `<CopilotKit> {...} </CopilotKit>` !!!"); } // src/hooks/use-tree.ts var import_shared = require("@copilotkit/shared"); var import_react2 = require("react"); var removeNode = (nodes, id) => { return nodes.reduce((result, node) => { if (node.id !== id) { const newNode = __spreadProps(__spreadValues({}, node), { children: removeNode(node.children, id) }); result.push(newNode); } return result; }, []); }; var addNode = (nodes, newNode, parentId) => { if (!parentId) { return [...nodes, newNode]; } return nodes.map((node) => { if (node.id === parentId) { return __spreadProps(__spreadValues({}, node), { children: [...node.children, newNode] }); } else if (node.children.length) { return __spreadProps(__spreadValues({}, node), { children: addNode(node.children, newNode, parentId) }); } return node; }); }; var treeIndentationRepresentation = (index, indentLevel) => { if (indentLevel === 0) { return (index + 1).toString(); } else if (indentLevel === 1) { return String.fromCharCode(65 + index); } else if (indentLevel === 2) { return String.fromCharCode(97 + index); } else { return "-"; } }; var printNode = (node, prefix = "", indentLevel = 0) => { const indent = " ".repeat(3).repeat(indentLevel); const prefixPlusIndentLength = prefix.length + indent.length; const subsequentLinesPrefix = " ".repeat(prefixPlusIndentLength); const valueLines = node.value.split("\n"); const outputFirstLine = `${indent}${prefix}${valueLines[0]}`; const outputSubsequentLines = valueLines.slice(1).map((line) => `${subsequentLinesPrefix}${line}`).join("\n"); let output = `${outputFirstLine} `; if (outputSubsequentLines) { output += `${outputSubsequentLines} `; } const childPrePrefix = " ".repeat(prefix.length); node.children.forEach( (child, index) => output += printNode( child, `${childPrePrefix}${treeIndentationRepresentation(index, indentLevel + 1)}. `, indentLevel + 1 ) ); return output; }; function treeReducer(state, action) { switch (action.type) { case "ADD_NODE": { const { value, parentId, id: newNodeId } = action; const newNode = { id: newNodeId, value, children: [], categories: new Set(action.categories) }; try { return addNode(state, newNode, parentId); } catch (error) { console.error(`Error while adding node with id ${newNodeId}: ${error}`); return state; } } case "REMOVE_NODE": return removeNode(state, action.id); default: return state; } } var useTree = () => { const [tree, dispatch] = (0, import_react2.useReducer)(treeReducer, []); const addElement = (0, import_react2.useCallback)( (value, categories, parentId) => { const newNodeId = (0, import_shared.randomId)(); dispatch({ type: "ADD_NODE", value, parentId, id: newNodeId, categories }); return newNodeId; }, [] ); const removeElement = (0, import_react2.useCallback)((id) => { dispatch({ type: "REMOVE_NODE", id }); }, []); const printTree = (0, import_react2.useCallback)( (categories) => { const categoriesSet = new Set(categories); let output = ""; tree.forEach((node, index) => { if (!setsHaveIntersection(categoriesSet, node.categories)) { return; } if (index !== 0) { output += "\n"; } output += printNode(node, `${treeIndentationRepresentation(index, 0)}. `); }); return output; }, [tree] ); return { tree, addElement, printTree, removeElement }; }; var use_tree_default = useTree; function setsHaveIntersection(setA, setB) { const [smallerSet, largerSet] = setA.size <= setB.size ? [setA, setB] : [setB, setA]; for (let item of smallerSet) { if (largerSet.has(item)) { return true; } } return false; } // src/components/copilot-provider/copilotkit.tsx var import_react_dom = require("react-dom"); var import_shared7 = require("@copilotkit/shared"); // src/hooks/use-flat-category-store.ts var import_react3 = require("react"); var import_shared2 = require("@copilotkit/shared"); var useFlatCategoryStore = () => { const [elements, dispatch] = (0, import_react3.useReducer)(flatCategoryStoreReducer, /* @__PURE__ */ new Map()); const addElement = (0, import_react3.useCallback)((value, categories) => { const newId = (0, import_shared2.randomId)(); dispatch({ type: "ADD_ELEMENT", value, id: newId, categories }); return newId; }, []); const removeElement = (0, import_react3.useCallback)((id) => { dispatch({ type: "REMOVE_ELEMENT", id }); }, []); const allElements = (0, import_react3.useCallback)( (categories) => { const categoriesSet = new Set(categories); const result = []; elements.forEach((element) => { if (setsHaveIntersection2(categoriesSet, element.categories)) { result.push(element.value); } }); return result; }, [elements] ); return { addElement, removeElement, allElements }; }; var use_flat_category_store_default = useFlatCategoryStore; function flatCategoryStoreReducer(state, action) { switch (action.type) { case "ADD_ELEMENT": { const { value, id, categories } = action; const newElement = { id, value, categories: new Set(categories) }; const newState = new Map(state); newState.set(id, newElement); return newState; } case "REMOVE_ELEMENT": { const newState = new Map(state); newState.delete(action.id); return newState; } default: return state; } } function setsHaveIntersection2(setA, setB) { const [smallerSet, largerSet] = setA.size <= setB.size ? [setA, setB] : [setB, setA]; for (let item of smallerSet) { if (largerSet.has(item)) { return true; } } return false; } // src/components/copilot-provider/copilot-messages.tsx var import_react5 = require("react"); // src/context/copilot-messages-context.tsx var import_react4 = __toESM(require("react")); var emptyCopilotContext2 = { messages: [], setMessages: () => [] }; var CopilotMessagesContext = import_react4.default.createContext(emptyCopilotContext2); // src/components/copilot-provider/copilot-messages.tsx var import_runtime_client_gql = require("@copilotkit/runtime-client-gql"); var import_jsx_runtime = require("react/jsx-runtime"); function CopilotMessages({ children }) { const [messages, setMessages] = (0, import_react5.useState)([]); const lastLoadedThreadId = (0, import_react5.useRef)(); const lastLoadedAgentName = (0, import_react5.useRef)(); const lastLoadedMessages = (0, import_react5.useRef)(); const { threadId, agentSession, runtimeClient } = useCopilotContext(); (0, import_react5.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, _d; if (!(agentSession == null ? void 0 : agentSession.agentName)) return; const result = yield runtimeClient.loadAgentState({ threadId, agentName: agentSession == null ? void 0 : agentSession.agentName }); const newMessages = (_b = (_a = result.data) == null ? void 0 : _a.loadAgentState) == null ? void 0 : _b.messages; if (newMessages === lastLoadedMessages.current) return; if ((_d = (_c = result.data) == null ? void 0 : _c.loadAgentState) == null ? void 0 : _d.threadExists) { lastLoadedMessages.current = newMessages; lastLoadedThreadId.current = threadId; lastLoadedAgentName.current = agentSession == null ? void 0 : agentSession.agentName; const messages2 = (0, import_runtime_client_gql.loadMessagesFromJsonRepresentation)(JSON.parse(newMessages || "[]")); setMessages(messages2); } }); void fetchMessages(); }, [threadId, agentSession == null ? void 0 : agentSession.agentName]); return /* @__PURE__ */ (0, import_jsx_runtime.jsx)( CopilotMessagesContext.Provider, { value: { messages, setMessages }, children } ); } // src/components/toast/toast-provider.tsx var import_react7 = require("react"); // src/components/error-boundary/error-utils.tsx var import_react6 = require("react"); // src/components/toast/exclamation-mark-icon.tsx var import_jsx_runtime2 = require("react/jsx-runtime"); var ExclamationMarkIcon = ({ className, style }) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)( "svg", { xmlns: "http://www.w3.org/2000/svg", width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: `lucide lucide-circle-alert ${className ? className : ""}`, style, children: [ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("circle", { cx: "12", cy: "12", r: "10" }), /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("line", { x1: "12", x2: "12", y1: "8", y2: "12" }), /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("line", { x1: "12", x2: "12.01", y1: "16", y2: "16" }) ] } ); // src/components/error-boundary/error-utils.tsx var import_react_markdown = __toESM(require("react-markdown")); var import_jsx_runtime3 = require("react/jsx-runtime"); function ErrorToast({ errors }) { const errorsToRender = errors.map((error, idx) => { var _a, _b, _c; const originalError = "extensions" in error ? (_a = error.extensions) == null ? void 0 : _a.originalError : {}; const message = (_b = originalError == null ? void 0 : originalError.message) != null ? _b : error.message; const code = "extensions" in error ? (_c = error.extensions) == null ? void 0 : _c.code : null; return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)( "div", { style: { marginTop: idx === 0 ? 0 : 10, marginBottom: 14 }, children: [ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(ExclamationMarkIcon, { style: { marginBottom: 4 } }), code && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)( "div", { style: { fontWeight: "600", marginBottom: 4 }, children: [ "Copilot Cloud Error:", " ", /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { style: { fontFamily: "monospace", fontWeight: "normal" }, children: code }) ] } ), /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_markdown.default, { children: message }) ] }, idx ); }); return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)( "div", { style: { fontSize: "13px", maxWidth: "600px" }, children: [ errorsToRender, /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: { fontSize: "11px", opacity: 0.75 }, children: "NOTE: This error only displays during local development." }) ] } ); } function useErrorToast() { const { addToast } = useToast(); return (0, import_react6.useCallback)( (error) => { const errorId = error.map((err) => { var _a, _b; const message = "extensions" in err ? ((_b = (_a = err.extensions) == null ? void 0 : _a.originalError) == null ? void 0 : _b.message) || err.message : err.message; const stack = err.stack || ""; return btoa(message + stack).slice(0, 32); }).join("|"); addToast({ type: "error", id: errorId, // Toast libraries typically dedupe by id message: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(ErrorToast, { errors: error }) }); }, [addToast] ); } // src/components/toast/toast-provider.tsx var import_jsx_runtime4 = require("react/jsx-runtime"); var ToastContext = (0, import_react7.createContext)(void 0); function useToast() { const context = (0, import_react7.useContext)(ToastContext); if (!context) { throw new Error("useToast must be used within a ToastProvider"); } return context; } function ToastProvider({ enabled, children }) { const [toasts, setToasts] = (0, import_react7.useState)([]); const addToast = (0, import_react7.useCallback)( (toast) => { var _a; if (!enabled) { return; } const id = (_a = toast.id) != null ? _a : Math.random().toString(36).substring(2, 9); setToasts((currentToasts) => { if (currentToasts.find((toast2) => toast2.id === id)) return currentToasts; return [...currentToasts, __spreadProps(__spreadValues({}, toast), { id })]; }); if (toast.duration) { setTimeout(() => { removeToast(id); }, toast.duration); } }, [enabled] ); const addGraphQLErrorsToast = (0, import_react7.useCallback)((errors) => { addToast({ type: "error", message: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(ErrorToast, { errors }) }); }, []); const removeToast = (0, import_react7.useCallback)((id) => { setToasts((currentToasts) => currentToasts.filter((toast) => toast.id !== id)); }, []); const value = { toasts, addToast, addGraphQLErrorsToast, removeToast, enabled }; return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(ToastContext.Provider, { value, children: [ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)( "div", { style: { position: "fixed", bottom: "1rem", left: "50%", transform: "translateX(-50%)", zIndex: 50, display: "flex", flexDirection: "column", gap: "0.5rem" }, children: [ toasts.length > 1 && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { textAlign: "right" }, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)( "button", { onClick: () => setToasts([]), style: { padding: "4px 8px", fontSize: "12px", cursor: "pointer", background: "white", border: "1px solid rgba(0,0,0,0.2)", borderRadius: "4px" }, children: "Close All" } ) }), toasts.map((toast) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)( Toast, { message: toast.message, type: toast.type, onClose: () => removeToast(toast.id) }, toast.id )) ] } ), children ] }); } function Toast({ message, type = "info", onClose }) { const bgColors = { info: "#3b82f6", success: "#22c55e", warning: "#eab308", error: "#ef4444" }; return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)( "div", { style: { backgroundColor: bgColors[type], color: "white", padding: "0.5rem 1.5rem", borderRadius: "0.25rem", boxShadow: "0 2px 4px rgba(0,0,0,0.1)", position: "relative", minWidth: "200px" }, children: [ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { children: message }), /* @__PURE__ */ (0, import_jsx_runtime4.jsx)( "button", { onClick: onClose, style: { position: "absolute", top: "0", right: "0", background: "none", border: "none", color: "white", cursor: "pointer", padding: "0.5rem", fontSize: "1rem" }, children: "\u2715" } ) ] } ); } // src/hooks/use-copilot-runtime-client.ts var import_runtime_client_gql2 = require("@copilotkit/runtime-client-gql"); var import_react8 = require("react"); var useCopilotRuntimeClient = (options) => { const { addGraphQLErrorsToast } = useToast(); const addErrorToast = useErrorToast(); const { addToast } = useToast(); const runtimeClient = (0, import_react8.useMemo)(() => { return new import_runtime_client_gql2.CopilotRuntimeClient(__spreadProps(__spreadValues({}, options), { handleGQLErrors: (error) => { if (error.graphQLErrors.length) { addGraphQLErrorsToast(error.graphQLErrors); } else { addErrorToast([error]); } }, handleGQLWarning: (message) => { console.warn(message); addToast({ type: "warning", message }); } })); }, [options, addGraphQLErrorsToast, addToast]); return runtimeClient; }; // src/utils/dev-console.ts function shouldShowDevConsole(showDevConsole) { if (typeof showDevConsole === "boolean") { return showDevConsole; } return getHostname() === "localhost" || getHostname() === "127.0.0.1" || getHostname() === "0.0.0.0" || getHostname() === "::1"; } function getHostname() { if (typeof window !== "undefined" && window.location) { return window.location.hostname; } return ""; } // src/components/error-boundary/error-boundary.tsx var import_react9 = __toESM(require("react")); var import_shared5 = require("@copilotkit/shared"); // src/lib/status-checker.ts var import_shared3 = require("@copilotkit/shared"); var STATUS_CHECK_INTERVAL = 1e3 * 60 * 5; var StatusChecker = class { constructor() { this.activeKey = null; this.intervalId = null; this.instanceCount = 0; this.lastResponse = null; } start(publicApiKey, onUpdate) { return __async(this, null, function* () { this.instanceCount++; if (this.activeKey === publicApiKey) return; if (this.intervalId) clearInterval(this.intervalId); const checkStatus = () => __async(this, null, function* () { try { const response = yield fetch(`${import_shared3.COPILOT_CLOUD_API_URL}/ciu`, { method: "GET", headers: { [import_shared3.COPILOT_CLOUD_PUBLIC_API_KEY_HEADER]: publicApiKey } }).then((response2) => response2.json()); this.lastResponse = response; onUpdate == null ? void 0 : onUpdate(response); return response; } catch (error) { return null; } }); const initialResponse = yield checkStatus(); this.intervalId = setInterval(checkStatus, STATUS_CHECK_INTERVAL); this.activeKey = publicApiKey; return initialResponse; }); } getLastResponse() { return this.lastResponse; } stop() { this.instanceCount--; if (this.instanceCount === 0) { if (this.intervalId) { clearInterval(this.intervalId); this.intervalId = null; this.activeKey = null; this.lastResponse = null; } } } }; // src/components/usage-banner.tsx var import_shared4 = require("@copilotkit/shared"); var import_jsx_runtime5 = require("react/jsx-runtime"); var defaultIcons = { [import_shared4.Severity.Error]: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)( "svg", { viewBox: "0 0 24 24", width: "20", height: "20", stroke: "currentColor", strokeWidth: "2", fill: "none", strokeLinecap: "round", strokeLinejoin: "round", children: [ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("circle", { cx: "12", cy: "12", r: "10" }), /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("line", { x1: "15", y1: "9", x2: "9", y2: "15" }), /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("line", { x1: "9", y1: "9", x2: "15", y2: "15" }) ] } ) }; function UsageBanner({ severity = import_shared4.Severity.Error, message = "", icon, actions }) { if (!message || !severity) { return null; } const Icon = icon || defaultIcons[severity]; const bgColor = { info: "#dbeafe", warning: "#fef3c7", error: "#fee2e2" }[severity]; const textColor = { info: "#1e40af", warning: "#854d0e", error: "#991b1b" }[severity]; const iconColor = { info: "#3b82f6", warning: "#eab308", error: "#ef4444" }[severity]; const primaryButtonColor = { info: "#3b82f6", warning: "#eab308", error: "#ef4444" }[severity]; const primaryButtonHoverColor = { info: "#2563eb", warning: "#ca8a04", error: "#dc2626" }[severity]; return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)( "div", { style: { position: "fixed", bottom: "16px", left: "50%", transform: "translateX(-50%)", maxWidth: "90%", zIndex: 9999 }, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)( "div", { style: { display: "flex", flexWrap: "wrap", alignItems: "center", gap: "12px", borderRadius: "9999px", border: "1px solid #e5e7eb", backgroundColor: bgColor, padding: "8px 16px", boxShadow: "0 4px 6px -1px rgba(0, 0, 0, 0.1)" }, children: [ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: { color: iconColor }, children: Icon }), /* @__PURE__ */ (0, import_jsx_runtime5.jsx)( "span", { style: { flex: 1, fontSize: "14px", fontWeight: 500, color: textColor, whiteSpace: "normal", wordBreak: "break-word" }, children: message } ), /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)( "div", { style: { display: "flex", gap: "8px", flexWrap: "wrap" }, children: [ (actions == null ? void 0 : actions.secondary) && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)( "button", { onClick: actions.secondary.onClick, style: { borderRadius: "9999px", padding: "4px 12px", fontSize: "14px", fontWeight: 500, color: textColor, backgroundColor: "transparent", border: "none", cursor: "pointer", transition: "background-color 0.2s" }, onMouseOver: (e) => e.currentTarget.style.backgroundColor = "rgba(255,255,255,0.5)", onMouseOut: (e) => e.currentTarget.style.backgroundColor = "transparent", children: actions.secondary.label } ), (actions == null ? void 0 : actions.primary) && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)( "button", { onClick: actions.primary.onClick, style: { borderRadius: "9999px", padding: "4px 12px", fontSize: "14px", fontWeight: 500, color: "#fff", backgroundColor: primaryButtonColor, border: "none", cursor: "pointer", transition: "background-color 0.2s" }, onMouseOver: (e) => e.currentTarget.style.backgroundColor = primaryButtonHoverColor, onMouseOut: (e) => e.currentTarget.style.backgroundColor = primaryButtonColor, children: actions.primary.label } ) ] } ) ] } ) } ); } function renderCopilotKitUsage(error) { switch (error.name) { case import_shared4.ERROR_NAMES.CONFIGURATION_ERROR: return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(UsageBanner, { severity: error.severity, message: error.message }); case import_shared4.ERROR_NAMES.MISSING_PUBLIC_API_KEY_ERROR: return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)( UsageBanner, { severity: error.severity, message: error.message, actions: { primary: { label: "Sign In", onClick: () => { window.location.href = "https://cloud.copilotkit.ai"; } } } } ); case import_shared4.ERROR_NAMES.UPGRADE_REQUIRED_ERROR: return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)( UsageBanner, { severity: error.severity, message: error.message, actions: { primary: { label: "Upgrade", onClick: () => { window.location.href = "https://copilotkit.ai/"; } } } } ); } } // src/components/error-boundary/error-boundary.tsx var import_shared6 = require("@copilotkit/shared"); var import_jsx_runtime6 = require("react/jsx-runtime"); var statusChecker = new StatusChecker(); var CopilotErrorBoundary = class extends import_react9.default.Component { constructor(props) { super(props); this.state = { hasError: false }; } static getDerivedStateFromError(error) { return { hasError: true, error }; } componentDidMount() { if (this.props.publicApiKey) { statusChecker.start(this.props.publicApiKey, (newStatus) => { this.setState((prevState) => { var _a; if ((newStatus == null ? void 0 : newStatus.severity) !== ((_a = prevState.status) == null ? void 0 : _a.severity)) { return { status: newStatus != null ? newStatus : void 0 }; } return null; }); }); } } componentWillUnmount() { statusChecker.stop(); } componentDidCatch(error, errorInfo) { console.error("CopilotKit Error:", error, errorInfo); } render() { var _a, _b; if (this.state.hasError) { if (this.state.error instanceof import_shared5.CopilotKitError) { if (import_shared6.COPILOT_CLOUD_ERROR_NAMES.includes(this.state.error.name)) { return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ErrorToast2, { error: this.state.error, children: renderCopilotKitUsage(this.state.error) }); } return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_jsx_runtime6.Fragment, { children: [ this.props.children, this.props.showUsageBanner && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)( UsageBanner, { severity: (_a = this.state.status) == null ? void 0 : _a.severity, message: (_b = this.state.status) == null ? void 0 : _b.message } ) ] }); } throw this.state.error; } return this.props.children; } }; function ErrorToast2({ error, children }) { const addErrorToast = useErrorToast(); (0, import_react9.useEffect)(() => { if (error) { addErrorToast([error]); } }, [error, addErrorToast]); if (!error) throw error; return children; } // src/components/copilot-provider/copilotkit.tsx var import_jsx_runtime7 = require("react/jsx-runtime"); function CopilotKit(_a) { var _b = _a, { children } = _b, props = __objRest(_b, ["children"]); const showDevConsole = props.showDevConsole === void 0 ? "auto" : props.showDevConsole; const enabled = shouldShowDevConsole(showDevConsole); return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(ToastProvider, { enabled, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(CopilotErrorBoundary, { publicApiKey: props.publicApiKey, showUsageBanner: enabled, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(CopilotKitInternal, __spreadProps(__spreadValues({}, props), { children })) }) }); } function CopilotKitInternal(cpkProps) { const _a = cpkProps, { children } = _a, props = __objRest(_a, ["children"]); validateProps(cpkProps); const chatApiEndpoint = props.runtimeUrl || import_shared7.COPILOT_CLOUD_CHAT_URL; const [actions, setActions] = (0, import_react10.useState)({}); const [coAgentStateRenders, setCoAgentStateRenders] = (0, import_react10.useState)({}); const chatComponentsCache = (0, import_react10.useRef)({ actions: {}, coAgentStateRenders: {} }); const { addElement, removeElement, printTree } = use_tree_default(); const [isLoading, setIsLoading] = (0, import_react10.useState)(false); const [chatInstructions, setChatInstructions] = (0, import_react10.useState)(""); const [authStates, setAuthStates] = (0, import_react10.useState)({}); const [extensions, setExtensions] = (0, import_react10.useState)({}); const [additionalInstructions, setAdditionalInstructions] = (0, import_react10.useState)([]); const { addElement: addDocument, removeElement: removeDocument, allElements: allDocuments } = use_flat_category_store_default(); const setAction = (0, import_react10.useCallback)((id, action) => { setActions((prevPoints) => { return __spreadProps(__spreadValues({}, prevPoints), { [id]: action }); }); }, []); const removeAction = (0, import_react10.useCallback)((id) => { setActions((prevPoints) => { const newPoints = __spreadValues({}, prevPoints); delete newPoints[id]; return newPoints; }); }, []); const setCoAgentStateRender = (0, import_react10.useCallback)((id, stateRender) => { setCoAgentStateRenders((prevPoints) => { return __spreadProps(__spreadValues({}, prevPoints), { [id]: stateRender }); }); }, []); const removeCoAgentStateRender = (0, import_react10.useCallback)((id) => { setCoAgentStateRenders((prevPoints) => { const newPoints = __spreadValues({}, prevPoints); delete newPoints[id]; return newPoints; }); }, []); const getContextString = (0, import_react10.useCallback)( (documents, categories) => { const documentsString = documents.map((document) => { return `${document.name} (${document.sourceApplication}): ${document.getContents()}`; }).join("\n\n"); const nonDocumentStrings = printTree(categories); return `${documentsString} ${nonDocumentStrings}`; }, [printTree] ); const addContext = (0, import_react10.useCallback)( (context, parentId, categories = defaultCopilotContextCategories) => { return addElement(context, categories, parentId); }, [addElement] ); const removeContext = (0, import_react10.useCallback)( (id) => { removeElement(id); }, [removeElement] ); const getFunctionCallHandler = (0, import_react10.useCallback)( (customEntryPoints) => { return entryPointsToFunctionCallHandler(Object.values(customEntryPoints || actions)); }, [actions] ); const getDocumentsContext = (0, import_react10.useCallback)( (categories) => { return allDocuments(categories); }, [allDocuments] ); const addDocumentContext = (0, import_react10.useCallback)( (documentPointer, categories = defaultCopilotContextCategories) => { return addDocument(documentPointer, categories); }, [addDocument] ); const removeDocumentContext = (0, import_react10.useCallback)( (documentId) => { removeDocument(documentId); }, [removeDocument] ); const copilotApiConfig = (0, import_react10.useMemo)(() => { var _a2, _b; let cloud = void 0; if (props.publicApiKey) { cloud = { guardrails: { input: { restrictToTopic: { enabled: Boolean(props.guardrails_c), validTopics: ((_a2 = props.guardrails_c) == null ? void 0 : _a2.validTopics) || [], invalidTopics: ((_b = props.guardrails_c) == null ? void 0 : _b.invalidTopics) || [] } } } }; } return __spreadProps(__spreadValues({ publicApiKey: props.publicApiKey }, cloud ? { cloud } : {}), { chatApiEndpoint, headers: props.headers || {}, properties: props.properties || {}, transcribeAudioUrl: props.transcribeAudioUrl, textToSpeechUrl: props.textToSpeechUrl, credentials: props.credentials }); }, [ props.publicApiKey, props.headers, props.properties, props.transcribeAudioUrl, props.textToSpeechUrl, props.credentials, props.cloudRestrictToTopic ]); const headers = (0, import_react10.useMemo)(() => { const authHeaders = Object.values(authStates || {}).reduce((acc, state) => { if (state.status === "authenticated" && state.authHeaders) { return __spreadValues(__spreadValues({}, acc), Object.entries(state.authHeaders).reduce( (headers2, [key, value]) => __spreadProps(__spreadValues({}, headers2), { [key.startsWith("X-Custom-") ? key : `X-Custom-${key}`]: value }), {} )); } return acc; }, {}); return __spreadValues(__spreadValues(__spreadValues({}, copilotApiConfig.headers || {}), copilotApiConfig.publicApiKey ? { [import_shared7.COPILOT_CLOUD_PUBLIC_API_KEY_HEADER]: copilotApiConfig.publicApiKey } : {}), authHeaders); }, [copilotApiConfig.headers, copilotApiConfig.publicApiKey, authStates]); const runtimeClient = useCopilotRuntimeClient({ url: copilotApiConfig.chatApiEndpoint, publicApiKey: copilotApiConfig.publicApiKey, headers, credentials: copilotApiConfig.credentials }); const [chatSuggestionConfiguration, setChatSuggestionConfiguration] = (0, import_react10.useState)({}); const addChatSuggestionConfiguration = (id, suggestion) => { setChatSuggestionConfiguration((prev) => __spreadProps(__spreadValues({}, prev), { [id]: suggestion })); }; const removeChatSuggestionConfiguration = (id) => { setChatSuggestionConfiguration((prev) => { const _a2 = prev, { [id]: _ } = _a2, rest = __objRest(_a2, [__restKey(id)]); return rest; }); }; const [availableAgents, setAvailableAgents] = (0, import_react10.useState)([]); const [coagentStates, setCoagentStates] = (0, import_react10.useState)({}); const coagentStatesRef = (0, import_react10.useRef)({}); const setCoagentStatesWithRef = (0, import_react10.useCallback)( (value) => { const newValue = typeof value === "function" ? value(coagentStatesRef.current) : value; coagentStatesRef.current = newValue; setCoagentStates((prev) => { return newValue; }); }, [] ); const hasLoadedAgents = (0, import_react10.useRef)(false); (0, import_react10.useEffect)(() => { if (hasLoadedAgents.current) return; const fetchData = () => __async(this, null, function* () { var _a2; const result = yield runtimeClient.availableAgents(); if ((_a2 = result.data) == null ? void 0 : _a2.availableAgents) { setAvailableAgents(result.data.availableAgents.agents); } hasLoadedAgents.current = true; }); void fetchData(); }, []); let initialAgentSession = null; if (props.agent) { initialAgentSession = { agentName: props.agent }; } const [agentSession, setAgentSession] = (0, import_react10.useState)(initialAgentSession); (0, import_react10.useEffect)(() => { if (props.agent) { setAgentSession({ agentName: props.agent }); } else { setAgentSession(null); } }, [props.agent]); const [internalThreadId, setInternalThreadId] = (0, import_react10.useState)(props.threadId || (0, import_shared7.randomUUID)()); const setThreadId = (0, import_react10.useCallback)( (value) => { if (props.threadId) { throw new Error("Cannot call setThreadId() when threadId is provided via props."); } setInternalThreadId(value); }, [props.threadId] ); (0, import_react10.useEffect)(() => { if (props.threadId !== void 0) { setInternalThreadId(props.threadId); } }, [props.threadId]); const [runId, setRunId] = (0, import_react10.useState)(null); const chatAbortControllerRef = (0, import_react10.useRef)(null); const showDevConsole = props.showDevConsole === void 0 ? "auto" : props.showDevConsole; const [langGraphInterruptAction, _setLangGraphInterruptAction] = (0, import_react10.useState)(null); const setLangGraphInterruptAction = (0, import_react10.useCallback)((action) => { _setLangGraphInterruptAction((prev) => { if (prev == null) return action; if (action == null) return null; let event = prev.event; if (action.event) { event = __spreadValues(__spreadValues({}, prev.event), action.event); } return __spreadProps(__spreadValues(__spreadValues({}, prev), action), { event }); }); }, []); const removeLangGraphInterruptAction = (0, import_react10.useCallback)(() => { setLangGraphInterruptAction(null); }, []); return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)( CopilotContext.Provider, { value: { actions, chatComponentsCache, getFunctionCallHandler, setAction, removeAction, coAgentStateRenders, setCoAgentStateRender, removeCoAgentStateRender, getContextString, addContext, removeContext, getDocumentsContext, addDocumentContext, removeDocumentContext, copilotApiConfig, isLoading, setIsLoading, chatSuggestionConfiguration, addChatSuggestionConfiguration, removeChatSuggestionConfiguration, chatInstructions, setChatInstructions, additionalInstructions, setAdditionalInstructions, showDevConsole, coagentStates, setCoagentStates, coagentStatesRef, setCoagentStatesWithRef, agentSession, setAgentSession, runtimeClient, forwardedParameters: props.forwardedParameters || {}, agentLock: props.agent || null, threadId: internalThreadId, setThreadId, runId, setRunId, chatAbortControllerRef, availableAgents, authConfig_c: props.authConfig_c, authStates_c: authStates, setAuthStates_c: setAuthStates, extensions, setExtensions, langGraphInterruptAction, setLangGraphInterruptAction, removeLangGraphInterruptAction }, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(CopilotMessages, { children }) } ); } var defaultCopilotContextCategories = ["global"]; function entryPointsToFunctionCallHandler(actions) { return (_0) => __async(this, [_0], function* ({ name, args }) { let actionsByFunctionName = {}; for (let action2 of actions) { actionsByFunctionName[action2.name] = action2; } const action = actionsByFunctionName[name]; let result = void 0; if (action) { yield new Promise((resolve, reject) => { (0, import_react_dom.flushSync)(() => __async(this, null, function* () { var _a; try { result = yield (_a = action.handler) == null ? void 0 : _a.call(action, args); resolve(); } catch (error) { reject(error); } })); }); yield new Promise((resolve) => setTimeout(resolve, 20)); } return result; }); } function formatFeatureName(featureName) { return featureName.replace(/_c$/, "").split("_").map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join(" "); } function validateProps(props) { const cloudFeatures = Object.keys(props).filter((key) => key.endsWith("_c")); if (!props.runtimeUrl && !props.publicApiKey) { throw new import_shared7.ConfigurationError("Missing required prop: 'runtimeUrl' or 'publicApiKey'"); } if (cloudFeatures.length > 0 && !props.publicApiKey) { throw new import_shared7.MissingPublicApiKeyError( `Missing required prop: 'publicApiKey' to use cloud features: ${cloudFeatures.map(formatFeatureName).join(", ")}` ); } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { CopilotKit, defaultCopilotContextCategories }); //# sourceMappingURL=index.js.map