72 lines
1.9 KiB
JavaScript
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
|