#!/usr/bin/env python3 """Open a URL, dev server, or file in the Hermes desktop GUI's preview pane. Registration moved into the `desktop_preview` tool; this module keeps the normalizer + open action for ``tools.preview_tool``. Emits ``preview.open`` via ``desktop_ui``: the renderer opens the pane for the window that asked and never steals focus for a background session. The desktop_ui toolset reaches desktop clients on any backend. """ import re from tools import desktop_ui from tools.registry import tool_error def _normalize_target(raw: str) -> str: """Coax a bare host/domain into a fetchable URL; leave paths + schemes alone. ``www.cnn.com`` -> ``https://www.cnn.com``; ``localhost:3000`` -> ``http://localhost:3000``. File paths and explicit schemes pass through for the renderer's preview normalizer. """ v = raw.strip().strip("`").strip() if not v or "://" in v or v.startswith(("/", "./", "../", "~", "file:")): return v if re.match(r"^(localhost|127\.0\.0\.1|0\.0\.0\.0|\[::1\])(:\d+)?(/|$)", v, re.I): return "http://" + v if re.match(r"^[\w.-]+\.[a-z]{2,}(:\d+)?(/.*)?$", v, re.I): return "https://" + v return v def open_preview_tool(url: str, label: str = "") -> str: """Ask the desktop GUI to show ``url`` in the preview pane beside the chat.""" target = _normalize_target(url or "") if not target: return tool_error( "url is required — a web URL (https://…), a localhost dev server, or a " "file path to show in the preview pane." ) label = (label or "").strip() return desktop_ui.emit_or_error( "preview.open", {"url": target, "label": label}, "Failed to open the preview pane: ", "The preview pane is only available in the Hermes desktop app.", {"success": True, "url": target, "label": label}, )