Comes to Waiting for 0 more responses. Not to Harmonizing desires

This commit is contained in:
aodulov
2025-10-10 13:08:25 +03:00
parent 3c192b136c
commit 0111938b43
3 changed files with 42 additions and 32 deletions

View File

@@ -38,12 +38,28 @@ export const sessions = new Map<string, SessionData>();
// Initialize LLM Service (API key from environment) // Initialize LLM Service (API key from environment)
const llmService = new LLMService(process.env.GEMINI_API_KEY || ''); const llmService = new LLMService(process.env.GEMINI_API_KEY || '');
// Helper to create a serializable version of the session state
const getSerializableSession = (sessionData: SessionData) => {
return {
...sessionData,
responses: Object.fromEntries(sessionData.responses),
clients: Array.from(sessionData.clients.keys()), // Only send client IDs, not the WebSocket objects
};
};
export const broadcastToSession = (sessionId: string, message: any, excludeClientId: string | null = null) => { export const broadcastToSession = (sessionId: string, message: any, excludeClientId: string | null = null) => {
const sessionData = sessions.get(sessionId); const sessionData = sessions.get(sessionId);
if (sessionData) { if (sessionData) {
const serializableMessage = {
...message,
payload: {
...message.payload,
session: getSerializableSession(sessionData),
},
};
sessionData.clients.forEach((client, clientId) => { sessionData.clients.forEach((client, clientId) => {
if (clientId !== excludeClientId && client.readyState === WebSocket.OPEN) { if (clientId !== excludeClientId && client.readyState === WebSocket.OPEN) {
client.send(JSON.stringify(message)); client.send(JSON.stringify(serializableMessage));
} }
}); });
} }
@@ -89,7 +105,7 @@ export const createWebSocketServer = (server: any) => {
if (!sessionData.clients.has(clientId)) { if (!sessionData.clients.has(clientId)) {
sessionData.clients.set(clientId, ws); sessionData.clients.set(clientId, ws);
console.log(`Client ${clientId} registered for session: ${sessionId}. Total clients: ${sessionData.clients.size}`); console.log(`Client ${clientId} registered for session: ${sessionId}. Total clients: ${sessionData.clients.size}`);
ws.send(JSON.stringify({ type: 'STATE_UPDATE', payload: { session: sessionData } })); ws.send(JSON.stringify({ type: 'STATE_UPDATE', payload: { session: getSerializableSession(sessionData) } }));
} }
console.log(`Received message from ${clientId} in session ${sessionId}:`, type); console.log(`Received message from ${clientId} in session ${sessionId}:`, type);
@@ -108,7 +124,7 @@ export const createWebSocketServer = (server: any) => {
sessionData.expectedResponses = expectedResponses; sessionData.expectedResponses = expectedResponses;
sessionData.topic = topic || 'Untitled Session'; sessionData.topic = topic || 'Untitled Session';
sessionData.state = SessionState.GATHERING; sessionData.state = SessionState.GATHERING;
broadcastToSession(sessionId, { type: 'STATE_UPDATE', payload: { session: sessionData } }); broadcastToSession(sessionId, { type: 'STATE_UPDATE', payload: {} });
console.log(`Session ${sessionId} moved to GATHERING with topic "${sessionData.topic}" and ${expectedResponses} expected responses.`); console.log(`Session ${sessionId} moved to GATHERING with topic "${sessionData.topic}" and ${expectedResponses} expected responses.`);
} else { } else {
ws.send(JSON.stringify({ type: 'ERROR', payload: { message: `Session is not in SETUP state. Current state: ${sessionData.state}` } })); ws.send(JSON.stringify({ type: 'ERROR', payload: { message: `Session is not in SETUP state. Current state: ${sessionData.state}` } }));
@@ -127,7 +143,7 @@ export const createWebSocketServer = (server: any) => {
if (sessionData.submittedCount === sessionData.expectedResponses) { if (sessionData.submittedCount === sessionData.expectedResponses) {
sessionData.state = SessionState.HARMONIZING; sessionData.state = SessionState.HARMONIZING;
broadcastToSession(sessionId, { type: 'STATE_UPDATE', payload: { session: sessionData } }); broadcastToSession(sessionId, { type: 'STATE_UPDATE', payload: {} });
console.log(`Session ${sessionId} moved to HARMONIZING. Triggering LLM analysis.`); console.log(`Session ${sessionId} moved to HARMONIZING. Triggering LLM analysis.`);
try { try {
@@ -200,16 +216,16 @@ export const createWebSocketServer = (server: any) => {
sessionData.finalResult = decision; sessionData.finalResult = decision;
sessionData.state = SessionState.FINAL; sessionData.state = SessionState.FINAL;
broadcastToSession(sessionId, { type: 'STATE_UPDATE', payload: { session: sessionData } }); broadcastToSession(sessionId, { type: 'STATE_UPDATE', payload: {} });
console.log(`Analysis complete for session ${sessionId}. Result:`, decision); console.log(`Analysis complete for session ${sessionId}. Result:`, decision);
} catch (error) { } catch (error) {
console.error(`Error during analysis for session ${sessionId}:`, error); console.error(`Error during analysis for session ${sessionId}:`, error);
sessionData.state = SessionState.GATHERING; sessionData.state = SessionState.GATHERING;
broadcastToSession(sessionId, { type: 'STATE_UPDATE', payload: { session: sessionData } }); broadcastToSession(sessionId, { type: 'STATE_UPDATE', payload: {} });
} }
} else { } else {
broadcastToSession(sessionId, { type: 'STATE_UPDATE', payload: { session: sessionData } }); broadcastToSession(sessionId, { type: 'STATE_UPDATE', payload: {} });
} }
} else { } else {
ws.send(JSON.stringify({ type: 'ERROR', payload: { message: `Session is not in GATHERING state. Current state: ${sessionData.state}` } })); ws.send(JSON.stringify({ type: 'ERROR', payload: { message: `Session is not in GATHERING state. Current state: ${sessionData.state}` } }));

View File

@@ -1,11 +1,12 @@
import React from 'react'; import React, { useEffect } from 'react';
import { Box, Button, Typography, Container } from '@mui/material'; import { Box, Typography, Container, CircularProgress } from '@mui/material';
import axios from 'axios'; import axios from 'axios';
import { useNavigate } from 'react-router-dom'; import { useNavigate } from 'react-router-dom';
const CreateSession = () => { const CreateSession = () => {
const navigate = useNavigate(); const navigate = useNavigate();
useEffect(() => {
const handleCreate = async () => { const handleCreate = async () => {
try { try {
const response = await axios.post('http://localhost:8000/sessions'); const response = await axios.post('http://localhost:8000/sessions');
@@ -16,6 +17,9 @@ const CreateSession = () => {
} }
}; };
handleCreate();
}, [navigate]);
return ( return (
<Container maxWidth="sm"> <Container maxWidth="sm">
<Box <Box
@@ -26,20 +30,10 @@ const CreateSession = () => {
alignItems: 'center', alignItems: 'center',
}} }}
> >
<Typography component="h1" variant="h5"> <CircularProgress />
Unisono <Typography component="h1" variant="h6" sx={{ mt: 2 }}>
Creating a new session...
</Typography> </Typography>
<Box sx={{ mt: 3 }}>
<Button
type="button"
fullWidth
variant="contained"
sx={{ mt: 3, mb: 2 }}
onClick={handleCreate}
>
Create a New Session
</Button>
</Box>
</Box> </Box>
</Container> </Container>
); );

View File

@@ -52,7 +52,7 @@ const SessionPage = () => {
{session.state === SessionState.SETUP && ( {session.state === SessionState.SETUP && (
<Box sx={{ mt: 4, p: 3, border: '1px dashed grey', borderRadius: '4px', textAlign: 'center' }}> <Box sx={{ mt: 4, p: 3, border: '1px dashed grey', borderRadius: '4px', textAlign: 'center' }}>
<Typography variant="h6" component="p" gutterBottom> <Typography variant="h6" component="p" gutterBottom>
Set Up the Session Set Up Session
</Typography> </Typography>
<TextField <TextField
margin="normal" margin="normal"