Merge commit 'df26886ad7df2d9934e973336dba677a8a5d5dae'

This commit is contained in:
Alexa Amundson
2025-11-18 01:20:02 -06:00
30 changed files with 5377 additions and 0 deletions

View File

@@ -0,0 +1,81 @@
"""
Operator Webhooks Router
Handles GitHub webhook events for the Operator Engine.
"""
from fastapi import APIRouter, Request, Header
from typing import Optional
import sys
import os
# Add operator_engine to path
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "../../../"))
from operator_engine.github_webhooks import get_webhook_handler
from operator_engine.pr_actions import get_queue
router = APIRouter(prefix="/api/operator", tags=["Operator"])
@router.post("/webhooks/github")
async def github_webhook(
request: Request,
x_github_event: str = Header(...),
x_hub_signature_256: Optional[str] = Header(None),
):
"""
Receive GitHub webhook events.
This endpoint receives events from GitHub and queues appropriate actions.
"""
handler = get_webhook_handler()
return await handler.handle_webhook(request, x_github_event, x_hub_signature_256)
@router.get("/queue/stats")
async def get_queue_stats():
"""Get queue statistics"""
queue = get_queue()
return await queue.get_queue_stats()
@router.get("/queue/pr/{owner}/{repo}/{pr_number}")
async def get_pr_actions(owner: str, repo: str, pr_number: int):
"""Get all actions for a specific PR"""
queue = get_queue()
actions = await queue.get_pr_actions(owner, repo, pr_number)
return {
"pr": f"{owner}/{repo}#{pr_number}",
"actions": [action.to_dict() for action in actions],
}
@router.get("/queue/action/{action_id}")
async def get_action_status(action_id: str):
"""Get the status of a specific action"""
queue = get_queue()
action = await queue.get_status(action_id)
if action:
return action.to_dict()
return {"error": "Action not found"}
@router.post("/queue/action/{action_id}/cancel")
async def cancel_action(action_id: str):
"""Cancel a queued action"""
queue = get_queue()
cancelled = await queue.cancel_action(action_id)
return {"cancelled": cancelled}
@router.get("/health")
async def health_check():
"""Health check endpoint"""
queue = get_queue()
stats = await queue.get_queue_stats()
return {
"status": "healthy",
"queue_running": stats["running"],
**stats,
}