code: async def handle_agent_job_done(self, agent_addr, message: AgentJobDone):
          
  
          if agent_addr in self._registered_agents:
              self._logger.info("Job %s %s finished on agent %s", message.job_id[0], message.job_id[1], agent_addr)
  
              # Remove the job from the list of running jobs
              del self._job_running[message.job_id]
  
              # Sent the data back to the client
              await ZMQUtils.send_with_addr(self._client_socket, message.job_id[0], BackendJobDone(message.job_id[1], message.result,
                                                                                                   message.grade, message.problems,
                                                                                                   message.tests, message.custom,
                                                                                                   message.state, message.archive,
                                                                                                   message.stdout, message.stderr))
  
              # The agent is available now
              self._available_agents.append(agent_addr)
          else:
              self._logger.warning("Job result %s %s from non-registered agent %s", message.job_id[0], message.job_id[1], agent_addr)
  
          # update the queue
          await self.update_queue()
docs: Handle an AgentJobDone message. Send the data back to the client, and start new job if needed