mirror of
https://github.com/rennf93/roboco.git
synced 2026-08-03 07:23:24 +02:00
129 lines
3.4 KiB
Python
129 lines
3.4 KiB
Python
"""QA intent-verb HTTP endpoints. Thin handlers; delegate to Choreographer."""
|
|
|
|
from typing import Annotated
|
|
from uuid import UUID
|
|
|
|
from fastapi import APIRouter, Depends, Header, Request
|
|
|
|
from roboco.api.deps import get_choreographer
|
|
from roboco.api.routes.v1._role_dep import envelope_to_response, require_qa
|
|
from roboco.api.schemas.v1.flow import (
|
|
ClaimReviewRequest,
|
|
FailReviewRequest,
|
|
GiveMeWorkRequest,
|
|
IAmBlockedRequest,
|
|
IAmIdleRequest,
|
|
PassReviewRequest,
|
|
ResumeRequest,
|
|
UnclaimRequest,
|
|
)
|
|
from roboco.services.gateway.choreographer import Choreographer
|
|
|
|
router = APIRouter(
|
|
prefix="/api/v1/flow/qa",
|
|
tags=["v1-flow-qa"],
|
|
dependencies=[require_qa],
|
|
)
|
|
|
|
|
|
_AgentIdHeader = Annotated[UUID, Header(alias="X-Agent-ID")]
|
|
_ChoreographerDep = Annotated[Choreographer, Depends(get_choreographer)]
|
|
|
|
|
|
@router.post("/give_me_work")
|
|
async def give_me_work(
|
|
request: Request,
|
|
_body: GiveMeWorkRequest,
|
|
x_agent_id: _AgentIdHeader,
|
|
choreographer: _ChoreographerDep,
|
|
) -> dict:
|
|
env = await choreographer.give_me_work(x_agent_id)
|
|
return envelope_to_response(env, request)
|
|
|
|
|
|
@router.post("/claim_review")
|
|
async def claim_review(
|
|
request: Request,
|
|
body: ClaimReviewRequest,
|
|
x_agent_id: _AgentIdHeader,
|
|
choreographer: _ChoreographerDep,
|
|
) -> dict:
|
|
env = await choreographer.claim_review(x_agent_id, body.task_id)
|
|
return envelope_to_response(env, request)
|
|
|
|
|
|
@router.post("/pass")
|
|
async def qa_pass(
|
|
request: Request,
|
|
body: PassReviewRequest,
|
|
x_agent_id: _AgentIdHeader,
|
|
choreographer: _ChoreographerDep,
|
|
) -> dict:
|
|
env = await choreographer.pass_review(
|
|
x_agent_id, body.task_id, body.notes, body.ac_verdicts
|
|
)
|
|
return envelope_to_response(env, request)
|
|
|
|
|
|
@router.post("/fail")
|
|
async def qa_fail(
|
|
request: Request,
|
|
body: FailReviewRequest,
|
|
x_agent_id: _AgentIdHeader,
|
|
choreographer: _ChoreographerDep,
|
|
) -> dict:
|
|
env = await choreographer.fail_review(x_agent_id, body.task_id, body.issues)
|
|
return envelope_to_response(env, request)
|
|
|
|
|
|
@router.post("/unclaim")
|
|
async def unclaim(
|
|
request: Request,
|
|
body: UnclaimRequest,
|
|
x_agent_id: _AgentIdHeader,
|
|
choreographer: _ChoreographerDep,
|
|
) -> dict:
|
|
env = await choreographer.unclaim(x_agent_id, body.task_id)
|
|
return envelope_to_response(env, request)
|
|
|
|
|
|
@router.post("/resume")
|
|
async def resume(
|
|
request: Request,
|
|
body: ResumeRequest,
|
|
x_agent_id: _AgentIdHeader,
|
|
choreographer: _ChoreographerDep,
|
|
) -> dict:
|
|
env = await choreographer.resume(x_agent_id, body.task_id)
|
|
return envelope_to_response(env, request)
|
|
|
|
|
|
@router.post("/i_am_idle")
|
|
async def i_am_idle(
|
|
request: Request,
|
|
_body: IAmIdleRequest,
|
|
x_agent_id: _AgentIdHeader,
|
|
choreographer: _ChoreographerDep,
|
|
) -> dict:
|
|
env = await choreographer.i_am_idle(x_agent_id)
|
|
return envelope_to_response(env, request)
|
|
|
|
|
|
@router.post("/i_am_blocked")
|
|
async def i_am_blocked(
|
|
request: Request,
|
|
body: IAmBlockedRequest,
|
|
x_agent_id: _AgentIdHeader,
|
|
choreographer: _ChoreographerDep,
|
|
) -> dict:
|
|
"""F015: the QA manifest registers ``i_am_blocked`` — surface the route so a
|
|
blocked QA agent's escape hatch returns an envelope instead of a 404."""
|
|
env = await choreographer.i_am_blocked(
|
|
x_agent_id,
|
|
body.task_id,
|
|
body.reason,
|
|
blocker_type=body.blocker_type,
|
|
what_needed=body.what_needed,
|
|
)
|
|
return envelope_to_response(env, request)
|