stablyai/orca · error · Error

${result.stderr || 'PowerShell process enumeration failed'}

Error message

${result.stderr || 'PowerShell process enumeration failed'}

What it means

readWindowsProcesses runs a PowerShell CIM query (Get-CimInstance Win32_Process) via spawnSync to enumerate processes on Windows. It throws when spawnSync returns a non-zero status, surfacing result.stderr (or a generic fallback). readProcessRows only selects this path when process.platform === 'win32', so the error is Windows-only. A non-zero status means PowerShell itself failed to run the query, distinct from a spawn error (which would appear on result.error and surface differently).

Solutions

  1. Confirm powershell.exe resolves on PATH (where powershell) on the host.
  2. Inspect result.stderr in the thrown error for the PowerShell-level failure.
  3. Verify the WinMgmt service is running (Get-Service WinMgmt) and the CIM repository is healthy.
  4. On non-Windows hosts this code path never runs — confirm process.platform is not unexpectedly 'win32'.

Example fix

// before
const result = spawnSync('powershell.exe', ['-NoProfile', '-Command', script], { encoding: 'utf8', maxBuffer: 20 * 1024 * 1024 })
if (result.status !== 0) {
  throw new Error(result.stderr || 'PowerShell process enumeration failed')
}

// after — surface spawn errors too, and keep a readable status
if (result.error) {
  throw result.error
}
if (result.status !== 0) {
  throw new Error(`PowerShell process enumeration failed (status ${result.status}): ${result.stderr}`)
}
Defensive patterns

Strategy: try-catch

Validate before calling

const psOk = (() => {
  try { spawnSync('powershell.exe', ['-NoProfile', '-Command', 'exit 0']); return true }
  catch { return false }
})()
if (process.platform === 'win32' && !psOk) throw new Error('powershell.exe required on PATH')

Try / catch

try {
  rows = readProcessRows()
} catch (err) {
  if (process.platform !== 'win32') throw err
  log.warn(`Windows process enumeration failed: ${err.message}; falling back to empty rows`)
  rows = []
}

Prevention

When it happens

Trigger: powershell.exe is absent or not on PATH; PowerShell execution policy or profile blocks the command; the WinMgmt/CIM service is stopped or corrupted; the CIM provider returns an error to stderr.

Common situations: Minimal/hardened Windows CI image without PowerShell; WMI repository corruption; group policy restricting script execution; antivirus intercepting PowerShell.

Related errors


AI-assisted analysis of stablyai/orca@1136503c6a (2026-08-12). Data as JSON: /api/errors/79a4abbd21b646c5. Report an issue: GitHub.

Appendix: source

Thrown at config/scripts/idle-cpu-process-sampling.mjs:66

function readUnixProcesses() {
  const stdout = execFileSync('ps', ['-axo', 'pid=,ppid=,pcpu=,rss=,cputime=,command='], {
    encoding: 'utf8',
    env: { ...process.env, LC_ALL: 'C', LANG: 'C' },
    maxBuffer: 20 * 1024 * 1024
  })
  return parseUnixProcesses(stdout)
}

function readWindowsProcesses() {
  const script =
    'Get-CimInstance Win32_Process | Select-Object ProcessId,ParentProcessId,WorkingSetSize,CommandLine | ConvertTo-Json -Compress'
  const result = spawnSync('powershell.exe', ['-NoProfile', '-Command', script], {
    encoding: 'utf8',
    maxBuffer: 20 * 1024 * 1024
  })
  if (result.status !== 0) {
    throw new Error(result.stderr || 'PowerShell process enumeration failed')
  }
  const parsed = JSON.parse(result.stdout || '[]')
  const entries = Array.isArray(parsed) ? parsed : [parsed]
  return entries.map((entry) => ({
    pid: Number(entry.ProcessId),
    ppid: Number(entry.ParentProcessId),
    percentCpu: 0,
    cpuTimeSeconds: null,
    rssBytes: Number(entry.WorkingSetSize) || 0,
    command: String(entry.CommandLine || '')
  }))
}

export function readProcessRows() {
  return process.platform === 'win32' ? readWindowsProcesses() : readUnixProcesses()
}

export function descendantsOf(rows, rootPid) {

View on GitHub (pinned to 1136503c6a)