"""Dashboards Handler - OpenPanel dashboard management (10 tools)""" import json from typing import Any from plugins.openpanel.client import OpenPanelClient def get_tool_specifications() -> list[dict[str, Any]]: """Return tool specifications for ToolGenerator (10 tools)""" return [ { "name": "list_dashboards", "method_name": "list_dashboards", "description": "List all dashboards for a project.", "schema": { "type": "object", "properties": {"project_id": {"type": "string", "description": "Project ID"}}, "required": ["project_id"], }, "scope": "read", }, { "name": "get_dashboard", "method_name": "get_dashboard", "description": "Get dashboard details including all charts.", "schema": { "type": "object", "properties": { "project_id": {"type": "string", "description": "Project ID"}, "dashboard_id": {"type": "string", "description": "Dashboard ID"}, }, "required": ["project_id", "dashboard_id"], }, "scope": "read", }, { "name": "create_dashboard", "method_name": "create_dashboard", "description": "Create a new custom dashboard.", "schema": { "type": "object", "properties": { "project_id": {"type": "string", "description": "Project ID"}, "name": {"type": "string", "description": "Dashboard name"}, "description": { "anyOf": [{"type": "string"}, {"type": "null"}], "description": "Dashboard description", }, }, "required": ["project_id", "name"], }, "scope": "write", }, { "name": "update_dashboard", "method_name": "update_dashboard", "description": "Update dashboard properties.", "schema": { "type": "object", "properties": { "project_id": {"type": "string", "description": "Project ID"}, "dashboard_id": {"type": "string", "description": "Dashboard ID"}, "name": { "anyOf": [{"type": "string"}, {"type": "null"}], "description": "New name", }, "description": { "anyOf": [{"type": "string"}, {"type": "null"}], "description": "New description", }, }, "required": ["project_id", "dashboard_id"], }, "scope": "write", }, { "name": "delete_dashboard", "method_name": "delete_dashboard", "description": "Delete a dashboard.", "schema": { "type": "object", "properties": { "project_id": {"type": "string", "description": "Project ID"}, "dashboard_id": {"type": "string", "description": "Dashboard ID to delete"}, }, "required": ["project_id", "dashboard_id"], }, "scope": "write", }, { "name": "add_chart", "method_name": "add_chart", "description": "Add a new chart to a dashboard.", "schema": { "type": "object", "properties": { "project_id": {"type": "string", "description": "Project ID"}, "dashboard_id": {"type": "string", "description": "Dashboard ID"}, "chart_type": { "type": "string", "enum": [ "line", "bar", "area", "pie", "map", "histogram", "funnel", "retention", "metric", ], "description": "Type of chart", }, "title": {"type": "string", "description": "Chart title"}, "events": { "type": "array", "items": { "type": "object", "properties": { "name": {"type": "string"}, "segment": {"type": "string"}, }, "required": ["name"], }, "description": "Events to include in chart", }, "breakdowns": { "anyOf": [{"type": "array", "items": {"type": "string"}}, {"type": "null"}], "description": "Breakdown dimensions", }, }, "required": ["project_id", "dashboard_id", "chart_type", "title", "events"], }, "scope": "write", }, { "name": "update_chart", "method_name": "update_chart", "description": "Update an existing chart configuration.", "schema": { "type": "object", "properties": { "project_id": {"type": "string", "description": "Project ID"}, "dashboard_id": {"type": "string", "description": "Dashboard ID"}, "chart_id": {"type": "string", "description": "Chart ID to update"}, "title": { "anyOf": [{"type": "string"}, {"type": "null"}], "description": "New title", }, "chart_type": { "anyOf": [{"type": "string"}, {"type": "null"}], "description": "New chart type", }, "events": { "anyOf": [{"type": "array"}, {"type": "null"}], "description": "New events configuration", }, }, "required": ["project_id", "dashboard_id", "chart_id"], }, "scope": "write", }, { "name": "delete_chart", "method_name": "delete_chart", "description": "Remove a chart from a dashboard.", "schema": { "type": "object", "properties": { "project_id": {"type": "string", "description": "Project ID"}, "dashboard_id": {"type": "string", "description": "Dashboard ID"}, "chart_id": {"type": "string", "description": "Chart ID to delete"}, }, "required": ["project_id", "dashboard_id", "chart_id"], }, "scope": "write", }, { "name": "duplicate_dashboard", "method_name": "duplicate_dashboard", "description": "Create a copy of an existing dashboard.", "schema": { "type": "object", "properties": { "project_id": {"type": "string", "description": "Project ID"}, "dashboard_id": {"type": "string", "description": "Dashboard ID to duplicate"}, "new_name": {"type": "string", "description": "Name for the new dashboard"}, }, "required": ["project_id", "dashboard_id", "new_name"], }, "scope": "write", }, { "name": "share_dashboard", "method_name": "share_dashboard", "description": "Generate a shareable link for a dashboard.", "schema": { "type": "object", "properties": { "project_id": {"type": "string", "description": "Project ID"}, "dashboard_id": {"type": "string", "description": "Dashboard ID"}, "public": { "type": "boolean", "description": "Make dashboard publicly accessible", "default": False, }, "expires_in_days": { "anyOf": [{"type": "integer"}, {"type": "null"}], "description": "Link expiration in days (null for no expiration)", }, }, "required": ["project_id", "dashboard_id"], }, "scope": "write", }, ] # ===================== # Dashboard Functions (10) # ===================== async def list_dashboards(client: OpenPanelClient, project_id: str) -> str: """List all dashboards""" try: return json.dumps( { "success": True, "project_id": project_id, "note": "Dashboard listing requires dashboard tRPC API. Use OpenPanel dashboard to view dashboards.", "message": "Dashboard list request processed", }, indent=2, ensure_ascii=False, ) except Exception as e: return json.dumps({"success": False, "error": str(e)}, indent=2, ensure_ascii=False) async def get_dashboard(client: OpenPanelClient, project_id: str, dashboard_id: str) -> str: """Get dashboard details""" try: return json.dumps( { "success": True, "project_id": project_id, "dashboard_id": dashboard_id, "note": "Dashboard details require dashboard tRPC API. Use OpenPanel dashboard for full view.", "message": "Dashboard request processed", }, indent=2, ensure_ascii=False, ) except Exception as e: return json.dumps({"success": False, "error": str(e)}, indent=2, ensure_ascii=False) async def create_dashboard( client: OpenPanelClient, project_id: str, name: str, description: str | None = None ) -> str: """Create a new dashboard""" try: dashboard_config = {"name": name, "description": description} return json.dumps( { "success": True, "project_id": project_id, "dashboard": dashboard_config, "note": "Dashboard creation requires dashboard tRPC API. Use OpenPanel dashboard to create.", "message": f"Dashboard '{name}' configuration created", }, indent=2, ensure_ascii=False, ) except Exception as e: return json.dumps({"success": False, "error": str(e)}, indent=2, ensure_ascii=False) async def update_dashboard( client: OpenPanelClient, project_id: str, dashboard_id: str, name: str | None = None, description: str | None = None, ) -> str: """Update dashboard properties""" try: updates = {} if name: updates["name"] = name if description: updates["description"] = description return json.dumps( { "success": True, "project_id": project_id, "dashboard_id": dashboard_id, "updates": updates, "note": "Dashboard updates require dashboard tRPC API. Use OpenPanel dashboard to modify.", "message": "Dashboard update configuration created", }, indent=2, ensure_ascii=False, ) except Exception as e: return json.dumps({"success": False, "error": str(e)}, indent=2, ensure_ascii=False) async def delete_dashboard(client: OpenPanelClient, project_id: str, dashboard_id: str) -> str: """Delete a dashboard""" try: return json.dumps( { "success": True, "project_id": project_id, "dashboard_id": dashboard_id, "note": "Dashboard deletion requires dashboard tRPC API. Use OpenPanel dashboard to delete.", "message": "Dashboard deletion request processed", }, indent=2, ensure_ascii=False, ) except Exception as e: return json.dumps({"success": False, "error": str(e)}, indent=2, ensure_ascii=False) async def add_chart( client: OpenPanelClient, project_id: str, dashboard_id: str, chart_type: str, title: str, events: list[dict[str, Any]], breakdowns: list[str] | None = None, ) -> str: """Add a chart to dashboard""" try: chart_config = { "chart_type": chart_type, "title": title, "events": events, "breakdowns": breakdowns, } return json.dumps( { "success": True, "project_id": project_id, "dashboard_id": dashboard_id, "chart": chart_config, "note": "Chart creation requires dashboard tRPC API. Use OpenPanel dashboard to add charts.", "message": f"Chart '{title}' configuration created", }, indent=2, ensure_ascii=False, ) except Exception as e: return json.dumps({"success": False, "error": str(e)}, indent=2, ensure_ascii=False) async def update_chart( client: OpenPanelClient, project_id: str, dashboard_id: str, chart_id: str, title: str | None = None, chart_type: str | None = None, events: list[dict[str, Any]] | None = None, ) -> str: """Update chart configuration""" try: updates = {} if title: updates["title"] = title if chart_type: updates["chart_type"] = chart_type if events: updates["events"] = events return json.dumps( { "success": True, "project_id": project_id, "dashboard_id": dashboard_id, "chart_id": chart_id, "updates": updates, "note": "Chart updates require dashboard tRPC API. Use OpenPanel dashboard to modify charts.", "message": "Chart update configuration created", }, indent=2, ensure_ascii=False, ) except Exception as e: return json.dumps({"success": False, "error": str(e)}, indent=2, ensure_ascii=False) async def delete_chart( client: OpenPanelClient, project_id: str, dashboard_id: str, chart_id: str ) -> str: """Remove chart from dashboard""" try: return json.dumps( { "success": True, "project_id": project_id, "dashboard_id": dashboard_id, "chart_id": chart_id, "note": "Chart deletion requires dashboard tRPC API. Use OpenPanel dashboard to remove charts.", "message": "Chart deletion request processed", }, indent=2, ensure_ascii=False, ) except Exception as e: return json.dumps({"success": False, "error": str(e)}, indent=2, ensure_ascii=False) async def duplicate_dashboard( client: OpenPanelClient, project_id: str, dashboard_id: str, new_name: str ) -> str: """Duplicate a dashboard""" try: return json.dumps( { "success": True, "project_id": project_id, "dashboard_id": dashboard_id, "new_name": new_name, "note": "Dashboard duplication requires dashboard tRPC API. Use OpenPanel dashboard to clone.", "message": f"Dashboard duplication request for '{new_name}'", }, indent=2, ensure_ascii=False, ) except Exception as e: return json.dumps({"success": False, "error": str(e)}, indent=2, ensure_ascii=False) async def share_dashboard( client: OpenPanelClient, project_id: str, dashboard_id: str, public: bool = False, expires_in_days: int | None = None, ) -> str: """Generate shareable link""" try: share_config = {"public": public, "expires_in_days": expires_in_days} return json.dumps( { "success": True, "project_id": project_id, "dashboard_id": dashboard_id, "share_config": share_config, "note": "Dashboard sharing requires dashboard tRPC API. Use OpenPanel dashboard to share.", "message": "Dashboard share configuration created", }, indent=2, ensure_ascii=False, ) except Exception as e: return json.dumps({"success": False, "error": str(e)}, indent=2, ensure_ascii=False)