Comes to Waiting for 0 more responses. Not to Harmonizing desires
This commit is contained in:
@@ -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}` } }));
|
||||||
|
|||||||
@@ -1,20 +1,24 @@
|
|||||||
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();
|
||||||
|
|
||||||
const handleCreate = async () => {
|
useEffect(() => {
|
||||||
try {
|
const handleCreate = async () => {
|
||||||
const response = await axios.post('http://localhost:8000/sessions');
|
try {
|
||||||
const { sessionId } = response.data;
|
const response = await axios.post('http://localhost:8000/sessions');
|
||||||
navigate(`/session/${sessionId}`);
|
const { sessionId } = response.data;
|
||||||
} catch (error) {
|
navigate(`/session/${sessionId}`);
|
||||||
console.error('Error creating session:', error);
|
} catch (error) {
|
||||||
}
|
console.error('Error creating session:', error);
|
||||||
};
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
handleCreate();
|
||||||
|
}, [navigate]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Container maxWidth="sm">
|
<Container maxWidth="sm">
|
||||||
@@ -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>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
Reference in New Issue
Block a user