Spaces:
Sleeping
Sleeping
import datetime | |
import json | |
import uuid | |
from dataclasses import dataclass | |
from pathlib import Path | |
from typing import Dict, List | |
import pytz | |
from smolagents import tool | |
class Task: | |
id: str = None | |
completed: bool = False | |
description: str = "" | |
last_updated: str = "" | |
def __post_init__(self): | |
if self.id is None: | |
self.id = str(uuid.uuid4()) | |
def to_dict(self) -> Dict: | |
return { | |
"id": self.id, | |
"completed": self.completed, | |
"description": self.description, | |
"last_updated": self.last_updated, | |
} | |
class TodoManager: | |
def __init__(self, filepath: str = "todo.jsonl"): | |
self.filepath = Path(filepath) | |
if not self.filepath.exists(): | |
self.filepath.write_text("") | |
def _read_tasks(self) -> List[Task]: | |
if not self.filepath.exists(): | |
return [] | |
try: | |
with self.filepath.open("r", encoding="utf-8") as file: | |
data = [json.loads(line) for line in file if line.strip()] | |
return [ | |
Task( | |
description=item.get("description", item.get("task", "")), | |
completed=item.get("completed", item.get("status") == "✅"), | |
last_updated=item["last_updated"], | |
id=item.get("id"), | |
) | |
for item in data | |
] | |
except json.JSONDecodeError: | |
return [] | |
def _save_tasks(self, tasks: List[Task]): | |
with self.filepath.open("w") as file: | |
for task in tasks: | |
file.write(json.dumps(task.to_dict()) + "\n") | |
def get_current_time_in_timezone(timezone: str) -> str: | |
"""A tool that fetches the current local time in a specified timezone. | |
Args: | |
timezone: A string representing a valid timezone (e.g., 'America/New_York'). | |
""" | |
try: | |
tz = pytz.timezone(timezone) | |
local_time = datetime.datetime.now(tz).strftime("%Y-%m-%d %H:%M:%S") | |
return f"The current local time in {timezone} is: {local_time}" | |
except Exception as e: | |
return f"Error fetching time for timezone '{timezone}': {str(e)}" | |
def get_todays_tasks() -> str: | |
"""List all tasks with their status and details. | |
Args: | |
None | |
Returns: | |
A formatted string containing all tasks with their status and IDs. | |
""" | |
manager = TodoManager("./todo.jsonl") | |
tasks = manager._read_tasks() | |
if not tasks: | |
return "No tasks found" | |
pending = [t for t in tasks if not t.completed] | |
completed = [t for t in tasks if t.completed] # Uncomment this to show all tasks | |
output = [f"📅 Tasks Report for {datetime.date.today()}"] | |
output.append("\n🔴 Pending Tasks:") | |
output.extend(f"[{t.id[:8]}] {t.description}" for t in pending) | |
output.append("\n✅ Completed Tasks:") # Show both pending and completed tasks | |
output.extend(f"[{t.id[:8]}] {t.description}" for t in completed) | |
output.append(f"\nTotal: {len(pending)} pending, {len(completed)} completed") | |
return "\n".join(output) | |
def update_task_status(task_id: str) -> str: | |
"""Toggle a task's completion status between complete and pending. | |
Args: | |
task_id: First 8 characters of the task's UUID (e.g., '65118069' from '65118069-b2a4-4ea3-b8e9-d7921381cbfc'). | |
You can find task IDs in square brackets when listing tasks. | |
Returns: | |
Success message with task details if found and updated. | |
Error message if task not found or invalid input. | |
Examples: | |
> update_task_status('65118069') | |
"✅ Task [65118069] marked as complete: Repair my computer" | |
> update_task_status('65118069') | |
"✅ Task [65118069] marked as pending: Repair my computer" | |
""" | |
# Validate task_id format | |
if not task_id or not isinstance(task_id, str) or len(task_id) < 1: | |
return "❌ Please provide a valid task ID" | |
try: | |
manager = TodoManager("./todo.jsonl") | |
tasks = manager._read_tasks() | |
if not tasks: | |
return "❌ No tasks found in the todo list" | |
# Find and update the task | |
for task in tasks: | |
if task.id.startswith(task_id): | |
task.completed = not task.completed | |
task.last_updated = datetime.date.today().strftime("%Y-%m-%d") | |
manager._save_tasks(tasks) | |
return f"✅ Task [{task_id}] marked as {'complete' if task.completed else 'pending'}: {task.description}" | |
return f"❌ No task found with ID '{task_id}'" | |
except (json.JSONDecodeError, IOError) as e: | |
return f"❌ Error accessing todo list: {str(e)}" | |
except Exception as e: | |
return f"❌ Unexpected error: {str(e)}" | |
def add_task(description: str) -> str: | |
"""Add a new task to the todo list. | |
Args: | |
description: The text description of the task to add. | |
Returns: | |
A confirmation message indicating the task was added. | |
""" | |
manager = TodoManager("./todo.jsonl") | |
tasks = manager._read_tasks() | |
new_task = Task( | |
description=description, | |
completed=False, | |
last_updated=datetime.date.today().strftime("%Y-%m-%d"), | |
) | |
tasks.append(new_task) | |
manager._save_tasks(tasks) | |
return f"✅ Added new task: {description}" | |