- Adopt the launch-key convention (documented in the Apps.xml header):
fresh Guid = product id, first Launch key reuses it, each extra entry
increments the last hex digit (wrapping F->0). Never a -1 suffix:
keys parse as System.Guid and silently collapse to Guid.Empty.
- Rewrite BT411 LC/MR + RIOJoy keys to the convention. RP4.11 LC/MR stay
pinned to the original console's hardcoded Guids (SiteManagement
constants + diff tests).
- Remove vPOD from the shipped catalog: dev tool, never a console-deployed
product (README documents the ad-hoc Add Product path instead).
- Add TeslaRel410 (DOSBox-X preservation pods): six entries, BT/RP 4.10 x
GameClient/LC/MR, all C:\Games\TeslaPod410\pod-launch.exe with mode
bt/rp. LC/MR boot identically (role assigned via egg hostType) and no
{res} token (output size fixed per rig at postinstall).
- CatalogTests: now 5 products / 14 entries; full diff suite 106/106.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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>
vPOD has outgrown its home inside the console's folder: it now emulates both
halves of a pod (Munga game client + TeslaLauncher service / provisioning),
so it lives at the repo root beside Console/, Launcher/, Contract/ and
SecureConfig/, like the peer it has become.
Accompanying changes: project references rebased (Contract, SecureConfig,
the console's vendored Munga Net.dll), solution + DiffTests reference paths,
the console csproj's now-obsolete vPOD source exclusion removed, and the
root README / Apps.xml / vPOD README path mentions updated. pack.ps1 is
self-relative and now emits vPOD/dist/vPOD.zip.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>