Loading...
No commits yet
Not committed History
Blame
_routes_claim.py • 4.2 KB
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# File: src/scitex_writer/_editor/_routes_claim.py

"""Claim routes for the GUI editor.

Endpoints:
    GET  /api/claims                   — list all claims with previews
    GET  /api/claims/<id>              — get single claim with all styles
    POST /api/claims                   — add/update claim
    DELETE /api/claims/<id>            — remove claim
    GET  /api/claims/<id>/chain        — claim + optional Clew chain (Mermaid)
    POST /api/claims/render            — regenerate claims_rendered.tex
"""

from __future__ import annotations

from flask import jsonify, request


def register_claim_routes(app, editor):
    """Register claim API routes."""

    from ..._mcp.handlers._claim import (
        add_claim,
        get_claim,
        list_claims,
        remove_claim,
        render_claims,
    )

    @app.route("/api/claims")
    def api_list_claims():
        """List all claims in the project."""
        return jsonify(list_claims(str(editor.project_dir)))

    @app.route("/api/claims/<claim_id>")
    def api_get_claim(claim_id):
        """Get a specific claim with all style renderings."""
        return jsonify(get_claim(str(editor.project_dir), claim_id))

    @app.route("/api/claims", methods=["POST"])
    def api_add_claim():
        """Add or update a claim."""
        data = request.get_json() or {}
        required = {"claim_id", "claim_type", "value"}
        missing = required - data.keys()
        if missing:
            return jsonify(
                {"success": False, "error": f"Missing fields: {missing}"}
            ), 400
        return jsonify(
            add_claim(
                str(editor.project_dir),
                claim_id=data["claim_id"],
                claim_type=data["claim_type"],
                value=data["value"],
                context=data.get("context"),
                session_id=data.get("session_id"),
                output_file=data.get("output_file"),
                output_hash=data.get("output_hash"),
                test=data.get("test"),
            )
        )

    @app.route("/api/claims/<claim_id>", methods=["DELETE"])
    def api_remove_claim(claim_id):
        """Remove a claim."""
        return jsonify(remove_claim(str(editor.project_dir), claim_id))

    @app.route("/api/claims/<claim_id>/chain")
    def api_claim_chain(claim_id):
        """Get claim data + optional Clew verification chain as Mermaid diagram.

        Returns:
            claim: full claim data
            previews: nature/apa/plain renderings
            mermaid: Mermaid diagram code (if clew available and output_file set)
            clew_available: whether scitex.clew is importable
            has_provenance: whether claim has output_file/session_id
        """
        claim_result = get_claim(str(editor.project_dir), claim_id)
        if not claim_result.get("success"):
            return jsonify(claim_result)

        claim = claim_result["claim"]
        response = {
            "success": True,
            "claim_id": claim_id,
            "claim": claim,
            "previews": claim_result.get("previews", {}),
            "mermaid": None,
            "clew_available": False,
            "has_provenance": bool(claim.get("output_file") or claim.get("session_id")),
        }

        output_file = claim.get("output_file")
        session_id = claim.get("session_id")

        if output_file or session_id:
            try:
                from scitex.clew import generate_mermaid_dag

                response["clew_available"] = True
                kwargs = {}
                if output_file:
                    kwargs["target_file"] = output_file
                elif session_id:
                    kwargs["session_id"] = session_id
                mermaid_code = generate_mermaid_dag(**kwargs)
                response["mermaid"] = mermaid_code
            except Exception:
                pass  # Clew not available or chain lookup failed — degrade gracefully

        return jsonify(response)

    @app.route("/api/claims/render", methods=["POST"])
    def api_render_claims():
        """Regenerate 00_shared/claims_rendered.tex."""
        return jsonify(render_claims(str(editor.project_dir)))


# EOF