{"record":{"id":"c9dc661c79b853d2","repo":"paperclipai/paperclip","slug":"failed-to-action-exe-dev-vm-vmname-result","errorCode":null,"errorMessage":"Failed to ${action} exe.dev VM ${vmName}: ${result.stderr.trim() || result.stdout.trim() || \"unknown error\"}","messagePattern":"Failed to (.+?) exe\\.dev VM (.+?): (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/plugins/sandbox-providers/exe-dev/src/plugin.ts","lineNumber":657,"sourceCode":"    });\n  } finally {\n    await identity.cleanup();\n  }\n}\n\nasync function detectRemoteContext(\n  config: ExeDevDriverConfig,\n  vm: ExeDevVmRecord,\n): Promise<{ homeDir: string; shellCommand: \"bash\" | \"sh\" }> {\n  const result = await runSshCommand(\n    config,\n    vm,\n    `sh -lc ${shellQuote(\n      'home=\"${HOME:-}\"; if [ -z \"$home\" ]; then home=\"$(pwd)\"; fi; if command -v bash >/dev/null 2>&1; then shell=bash; else shell=sh; fi; printf \"%s\\\\n%s\\\\n\" \"$home\" \"$shell\"',\n    )}`,\n  );\n  if (result.timedOut || result.exitCode !== 0) {\n    throw new Error(formatSshFailure(\"inspect\", vm.name, result));\n  }\n\n  const [homeDirRaw, shellRaw] = result.stdout.split(/\\r?\\n/);\n  const homeDir = homeDirRaw?.trim() || \"/tmp\";\n  return {\n    homeDir,\n    shellCommand: shellRaw?.trim() === \"bash\" ? \"bash\" : \"sh\",\n  };\n}\n\nasync function ensureRemoteWorkspace(\n  config: ExeDevDriverConfig,\n  vm: ExeDevVmRecord,\n  remoteCwd: string,\n): Promise<void> {\n  const result = await runSshCommand(\n    config,\n    vm,","sourceCodeStart":639,"sourceCodeEnd":675,"githubUrl":"https://github.com/paperclipai/paperclip/blob/a7e689b3c35347b529cb9f54c9b9a8575a3dcab6/packages/plugins/sandbox-providers/exe-dev/src/plugin.ts#L639-L675","documentation":"SSH failure surfacing via formatSshFailure: the `sh -lc` command run over SSH to detect the VM's home dir and shell either timed out or exited non-zero, and its trimmed stderr/stdout (or 'unknown error') is reported. The detected homeDir/shellCommand are required to build later commands, so detection failure aborts the flow.","triggerScenarios":"Thrown at packages/plugins/sandbox-providers/exe-dev/src/plugin.ts:655 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Inspect the stdout/stderr in the message, fix the VM operation, and retry."],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"a7e689b3c35347b529cb9f54c9b9a8575a3dcab6","analyzedAt":"2026-08-18T22:49:45.177Z","contentChangedAt":"2026-08-18T22:49:45.177Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}