The Launcher's XP11 port (8730b9b) now extends to everything: one net40
flavor across Console, vPOD, Contract, and SecureConfig (Newtonsoft.Json
everywhere; the net48/System.Text.Json legs and their #if splits are gone
since nothing consumed them).
Console (net40, single TFM like the Launcher):
- The ~31 BinaryFormatter bitmap blobs in the .resx files became raw
embedded files under assets/icons/ (extracted byte-faithfully via a
serialization surrogate — the animated square_throbber.gif survives),
loaded by Properties.Resources.EmbeddedBitmap/EmbeddedIcon. Reason:
System.Resources.Extensions' DeserializingResourceReader is net461+
and cannot load on net40. Strings stay in the .resx.
- IReadOnlyList -> IList in AppRegistry (net45+ interface).
vPOD (net40, single TFM):
- Zip extraction now shares the Launcher's MiniZip.cs (linked source), so
the diff-test install round-trip exercises it against ZipArchive zips.
- RPC args as JTokens; LaunchApps.json persistence via Newtonsoft;
Thread.VolatileRead instead of Volatile.Read.
Contract/SecureConfig: net40-only; Client/** (PodManagerConnection) now
ships in the one build. The Launcher package gains
TeslaSecureConfiguration.dll as a dependency of the client half.
Tests: the net48 xunit host loads the net40 assemblies (both CLR4), so
the suite exercises exactly what ships — 106/106 green. Also verified
live: net40 console provisioned, managed, and ran a full RP mission
against net40 vPOD (beacon/passphrase/RSA, 53290 RPC, egg load,
Run/Stop Mission).
Version: 4.11.4.3 across Launcher, Console, and vPOD (vPOD joins the
suite version line; was 1.0.0). Ship the dotNetFx40 redistributable in
Launcher/assets for XP-era pods.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Launcher/build.bat now outputs to dist\TeslaLauncher\ (was TeslaLauncher\ at the
Launcher root) and produces dist\TeslaLauncher-podpkg.zip, matching Console\dist\.
- Both build scripts now zip the package themselves (Compress-Archive) instead of
leaving it as a manual step: Console/build-package.bat -> dist\TeslaConsole-pkg.zip.
- Launcher/.gitignore: ignore /dist/ (drop the obsolete /TeslaLauncher/ + staging
entries); Console already ignores /dist/.
- READMEs updated to point at dist\.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Reconfigure timeout (launcher reinstall of an already-configured pod):
- The console pings each configured pod and connects on success, on a loop, and
never tore that down — so it kept hammering the pod's old IP with a stale
connection while SecureConfig tried to bring the pod up on that address, which
timed out. Only a console restart (closing all sockets) cleared it.
- DeletePod now Disconnect()s the pod's connection (closes the lingering socket)
so delete-to-reconfigure works WITHOUT a console restart.
- Reconfiguring a known pod in place now pauses that pod's ping/connect loop
(OperationInProgress) and drops its stale connection before SecureConfig, and
resumes on completion (success or failure) so it reconnects with the new key.
(StopPing kills the ping thread irreversibly, so pause via OperationInProgress.)
Note: PodInfo's static mPods registry is dead code (nothing registers), so the
real fix is the disconnect, not an unregister.
Console deployment:
- Console/install.bat: installs the console to C:\Program Files\TeslaConsole,
preps the %ProgramData%\Tesla Console data dir (Users: modify), creates a Start
Menu shortcut, and adds a per-program inbound firewall rule so it can receive
pod discovery beacons. net48 is in-box, no runtime install.
- Console/build-package.bat: publishes the console (net48 framework-dependent) to
dist\TeslaConsole\App and assembles the package with install.bat.
74 tests green; the pod-config fix is UI/network behavior, validate on a pod.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>