feat(agents): reset button + endpoint to clear stuck agent error state
All checks were successful
G12 Leak-Guard / leak-guard (pull_request) Successful in 5s
Lint — undefined names / undefined-names (pull_request) Successful in 10s

Adds a one-click 'reset agents' action for cases where writer/QA agents
are stuck in Paperclip's error state (triggered by recovery loop or
failed run). Addresses the root cause documented in
reference_paperclip_recovery_loops: reassigns open issues from agents
back to the chair user, and calls reset_agent_session for each error
agent to clear wedged runtime sessions.

Changes:
- paperclip_client.py: reset_case_agents() — reassigns stuck issues +
  clears error status in Paperclip DB + calls reset_agent_session
- agent_platform_port.py: exports pc_reset_case_agents (G12 gate)
- app.py: POST /api/cases/{case_number}/agents/reset endpoint
- agents.ts: useResetCaseAgents mutation hook + AgentResetResult type
- agent-status-widget.tsx: 'אפס' button (shown only when error agents
  exist) with Dialog confirmation + loading state + toast feedback

Invariants: G12 (Paperclip only via port), G2 (no parallel path —
uses existing reset_agent_session + pc_get_case_issues).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-24 14:53:50 +00:00
parent a9d04c1e9f
commit 82844a63c2
5 changed files with 195 additions and 7 deletions

View File

@@ -72,6 +72,7 @@ from web.agent_platform_port import (
pc_reject_interaction,
pc_request,
pc_reset_agent_session,
pc_reset_case_agents,
pc_respond_to_interaction,
pc_restore_project,
pc_wake_analyst_for_appraiser_facts,
@@ -4173,6 +4174,19 @@ async def api_post_interaction_response(
raise HTTPException(502, f"שגיאת Paperclip: {e}")
@app.post("/api/cases/{case_number}/agents/reset")
async def api_reset_case_agents(case_number: str):
"""Reset stuck agents for a case.
Clears writer/QA agents from 'error' status and reassigns any open
issues back to the chair user, stopping Paperclip recovery loops.
"""
result = await pc_reset_case_agents(case_number)
if not result.get("ok"):
raise HTTPException(502, result.get("error", "שגיאה בביצוע האיפוס"))
return result
# ── Settings: MCP Server Configuration ────────────────────────────
#
# Source of truth for legal-ai env vars is Coolify (see memory: