rdesign/frontend/node_modules/@copilotkitnext/react/dist/hooks/use-human-in-the-loop.mjs

72 lines
1.9 KiB
JavaScript

import { useCopilotKit } from "../providers/CopilotKitProvider.mjs";
import { useFrontendTool } from "./use-frontend-tool.mjs";
import React, { useCallback, useEffect, useRef } from "react";
//#region src/hooks/use-human-in-the-loop.tsx
function useHumanInTheLoop(tool, deps) {
const { copilotkit } = useCopilotKit();
const resolvePromiseRef = useRef(null);
const respond = useCallback(async (result) => {
if (resolvePromiseRef.current) {
resolvePromiseRef.current(result);
resolvePromiseRef.current = null;
}
}, []);
const handler = useCallback(async () => {
return new Promise((resolve) => {
resolvePromiseRef.current = resolve;
});
}, []);
const RenderComponent = useCallback((props) => {
const ToolComponent = tool.render;
if (props.status === "inProgress") {
const enhancedProps = {
...props,
name: tool.name,
description: tool.description || "",
respond: void 0
};
return React.createElement(ToolComponent, enhancedProps);
} else if (props.status === "executing") {
const enhancedProps = {
...props,
name: tool.name,
description: tool.description || "",
respond
};
return React.createElement(ToolComponent, enhancedProps);
} else if (props.status === "complete") {
const enhancedProps = {
...props,
name: tool.name,
description: tool.description || "",
respond: void 0
};
return React.createElement(ToolComponent, enhancedProps);
}
return React.createElement(ToolComponent, props);
}, [
tool.render,
tool.name,
tool.description,
respond
]);
useFrontendTool({
...tool,
handler,
render: RenderComponent
}, deps);
useEffect(() => {
return () => {
copilotkit.removeHookRenderToolCall(tool.name, tool.agentId);
};
}, [
copilotkit,
tool.name,
tool.agentId
]);
}
//#endregion
export { useHumanInTheLoop };
//# sourceMappingURL=use-human-in-the-loop.mjs.map