paperclipai/paperclip · error

exe.dev environments require an API key in config or…

Error message

exe.dev environments require an API key in config or EXE_API_KEY.

What it means

Credential resolution failure in resolveApiKey for the exe.dev driver: no API key was found in the environment config and the EXE_API_KEY env var fallback is also unset. Without it every exe.dev API call would be unauthenticated, so the driver fails at credential resolution rather than at request time.

Solutions

  1. Set EXE_API_KEY or configure apiKey in the environment config.
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at packages/plugins/sandbox-providers/exe-dev/src/plugin.ts:272 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of paperclipai/paperclip@a7e689b3c3 (2026-08-18). Data as JSON: /api/errors/2bf668dc08287544. Report an issue: GitHub.

Appendix: source

Thrown at packages/plugins/sandbox-providers/exe-dev/src/plugin.ts:274

    integrations: parseStringArray(raw.integrations),
    tags: parseStringArray(raw.tags),
    setupScript: parseOptionalString(raw.setupScript),
    prompt: parseOptionalString(raw.prompt),
    timeoutMs: Number.isFinite(timeoutMs) ? Math.trunc(timeoutMs) : DEFAULT_TIMEOUT_MS,
    reuseLease: raw.reuseLease === true,
    sshUser: parseOptionalString(raw.sshUser),
    sshPrivateKey: parseOptionalString(raw.sshPrivateKey),
    sshIdentityFile: parseOptionalString(raw.sshIdentityFile),
    sshPort: Number.isFinite(sshPort) ? Math.trunc(sshPort) : 22,
    strictHostKeyChecking: parseOptionalString(raw.strictHostKeyChecking) ?? "accept-new",
  };
}

function resolveApiKey(config: ExeDevDriverConfig): string {
  if (config.apiKey) return config.apiKey;
  const envApiKey = process.env.EXE_API_KEY?.trim() ?? "";
  if (!envApiKey) {
    throw new Error("exe.dev environments require an API key in config or EXE_API_KEY.");
  }
  return envApiKey;
}

function isValidShellEnvKey(value: string): boolean {
  return /^[A-Za-z_][A-Za-z0-9_]*$/.test(value);
}

function shellQuote(value: string): string {
  return `'${value.replace(/'/g, `'"'"'`)}'`;
}

function formatErrorMessage(error: unknown): string {
  return error instanceof Error ? error.message : String(error);
}

function buildVmName(config: ExeDevDriverConfig, params: PluginEnvironmentAcquireLeaseParams): string {
  const envPart = params.environmentId.replace(/[^a-z0-9]+/gi, "").slice(0, 8).toLowerCase() || "env";

View on GitHub (pinned to a7e689b3c3)