"""Image-domain tool implementations. Extracted from tool_implementations.py as part of slice 1 (#4082/#4071). Holds the edit_image (gallery) tool. ``src.tool_implementations`` re-exports these for backward compatibility. ``_INTERNAL_BASE`` still lives in tool_implementations.py and is pulled back function-locally here. """ from typing import Dict, Optional from src.tools._common import _parse_tool_args async def do_edit_image(content: str, owner: Optional[str] = None) -> Dict: """Edit a gallery image (upscale, rembg, inpaint, harmonize).""" import httpx from src.tool_implementations import _INTERNAL_BASE # shared constant, still lives in the facade try: args = _parse_tool_args(content) except ValueError: return {"error": "Invalid JSON arguments", "exit_code": 1} image_id = args.get("image_id", "") action = args.get("action", "") if not image_id or not action: return {"error": "image_id and action are required", "exit_code": 1} payload = {"image_id": image_id} if args.get("prompt"): payload["prompt"] = args["prompt"] if args.get("scale"): payload["scale"] = args["scale"] try: async with httpx.AsyncClient(timeout=120) as client: resp = await client.post(f"{_INTERNAL_BASE}/api/gallery/{action}", json=payload) data = resp.json() if data.get("success") or data.get("id"): return {"output": f"Image edited ({action}). New image ID: {data.get('id', '?')}", "exit_code": 0} return {"error": data.get("error", f"{action} failed"), "exit_code": 1} except Exception as e: return {"error": str(e), "exit_code": 1}