class_docstr: This class keeps track of services that can be employed by all objects of the agent-environment loop.
  
  Currently the context is populated by
  
  - Event service: Acts as backend of the PubSub service, collects all events from the env.
    The event service can also be directly facilitated by components outside the environment (e.g. agent, heuristics,
    state/observation mapping)
  - Episode ID: Generates and keeps track of the current episode ID
    Episode IDs are used for connecting logged statistics, events and recorded trajectory data together, making
    analysis and drill-down across these different levels possible.
  - Step ID: Tracks ID of the core env step we are currently in. Helps wrappers recognize core env steps in multi-step
    scenarios.
  - Post-step callbacks: Handles registration of post-step callbacks and provides a utility to run them (usually
                         triggered from the outer-most wrapper)
  - Step lifecycle flags: Flags partially managed from the wrapper stack, helping the wrappers to determine
                          where we are in the step lifecycle and which one is the outer-most one
docstr: Get the episode ID.
  
  Episode ID is a UUID generated in a lazy manner, ensuring that if the ID is not needed, the potentially costly
  random UUID generation is avoided. Once generated, it stays the same for the entire episode and then
  is reset.
  
  :return: Episode UUID as string
docstr_tok: ["Get","the","episode","ID",".","Episode","ID","is","a","UUID","generated","in","a","lazy","manner",",","ensuring","that","if","the","ID","is","not","needed",",","the","potentially","costly","random","UUID","generation","is","avoided",".","Once","generated",",","it","stays","the","same","for","the","entire","episode","and","then","is","reset",".",":","return",":","Episode","UUID","as","string"]
code: def episode_id(self) -> str:
      """
      Get the episode ID.
  
      Episode ID is a UUID generated in a lazy manner, ensuring that if the ID is not needed, the potentially costly
      random UUID generation is avoided. Once generated, it stays the same for the entire episode and then
      is reset.
  
      :return: Episode UUID as string
      """
      if self._episode_id is None:
          self._episode_id = str(uuid.uuid4())
  
      return self._episode_id
  
file_path: maze/maze/core/env/environment_context.py
imports: import uuid
  from typing import Callable
label_desc: Use image node_id 2 for calling the EnvironmentContext obj's underlying member method code with example usage: obj.episode_id() and returns: self