from __future__ import annotations import json import os import re from dataclasses import dataclass from pathlib import Path from typing import TYPE_CHECKING, Literal, Protocol from dotenv import load_dotenv from google import genai from google.genai import types from textworld.core import GameState from agents.hero.cli import parse_cli_command from .base import DMInterfaceError, SUPPORTED_DIRECTIONS if TYPE_CHECKING: from .session import EpisodeSession DEFAULT_GEMINI_MODEL = "gemini-2.5-flash-lite" _TEXTWORLD_PROMPT_LINE_RE = re.compile(r"^\s*>\s.*-\=\s.*=\-(?:\d+/\d+)?\s*$") _TEXTWORLD_BANNER_CHAR_RE = re.compile(r"[\\|$_/]") _TEXTWORLD_ROOM_HEADER_RE = re.compile(r"^\s*-\=\s*(?P