diff --git a/src/api/blackboard_routes.py b/src/api/blackboard_routes.py index cad2fcd..a2389a6 100644 --- a/src/api/blackboard_routes.py +++ b/src/api/blackboard_routes.py @@ -38,12 +38,28 @@ async def list_tasks(project_id: str, @router.get("/tasks/{task_id}") -async def get_task(project_id: str, task_id: str): +async def get_task(project_id: str, task_id: str, + expand: Optional[str] = None): bb = _bb(project_id) task = bb.get_task(task_id) if not task: raise HTTPException(404, f"Task not found: {task_id}") - return _task_to_dict(task) + result = _task_to_dict(task) + if expand == "all": + q = _q(project_id) + detail = q.task_detail(task_id) + if detail: + result["comments_count"] = detail.get("comments_count", 0) + result["outputs_count"] = detail.get("outputs_count", 0) + result["review_status"] = detail.get("review_status") + result["latest_event_detail"] = detail.get("latest_event_detail") + result["comments"] = [dict(c.__dict__) for c in bb.get_comments(task_id)] + result["outputs"] = [dict(o.__dict__) for o in bb.get_outputs(task_id)] + result["reviews"] = [dict(r.__dict__) for r in bb.get_reviews(task_id)] + result["decisions"] = [dict(d.__dict__) for d in bb.get_decisions(task_id)] + result["events"] = q.task_events(task_id) + result["experiences"] = q.task_experiences(task_id) + return result @router.post("/tasks") @@ -104,11 +120,13 @@ async def add_comment(project_id: str, task_id: str, body: Dict[str, Any]): @router.get("/tasks/{task_id}/outputs") async def get_outputs(project_id: str, task_id: str): bb = _bb(project_id) - return {"outputs": [dict(o.__dict__) for o in bb.get_outputs(task_id)]} + return {"decisions": [dict(d.__dict__) for d in bb.get_decisions(task_id)]} -@router.post("/tasks/{task_id}/outputs") -async def write_output(project_id: str, task_id: str, body: Dict[str, Any]): +# --- Per-task Decisions (POST) --- + +@router.post("/tasks/{task_id}/decisions") +async def add_decision(project_id: str, task_id: str, body: Dict[str, Any]): bb = _bb(project_id) oid = bb.write_output(task_id, body["agent"], body["type"], body["title"], content_path=body.get("path"), @@ -161,6 +179,19 @@ async def add_review(project_id: str, task_id: str, body: Dict[str, Any]): # --- Events --- +@router.get("/tasks/{task_id}/events") +async def get_task_events(project_id: str, task_id: str, + limit: int = Query(50, le=200)): + q = _q(project_id) + return {"events": q.task_events(task_id, limit)} + + +@router.get("/tasks/{task_id}/experiences") +async def get_task_experiences(project_id: str, task_id: str): + q = _q(project_id) + return {"experiences": q.task_experiences(task_id)} + + @router.get("/events") async def get_events(project_id: str, limit: int = Query(50, le=200)): q = _q(project_id)