fix(p0): secure agent revocation and R6 worker queue
This commit is contained in:
@@ -20,6 +20,15 @@ from typing import Any, Dict, List, Optional
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
try:
|
||||
from agent_v0.agent_v1.ui.message_contract import (
|
||||
coerce_supervised_pause_message,
|
||||
warn_visible_message,
|
||||
)
|
||||
except Exception: # pragma: no cover - fallback for partial server deployments
|
||||
coerce_supervised_pause_message = None
|
||||
warn_visible_message = None
|
||||
|
||||
|
||||
@dataclass
|
||||
class PausePayload:
|
||||
@@ -50,8 +59,25 @@ def build_pause_payload(
|
||||
last_screenshot: Optional[str],
|
||||
) -> PausePayload:
|
||||
"""Construit le payload de pause enrichi pour une action pause_for_human."""
|
||||
params = action.get("parameters") or {}
|
||||
message = params.get("message", "Validation requise")
|
||||
params = dict(action.get("parameters") or {})
|
||||
for key in ("message", "safety_level", "safety_checks", "pause_reason"):
|
||||
if key not in params or params.get(key) in (None, "", []):
|
||||
if action.get(key) not in (None, "", []):
|
||||
params[key] = action.get(key)
|
||||
|
||||
raw_message = (
|
||||
params.get("message")
|
||||
or action.get("message")
|
||||
or action.get("intention")
|
||||
or ""
|
||||
)
|
||||
message = _coerce_pause_message(
|
||||
raw_message,
|
||||
intention=params.get("intention") or action.get("intention") or action.get("description"),
|
||||
attendu=params.get("attendu") or params.get("expected") or action.get("expected"),
|
||||
vu=params.get("vu") or params.get("observed") or action.get("observed"),
|
||||
demande=params.get("demande") or params.get("request"),
|
||||
)
|
||||
safety_level = params.get("safety_level")
|
||||
declarative = params.get("safety_checks") or []
|
||||
|
||||
@@ -90,11 +116,60 @@ def build_pause_payload(
|
||||
|
||||
return PausePayload(
|
||||
checks=checks,
|
||||
pause_reason="",
|
||||
pause_reason=params.get("pause_reason", ""),
|
||||
message=message,
|
||||
)
|
||||
|
||||
|
||||
def _coerce_pause_message(
|
||||
message: Any = "",
|
||||
*,
|
||||
intention: Any = "",
|
||||
attendu: Any = "",
|
||||
vu: Any = "",
|
||||
demande: Any = "",
|
||||
) -> str:
|
||||
if warn_visible_message is not None:
|
||||
warn_visible_message(
|
||||
message,
|
||||
source="safety_checks_provider._coerce_pause_message.raw",
|
||||
supervised_pause=False,
|
||||
)
|
||||
|
||||
if coerce_supervised_pause_message is not None:
|
||||
result = coerce_supervised_pause_message(
|
||||
message,
|
||||
intention=intention,
|
||||
attendu=attendu,
|
||||
vu=vu,
|
||||
demande=demande,
|
||||
)
|
||||
if warn_visible_message is not None:
|
||||
warn_visible_message(
|
||||
result,
|
||||
source="safety_checks_provider._coerce_pause_message.final",
|
||||
supervised_pause=True,
|
||||
)
|
||||
return result
|
||||
|
||||
fallback_request = "indiquer si je peux continuer ou corriger l'action attendue"
|
||||
result = "\n".join(
|
||||
(
|
||||
f"J'essaie de : {intention or 'continuer une etape supervisee'}",
|
||||
f"J'attendais : {attendu or 'un accord humain clair avant de continuer'}",
|
||||
f"Je vois : {vu or 'je suis sur une etape qui demande une verification humaine'}",
|
||||
f"Peux-tu : {demande or message or fallback_request}",
|
||||
)
|
||||
)
|
||||
if warn_visible_message is not None:
|
||||
warn_visible_message(
|
||||
result,
|
||||
source="safety_checks_provider._coerce_pause_message.final_fallback",
|
||||
supervised_pause=True,
|
||||
)
|
||||
return result
|
||||
|
||||
|
||||
def _call_llm_for_contextual_checks(
|
||||
action: Dict[str, Any],
|
||||
replay_state: Dict[str, Any],
|
||||
|
||||
Reference in New Issue
Block a user