different-ai/openwork · error

Helper binary not found. Run pnpm dev to build it.

Error message

Helper binary not found. Run pnpm dev to build it.

What it means

openComputerUseSetupApp opens the macOS Computer Use permission setup GUI. It first tries shell.openPath on the bundled .app; if absent, it falls back to spawning the raw helper binary resolved by resolveComputerUseExecutable(). When neither the .app bundle nor the binary exists on disk, it throws this error, because the helper is built by the dev toolchain, not shipped inside the main app.

Source

Thrown at apps/desktop/electron/computer-use.mjs:154

        resolve({ ok: false, apps: [] });
      }
    });
  });
}

async function openComputerUseSetupApp() {
  // Open the GUI. Use the .app bundle if available so macOS shows it as
  // a real app with its own dock icon and permission identity.
  const appPath = computerUseHelperAppPath();
  if (appPath) {
    const result = await shell.openPath(appPath);
    if (result) console.error("[ComputerUse] shell.openPath error:", result);
    return;
  }

  // Fallback: spawn the raw binary (opens the same GUI).
  const bin = resolveComputerUseExecutable();
  if (!bin) throw new Error("Helper binary not found. Run pnpm dev to build it.");
  const child = spawn(bin, [], { detached: true, stdio: "ignore" });
  child.unref();
}

export {
  checkComputerUsePermissions,
  getComputerUseMcpCommand,
  listRunningApps,
  openComputerUseSetupApp,
};

View on GitHub (pinned to 2b7df46e8a)

Solutions

  1. Run `pnpm dev` (or the repo's full build) so the Computer Use helper binary/bundle is produced before launching the app.
  2. Verify the helper exists at the path resolveComputerUseExecutable() computes (resources/helper dirs) and that the app is launched from the repo root or correct packaged layout.
  3. Re-run packaging so the helper is bundled with the app if the error occurs in production builds.
  4. Guard the call with existence checks and show the user a 'setup unavailable, rebuild the app' message instead of crashing.

Example fix

// before
openComputerUseSetupApp(); // throws if helper missing
// after
if (computerUseHelperAppPath() || resolveComputerUseExecutable()) {
  await openComputerUseSetupApp();
} else {
  console.error('Computer Use helper not built. Run pnpm dev first.');
}
Defensive patterns

Strategy: fallback

Validate before calling

import { existsSync } from 'node:fs';
const bin = resolveComputerUseExecutable();
const appPath = computerUseHelperAppPath();
if (!appPath && !(bin && existsSync(bin))) {
  console.error('Computer Use helper not built — run pnpm dev.');
}

Type guard

function hasComputerUseHelper() {
  return Boolean(computerUseHelperAppPath() || resolveComputerUseExecutable());
}

Try / catch

try {
  await openComputerUseSetupApp();
} catch (err) {
  if (String(err.message).includes('Helper binary not found')) {
    showDialog('Computer Use setup is unavailable. Rebuild the app (pnpm dev) and try again.');
  } else throw err;
}

Prevention

When it happens

Trigger: Calling openComputerUseSetupApp() on macOS when neither computerUseHelperAppPath() nor resolveComputerUseExecutable() resolves to an existing file — e.g. running the app from source before building the helper, a partial/cleaned build, or running a packaged build that omitted the helper.

Common situations: Developers cloning the repo and running the Electron app without running the full build first; CI packaging steps that skip the helper build; running the app from a non-default working directory so the helper path resolution fails.

Related errors


AI-assisted analysis of different-ai/openwork@2b7df46e8a (2026-09-01). Data as JSON: /api/errors/d77f384fd221cd9a. Report an issue: GitHub.