Add disconnect/uninstall for persistent sessions

- Server: Add DELETE /api/sessions/:id endpoint to disconnect agents
- Server: SessionManager.disconnect_session() sends Disconnect message
- Agent: Handle ADMIN_DISCONNECT to trigger uninstall
- Agent: Add startup::uninstall() to remove from startup and schedule exe deletion
- Dashboard: Add Disconnect button in Access tab machine details
- Dashboard: Add Chat button for persistent sessions

🤖 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 16:53:29 -07:00
parent aa03a87c7c
commit 4b29dbe6c8
7 changed files with 131 additions and 2 deletions

View File

@@ -709,7 +709,9 @@
'<div class="detail-section">' +
'<div class="detail-section-title">Actions</div>' +
'<button class="btn btn-primary" style="width: 100%; margin-bottom: 8px;" onclick="connectToMachine(\'' + m.id + '\')">Connect</button>' +
'<button class="btn btn-outline" style="width: 100%;" disabled>Transfer Files</button>' +
'<button class="btn btn-outline" style="width: 100%; margin-bottom: 8px;" onclick="openChat(\'' + m.id + '\', \'' + (m.agent_name || 'Client').replace(/'/g, "\\'") + '\')">Chat</button>' +
'<button class="btn btn-outline" style="width: 100%; margin-bottom: 8px;" disabled>Transfer Files</button>' +
'<button class="btn btn-outline" style="width: 100%; color: hsl(0, 62.8%, 50%);" onclick="disconnectMachine(\'' + m.id + '\', \'' + (m.agent_name || m.agent_id).replace(/'/g, "\\'") + '\')">Disconnect</button>' +
'</div>';
}
@@ -718,6 +720,22 @@
alert("Viewer not yet implemented.\\n\\nSession ID: " + sessionId + "\\n\\nWebSocket: wss://connect.azcomputerguru.com/ws/viewer?session_id=" + sessionId);
}
async function disconnectMachine(sessionId, machineName) {
if (!confirm("Disconnect " + machineName + "?\\n\\nThis will end the remote session.")) return;
try {
const response = await fetch("/api/sessions/" + sessionId, { method: "DELETE" });
if (response.ok) {
selectedMachine = null;
renderMachineDetail();
loadMachines();
} else {
alert("Failed to disconnect: " + await response.text());
}
} catch (err) {
alert("Error disconnecting machine");
}
}
// Refresh machines every 5 seconds
loadMachines();
setInterval(loadMachines, 5000);