code: def get_runinfo(self, suffix):
      run_id_changed = self.card_options.refresh_run()
      if run_id_changed:
          self.log_message(
              "RunID changed in the background to %s"
              % self.card_options.run_object.pathspec
          )
          _ClickLogger(
              "RunID changed in the background to %s"
              % self.card_options.run_object.pathspec,
              fg="blue",
          )
  
      if self.card_options.run_object is None:
          self._response(
              {
                  "status": "No Run Found",
                  "flow": self.card_options.flow_name,
              },
              code=404,
              is_json=True,
          )
          return
  
      task_card_generator = cards_for_run(
          self.card_options.flow_datastore,
          self.card_options.run_object,
          self.card_options.only_running,
          max_cards=self.card_options.max_cards,
      )
      flow_name = self.card_options.run_object.parent.id
      run_id = self.card_options.run_object.id
      cards = []
      for pathspec, card in task_card_generator:
          step, task = pathspec.split("/")[-2:]
          _task = self.card_options.run_object[step][task]
          task_finished = True if _task.finished else False
          cards.append(
              dict(
                  task=pathspec,
                  label="%s/%s %s" % (step, task, card.hash),
                  card_object=dict(
                      hash=card.hash,
                      type=card.type,
                      path=card.path,
                      id=card.id,
                  ),
                  finished=task_finished,
                  card="%s/%s" % (pathspec, card.hash),
              )
          )
      resp = {
          "status": "ok",
          "flow": flow_name,
          "run_id": run_id,
          "cards": cards,
          "poll_interval": self.card_options.poll_interval,
      }
      self._response(resp, is_json=True)
  
imports: import os
  import json
  from http.server import BaseHTTPRequestHandler
  from threading import Thread
  from multiprocessing import Pipe
  from multiprocessing.connection import Connection
  from urllib.parse import urlparse
  import time
  from .card_client import CardContainer
  from .exception import CardNotPresentException
  from .card_resolver import resolve_paths_from_task
  from metaflow.metaflow_config import DATASTORE_LOCAL_DIR
  from metaflow import namespace
  from metaflow.exception import CommandException, MetaflowNotFound, MetaflowNamespaceMismatch
label_desc: Use image node_id 2 for calling the CardViewerRoutes obj's underlying member method code with example usage: obj.get_runinfo(suffix) without return types