Add connected technician tracking to dashboard

- Add ViewerInfo struct to track viewer name and connection time
- Update session manager to track viewers with names
- Update API to return viewer list for each session
- Update dashboard to display "Mike Connected (3 min)" on machine bars
- Update viewer.html to pass viewer_name parameter

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-28 19:17:47 -07:00
parent f3b76b7b62
commit 448d3b75ac
5 changed files with 117 additions and 16 deletions

View File

@@ -34,6 +34,12 @@ pub struct AgentParams {
#[derive(Debug, Deserialize)]
pub struct ViewerParams {
session_id: String,
#[serde(default = "default_viewer_name")]
viewer_name: String,
}
fn default_viewer_name() -> String {
"Technician".to_string()
}
/// WebSocket handler for agent connections
@@ -58,9 +64,10 @@ pub async fn viewer_ws_handler(
Query(params): Query<ViewerParams>,
) -> impl IntoResponse {
let session_id = params.session_id;
let viewer_name = params.viewer_name;
let sessions = state.sessions.clone();
ws.on_upgrade(move |socket| handle_viewer_connection(socket, sessions, session_id))
ws.on_upgrade(move |socket| handle_viewer_connection(socket, sessions, session_id, viewer_name))
}
/// Handle an agent WebSocket connection
@@ -242,6 +249,7 @@ async fn handle_viewer_connection(
socket: WebSocket,
sessions: SessionManager,
session_id_str: String,
viewer_name: String,
) {
// Parse session ID
let session_id = match uuid::Uuid::parse_str(&session_id_str) {
@@ -256,7 +264,7 @@ async fn handle_viewer_connection(
let viewer_id = Uuid::new_v4().to_string();
// Join the session (this sends StartStream to agent if first viewer)
let (mut frame_rx, input_tx) = match sessions.join_session(session_id, viewer_id.clone()).await {
let (mut frame_rx, input_tx) = match sessions.join_session(session_id, viewer_id.clone(), viewer_name.clone()).await {
Some(channels) => channels,
None => {
warn!("Session not found: {}", session_id);
@@ -264,7 +272,7 @@ async fn handle_viewer_connection(
}
};
info!("Viewer {} joined session: {}", viewer_id, session_id);
info!("Viewer {} ({}) joined session: {}", viewer_name, viewer_id, session_id);
let (mut ws_sender, mut ws_receiver) = socket.split();