Two additions to the virtual launcher's real-process mode:
- Auto-restart watchdog. Replaces the poll-on-query PruneExitedProcesses
with a per-process watcher thread (StartWatcher): when a real-launched
app exits on its own -- not via a Kill*/Uninstall, which untrack it
first -- it is dropped from the running list and, if its LaunchData has
AutoRestart and the "Auto-restart after the app exits (watchdog)"
toggle is on, relaunched after the Agent's 2 s delay. A watchdog
generation counter cancels pending restarts when the pod goes dark
(power off / reboot / reprovision / WipeApps); the console's KillAllApps
leaves them pending, matching the real Agent's race.
- postinstall.bat toggle. A "Run postinstall.bat after install" checkbox
(above "Actually launch apps", off by default) makes an install execute
a packaged postinstall.bat via cmd /c (waited up to 5 min) before
deleting it, like the real service. Off, it is logged and removed unrun
as before -- it runs package script code on the host.
Both are opt-in from the vPOD window. Verified against the real
LauncherRpcServer over a loopback socket: the watchdog test relaunches an
exited ping.exe with a new PID and stops once toggled off; a crafted
package's postinstall.bat runs (and is removed) only when enabled. Full
differential suite 103/103.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- InstallProduct now extracts into the real C:\Games (the launcher's
GAMES_DIR) so deployed products land where their catalog launch entries
point; uninstall removes the real product folder. Tests pass an isolated
games root through the VirtualLauncher ctor.
- New "Actually launch apps (real processes)" toggle (off by default =
simulated PIDs): LaunchApp starts the entry's exe exactly like the Agent
(same start info, same registered-but-not-installed error), Kill*/
Uninstall/Wipe terminate the real processes (kill before folder delete),
and self-exited apps are pruned from GetLaunchedApps/FullUpdate. Real
processes die with the machine: power off, reboot, or closing vPOD. The
Agent's autoRestart watchdog is deliberately not emulated.
- Pod Power and Mimicking Game groups swapped (game left, power right).
- Provisioning round-trip test now skips as inconclusive when a running
TeslaConsole holds UDP 53291 instead of failing the suite; two new tests
cover real launch/kill (ping.exe) and the missing-exe error path.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The launcher drops RPC sessions idle >30s (easily hit while the operator sits
in the install dialogs), but a dropped socket still reports Connected until an
I/O fails. InstallProductWorker then skipped its reopen, streamed the archive
on the fresh out-of-band connection, and died on the first progress poll —
and the install-completed handler registered launch entries without checking
e.Error, so AddApp's disconnected-guard exception crashed the whole console.
- PodInfo.EnsureConnectionAlive: probe an "open" connection with a Ping and
reconnect when it is dead; used by the install and uninstall workers.
- SiteManagement.PodInfo_InstallProductCompleted: register launch entries only
on success, and surface registration failures as the row's Install Failed
state instead of an unhandled exception.
- Regression test pins the premise + recovery against vPOD's launcher server
(stale socket reports open, Ping exposes it, reconnect restores service).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
vPOD now also impersonates the pod's TeslaLauncher service, so the console's
Manage Site works against it unmodified:
- LauncherRpcServer: ILauncherService over OFB + framed JSON on TCP 53290,
mirroring TeslaLauncherService (concurrent sessions, out-of-band install
zip on a second connection, the 99%-not-100 completion convention).
Packages extract to %LocalAppData%\vPOD\Games; postinstall.bat is logged
but never executed.
- PodProvisioning: pod side of SecureConfig (RQST beacon, RPLY decrypt, RSA
session-key exchange), display-only — never touches the NIC/registry. The
console's Configure flow mints the key exactly as for a real pod; console
Reconfigure (ClearStore) drops the key and re-enters beacon mode.
- VirtualLauncher: installed-app registry (persisted), simulated launch PIDs,
volume, install progress; console Shutdown/Restart power-cycles the pod.
- Form gets a Launcher/Site Management column (passcode display, RPC status,
install progress, app list, Reprovision); Power Off darkens the launcher
side too; new -nomanage flag disables it.
vPOD references the shared Tesla.Contract/Tesla.SecureConfig projects (server
side of the existing contract only, no new RPCs). Loopback tests drive the
real PodManagerConnection and PodConfigurationServer against the new code
(VPodLauncherServerTests, VPodProvisioningTests) — suite now 99 green.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>