smiles), escapeshellarg($outputPath) ); try { $result = Process::timeout($this->timeout)->run($cmd); $outputData = null; $fullOutput = $result->output(); if (preg_match('/\{"status":\s*"(success|error)".*\}/s', $fullOutput, $matches)) { $outputData = json_decode($matches[0], true); } if (! $result->successful() || ($outputData && $outputData['status'] === 'error')) { $errorMsg = $outputData['message'] ?? $result->errorOutput() ?: 'Unknown conversion error'; throw new \Exception('SMILES conversion failed: '.$errorMsg); } $this->dockingJob->update([ 'ligand_path' => $outputData['output_file'] ?? $outputPath, ]); RunDockingJob::dispatch($this->dockingJob, $this->params); } catch (\Exception $e) { Log::error('SMILES conversion failed', [ 'job_id' => $this->dockingJob->id, 'smiles' => $this->smiles, 'error' => $e->getMessage(), ]); $this->dockingJob->update([ 'status' => 'failed', 'result_data' => ['error' => $e->getMessage()], ]); } } }