Amir Mahla
Init CUA2
af1ae43
raw
history blame
3.71 kB
import React from 'react';
import { useWebSocket } from '@/hooks/useWebSocket';
import { AgentMessage, WebSocketEvent } from '@/types/agent';
import { useEffect, useState } from 'react';
const Index = () => {
const [messages, setMessages] = useState<AgentMessage[]>([]);
const [isAgentProcessing, setIsAgentProcessing] = useState(false);
const [vncUrl, setVncUrl] = useState<string>('');
// WebSocket connection - Use environment variable for flexibility across environments
// const WS_URL = process.env.NEXT_PUBLIC_WS_URL || 'ws://localhost:8000/ws';
const WS_URL = 'ws://localhost:8000/ws';
const handleWebSocketMessage = (event: WebSocketEvent) => {
console.log('WebSocket event received:', event);
switch (event.type) {
case 'agent_start':
setIsAgentProcessing(true);
if (event.content) {
const newMessage: AgentMessage = {
id: event.messageId,
type: 'agent',
instructions: event.instructions,
modelId: event.modelId,
timestamp: new Date(),
isLoading: true,
};
setMessages(prev => [...prev, newMessage]);
}
break;
case 'agent_progress':
if (event.messageId && event.agentStep) {
// Add new step from a agent trace run with image, generated text, actions, tokens and timestamp
setMessages(prev =>
prev.map(msg => {
if (msg.id === event.agentStep.messageId) {
const existingSteps = msg.steps || [];
const stepExists = existingSteps.some(step => step.stepId === event.agentStep.stepId);
if (!stepExists) {
return { ...msg, steps: [...existingSteps, event.agentStep], isLoading: true };
}
return msg;
}
return msg;
})
);
}
break;
case 'agent_complete':
setIsAgentProcessing(false);
if (event.messageId && event.metadata) {
setMessages(prev =>
prev.map(msg =>
msg.id === event.metadata.messageId
? {
...msg,
isLoading: false,
metadata: event.metadata,
}
: msg
)
);
}
break;
case 'agent_error':
setIsAgentProcessing(false);
// TODO: Handle agent error
break;
case 'vnc_url_set':
if (event.vncUrl) {
setVncUrl(event.vncUrl);
}
// TODO: Handle VNC URL set
break;
case 'vnc_url_unset':
setVncUrl('');
// TODO: Handle VNC URL unset
break;
case 'heartbeat':
console.log('Heartbeat received:', event);
break;
}
};
const handleWebSocketError = () => {
// Error handling is now throttled in the WebSocket hook
};
const { isConnected, connectionState, sendMessage, manualReconnect } = useWebSocket({
url: WS_URL,
onMessage: handleWebSocketMessage,
onError: handleWebSocketError,
});
const handleSendMessage = (content: string) => {
const userMessage: AgentMessage = {
id: Date.now().toString(),
type: 'user',
content,
timestamp: new Date(),
};
setMessages(prev => [...prev, userMessage]);
// Send message to Python backend via WebSocket
sendMessage({
type: 'user_task',
content,
model_id: "anthropic/claude-sonnet-4-5-20250929",
timestamp: new Date().toISOString(),
});
};
return (
<div>
<h1>Hello World</h1>
</div>
);
};
export default Index;