diff --git a/src/cli/daemon-cli/install.test.ts b/src/cli/daemon-cli/install.test.ts index b41a2d0f720..ae8a892a096 100644 --- a/src/cli/daemon-cli/install.test.ts +++ b/src/cli/daemon-cli/install.test.ts @@ -326,4 +326,26 @@ describe("runDaemonInstall", () => { expect(installDaemonServiceAndEmitMock).toHaveBeenCalledTimes(1); }); + + it("reinstalls when the installed service still runs from nvm even if the installer runtime does not", async () => { + service.isLoaded.mockResolvedValue(true); + resolveAutoNodeExtraCaCertsMock.mockImplementation(({ execPath }) => + typeof execPath === "string" && execPath.includes("/.nvm/") + ? "/etc/ssl/certs/ca-certificates.crt" + : undefined, + ); + service.readCommand.mockResolvedValue({ + programArguments: ["/home/test/.nvm/versions/node/v22.18.0/bin/node", "dist/entry.js"], + environment: {}, + } as never); + + await runDaemonInstall({ json: true }); + + expect(installDaemonServiceAndEmitMock).toHaveBeenCalledTimes(1); + expect(resolveAutoNodeExtraCaCertsMock).toHaveBeenCalledWith( + expect.objectContaining({ + execPath: "/home/test/.nvm/versions/node/v22.18.0/bin/node", + }), + ); + }); }); diff --git a/src/cli/daemon-cli/install.ts b/src/cli/daemon-cli/install.ts index ec92674f990..8478d859bbc 100644 --- a/src/cli/daemon-cli/install.ts +++ b/src/cli/daemon-cli/install.ts @@ -135,17 +135,24 @@ async function gatewayServiceNeedsAutoNodeExtraCaCertsRefresh(params: { service: ReturnType; env: Record; }): Promise { - const expectedNodeExtraCaCerts = resolveAutoNodeExtraCaCerts({ - env: params.env, - execPath: process.execPath, - }); - if (!expectedNodeExtraCaCerts) { - return false; - } - try { const currentCommand = await params.service.readCommand(params.env); + const currentExecPath = currentCommand?.programArguments[0]?.trim(); + if (!currentExecPath) { + return false; + } const currentNodeExtraCaCerts = currentCommand?.environment?.NODE_EXTRA_CA_CERTS?.trim(); + const expectedNodeExtraCaCerts = resolveAutoNodeExtraCaCerts({ + env: { + ...params.env, + ...currentCommand.environment, + NODE_EXTRA_CA_CERTS: undefined, + }, + execPath: currentExecPath, + }); + if (!expectedNodeExtraCaCerts) { + return false; + } return currentNodeExtraCaCerts !== expectedNodeExtraCaCerts; } catch { return false;