Merge TeslaLauncherService (Session 0) + TeslaLauncherAgent (tray) into one
userland TeslaLauncher.exe. The split existed only to work around Vista+
Session 0 isolation; running everything in the auto-logged-in admin session
needs no service, no named pipe, and no flat<->wire conversion layer. The
original Elsewhen software was likewise a single binary.
net40 is the newest framework XP SP3 can install, and net40 assemblies load
in-place on the 4.8 runtime in Win10/11 -- one exe covers both.
- Contract: multi-target net48;net40. The net40 leg of PodRpcProtocol uses
Newtonsoft.Json (STJ has no net40 target); JSON is shape-identical on the
wire, and the request reader keeps date strings raw so Ping echoes
byte-identically. Console keeps the untouched net48/STJ leg.
- MiniZip.cs: central-directory ZIP extractor (stored/deflate/ZIP64) since
net40 has no ZipFile; zip-slip guarded.
- SecureConfig: RSACryptoServiceProvider instead of RSA.Create (net46+),
no leaveOpen BinaryWriter/Reader, struct instead of ValueTuple, and no
SetCompatibleTextRenderingDefault on the passcode thread (the merged app
already has a form). netsh "interface ip" syntax was already XP-correct.
- Volume: nircmd -> CoreAudio (Vista+) -> winmm waveOutSetVolume (XP).
- Paths: CommonApplicationData resolved per-OS (XP has no C:\ProgramData);
launcher log moved next to the key/config in the data dir.
- install.bat: dual-OS (cacls/icacls, netsh firewall/advfirewall, dism and
UAC/notification steps skipped on XP, .NET 4.0 redist check, XP DHCP reset
via netsh); no service registration -- HKLM Run key + auto-login on both;
RegisterApplicationRestart supplies crash-restart on Vista+.
- Bench switches: /skipconfig, /port:NNNN.
Verified: Console + diff suite (103 tests) still green on the net48 leg;
E2E smoke test drove the net40 launcher over real TCP with the Console's own
PodManagerConnection (STJ client vs Newtonsoft server) -- Ping echo, volume,
app registry, launch/kill/watch, InstallProduct zip transfer + extract, and
uninstall orphan cleanup: 17/17 pass.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Join a site-wide workgroup (WORKGROUP=Tesla) at install time so every pod
shares one browse list for the mw4files / c shares.
- Enable SMB1 server as well as client: the pod hosts those shares and Win10/11
ship the SMB1-Server sub-feature off by default, so old SMB1 clients couldn't
reach them. Now enables SMB1Protocol + -Client + -Server.
- Refresh the stale asset-layout comment in the header.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Install the UltraVNC server component with the service tasks selected up front
(SetupType=custom, Components=ultravnc_server, Tasks=installservice,startservice)
and run the setup with start /wait + /loadinf so the pod comes up with the VNC
service registered and started for remote diagnostics.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Notifications: replace per-user HKCU tweaks (which only hit the admin running
the installer) with machine-wide HKLM Group Policy keys so they apply to the
auto-login kiosk account — no toasts, lock-screen notifications, cloud toasts,
tips/Spotlight/consumer content, or Defender health alerts.
- Shares (closed network): create C:\mw4files and share it as \host\mw4files,
and share C:\ as \host\c, both granted to Everyone. Idempotent (delete-then-
create); C:\mw4files also gets Everyone modify on NTFS so the grant is usable.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- assets/: replace old reference dumps with the three redist folders the
installer actually consumes (dx9201006/, openal/, UltraVNC/).
- build.bat: mirror each redist folder into the package root so install.bat's
%ROOT%\dx9201006, %ROOT%\openal, %ROOT%\UltraVNC paths resolve; bump header
to v4.11.4.1.
- install.bat: bump header to v4.11.4.1; write Winlogon auto-login regedits
for the Firestorm kiosk account (was manual instructions); fix UltraVNC
setup exe filename typo (UltraVNC_Setup_x64 -> UltraVNC_x64_Setup).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Converts the Launcher Service + Agent from net8/win-x64 self-contained to net48
framework-dependent, and makes Tesla.Contract net48-only (drops multi-targeting).
Both consumers (Console + Launcher) are now a single TFM.
Code changes for net48 (the only net8/netstandard2.1 APIs in use):
- RandomNumberGenerator.Fill -> RandomNumberGenerator.Create().GetBytes (3x)
- TcpListener.AcceptTcpClientAsync(ct) -> AcceptTcpClientAsync() + stop-on-cancel
- byte[].AsSpan().SequenceEqual -> Linq SequenceEqual (no System.Memory) (2x)
- PipeStream.Write(byte[]) / WriteAsync(byte[],ct) -> explicit (buf,0,len[,ct])
- Math.Clamp -> Math.Max/Min
The generic host (Microsoft.Extensions.Hosting 8.x + UseWindowsService) runs on
net48 unchanged. build.bat/install.bat updated for the folder-of-DLLs deploy;
solution platform reverted x64 -> AnyCPU.
RESULT — package size: ~3.7 MB on disk / 1.58 MB zipped, vs ~213 MB / 91 MB for
the net8 self-contained build (~50-58x smaller). net48 ships in Win10/11 so no
runtime prerequisite. 73 tests green; NOT re-validated on a live pod.
Spike branch for evaluation — do not merge without a pod re-test.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-locate the two cockpit-pod projects into a single repository:
- Console/ : TeslaConsole, the net48 WinForms operator console (decompiled
reconstruction) plus its differential + catalog test suite.
- Launcher/ : TeslaLauncher, the net6 pod-side Service + Agent rewrite.
Adds a combined TeslaSuite.sln, root README documenting the shared wire
contract (and its current duplication, the main follow-up), and a root
.gitignore. Histories were not preserved per request; this is a fresh start
from the current working state of both projects.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>