"""HTTP 中断适配:领域错误映射为状态码,执行层不依赖请求模型。""" from fastapi import HTTPException from runtime.events import EventBuilder from runtime.interrupts import pack, token_for, ResumeDecision, ResumeError from runtime.interrupts import interrupt_event, resume_value as resolve_resume, official_resume from api.sse_events import serialize_event def decision_from_request(request) -> ResumeDecision: return ResumeDecision(interrupt_token=request.interrupt_token or "", approved=request.approved, status=request.status, answers=request.answers, error=request.error) def interrupt_frame(writer, payload): builder = EventBuilder(writer.session_id, writer.trace_id, encode=lambda event: event) return serialize_event(interrupt_event(builder, payload)) def resume_value(request, state): try: return resolve_resume(decision_from_request(request), state) except ResumeError as exc: raise _http_error(exc) from exc def to_official_resume(request, pending_count): try: return official_resume(decision_from_request(request), pending_count) except ResumeError as exc: raise _http_error(exc) from exc def _http_error(exc: ResumeError) -> HTTPException: status = 400 if exc.code in {"invalid_answers", "invalid_decision"} else 409 return HTTPException(status_code=status, detail={"code": exc.code, "message": str(exc)})