File size: 1,928 Bytes
c2c8c8d | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | import { useCallback, useState } from 'react';
import { useWebSocket } from './useWebSocket';
import { useAIStore } from '@/stores/aiStore';
import { useFileStore } from '@/stores/fileStore';
import type { AgentType, AgentProgressEvent, FullReviewResult } from '@glmpilot/shared';
export function useAgentReview() {
const { socket } = useWebSocket();
const { setAgentResult, setAgentRunning } = useAIStore();
const files = useFileStore((s) => s.files);
const [isReviewing, setIsReviewing] = useState(false);
const [progress, setProgress] = useState<AgentProgressEvent | null>(null);
const reviewWorkspace = useCallback(
(agents?: AgentType[]) => {
if (!socket || isReviewing) return;
setIsReviewing(true);
const onProgress = (event: AgentProgressEvent) => {
setProgress(event);
setAgentRunning(event.agent as AgentType, event.status === 'started' || event.status === 'analyzing');
};
const onComplete = (result: FullReviewResult) => {
if (result.agentResults) {
for (const [agent, agentResult] of Object.entries(result.agentResults)) {
setAgentResult(agent as AgentType, agentResult);
setAgentRunning(agent as AgentType, false);
}
}
setIsReviewing(false);
setProgress(null);
socket.off('review:progress', onProgress);
socket.off('review:complete', onComplete);
};
socket.on('review:progress', onProgress);
socket.on('review:complete', onComplete);
socket.emit('review:start', { files, agents });
},
[socket, files, isReviewing, setAgentResult, setAgentRunning]
);
const reviewCurrentFile = useCallback(
(filePath: string, content: string) => {
if (!socket) return;
socket.emit('review:file', { filePath, content });
},
[socket]
);
return { reviewWorkspace, reviewCurrentFile, isReviewing, progress };
}
|