@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>
497 lines (489 loc) • 16.6 kB
JavaScript
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
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/error-boundary/error-boundary.tsx
var error_boundary_exports = {};
__export(error_boundary_exports, {
CopilotErrorBoundary: () => CopilotErrorBoundary,
ErrorToast: () => ErrorToast2
});
module.exports = __toCommonJS(error_boundary_exports);
var import_react3 = __toESM(require("react"));
var import_shared3 = require("@copilotkit/shared");
// src/lib/status-checker.ts
var import_shared = 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_shared.COPILOT_CLOUD_API_URL}/ciu`, {
method: "GET",
headers: {
[import_shared.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_shared2 = require("@copilotkit/shared");
var import_jsx_runtime = require("react/jsx-runtime");
var defaultIcons = {
[import_shared2.Severity.Error]: /* @__PURE__ */ (0, import_jsx_runtime.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_runtime.jsx)("circle", { cx: "12", cy: "12", r: "10" }),
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "15", y1: "9", x2: "9", y2: "15" }),
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "9", y1: "9", x2: "15", y2: "15" })
]
}
)
};
function UsageBanner({
severity = import_shared2.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_runtime.jsx)(
"div",
{
style: {
position: "fixed",
bottom: "16px",
left: "50%",
transform: "translateX(-50%)",
maxWidth: "90%",
zIndex: 9999
},
children: /* @__PURE__ */ (0, import_jsx_runtime.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_runtime.jsx)("div", { style: { color: iconColor }, children: Icon }),
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
"span",
{
style: {
flex: 1,
fontSize: "14px",
fontWeight: 500,
color: textColor,
whiteSpace: "normal",
wordBreak: "break-word"
},
children: message
}
),
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
"div",
{
style: {
display: "flex",
gap: "8px",
flexWrap: "wrap"
},
children: [
(actions == null ? void 0 : actions.secondary) && /* @__PURE__ */ (0, import_jsx_runtime.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_runtime.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_shared2.ERROR_NAMES.CONFIGURATION_ERROR:
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(UsageBanner, { severity: error.severity, message: error.message });
case import_shared2.ERROR_NAMES.MISSING_PUBLIC_API_KEY_ERROR:
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
UsageBanner,
{
severity: error.severity,
message: error.message,
actions: {
primary: {
label: "Sign In",
onClick: () => {
window.location.href = "https://cloud.copilotkit.ai";
}
}
}
}
);
case import_shared2.ERROR_NAMES.UPGRADE_REQUIRED_ERROR:
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
UsageBanner,
{
severity: error.severity,
message: error.message,
actions: {
primary: {
label: "Upgrade",
onClick: () => {
window.location.href = "https://copilotkit.ai/";
}
}
}
}
);
}
}
// src/components/error-boundary/error-utils.tsx
var import_react2 = require("react");
// src/components/toast/toast-provider.tsx
var import_react = require("react");
var import_jsx_runtime2 = require("react/jsx-runtime");
var ToastContext = (0, import_react.createContext)(void 0);
function useToast() {
const context = (0, import_react.useContext)(ToastContext);
if (!context) {
throw new Error("useToast must be used within a ToastProvider");
}
return context;
}
// src/components/toast/exclamation-mark-icon.tsx
var import_jsx_runtime3 = require("react/jsx-runtime");
var ExclamationMarkIcon = ({
className,
style
}) => /* @__PURE__ */ (0, import_jsx_runtime3.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_runtime3.jsx)("circle", { cx: "12", cy: "12", r: "10" }),
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("line", { x1: "12", x2: "12", y1: "8", y2: "12" }),
/* @__PURE__ */ (0, import_jsx_runtime3.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_runtime4 = 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_runtime4.jsxs)(
"div",
{
style: {
marginTop: idx === 0 ? 0 : 10,
marginBottom: 14
},
children: [
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(ExclamationMarkIcon, { style: { marginBottom: 4 } }),
code && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
"div",
{
style: {
fontWeight: "600",
marginBottom: 4
},
children: [
"Copilot Cloud Error:",
" ",
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { style: { fontFamily: "monospace", fontWeight: "normal" }, children: code })
]
}
),
/* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react_markdown.default, { children: message })
]
},
idx
);
});
return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
"div",
{
style: {
fontSize: "13px",
maxWidth: "600px"
},
children: [
errorsToRender,
/* @__PURE__ */ (0, import_jsx_runtime4.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_react2.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_runtime4.jsx)(ErrorToast, { errors: error })
});
},
[addToast]
);
}
// src/components/error-boundary/error-boundary.tsx
var import_shared4 = require("@copilotkit/shared");
var import_jsx_runtime5 = require("react/jsx-runtime");
var statusChecker = new StatusChecker();
var CopilotErrorBoundary = class extends import_react3.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_shared3.CopilotKitError) {
if (import_shared4.COPILOT_CLOUD_ERROR_NAMES.includes(this.state.error.name)) {
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ErrorToast2, { error: this.state.error, children: renderCopilotKitUsage(this.state.error) });
}
return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
this.props.children,
this.props.showUsageBanner && /* @__PURE__ */ (0, import_jsx_runtime5.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_react3.useEffect)(() => {
if (error) {
addErrorToast([error]);
}
}, [error, addErrorToast]);
if (!error)
throw error;
return children;
}
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
CopilotErrorBoundary,
ErrorToast
});
//# sourceMappingURL=error-boundary.js.map
;