fix: background tasks now fetch real page content; add task-status tools
Rebuild & Deploy / rebuild (push) Successful in 58s

Background research tasks were producing garbage or failing because the
self-hosted Firecrawl /v1/scrape defaults to a ~30s timeout that's too short
for heavy news/research sites, and the small LLM won't reliably chain a
second scrape call after a search that only returns snippets.

task_worker.py:
- web_search now auto-fetches the top results directly from the container
  (which has working outbound internet) and returns their real text, so the
  model gets actual page content in one call instead of snippet echoes.
- web_scrape requests timeout: 90000 (Firecrawl renders heavy sites but needs
  >30s), and falls back to a direct container fetch with tag-stripping if
  Firecrawl times out or returns nothing.

task_registry.py / dispatch_mcp.py:
- Add task_status(id) and list_tasks() tools so Hope can check the live state
  of any dispatched task (pending / running / completed / failed / STALLED).
- Track last_activity per task and surface a stall heuristic.
- Move the status summary into task_registry (no mcp dependency) so it's
  unit-testable.

agent.py: prompt tells Hope about task_status / list_tasks.
tests: add task-status summary and last-activity regression tests.
This commit is contained in:
snowspeeder committed 2026-08-30 06:54:57 -04:00
1 parent df8aa64504
commit d4ea4fc984
5 files changed
+217 -30

No files matched your search

+34
View File
@@ -12,6 +12,7 @@ from __future__ import annotations
import asyncio
import logging
import os
import time
from mcp.server.fastmcp import FastMCP
@@ -64,5 +65,38 @@ async def _run_worker(worker: "TaskWorker", task_id: str):
registry.fail(task_id, str(e))
def _status_summary(task_id: str, stalled_s: float = 45.0) -> str:
"""Human-readable live status for one task, plus a stall hint."""
try:
from agent.task_registry import status_summary
except ImportError:
from task_registry import status_summary
return status_summary(task_id, stalled_s)
@mcp.tool()
async def task_status(task_id: str) -> str:
"""Check the live status of a background task you dispatched earlier,
including whether it is pending, running, completed, failed, or looking
stalled (no activity for a while). Pass the task id from dispatch_task
(or from list_tasks)."""
return _status_summary(task_id)
@mcp.tool()
async def list_tasks() -> str:
"""List every background task Hope has dispatched in this conversation,
with their live status so you can report progress to the user."""
try:
from agent.task_registry import registry
except ImportError:
from task_registry import registry
tasks = registry.list_all()
if not tasks:
return "No background tasks have been dispatched yet."
return "\n".join(_status_summary(t["id"]) for t in tasks)
if __name__ == "__main__":
mcp.run(transport="stdio")