Audit date: 2026-07-10.
The plugin command registry and transport were compared directly with:
8a2ef7fdddb6b06a4572bc422e57385f310d0457.Companion-Ninja/server/oscninja.js.No VDO.Ninja source or established API handler was changed during this plugin review.
Every command exposed by the plugin except activateQueuedGuest and the newer muteAllGuests convenience wrapper exists in the checked v29.4 API surface. The plugin no longer depends on the wrapper and does not use the current-month scene-force extension where a legacy-safe path exists.
| Plugin area | API commands sent | Pre-v30.1 behavior |
|---|---|---|
| Connection/state | getDetails, getGuestList |
Existing shapes retained. |
| Local controls | mic, camera, speaker, record, togglescreenshare, togglehand, forceKeyframe, reload, hangup |
Existing shapes retained. Record uses explicit true or false; VDO.Ninja has no record toggle command. |
| Guest controls | mic, camera, speaker, display, volume, group, forward, hangup, solo/chat/refresh commands |
Existing shapes retained. Commands whose false result means rejection now show an alert. |
| Guest keyframe | forceKeyframe |
Sent without waiting for a callback because the legacy target handler performs the action but returns no result. |
| Guest scene toggle | addScene |
Existing toggle shape retained. |
| Fixed scene force | addScene, addScene2 through addScene8 |
Uses the historical boolean semantics. The legacy handler sets the current button value and then toggles, so the payload intentionally sends the inverse of the desired final state. |
| Named scene force | addScene |
Uses live getDetails.scenes state. It skips an already-correct state or sends one legacy toggle. If state is unavailable, it alerts instead of risking the wrong result. |
| Layout/slot | layout, setslot |
Existing shapes retained. |
| Mute all | One targeted mic command per non-director guest |
Replaces the v30.2-only muteAllGuests wrapper with the long-standing guest mic path. Directors and screen-share pseudo-guests are excluded. |
| Transfer all | One forward command per non-director guest |
Existing shape retained, with the existing two-press safety guard. |
| PTZ | Local zoom/pan/tilt/focus/exposure; guest ptz* commands |
Existing v29.4 shapes retained. Unsupported local/guest combinations are normalized before a button can send them. |
| Value dials | volume, panning, bitrate, setBufferDelay |
Existing shapes retained. All-stream buffer delay continues to use value2: "*". |
| Activate held guest | activateQueuedGuest |
Requires v30.2+. No equivalent native &api command exists in v29.4, so the inspector labels this limitation and an older page returns an alert. |
value2 use raw WebSocket payloads, preserving secondary values on older pages that already support them.failed and timeout relay responses remain errors.The test suite now checks:
Physical Stream Deck key/dial and browser permission prompts still require a hardware or Stream Deck Mobile smoke test.