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;" />

462 lines (454 loc) • 16 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 __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/hooks/use-copilot-authenticated-action.ts var use_copilot_authenticated_action_exports = {}; __export(use_copilot_authenticated_action_exports, { useCopilotAuthenticatedAction_c: () => useCopilotAuthenticatedAction_c }); module.exports = __toCommonJS(use_copilot_authenticated_action_exports); var import_react9 = require("react"); // src/context/copilot-context.tsx var import_react = __toESM(require("react")); var emptyCopilotContext = { actions: {}, setAction: () => { }, removeAction: () => { }, setRegisteredActions: () => "", removeRegisteredAction: () => { }, chatComponentsCache: { current: { actions: {}, coAgentStateRenders: {} } }, getContextString: (documents, categories) => returnAndThrowInDebug(""), addContext: () => "", removeContext: () => { }, getAllContext: () => [], getFunctionCallHandler: () => returnAndThrowInDebug(() => __async(void 0, null, function* () { })), isLoading: false, setIsLoading: () => returnAndThrowInDebug(false), chatInstructions: "", setChatInstructions: () => returnAndThrowInDebug(""), additionalInstructions: [], setAdditionalInstructions: () => returnAndThrowInDebug([]), getDocumentsContext: (categories) => returnAndThrowInDebug([]), addDocumentContext: () => returnAndThrowInDebug(""), removeDocumentContext: () => { }, 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: false, coagentStates: {}, setCoagentStates: () => { }, coagentStatesRef: { current: {} }, setCoagentStatesWithRef: () => { }, agentSession: null, setAgentSession: () => { }, forwardedParameters: {}, agentLock: null, threadId: "", setThreadId: () => { }, runId: null, setRunId: () => { }, chatAbortControllerRef: { current: null }, availableAgents: [], extensions: {}, setExtensions: () => { }, interruptActions: {}, setInterruptAction: () => { }, removeInterruptAction: () => { }, interruptEventQueue: {}, addInterruptEvent: () => { }, resolveInterruptEvent: () => { }, onError: () => { }, bannerError: null, setBannerError: () => { }, internalErrorHandlers: {}, setInternalErrorHandler: () => { }, removeInternalErrorHandler: () => { } }; 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-copilot-action.ts var import_react8 = require("react"); // src/hooks/use-frontend-tool.ts var import_react2 = __toESM(require("react")); var import_shared = require("@copilotkit/shared"); var import_shared2 = require("@copilotkit/shared"); var import_react3 = require("@copilotkitnext/react"); function useFrontendTool(tool, dependencies) { const { name, description, parameters, render, followUp } = tool; const zodParameters = (0, import_shared.getZodParameters)(parameters); const normalizedRender = (() => { if (typeof render === "undefined") { return void 0; } if (typeof render === "string") { const staticRender = render; return () => import_react2.default.createElement( import_react2.default.Fragment, null, staticRender ); } return (args) => { const renderArgs = __spreadProps(__spreadValues({}, args), { result: typeof args.result === "string" ? (0, import_shared2.parseJson)(args.result, args.result) : args.result }); const rendered = render(renderArgs); if (typeof rendered === "string") { return import_react2.default.createElement(import_react2.default.Fragment, null, rendered); } return rendered != null ? rendered : null; }; })(); const handlerRef = (0, import_react2.useRef)(tool.handler); (0, import_react2.useEffect)(() => { handlerRef.current = tool.handler; }, [tool.handler, ...dependencies != null ? dependencies : []]); const normalizedHandler = tool.handler ? (args) => { var _a; return (_a = handlerRef.current) == null ? void 0 : _a.call(handlerRef, args); } : void 0; (0, import_react3.useFrontendTool)({ name, description, parameters: zodParameters, handler: normalizedHandler, followUp, render: normalizedRender }); } // src/hooks/use-render-tool-call.ts var import_shared3 = require("@copilotkit/shared"); var import_react4 = require("react"); var import_react5 = require("@copilotkitnext/react"); var import_shared4 = require("@copilotkit/shared"); function useRenderToolCall(tool, dependencies) { const { copilotkit } = (0, import_react5.useCopilotKit)(); const hasAddedRef = (0, import_react4.useRef)(false); (0, import_react4.useEffect)(() => { const { name, parameters, render } = tool; const zodParameters = (0, import_shared3.getZodParameters)(parameters); const renderToolCall = name === "*" ? (0, import_react5.defineToolCallRenderer)({ name: "*", render: (args) => { return render(__spreadProps(__spreadValues({}, args), { result: args.result ? (0, import_shared4.parseJson)(args.result, args.result) : args.result })); } }) : (0, import_react5.defineToolCallRenderer)({ name, args: zodParameters, render: (args) => { return render(__spreadProps(__spreadValues({}, args), { result: args.result ? (0, import_shared4.parseJson)(args.result, args.result) : args.result })); } }); const existingIndex = copilotkit.renderToolCalls.findIndex((r) => r.name === name); if (existingIndex !== -1) { copilotkit.renderToolCalls.splice(existingIndex, 1); } copilotkit.renderToolCalls.push(renderToolCall); hasAddedRef.current = true; return () => { if (hasAddedRef.current) { const index = copilotkit.renderToolCalls.findIndex((r) => r.name === name); if (index !== -1) { copilotkit.renderToolCalls.splice(index, 1); } hasAddedRef.current = false; } }; }, [tool, ...dependencies != null ? dependencies : []]); } // src/hooks/use-human-in-the-loop.ts var import_shared5 = require("@copilotkit/shared"); var import_react6 = require("@copilotkitnext/react"); var import_core = require("@copilotkitnext/core"); var import_react7 = __toESM(require("react")); function useHumanInTheLoop(tool, dependencies) { const _a = tool, { render } = _a, toolRest = __objRest(_a, ["render"]); const { name, description, parameters, followUp } = toolRest; const zodParameters = (0, import_shared5.getZodParameters)(parameters); const renderRef = (0, import_react7.useRef)(null); (0, import_react7.useEffect)(() => { renderRef.current = (args) => { if (typeof render === "string") { return import_react7.default.createElement(import_react7.default.Fragment, null, render); } if (!render) { return null; } const renderProps = (() => { const mappedArgs = args.args; switch (args.status) { case import_core.ToolCallStatus.InProgress: return { args: mappedArgs, respond: args.respond, status: args.status, handler: void 0 }; case import_core.ToolCallStatus.Executing: return { args: mappedArgs, respond: args.respond, status: args.status, handler: () => { } }; case import_core.ToolCallStatus.Complete: return { args: mappedArgs, respond: args.respond, status: args.status, result: args.result ? (0, import_shared5.parseJson)(args.result, args.result) : args.result, handler: void 0 }; default: throw new import_shared5.CopilotKitError({ code: import_shared5.CopilotKitErrorCode.UNKNOWN, message: `Invalid tool call status: ${args.status}` }); } })(); const rendered = render(renderProps); if (typeof rendered === "string") { return import_react7.default.createElement(import_react7.default.Fragment, null, rendered); } return rendered != null ? rendered : null; }; }, [render, ...dependencies != null ? dependencies : []]); (0, import_react6.useHumanInTheLoop)({ name, description, followUp, parameters: zodParameters, render: (args) => { var _a2, _b; return (_b = (_a2 = renderRef.current) == null ? void 0 : _a2.call(renderRef, args)) != null ? _b : null; } }); } // src/hooks/use-copilot-action.ts function getActionConfig(action) { if (action.name === "*") { return { type: "render", action }; } if ("renderAndWaitForResponse" in action || "renderAndWait" in action) { let render = action.render; if (!render && "renderAndWaitForResponse" in action) { render = action.renderAndWaitForResponse; } if (!render && "renderAndWait" in action) { render = action.renderAndWait; } return { type: "hitl", action: __spreadProps(__spreadValues({}, action), { render }) }; } if ("available" in action) { if (action.available === "enabled" || action.available === "remote") { return { type: "frontend", action }; } if (action.available === "frontend" || action.available === "disabled") { return { type: "render", action }; } } if ("handler" in action) { return { type: "frontend", action }; } throw new Error("Invalid action configuration"); } function useCopilotAction(action, dependencies) { const [initialActionConfig] = (0, import_react8.useState)(getActionConfig(action)); const currentActionConfig = getActionConfig(action); if (initialActionConfig.type !== currentActionConfig.type) { throw new Error("Action configuration changed between renders"); } switch (currentActionConfig.type) { case "render": return useRenderToolCall(currentActionConfig.action, dependencies); case "hitl": return useHumanInTheLoop(currentActionConfig.action, dependencies); case "frontend": return useFrontendTool(currentActionConfig.action, dependencies); default: throw new Error("Invalid action configuration"); } } // src/hooks/use-copilot-authenticated-action.ts var import_react10 = __toESM(require("react")); function useCopilotAuthenticatedAction_c(action, dependencies) { const { authConfig_c, authStates_c, setAuthStates_c } = useCopilotContext(); const pendingActionRef = (0, import_react9.useRef)(null); const executeAction = (0, import_react9.useCallback)( (props) => { if (typeof action.render === "function") { return action.render(props); } return action.render || import_react10.default.createElement(import_react9.Fragment); }, [action] ); const wrappedRender = (0, import_react9.useCallback)( (props) => { const isAuthenticated = Object.values(authStates_c || {}).some( (state) => state.status === "authenticated" ); if (!isAuthenticated) { pendingActionRef.current = props; return (authConfig_c == null ? void 0 : authConfig_c.SignInComponent) ? import_react10.default.createElement(authConfig_c.SignInComponent, { onSignInComplete: (authState) => { setAuthStates_c == null ? void 0 : setAuthStates_c((prev) => __spreadProps(__spreadValues({}, prev), { [action.name]: authState })); if (pendingActionRef.current) { executeAction(pendingActionRef.current); pendingActionRef.current = null; } } }) : import_react10.default.createElement(import_react9.Fragment); } return executeAction(props); }, [action, authStates_c, setAuthStates_c] ); useCopilotAction( __spreadProps(__spreadValues({}, action), { render: wrappedRender }), dependencies ); } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { useCopilotAuthenticatedAction_c }); //# sourceMappingURL=use-copilot-authenticated-action.js.map