# ui/renderers.py from datetime import datetime from config import AGENTS_INFO def _format_iso_time(iso_str: str) -> str: if not iso_str or iso_str == "N/A": return "" try: dt = datetime.fromisoformat(iso_str) return dt.strftime("%H:%M") except Exception: if "T" in iso_str: return iso_str.split("T")[1][:5] return iso_str def create_agent_stream_output(text: str = None) -> str: return f'
{text}
' def create_agent_dashboard(status_dict: dict) -> str: leader_key = 'team' member_keys = ['scout', 'weatherman', 'optimizer', 'navigator', 'presenter'] def _render_card(key): info = AGENTS_INFO.get(key, {}) state = status_dict.get(key, {}) status = state.get('status', 'idle') msg = state.get('message', 'Standby') active_class = "working" if status == "working" else "" icon = info.get('icon', '🤖') name = info.get('name', key.title()) role = info.get('role', 'Agent') color = info.get('color', '#6366f1') return f"""
{icon}
{name}
{role}
{msg}
""" html = f"""
{_render_card(leader_key)}
{''.join([_render_card(k) for k in member_keys])}
""" return html def create_summary_card(total_tasks: int, high_priority: int, total_time: int, location: str = "Taipei City", date: str = "Today") -> str: return f"""
TRIP SUMMARY
{location}
📅 {date}
{total_tasks}
Tasks
Duration
{total_time} min
High Prio
{high_priority}
""" def create_task_card(task_num: int, task_title: str, priority: str, time_window: dict, duration: str, location: str, icon: str = "📋") -> str: p_color = {"HIGH": "#ef4444", "MEDIUM": "#f59e0b", "LOW": "#10b981"}.get(priority.upper(), "#94a3b8") display_time = "Anytime" if isinstance(time_window, dict): s_clean = _format_iso_time(time_window.get('earliest_time', '')) e_clean = _format_iso_time(time_window.get('latest_time', '')) if s_clean and e_clean: display_time = f"{s_clean} - {e_clean}" elif s_clean: display_time = f"After {s_clean}" elif time_window: display_time = str(time_window) return f"""
{icon} {task_title}
{priority}
📍 {location}
🕒 {display_time} | ⏳ {duration}
""" # 🔥🔥🔥 Updated Timeline Function def create_timeline_html_enhanced(timeline): if not timeline: return """
No timeline data available yet.
""" html = '
' for i, stop in enumerate(timeline): location = stop.get('location', 'Unknown') time_str = stop.get('time', '') if not time_str or time_str == "N/A": time_str = "Flexible Time" weather_str = stop.get('weather', '') weather_html = "" if weather_str and weather_str != "N/A": weather_html = f'
🌤️ {weather_str}
' html += f"""
{location}
🕒 {time_str}
{weather_html}
""" html += '
' return html # Empty Placeholders def create_metrics_cards(metrics, traffic): return "" def create_result_visualization(tasks, data): return "" def generate_chat_history_html_bubble(session): return ""