diff --git a/src/lib/runtime-availability.test.ts b/src/lib/runtime-availability.test.ts index 5a86e16e6..721577fda 100644 --- a/src/lib/runtime-availability.test.ts +++ b/src/lib/runtime-availability.test.ts @@ -204,9 +204,24 @@ try { env: { Path: "C:\\bin" }, platform: "win32", statFile: (candidate) => candidate === "C:\\bin\\node.exe" || candidate === "C:\\bin\\copilot-entry.js", + readableFile: (candidate) => candidate === "C:\\bin\\copilot-entry.js", }); assert.equal(requiredArtifactReady.state, "ready", "a complete direct launch plan is ready"); + const statOnlyArtifact = evaluateRuntimeAvailability({ + runner: "copilot", + command: "node.exe", + requiredFiles: [path.join(scratch, "missing-required-artifact.js")], + env: { Path: "C:\\bin" }, + platform: "win32", + statFile: () => true, + }); + assert.equal( + statOnlyArtifact.state, + "unlaunchable", + "a command stat double cannot silently stand in for required-artifact readability", + ); + const requiredArtifactUnreadable = evaluateRuntimeAvailability({ runner: "copilot", command: "node.exe", @@ -422,6 +437,7 @@ try { platform: "win32", requiredFiles: [openCodeTarget], statFile: winStats([nodeHost, openCodeTarget]), + readableFile: winStats([openCodeTarget]), }); assert.equal( openCodeWinReady.state, @@ -436,6 +452,7 @@ try { platform: "win32", requiredFiles: [openCodeTarget], statFile: winStats([nodeHost]), + readableFile: winStats([]), }); assert.equal( openCodeTargetGone.state, diff --git a/src/lib/runtime-availability.ts b/src/lib/runtime-availability.ts index 5e74fb47b..d6a2b1b7c 100644 --- a/src/lib/runtime-availability.ts +++ b/src/lib/runtime-availability.ts @@ -411,8 +411,7 @@ export function evaluateRuntimeAvailability( const inspectCandidate: InspectCandidateFn = probe.statFile ? (candidate) => inspectWithStatFile(candidate, probe.statFile!) : (candidate) => defaultInspectCandidate(candidate, platform); - const readableFile = probe.readableFile - ?? (probe.statFile ? probe.statFile : defaultReadableFile); + const readableFile = probe.readableFile ?? defaultReadableFile; const label = RUNNER_LABELS[runner]; try { if (probe.resolutionFailed) {