Subscribe to selection changes. Returns an unsubscribe handle.
Start the viewer for model. If already running for the same model,
returns the existing state. If a different model is requested, the
caller must close() first — we don't auto-swap to avoid surprising
mid-session changes.
OptionalrequestedPort: numberSend a one-off command via the viewer's REST API.
Optionalpayload: Record<string, unknown>
Build viewer + visibility streaming adapters bound to the running port.