Commit Graph
28 Commits
Author SHA1 Message Date
CydandClaude Fable 5 fd0c8c5196 vPOD: pod power controls, end-mission restart cycle, egg viewer polish
Adds pod-lifecycle controls to the vPOD window:

- Power Off / Power On: Power Off closes the TCP listener so the console can no
  longer connect, mimicking a pod with no game client running; Power On reopens
  it. The listener close/open is the faithful signal a console sees.
- End-mission graceful-exit + watchdog restart: on the end-mission command
  (StopMission) the game exits gracefully (listener closes, connection drops)
  and a watchdog relaunches it about 1.5 s later, coming back up in
  WaitingForEgg - the real pod's per-game cycle. A "Restart game after mission
  ends (watchdog)" checkbox (default on) toggles it; unchecked, the pod just
  returns to WaitingForEgg without exiting.
- Egg viewer: the last egg is kept across missions/restarts (no auto-clear) so
  it can be copied for dev use; a Clear button empties it on demand.
- Log pane defaults to half the window (egg lines are rarely wide); the split
  is set at load once the control has its real width.

Verified over real TCP: driving egg -> run -> end-mission makes the listener
drop then reopen with the pod back in WaitingForEgg (confirmed in vPOD's own
log: "Game exited gracefully" then "Watchdog restarted the game").

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
v4.11.4.2
2026-07-08 10:43:44 -05:00
CydandClaude Fable 5 aff8bbf6e5 vPOD: gitignore its dist like the console/launcher packages
The console (Console\dist) and launcher (Launcher\dist) packages are build
artifacts rebuilt by their build scripts and gitignored per-project; vPOD's
package was inconsistently committed. Give vPOD its own .gitignore (/dist/) so
its pack.ps1 output is rebuilt on demand the same way, and drop the tracked
zip. Deployment is unaffected: the Apps.xml product still lists vPOD in Install
Product, and the operator selects the pack.ps1-built zip at install time.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 09:58:59 -05:00
CydandClaude Fable 5 3fd637c58a Add vPOD: a virtual pod / game-client stand-in for testing the consoles
vPOD impersonates a Tesla game client (rpl4opt.exe / btl4.exe) so the Red
Planet and BattleTech operator consoles can be exercised without real cockpit
hardware. New net48 WinForms project under Console\vPOD:

- MungaPodServer: the server half of the Munga control protocol (TCP 1501).
  The vendored MungaSocket is client-only, so this reimplements the identical
  framing ([16-byte header][12-byte base + body], dispatched by
  ClientID+MessageID) for the listening side, reusing the vendored message
  classes' WriteTo/BinaryReader serialization.
- PodSimulator: the ApplicationState machine driven by the console's messages -
  answers StateQuery, reassembles the streamed egg and acknowledges it, and
  walks WaitingForEgg -> LoadingMission -> WaitingForLaunch -> RunningMission
  and back on Run/Stop/Abort/Suspend/Resume.
- VPodForm: live display of listening/connection status, the colour-coded
  ApplicationState, an egg viewer (fields + summary), and a newest-first
  protocol log. A Red Planet / BattleTech toggle changes which ApplicationID
  the pod reports, live, so one vPOD stands in for either game.
- PodArguments: parses the real client's launch flags (-net/-app/-lc/-mr/
  -host/-res).

