Remote Desktop
RDP, VNC and Telnet remote desktop sessions, packaged as a first-party plugin.
Why this plugin runs in-process
Every other plugin runs in a worker_threads worker and reaches the server
through a structured-clone postMessage boundary. That boundary is what makes
the capability gate and the audit trail mean anything: a worker plugin cannot
hold a db handle, an ssh2 Client or a live socket, so every privileged action
has to go through the broker.
This plugin cannot work that way:
- it owns a
guacamole-liteWebSocket server on port 30008, - its
/connect-host/:hostIdroute does multi-step credential and tunnel resolution (SSH jump-host tunnels, a macOS VNC compatibility proxy) using rawnet.Socketplumbing, - it needs plaintext host credentials to connect at all.
None of that can cross a structured-clone boundary, so this plugin runs on the
main thread instead, under the process:transport-owner tier, the same as
ssh-terminal, docker and host-metrics.
guacd is not spawned by this plugin
guacd (the Apache Guacamole proxy daemon that actually speaks RDP/VNC/Telnet) is a separate, external service reached over plain TCP -- by default a sibling Docker container, or any network-reachable host configured through the admin "guacd URL" setting. This plugin does not download, bundle or spawn guacd as a child process.
That is a deliberate limitation, not an oversight: Apache Guacamole does not publish prebuilt guacd binaries for any platform (only source tarballs and their own Docker image), and there is no viable native guacd for Windows at all. Bundling guacd for Linux and macOS is possible in principle but would make Termix the ongoing upstream builder and security patcher for guacd plus FreeRDP/libvncclient/libssh2/libtelnet -- out of scope for this conversion. guacd's availability is handled as an external dependency with graceful degradation, exactly as it was before this plugin existed.
What lives where
Unlike ssh-terminal (whose implementation stays in core because
session-manager.ts has consumers well beyond the terminal), this plugin's
backend and frontend code is fully relocated here from
src/backend/hosts/guacamole/ and src/ui/features/guacamole/, the same
shape docker and host-metrics use.
Two pieces of shared infrastructure still reach across the plugin boundary into this plugin rather than living in core:
src/backend/hosts/collab/routes.tsandsrc/backend/hosts/session-sharing/importtoken-service.tsandguacamole-server.tsdirectly to resolve and validate live Guacamole sessions for collaborative/shared viewing.src/ui/features/collab/andsrc/ui/features/session-sharing/importGuacamoleDisplay.tsxdirectly for the same reason.
This is an accepted, temporary coupling: collab and session-sharing are expected to become plugins of their own later, at which point these become real inter-plugin references instead of raw relative imports.
Disabling
Disabling behaves like any other plugin: the rdp/vnc/telnet tabs stop being
offered from the host list, command palette and quick connect, the
/guacamole router 404s, and the WebSocket server on port 30008 is closed.