From 4eb0b4a528d1ba6825fd76cdd1bb5483de38b463 Mon Sep 17 00:00:00 2001 From: vibesoftwarecoder Date: Wed, 21 Oct 2026 15:09:47 -0500 Subject: [PATCH] Release 0.6.23 Bump version.txt and add the 0.6.23 notes. - #128 (fixes #124) - #127 (fixes #126) Co-Authored-By: Claude Sonnet 5.5 --- docs/release-notes/0.6.23.md | 63 ++++++++++++++++++++++++++++++++++++ version.txt | 2 +- 2 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 docs/release-notes/0.6.23.md diff --git a/docs/release-notes/0.6.23.md b/docs/release-notes/0.6.23.md new file mode 100644 index 0000000..c1584ec --- /dev/null +++ b/docs/release-notes/0.6.23.md @@ -0,0 +1,63 @@ +**This release fixes the duplicate Apollo after Restart, makes Quit a real quit, and fixes the installer's close-Steam command.** + +## What was happening + +- **Restart in a seat's Apollo web UI left two Apollo processes running** (issue #124). Both ran on the seat's ports. The service launched a second Apollo while Apollo's own restart child was still alive. This reproduced on 0.6.21 and on 0.6.22, so it is older than this release. +- **Quit did not stay quit** (issue #124). With a console, Apollo exits with code 0 on both Restart and Quit, and the service cannot tell that from a crash. By the code, it starts Apollo again within about 5 seconds. This was read from the code, not measured. +- **The installer printed a close-Steam command that failed** (issue #126). When an isolated Steam blocked an upgrade, the command had `SteamHook.dll` after `--steam` instead of `steam.exe`. The launcher printed its usage text and did nothing. + +## What changes + +- **The seat's Apollo now starts with no console window** (#128). It is launched with `CREATE_NO_WINDOW`, and the service keeps the process handle so it can read the exit code. With no console, Apollo acts as it does under its own Windows service. Restart exits with 0 and starts nothing. Quit exits with 1115. +- **The service reads the exit code and acts on it.** + - **Quit (1115)** leaves Apollo stopped. The seat shows a message and the Start button. No restart attempt is used. + - **Restart (0)** relaunches Apollo without using a restart attempt. An exit 0 within 30 seconds of launch is counted, so a loop cannot run forever. + - **Any other exit** is a crash and counts against the three restart attempts, as before. +- **A Quit or the dashboard's Stop holds.** It holds through a session drop and through the reconnect after sleep. Start, Restart, reprovision and teardown clear it. It is kept in memory only, so a service restart or a reboot starts seats as usual. +- **Strays are ended.** Before every Apollo start and at the end of every stop, the service ends any `sunshine.exe` that runs this seat's exact config path. Other seats' Apollo and the console Apollo never match. +- **A change to the NVENC preset, resolution or scale restarts Apollo through the normal start path.** On a seat whose Apollo was stopped by the user, this brings Apollo back and clears the stop. +- **The installer's close-Steam command names `steam.exe`** (#127). Each process entry now has an `ImagePath` field with the process's own exe. It is read from the process, with a `Win32_Process` fallback, and is null when neither works. The message uses the first steam entry whose `ImagePath` ends in `steam.exe`. If there is no usable entry, the message keeps the `` placeholder. `Path` is unchanged. + +**This reverses the #120 and #121 choice to keep the console, on purpose.** Those changes kept the console so Apollo's Restart and Quit would work as before. That console is the cause of the duplicate. What this means for you: + +- There is no Apollo window on the seat at all now. +- The minimized-window setting from #121 is kept. It does no harm, and it still helps if the Apollo exe is ever a GUI build. +- After a Quit, the seat stays in the Moonlight host list but cannot be connected to. Start Apollo from the Apollo row in the dashboard. + +## How this was checked + +**The Apollo change, live.** On a seat on 2026-10-21, on a build of 0.6.22 plus the #124 service files (`0.6.22+321ea0fe2`): + +- Restart from Apollo's web UI left exactly one Apollo, with the service as its parent. No restart attempt was used. The same test before the change left two. +- Quit left Apollo stopped for the 70 seconds watched. The service logged exit code 1115. +- Start brought one Apollo back. +- A game ran in the seat's session at about 20% video encode. Apollo kept writing its log with no console. +- Force-killing Apollo made the service relaunch it within a few seconds. The restart count went from 0 to 1. +- The console Apollo's process and start time did not change at any step. + +**Unit tests.** CI passed on `master` after both changes. The suite on the #128 branch finished with 1702 passed, 18 skipped and 0 failed. The tests cover the launch flags, the exit-code rules, the health-check decision, the restart limit, the config-path match (including a near-miss seat name and the console Apollo) and the stopped-by-user marker. The installer message has tests for a holder whose `Path` is the hook DLL, a holder with no `ImagePath`, a DLL-image entry listed before a real `steam.exe`, and a real running process in a temporary `SteamIsolation` folder. + +**Not verified:** a real sleep and wake after a Quit (unit-tested only; the dashboard's Stop uses the same code). The WMI step that ends strays was not run against a real stray, and only its path matcher is unit-tested. The #127 installer message was not re-run against a live isolated Steam, because the tests use a stand-in `steam.exe`. The 32-bit `steam.exe` fallback is unexercised. + +## Known limitations + +- **With Apollo stopped by a Quit, the Moonlight client still lists the seat but fails to connect** until Apollo is started from the dashboard. +- **In one test, Steam stayed up for about two minutes after the installer's close command**, with a game running (issue #126). The cause is not known and this release does not change it. +- **On at least one host the scale override is still ignored** (issue #93). This release does not change that. +- Seats capture the remote desktop surface, not a dedicated virtual display. A Windows constraint, not a regression. +- Steam isolation is experimental and off by default. + +## Install + +```powershell +.\prerequisites\install-prerequisites.ps1 # drivers - needed either way +.\scripts\install-service.ps1 -FromZip . +``` + +Afterwards, confirm what landed: + +```powershell +& 'C:\Program Files\MultiSeat\MultiSeat.Service.exe' --config +``` + +It should report `0.6.23`. diff --git a/version.txt b/version.txt index d15dfad..9d04cbd 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.6.22 +0.6.23