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

318 lines (313 loc) • 10.3 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 __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-langgraph-interrupt-render.ts var use_langgraph_interrupt_render_exports = {}; __export(use_langgraph_interrupt_render_exports, { useLangGraphInterruptRender: () => useLangGraphInterruptRender }); module.exports = __toCommonJS(use_langgraph_interrupt_render_exports); // 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-langgraph-interrupt-render.ts var import_react4 = __toESM(require("react")); var import_runtime_client_gql = require("@copilotkit/runtime-client-gql"); var import_shared = require("@copilotkit/shared"); // src/hooks/use-agent-nodename.ts var import_react2 = require("react"); var import_react3 = require("@copilotkitnext/react"); function useAgentNodeName(agentName) { const { agent } = (0, import_react3.useAgent)({ agentId: agentName }); const nodeNameRef = (0, import_react2.useRef)("start"); (0, import_react2.useEffect)(() => { if (!agent) return; const subscriber = { onStepStartedEvent: ({ event }) => { nodeNameRef.current = event.stepName; }, onRunStartedEvent: () => { nodeNameRef.current = "start"; }, onRunFinishedEvent: () => { nodeNameRef.current = "end"; } }; const subscription = agent.subscribe(subscriber); return () => { subscription.unsubscribe(); }; }, [agent]); return nodeNameRef.current; } // src/hooks/use-langgraph-interrupt-render.ts var import_react5 = require("@copilotkitnext/react"); var InterruptRenderer = ({ event, result, render, resolve }) => { return render({ event, result, resolve }); }; function useLangGraphInterruptRender(agent) { var _a; const { interruptActions, agentSession, threadId, interruptEventQueue, addInterruptEvent, resolveInterruptEvent } = useCopilotContext(); const existingConfig = (0, import_react5.useCopilotChatConfiguration)(); const resolvedAgentId = (_a = existingConfig == null ? void 0 : existingConfig.agentId) != null ? _a : "default"; const nodeName = useAgentNodeName(resolvedAgentId); (0, import_react4.useEffect)(() => { if (!agent) return; let localInterrupt = null; const subscriber = { onCustomEvent: ({ event }) => { if (event.name === "on_interrupt") { const eventData = { name: import_runtime_client_gql.MetaEventName.LangGraphInterruptEvent, type: event.type, value: (0, import_shared.parseJson)(event.value, event.value) }; const eventId = (0, import_shared.dataToUUID)(eventData, "interruptEvents"); localInterrupt = { eventId, threadId, event: eventData }; } }, onRunStartedEvent: () => { localInterrupt = null; }, onRunFinalized: () => { if (localInterrupt) { addInterruptEvent(localInterrupt); localInterrupt = null; } } }; const { unsubscribe } = agent.subscribe(subscriber); return () => { unsubscribe(); }; }, [agent, threadId]); const handleResolve = (0, import_react4.useCallback)( (eventId, response) => { agent == null ? void 0 : agent.runAgent({ forwardedProps: { command: { resume: response } } }); resolveInterruptEvent(threadId, eventId, response != null ? response : ""); }, // eslint-disable-next-line react-hooks/exhaustive-deps [agent, threadId] ); return (0, import_react4.useMemo)(() => { const eventQueue = interruptEventQueue[threadId] || []; const currentQueuedEvent = eventQueue.find((qe) => !qe.event.response); if (!currentQueuedEvent || !agentSession) return null; const allActions = Object.values(interruptActions); const matchingAction = allActions.find((action) => { if (!action.enabled) return true; return action.enabled({ eventValue: currentQueuedEvent.event.value, agentMetadata: __spreadProps(__spreadValues({}, agentSession), { nodeName }) }); }); if (!matchingAction) return null; const { render, handler } = matchingAction; const resolveInterrupt = (response) => { handleResolve(currentQueuedEvent.eventId, response); }; let result = null; if (handler) { result = handler({ event: currentQueuedEvent.event, resolve: resolveInterrupt }); } if (!render) return null; return import_react4.default.createElement(InterruptRenderer, { event: currentQueuedEvent.event, result, render, resolve: resolveInterrupt }); }, [interruptActions, interruptEventQueue, threadId, agentSession, handleResolve]); } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { useLangGraphInterruptRender }); //# sourceMappingURL=use-langgraph-interrupt-render.js.map