feat: RDP frontend — Guacamole client with custom JSON WebSocket tunnel
- useRdp.ts: JsonWsTunnel class extends Guacamole.Tunnel to bridge
guacamole-common-js (expects raw protocol) with our JSON gateway
(consistent with SSH/SFTP message envelope pattern). Parses
length-prefixed Guacamole instructions, dispatches to Guacamole.Client.
Handles mouse/keyboard input, clipboard send, and session lifecycle.
- RdpCanvas.vue: full-size container that mounts the Guacamole display
canvas. Calls useRdp().connectRdp() on mount, cleans up on unmount.
Exposes sendClipboard() and disconnect() for toolbar integration.
- RdpToolbar.vue: auto-hiding floating toolbar (3s idle timeout) with
clipboard paste dialog, fullscreen toggle (HTML5 Fullscreen API),
settings panel stub, and disconnect button.
- SessionContainer.vue: renders RdpCanvas + RdpToolbar when
session.protocol === 'rdp', replacing the Phase 3 placeholder.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>