agent_m/agentm/views/agent_home.py

68 lines
2.6 KiB
Python

from textual.screen import Screen
from textual.widgets import Button, Static
from textual.containers import Vertical
from agentm.utils.logger import log_with_caller
from agentm.components.footer import AgentMFooter
from agentm.theme.palette import get_theme
from agentm.logic.db_functions import get_models_for_run
from agentm.views.model_select import ModelSelectView
from pyfiglet import Figlet
palette = get_theme()
class AgentHomeView(Screen):
BINDINGS = [("escape", "app.pop_screen", "Back")]
def __init__(self, agent: dict, run: dict):
super().__init__()
self.agent_metadata = agent
self.run_metadata = run
self.models_exist = False
def compose(self):
f = Figlet(font="ansi_shadow")
ascii_header = f.renderText(self.agent_metadata["name"])
yield Static(f"[{palette.ACCENT}]{ascii_header}[/{palette.ACCENT}]", classes="header", expand=False)
yield Static(
f"[b]Agent ID:[/] {self.agent_metadata['id']} | "
f"[b]Run:[/] {self.run_metadata['name']}",
classes="subheader",
expand=False
)
# Buttons - only Eval and Submit may be disabled
self.train_btn = Button("🚀 Train", id="train_btn", classes="confirm_button")
self.eval_btn = Button("🎮 Eval", id="eval_btn", classes="confirm_button", disabled=True)
self.submit_btn = Button("📦 Submit", id="submit_btn", classes="confirm_button", disabled=True)
yield Vertical(
self.train_btn,
self.eval_btn,
self.submit_btn,
id="agent_home_menu",
classes="centered_layout"
)
yield AgentMFooter(compact=True)
async def on_mount(self):
log_with_caller("info", f"Entered AgentHomeView for agent '{self.agent_metadata['name']}'")
models = get_models_for_run(self.run_metadata["id"])
self.models_exist = len(models) > 0
self.eval_btn.disabled = not self.models_exist
self.submit_btn.disabled = not self.models_exist
log_with_caller("debug", f"Found {len(models)} model(s) for run '{self.run_metadata['name']}'")
async def on_button_pressed(self, event: Button.Pressed) -> None:
action = event.button.id.replace("_btn", "") # 'train', 'eval', or 'submit'
log_with_caller("info", f"{action.title()} selected for run '{self.run_metadata['name']}'")
# Always go to model select before action
await self.app.push_screen(
ModelSelectView(
agent_metadata=self.agent_metadata,
mode=action,
run=self.run_metadata
)
)