firecrawl/open-lovable · error · Error

Unable to read file: ${normalizedPath}

Error message

Unable to read file: ${normalizedPath}

What it means

readFileFromSandbox tries one or more mechanisms (provider readFile API, shell cat) to read a file from the sandbox and throws this error if every attempt fails or returns non-zero exit. It signals the requested file could not be retrieved from the sandbox filesystem, often because it does not exist or the sandbox API is not available.

Source

Thrown at lib/morph-fast-apply.ts:115

    } catch {}
    // fallback to absolute path
    try {
      const resAbs = await sandbox.runCommand(`cat ${fullPath}`);
      if (resAbs && typeof resAbs.stdout === 'string') {
        return resAbs.stdout as string;
      }
    } catch {}
  }

  // Try shell cat via commands.run
  if (sandbox?.commands?.run) {
    const result = await sandbox.commands.run(`cat ${fullPath}`, { cwd: '/home/user/app', timeout: 30 });
    if (result?.exitCode === 0 && typeof result?.stdout === 'string') {
      return result.stdout as string;
    }
  }

  throw new Error(`Unable to read file: ${normalizedPath}`);
}

// Write a file to sandbox and update cache
async function writeFileToSandbox(sandbox: any, normalizedPath: string, fullPath: string, content: string): Promise<void> {
  // Provider pattern (writeFile)
  if (typeof sandbox?.writeFile === 'function') {
    await sandbox.writeFile(normalizedPath, content);
    return;
  }

  // Provider pattern (runCommand redirect)
  if (typeof sandbox?.runCommand === 'function') {
    // Ensure directory exists
    const dir = normalizedPath.includes('/') ? normalizedPath.substring(0, normalizedPath.lastIndexOf('/')) : '';
    if (dir) {
      try { await sandbox.runCommand(`mkdir -p ${dir}`); } catch {}
    }
    // Write via heredoc with proper escaping

View on GitHub (pinned to 69bd93bae7)

Solutions

  1. Verify the file actually exists at that path inside the sandbox (run `ls` or check the file cache) before reading.
  2. Check for path typos, wrong case, or missing directories in normalizedPath.
  3. Use the provider's native readFile method instead of the shell fallback.
  4. Ensure the sandbox object is a supported provider instance (e2b/vercel) exposing commands.run.
  5. Catch the error and treat it as 'create new file' when the edit should create a missing file.

Example fix

// before
const current = await readFileFromSandbox(sandbox, path);
// after
let current = '';
try {
  current = await readFileFromSandbox(sandbox, path);
} catch {
  current = ''; // new file: apply edit to empty content
}
Defensive patterns

Strategy: try-catch

Validate before calling

const exists = await sandbox.commands.run(`test -f ${fullPath} && echo yes || echo no`, { cwd: '/home/user/app' });
if (exists.stdout.trim() !== 'yes') {
  // skip read; treat as new file
}

Type guard

function canReadFile(r: unknown): r is { stdout: string; exitCode: number } {
  return !!r && typeof r === 'object' && typeof (r as any).stdout === 'string' && typeof (r as any).exitCode === 'number';
}

Try / catch

try {
  const content = await readFileFromSandbox(sandbox, path);
} catch (err) {
  if (err instanceof Error && err.message.startsWith('Unable to read file')) {
    console.warn(`File ${path} not readable in sandbox; treating as new file`);
    return ''; // or skip this edit
  }
  throw err;
}

Prevention

When it happens

Trigger: The file at normalizedPath does not exist inside /home/user/app in the sandbox; `cat` exits non-zero (permissions, missing file); the sandbox object exposes neither a readFile method nor commands.run; or the command output is not a string.

Common situations: Applying an edit to a path that was never created in the sandbox; path casing or typo mismatches (e.g. /src/App.jsx vs app.jsx); sandbox freshly provisioned and empty; using a custom/mock sandbox object lacking the expected API surface.

Understand the failure class

Background: "File not found" and ENOENT errors: why libraries can't find a file that should exist — this error's family across 50 libraries.

Related errors


AI-assisted analysis of firecrawl/open-lovable@69bd93bae7 (2026-08-28). Data as JSON: /api/errors/eeb9d68278528da6. Report an issue: GitHub.