Annie Voigt
style: apply ruff lint --fix + ruff format across the tree
c3b49d6
Raw
History Blame Contribute Delete
1.98 kB
"""
Plan Manager for CodeAct Agent.
Handles plan creation, updates, and progress tracking.
"""
import re
class PlanManager:
"""Manages plan creation, updates, and progress tracking."""
@staticmethod
def extract_plan_from_content(content: str) -> str | None:
"""Extract plan from agent content."""
plan_pattern = r"\d+\.\s*\[[^\]]*\]\s*[^\n]+(?:\n\d+\.\s*\[[^\]]*\]\s*[^\n]+)*"
matches = re.findall(plan_pattern, content)
# Return the last (most recent) plan if multiple plans exist
return matches[-1] if matches else None
@staticmethod
def update_plan_for_solution(plan_text: str) -> str:
"""Update plan to mark all remaining steps as completed when providing final solution."""
if not plan_text:
return plan_text
lines = plan_text.split("\n")
updated_lines = []
for line in lines:
# Mark any unchecked or failed steps as completed since we're providing final solution
if "[ ]" in line or "[✗]" in line:
updated_line = re.sub(r"\[\s*[^\]]*\]", "[✓]", line)
updated_lines.append(updated_line)
else:
updated_lines.append(line)
return "\n".join(updated_lines)
@staticmethod
def get_plan_progress(plan_text: str) -> dict[str, int]:
"""Get plan progress statistics."""
if not plan_text:
return {"total": 0, "completed": 0, "pending": 0, "failed": 0}
lines = plan_text.split("\n")
stats = {"total": 0, "completed": 0, "pending": 0, "failed": 0}
for line in lines:
if re.search(r"\d+\.\s*\[", line):
stats["total"] += 1
if "[✓]" in line:
stats["completed"] += 1
elif "[ ]" in line:
stats["pending"] += 1
elif "[✗]" in line:
stats["failed"] += 1
return stats