musistudio/claude-code-router · warning

[export] Failed to include ${file}: ${formatError(error)}

Error message

[export] Failed to include ${file}: ${formatError(error)}

What it means

While collecting data-export attachments, reading or stat'ing one candidate file failed and it is skipped with a warning; the export continues without it.

Source

Thrown at packages/electron/src/main/ipc.ts:980

function readDataExportFiles(): Array<{ base64: string; name: string; path: string; sizeBytes: number }> {
  const files: Array<{ base64: string; name: string; path: string; sizeBytes: number }> = [];
  for (const file of dataExportCandidateFiles()) {
    try {
      if (!existsSync(file)) {
        continue;
      }
      const stat = statSync(file);
      if (!stat.isFile()) {
        continue;
      }
      files.push({
        base64: readFileSync(file).toString("base64"),
        name: path.basename(file),
        path: file,
        sizeBytes: stat.size
      });
    } catch (error) {
      console.warn(`[export] Failed to include ${file}: ${formatError(error)}`);
    }
  }
  return files;
}

function dataExportCandidateFiles(): string[] {
  return uniqueStrings([
    ...sqliteDataFiles(APP_CONFIG_DB_FILE),
    ...LEGACY_APP_CONFIG_DB_FILES.flatMap(sqliteDataFiles),
    ...LEGACY_API_KEYS_DB_FILES.flatMap(sqliteDataFiles),
    ...sqliteDataFiles(REQUEST_LOGS_DB_FILE),
    ...sqliteDataFiles(USAGE_DB_FILE)
  ]);
}

function sqliteDataFiles(file: string): string[] {
  return [file, `${file}-wal`, `${file}-shm`];
}

View on GitHub (pinned to 99f24806c6)

Solutions

  1. Check the file still exists and is readable right before adding it to candidates
  2. Run export with sufficient permissions
  3. Exclude rotating/volatile directories from candidates
  4. Retry the export; transient deletion self-resolves
Defensive patterns

Strategy: validation

Validate before calling

const st = statSync(file); if (!st.isFile() || (st.mode & 0o400) === 0) continue; // then read

Type guard

const isReadableFile = (st: Stats): boolean => st.isFile();

Try / catch

catch (error) { console.warn(`[export] Failed to include ${file}`); }

Prevention

When it happens

Trigger: dataExportCandidateFiles lists files (logs, databases) and one disappears between listing and readFileSync, has no read permission, or is a directory.

Common situations: Log rotation deleting files mid-export, permission-restricted files on macOS/Linux, or a symlink pointing to a missing target.

Related errors


AI-assisted analysis of musistudio/claude-code-router@99f24806c6 (2026-08-27). Data as JSON: /api/errors/92d72c5f31ea4a56. Report an issue: GitHub.