# Native Vivox validation

MetaCrate's Vivox support is a cross-platform Rust implementation of the SDK
control protocol. `VivoxControlClient` connects to a caller-supplied TCP socket,
writes bounded XML requests terminated by the Vivox three-newline delimiter,
correlates responses by request ID and action, and queues asynchronous login,
session, and participant events. It does not start or ship proprietary code.

The client owns connector, account, and session state. Invalid ordering is
rejected locally. `shutdown()` is idempotent and reverses active state in this
order: sessions, account, connector, TCP writer. Response failures preserve the
action and numeric return/status codes while passwords, handles, and URIs remain
opaque. XML is escaped on output; input is capped at 1 MiB and rejects DTD or
entity declarations.

`vivox-test --fake-script FILE` launches a deterministic fake control service on
IPv4 loopback. It validates the same wire requests used with a real daemon,
scripts device responses and participant events, and waits for both client and
server teardown. Live mode additionally logs into a grid, waits for the event
queue, requests `ProvisionVoiceAccountRequest` and `ParcelVoiceInfoRequest`, and
then exercises the control service. Live login requires both
`--allow-live-login` and `--confirm-live-login LOGIN`; joining audio also requires
`--allow-session-audio`.

Use environment variables for live credentials so they are not copied into a
shell history or process argument list:

```sh
GRID_FIRST_NAME=... GRID_LAST_NAME=... GRID_PASSWORD=... \
  cargo run -p libremetaverse-programs --bin vivox-test -- \
  --allow-live-login --confirm-live-login LOGIN
```

The Vivox daemon/SDK is proprietary and must be installed, configured, and
started independently. MetaCrate never discovers or invokes it.
