fix: improve Windows managed OpenCode shutdown and launch behavior (#844)

* fix: windows shutdown and restart orphaned cleanup

* fix: launch managed OpenCode directly on Windows
Unwrap OpenCode wrappers to launch directly on Windows, improving shutdown reliability and avoid orphans.

* fix: restore desktopNotifyEnabled in health snapshot

---------

Signed-off-by: Dr. Zed <142888684+DocterZed@users.noreply.github.com>
Co-authored-by: Bohdan Triapitsyn <artmore@protonmail.com>
This commit is contained in:
Dr. Zed
2026-04-11 22:29:09 +03:00
committed by GitHub
co-authored by Bohdan Triapitsyn
parent a3d73a8b67
commit 636dcd5314
8 changed files with 512 additions and 100 deletions
+23 -7
View File
@@ -20,7 +20,9 @@ type OpenChamberHealthSnapshot = {
lastOpenCodeError?: unknown;
opencodeBinaryResolved?: unknown;
opencodeBinarySource?: unknown;
opencodeShimInterpreter?: unknown;
opencodeLaunchBinary?: unknown;
opencodeLaunchArgs?: unknown;
opencodeLaunchWrapperType?: unknown;
nodeBinaryResolved?: unknown;
bunBinaryResolved?: unknown;
};
@@ -32,7 +34,9 @@ type OpenChamberOpencodeResolution = {
source?: unknown;
detectedNow?: unknown;
detectedSourceNow?: unknown;
shim?: unknown;
launchBinary?: unknown;
launchArgs?: unknown;
launchWrapperType?: unknown;
node?: unknown;
bun?: unknown;
};
@@ -273,10 +277,20 @@ export const buildOpenCodeStatusReport = async (): Promise<string> => {
openChamberOpencodeResolution && typeof openChamberOpencodeResolution.source === 'string'
? openChamberOpencodeResolution.source
: (openChamberHealth && typeof openChamberHealth.opencodeBinarySource === 'string' ? openChamberHealth.opencodeBinarySource : '');
const shim =
openChamberOpencodeResolution && typeof openChamberOpencodeResolution.shim === 'string'
? openChamberOpencodeResolution.shim
: (openChamberHealth && typeof openChamberHealth.opencodeShimInterpreter === 'string' ? openChamberHealth.opencodeShimInterpreter : '');
const launchBinary =
openChamberOpencodeResolution && typeof openChamberOpencodeResolution.launchBinary === 'string'
? openChamberOpencodeResolution.launchBinary
: (openChamberHealth && typeof openChamberHealth.opencodeLaunchBinary === 'string' ? openChamberHealth.opencodeLaunchBinary : '');
const launchWrapperType =
openChamberOpencodeResolution && typeof openChamberOpencodeResolution.launchWrapperType === 'string'
? openChamberOpencodeResolution.launchWrapperType
: (openChamberHealth && typeof openChamberHealth.opencodeLaunchWrapperType === 'string' ? openChamberHealth.opencodeLaunchWrapperType : '');
const launchArgs =
openChamberOpencodeResolution && Array.isArray(openChamberOpencodeResolution.launchArgs)
? openChamberOpencodeResolution.launchArgs.filter((value): value is string => typeof value === 'string')
: (openChamberHealth && Array.isArray(openChamberHealth.opencodeLaunchArgs)
? openChamberHealth.opencodeLaunchArgs.filter((value): value is string => typeof value === 'string')
: []);
const node =
openChamberOpencodeResolution && typeof openChamberOpencodeResolution.node === 'string'
? openChamberOpencodeResolution.node
@@ -310,7 +324,9 @@ export const buildOpenCodeStatusReport = async (): Promise<string> => {
lines.push(`- detected-now: ${detectedNow}`);
lines.push(`- detected-source: ${detectedSourceNow || '(n/a)'}`);
}
lines.push(`- shim: ${shim || '(n/a)'}`);
lines.push(`- launch-binary: ${launchBinary || '(n/a)'}`);
lines.push(`- launch-wrapper: ${launchWrapperType || '(n/a)'}`);
lines.push(`- launch-args: ${launchArgs.length ? launchArgs.join(' ') : '(none)'}`);
lines.push(`- node: ${node || '(n/a)'}`);
lines.push(`- bun: ${bun || '(n/a)'}`);
if (!openChamberOpencodeResolution && openChamberOpencodeResolutionResult.error) {