"""MCP tools — aggregated legal arguments (claim de-duplication).""" from __future__ import annotations from uuid import UUID from legal_mcp.services import argument_aggregator, db from legal_mcp.tools.envelope import empty, err, ok # GAP-48: SSoT envelope async def aggregate_claims_to_arguments( case_number: str, force: bool = False, ) -> str: """כינוס פרופוזיציות גולמיות לטיעונים משפטיים מובחנים. Args: case_number: מספר תיק הערר. force: True = למחוק טיעונים קיימים ולחשב מחדש. """ case = await db.get_case_by_number(case_number) if not case: return err(f"תיק {case_number} לא נמצא.") case_id = UUID(case["id"]) result = await argument_aggregator.aggregate_claims_to_arguments( case_id, force=force, ) result["case_number"] = case_number return ok(result) async def get_legal_arguments( case_number: str, party: str = "", ) -> str: """שליפת טיעונים משפטיים מאוגדים לתיק. Args: case_number: מספר תיק הערר. party: סינון לפי צד (appellant/respondent/committee/permit_applicant). ריק = כל הצדדים. """ case = await db.get_case_by_number(case_number) if not case: return err(f"תיק {case_number} לא נמצא.") case_id = UUID(case["id"]) args = await argument_aggregator.get_legal_arguments(case_id, party=party) if not args: return empty( "לא נמצאו טיעונים מאוגדים. הרץ aggregate_claims_to_arguments תחילה.", data={"case_number": case_number, "arguments": []}, ) # Group by party for nicer display. party_he = { "appellant": "עוררים", "respondent": "משיבים", "committee": "ועדה מקומית", "permit_applicant": "מבקשי היתר", "unknown": "צד לא מזוהה", } by_party: dict[str, list[dict]] = {} for a in args: label = party_he.get(a["party"], a["party"]) by_party.setdefault(label, []).append(a) return ok({ "case_number": case_number, "total": len(args), "by_party": by_party, })