Deployable from Manage Site -> Install Product: a catalog product in
RedPlanet\Apps.xml (Game Client / Live Camera / Mission Review entries) plus
pack.ps1, which builds dist\vPOD.zip laying out vPOD\vPOD.exe for the launcher
to extract to C:\Games\vPOD. CatalogTests updated to 5 products / 11 entries
with the four vPOD entry assertions (88/88 pass). TeslaConsole.csproj excludes
vPOD\** from its **/*.cs glob; the project is added to the solution.

Verified end-to-end over real TCP: a console-role client using the vendored
MungaSocket drives connect -> WaitingForEgg -> stream egg -> (ack) ->
WaitingForLaunch -> Run -> RunningMission -> Stop -> WaitingForEgg, with vPOD
reporting the correct state at each step. MungaGame (what the console's game
windows use) is a thin wrapper over MungaSocket, so this exercises the exact
wire behaviour.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 09:34:53 -05:00
CydandClaude Fable 5 18d787bdd5 BattleTech results printing, defaults dialog, and BT411 catalog (BT port phase 4)
Completes the BattleTech console feature to parity with Red Planet:

- BTPrintDocument: the per-pilot landscape score sheet (mech portrait,
  placing, kill/death/damage stats, randomized mission-highlights narrative,
  pilot-vs-pilot damage matrix, place-over-time chart), mirroring
  RPPrintDocument minus the football/lap/boost/score-zone concepts. Wired into
  BTGame (Auto Print checkbox + Print Last Mission button) and the shell's File
  menu (BT Mission Print Preview / Print BT Mission, loading .btm files).
- BTStrings(.xml): the BT mission-highlight narrative pools (damage tiers,
  kill, death-without-honor, recap), loaded from BattleTech\BTStrings.xml like
  RPStrings.
- BTDefaultsDialog: two-column (Free For All / No Return) editor for the BT
  operator defaults, reachable from Settings (Change/Import/Export BattleTech
  Defaults). Verified via UI Automation: opens with all 18 option combos
  populated.
- Apps.xml: the BattleTech 4.11 product (btl4.exe on the shared RP411 engine,
  same -net/-res/-lc/-mr command line; deploys to C:\Games\BT411) with Game
  Client / Live Camera / Mission Review launch entries. CatalogTests updated to
  4 products / 8 entries plus the three new BT entry assertions.

Role model spelling corrected to "noreturn": the Mac Console.ini tag and the
game's BTL4.RES role resource are dfltrole/NoReturn; the 4.10 console's eggs
emitted a broken "noretun" that cannot resolve against the RES. BTGoldenEggTests
and BTConfig.xml updated accordingly.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 23:04:03 -05:00
CydandClaude Fable 5 deaade4f72 Track the 410console hand-off docs; ignore the raw Mac archive
The BattleTech port spec, the Console 4.10 decompilation notes, the golden
reference eggs, and the PEF/rsrc analysis tools come into the repo. The .sit
archive and its extraction (Mac binaries, __MACOSX/.finf metadata) stay
untracked for now.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 22:43:32 -05:00
CydandClaude Fable 5 36166a95b0 BTGame pane + shell de-hardcode for multi-game pods (BT port phase 3)
BTGame mirrors RPGame - same GameStateData/state-machine/NetworkScan engine
driving each pod's MungaGame (take ownership, stream egg on WaitingForEgg,
Run/Abort/Stop, countdown) - with the BT differences: ApplicationID.BTL4, a
pilots grid carrying Mech/Camo/Patch/Badge/Experience, an Advanced Damage
checkbox in place of RP's Score Compression, and the Mech* in-match messages
recorded via BTMissionRecorder into BTMissionResults (.btm, gzip +
BinaryFormatter like .rpm; scores are 1000-based like RP). Free For All and
No Return share the pane; the mode selects the pilots' role. BTDefaults
persists per-mode operator defaults to BTDefaults.btd (no dialog yet).
RPGame's dead decompile members (sStopToIdleStates, IsAllPodsAppState) were
not carried over.

TeslaConsoleForm no longer assumes RP: the "AppID != 0 -> Pod Not Running RP"
check becomes a GameTag map (RPL4 -> RP, BTL4 -> BT, otherwise Unknown Pod
Application) feeding the per-game status strings, and the Games menu gains
BattleTech: Free For All / No Return.

Deferred to phase 4: mech/arena art, BT defaults dialog, BT score-sheet
print document, Apps.xml BT411 product, live-pod verification.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 22:29:20 -05:00
CydandClaude Fable 5 9148ce2cca BattleTech egg builder, catalog, and golden-egg DiffTests (BT port phases 1-2)
New TeslaConsole.BattleTech namespace mirroring TeslaConsole.RedPlanet's
mission layer: BTMission/BTFreeForAllMission (egg serializer; RP wire framing
and ordinal bitmaps reused verbatim), BTParticipant/BTPlayer/BTCamera (BT
participant fields: advancedDamage, experience, vehicleValue, patch, role),
and the BTConfig/BTScenario/BTMap/BTVehicle/BTWeather/BTRole catalog loaded
from BattleTech\BTConfig.xml (reconstructed from the Mac Console 4.10 ini BT
tree). Free For All and No Return share one mission class - both send
scenario=freeforall; the mode is the role assigned to each pilot.

BTGoldenEggTests (7 tests, recovered-only) diff the generated egg
field-by-field against two eggs captured from the original consoles
(cavern.egg, TESTARN.EGG): order-independent per-section compare with
font-rendered bitmap pixel rows excluded, ordinal art byte-exact vs
TESTARN.EGG, EggFileMessage framing reassembly, role de-dup, No Return role
semantics, and shipped-catalog contents. Invoker gains BTEggString/
BTEggFraming reflection cases.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 22:28:07 -05:00
CydandClaude Opus 4.8 0431c6840b install.bat: join Tesla workgroup + enable SMB1 client and server
- 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>
2026-07-01 08:57:18 -05:00
CydandClaude Opus 4.8 3637f5c6b1 install.bat: silent UltraVNC server install via custom Inno answer file
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>
v4.11.4.1
2026-07-01 00:20:33 -05:00
CydandClaude Opus 4.8 09e3d769d7 Remove redundant "BattleTech Firestorm LC" product from catalog
Firestorm selects game vs. Live Cam behavior from its assigned IP address, so a
separate LC product entry is unnecessary. Drop it from Apps.xml and update the
catalog tests (now 3 products / 5 entries; removed FirestormLC_Matches_Original).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 22:53:08 -05:00
CydandClaude Opus 4.8 6268bb3df7 install.bat: disable all notifications machine-wide + add game-data shares
- 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>
2026-06-30 22:53:02 -05:00
CydandClaude Opus 4.8 a6c3a62e23 Rename UltraVNC.ini -> UltraVNC.inf; clean redist folders on rebuild
install.bat passes /loadinf="...\UltraVNC.inf", so the answer file must have
the .inf extension. Also make build.bat wipe the dx9201006/openal/UltraVNC
package folders before re-copying, so stale files don't linger across builds.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 22:16:58 -05:00
CydandClaude Opus 4.8 7852bc59ea Package DirectX/OpenAL/UltraVNC redists with launcher; auto-login + v4.11.4.1
- 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>
2026-06-30 22:10:51 -05:00
CydandClaude Opus 4.8 a91d31913e Remove redundant "Push to selected pods now" checkbox from Add Product
Deployment intent is now implied by the install package field: if a package is
supplied the product is installed to the selected pods after being added; if not,
it is only added to the catalog. Removes the checkbox (dlgAddProduct) and the
push-decision branch (AddProduct_Click). The register-only-without-package path is
retired with it, so the now-dead RegisterProductOnSelectedPods is removed too.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 20:36:30 -05:00
CydandClaude Opus 4.8 7ae8c0dfb1 Remove "Register Product on Pods" from the Site Management context menu
Drops the standalone right-click submenu (and its handler + field). Installing a
product from the console still registers its launch entries on completion, and the
Add New Product dialog's "push now" path still uses RegisterProductOnSelectedPods,
which is retained.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 20:18:17 -05:00
CydandClaude Opus 4.8 d1e9f0e365 Package both launcher and console into dist\ (parity)
- 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>
2026-06-30 20:06:50 -05:00
CydandClaude Opus 4.8 4a61a9f8c3 Fix pod reconfigure timeout; add console installer + package
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>
2026-06-30 19:26:28 -05:00
CydandClaude Opus 4.8 4c15197b34 Console/launcher-managed RIOJoy + real product uninstall
RIOJoy lifecycle is now owned by the console + launcher (the auto-start Run entry
was removed on the RioJoy side): Apps.xml autoRestart false -> true, so the
launcher starts RIOJoy and keeps it alive. Safe with uninstall — the watcher only
relaunches a still-tracked process, and uninstall's kill untracks it first.

Uninstall now physically removes the product (was unregister-only):
- Agent CmdUninstallApp: after kill + unregister, reports the product's
  C:\Games\<dir> to clean up — but only if no remaining registered launch entry
  still uses that folder (orphan check keeps multi-entry products like Red Planet's
  GameClient/LC/MR intact until the last entry is removed).
- Service (SYSTEM): on UninstallApp, runs <dir>\pre-uninstall.bat if present
  (RIOJoy's removes ViGEmBus + config) then deletes the directory, on a background
  thread so it can't trip the Console's RPC timeout. Path-guarded to only ever
  delete a proper subdirectory of C:\Games. Logged to podconf.log.

74 tests green; the cleanup path is pod-behavior, not unit-tested here.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 18:53:09 -05:00
CydandClaude Opus 4.8 ce094535fa Add RIOJoy to the product catalog
RIOJoy (the cockpit RIO → virtual-gamepad feeder; separate net48 repo) is now an
installable/launchable product in Console/RedPlanet/Apps.xml. Its dist zip is
already TeslaConsole-shaped (postinstall.bat + RIOJoy\ → extracts to C:\Games, the
launcher runs postinstall.bat as SYSTEM to install ViGEmBus + register auto-start),
so this is the only change needed on the TeslaSuite side.

- Launch entry exe C:\Games\RIOJoy\app\RioJoy.Tray.exe, autoRestart=false (the
  postinstall HKLM Run entry owns startup; the catalog entry is for registration +
  manual restart from the console).
- CatalogTests: bumped the count guard to 4 products / 6 entries and added a
  byte-exact LaunchData check for the RIOJoy entry. 74 tests green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 14:13:36 -05:00
CydandClaude Opus 4.8 d5c4be26ce Docs: bring READMEs in line with current state (net48, JSON wire)
- Root README: launcher is .NET Framework 4.8 (was .NET 6/x86); RPC is framed
  JSON (was BinaryFormatter); added Contract/ + SecureConfig/; dropped the
  now-resolved "known duplication" warning; corrected the lib/*.dll note
  (TeslaConsoleLaunchLib/TeslaSecureConfiguration are source-built, kept only as
  test baselines); added a short history section.
- Console README: Contract is net48-only; Launcher targets net48.
- Launcher README: net48 framework-dependent (was net8/x64 self-contained);
  needs .NET Framework 4.8 (built into Windows), no bundled runtime.
- DiffTests README: original 4.11.3.37076 vs recovered 4.11.4.x (no longer share
  identity); noted version-insensitive comparison + the new protocol/crypto guards.
- Removed Launcher/assets/MEMORY.md (stale leftover dev-notes, superseded by the
  README and now-moot post-BinaryFormatter).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 13:44:06 -05:00
Cyd 2a3d1c1ef6 Merge: net48-only launcher (pod-validated)
Launcher Service + Agent moved from net8/x64 self-contained to net48
framework-dependent; Tesla.Contract is now net48-only (single TFM across the
suite). Package drops from ~91 MB zipped to ~1.6 MB. Tested OK end-to-end on a
pod computer.
2026-06-30 12:59:50 -05:00
CydandClaude Opus 4.8 1e2ec12f11 Spike: net48-only launcher (evaluate size vs net8 self-contained)
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>
2026-06-30 11:46:00 -05:00
Cyd d873b653c7 Merge: source contract + JSON wire (no BinaryFormatter) + net8/x64, v4.11.4.1
Live-validated end-to-end on a stand-in pod (SecureConfig, install, launch).
See branch commits for the full breakdown.
2026-06-30 10:03:11 -05:00
CydandClaude Opus 4.8 78bf297824 Bump version to 4.11.4.1; show version in Agent tray menu
- Console AssemblyVersion/AssemblyFileVersion 4.11.3.37076 -> 4.11.4.1. The
  recovered console is no longer a byte-faithful copy of the original baseline;
  it is the modernized 4.11.4.x line.
- Launcher Service + Agent Version -> 4.11.4.1 (unified suite version). The Agent
  tray menu header now shows the running version ("Tesla Launcher Agent  v4.11.4.1").
- Differential tests: the identity guard now expects the original at 4.11.3.37076
  and the recovered at 4.11.4.1 (not identical); the public-member surface check
  strips Version= stamps before comparing, since generic-argument signatures embed
  the assembly version (we compare type names, not versions). 73 tests green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 10:02:39 -05:00
CydandClaude Opus 4.8 477f20b24c Fix: show SecureConfig codes on screen during configuration
The Agent only opened the on-screen passcode splash when IsMachineConfigured()
was false (Ethernet adapter on DHCP). But during SecureConfig the Service assigns
a TEMPORARY static IP to the adapter so it can broadcast — which flips
IsMachineConfigured() to true. So an Agent starting at auto-login (in the
SecureConfig wait window) saw a "configured" adapter and skipped the splash
entirely; the Request ID / Passphrase only reached the log and the COM2 plasma
display, never the screen.

Gate the splash on the configuring.json file the Service writes (before the temp
IP) as well as the DHCP check, and make the splash dismiss robustly when
SecureConfig finishes (file gone after being seen, or the machine becomes
configured). The COM2 plasma path in the Service was already correct.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 09:32:59 -05:00
CydandClaude Opus 4.8 a7aafaa9e9 Fix Launcher packaging for net8/x64; doc + gitignore updates
build.bat was broken by the contract extraction: it staged the loose Launcher
.cs files into temp folders and published from there, but the projects now have
a ProjectReference to ..\Contract\Tesla.Contract.csproj which cannot resolve from
a temp dir. Publish the projects IN PLACE instead, and target net8 / win-x64
(self-contained single-file) to match the runtime/arch uplift. The resulting
TeslaLauncher\ package (Service\ + Agent\ + install.bat) installs on a pod with
no .NET runtime prerequisite.

- Launcher/README.md: correct net6->net8, x86->x64, BinaryFormatter->framed JSON,
  and note wire types now come from ../Contract.
- Launcher/.gitignore: ignore the TeslaLauncher-*.zip deployment package.
- Console/.gitignore: ignore the published TeslaConsole-app\ package + its zip
  (framework-dependent net48 console build for running against a test pod).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 08:30:13 -05:00
CydandClaude Opus 4.8 b9d8027cf6 Extract shared contract, drop BinaryFormatter wire, modernize to net8/x64
Make the Console<->Launcher system source-built and modern now that the console
is under our control and the WinXP-era pods are gone.

Contract extraction (Contract/Tesla.Contract.csproj):
- One multi-targeted (net48;net8.0-windows) source project for the RPC contract,
  replacing the vendored TeslaConsoleLaunchLib.dll and the hand-synced Tesla.Net
  replica in Launcher/LaunchModels_Shared.cs. Emits assembly TeslaConsoleLaunchLib.

SecureConfig extraction (SecureConfig/Tesla.SecureConfig.csproj):
- net48 source of the first-boot provisioning protocol (UDP beacons, OFB crypto,
  RSA key exchange), replacing the vendored TeslaSecureConfiguration.dll.

Remove BinaryFormatter from the wire (RCE sink + the reason net6 was pinned):
- Console<->Launcher RPC is now length-prefixed System.Text.Json frames
  (Contract/PodRpcProtocol.cs) over the unchanged OFB transport; dispatch by
  method name. Deleted the SerializationBinder / MethodInfoProxy machinery.
- Console-local BinaryFormatter (Site config, mission replays) intentionally
  retained: local net48 file I/O, not the network surface.

Runtime modernization:
- Launcher Service + Agent: net6 -> net8, win-x86 -> win-x64 (all pods are
  64-bit Win10). Kept the SHA1-default PBKDF2 (Console key-derivation compat)
  with SYSLIB0041 suppressed and documented.

Tests: differential suite now 73 green. Added SecureConfigCompatTests (OFB
ciphertext byte-identical to the vendored DLL) and PodRpcProtocolTests (JSON
round-trip of every request/response shape); removed the now-obsolete
BinaryFormatter byte-identity guard.

Build hygiene: per-project obj dirs (Launcher/Directory.Build.props) fix a
NuGet restore collision between the two Launcher projects sharing one folder.

NOT runtime-verified against a live pod.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 08:15:17 -05:00
CydandClaude Opus 4.8 548550b312 Initial commit: TeslaSuite monorepo (TeslaConsole + TeslaLauncher)
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>
2026-06-29 14:43:28 -05:00