pulumi/pulumi · critical

Problem executing program (could not run language executor):

Error message

Problem executing program (could not run language executor): %w

What it means

The language host could not even start the NodeJS/bun process: the error from cmd.Start()/run() was not an *exec.ExitError, meaning exec failed before the program ran. The host wraps the underlying OS error (typically 'executable file not found in $PATH') with this message.

Source

Thrown at sdk/nodejs/cmd/pulumi-language-nodejs/main.go:1071

			case 0:
				// This really shouldn't happen, but if it does, we don't want to render "non-zero exit code"
				err = fmt.Errorf("Program exited unexpectedly: %w", exiterr)
			case nodeJSProcessExitedAfterShowingUserActionableMessage:
				// Check if we got special exit code that means "we already gave the user an
				// actionable message". In that case, we can simply bail out and terminate `pulumi`
				// without showing any more messages.
				return &pulumirpc.RunResponse{Error: "", Bail: true}
			default:
				err = fmt.Errorf("Program exited with non-zero exit code: %d", code)
				sniffer.Wait()
				if sniffer.Detected() {
					err = fmt.Errorf("Program exited with non-zero exit code: %d. %s", code, sniffer.Message())
				}
			}
		} else {
			// Otherwise, we didn't even get to run the program.  This ought to never happen unless there's
			// a bug or system condition that prevented us from running the language exec.  Issue a scarier error.
			err = fmt.Errorf("Problem executing program (could not run language executor): %w", err)
		}

		errResult = err.Error()
	}

	// notify our caller of the response we got from the nodejs process.  Note: this is done
	// unilaterally. this is how we signal to nodeLanguageHost.Run that we are done and it can
	// return to its caller.
	return &pulumirpc.RunResponse{Error: errResult}
}

// constructArguments constructs a command-line for `pulumi-language-nodejs`
// by enumerating all of the optional and non-optional arguments present
// in a RunRequest.
func (host *nodeLanguageHost) constructArguments(
	req *pulumirpc.RunRequest, runPath, address, pipesDirectory string,
) []string {
	args := []string{runPath}

View on GitHub (pinned to 793f7b2e16)

Solutions

  1. Install the required runtime (node or bun) and make sure it is on PATH: `node -v` / `bun -v` should succeed in your shell.
  2. Fix the `runtime` field in Pulumi.yaml (options.runtime) to a valid installed binary name.
  3. If using a custom runtime binary, ensure it is executable (chmod +x) and reachable.
  4. In CI, add the runtime to the job's PATH before invoking pulumi.

Example fix

// before (Pulumi.yaml)
options:
  runtime: bun   # bun not installed

// after: install bun or switch runtime
curl -fsSL https://bun.sh/install | bash
# or
options:
  runtime: nodejs
Defensive patterns

Strategy: validation

Validate before calling

# Verify the runtime is installed and on PATH before pulumi up
runtime=$(yq '.options.runtime // "nodejs"' Pulumi.yaml)
command -v "$runtime" >/dev/null || { echo "$runtime not found in PATH"; exit 1; }

Prevention

When it happens

Trigger: cmd.Start() fails because runtimeBin (node/bun) does not exist or is not executable in PATH, working directory is missing, or exec setup fails (sdk/nodejs/cmd/pulumi-language-nodejs/main.go:1068-1071).

Common situations: Runtime set to 'node' but node not installed in the CLI's PATH; `options.runtime: 'bun'` in Pulumi.yaml without bun installed; custom runtime binary name typo; broken PATH under sudo or CI images.

Related errors


AI-assisted analysis of pulumi/pulumi@793f7b2e16 (2026-08-31). Data as JSON: /api/errors/cfdacd0f682da175. Report an issue: GitHub.