{
  "generatedAt": "2026-09-11",
  "version": "e802d3c4d80cfdd5",
  "routes": [
    {
      "method": "POST",
      "path": "/api/agent/chats/<int:datachat_id>/read",
      "endpoint": "agent_runs.mark_chat_read",
      "group": "agent_runs",
      "title": "Mark chat read",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": [
        {
          "name": "datachat_id",
          "type": "integer"
        }
      ]
    },
    {
      "method": "POST",
      "path": "/api/agent/client-timing",
      "endpoint": "agent_runs.record_client_timing",
      "group": "agent_runs",
      "title": "Record client timing",
      "description": "Bounded, explicitly client-reported timings; no database work on delivery.",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/agent/documentation",
      "endpoint": "agent_runs.read_documentation",
      "group": "agent_runs",
      "title": "Read documentation",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/agent/messages/<message_id>/run",
      "endpoint": "agent_runs.get_run_for_message",
      "group": "agent_runs",
      "title": "Get run for message",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": [
        {
          "name": "message_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "POST",
      "path": "/api/agent/runs",
      "endpoint": "agent_runs.create_background_run",
      "group": "agent_runs",
      "title": "Create background run",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/agent/runs/<run_id>",
      "endpoint": "agent_runs.get_run_status",
      "group": "agent_runs",
      "title": "Get run status",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": [
        {
          "name": "run_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "GET",
      "path": "/api/agent/runs/<run_id>/events",
      "endpoint": "agent_runs.get_run_events",
      "group": "agent_runs",
      "title": "Get run events",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": [
        {
          "name": "run_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "POST",
      "path": "/api/agent/runs/<run_id>/stop",
      "endpoint": "agent_runs.stop_run",
      "group": "agent_runs",
      "title": "Stop run",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": [
        {
          "name": "run_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "GET",
      "path": "/api/agent/runs/<run_id>/stream",
      "endpoint": "agent_runs.stream_conversation",
      "group": "agent_runs",
      "title": "Stream conversation",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": [
        {
          "name": "run_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "POST",
      "path": "/api/agent/transcribe",
      "endpoint": "agent_runs.transcribe_voice",
      "group": "agent_runs",
      "title": "Transcribe voice",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/agent/workspace",
      "endpoint": "agent_runs.get_workspace_state",
      "group": "agent_runs",
      "title": "Get workspace state",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/auth/email-login",
      "endpoint": "auth.email_login",
      "group": "auth",
      "title": "Email login",
      "description": "Send a magic login link to the user's email.",
      "auth": "public",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/auth/email-login/verify",
      "endpoint": "auth.verify_email_login",
      "group": "auth",
      "title": "Verify email login",
      "description": "Verify a magic login token and return user data.",
      "auth": "public",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/auth/google",
      "endpoint": "auth.google_login",
      "group": "auth",
      "title": "Google login",
      "description": "Verify Google ID token and create/login user.",
      "auth": "public",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/auth/logout",
      "endpoint": "auth.logout",
      "group": "auth",
      "title": "Logout",
      "description": "",
      "auth": "browser",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/auth/logout-all",
      "endpoint": "auth.logout_all",
      "group": "auth",
      "title": "Logout all",
      "description": "",
      "auth": "browser",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/auth/register-and-checkout",
      "endpoint": "auth.register_and_checkout",
      "group": "auth",
      "title": "Register and checkout",
      "description": "Keep the existing endpoint while sharing registration and session issuance.",
      "auth": "public",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/auth/registration/start",
      "endpoint": "auth.start_registration",
      "group": "auth",
      "title": "Start registration",
      "description": "Send a registration confirmation link to the user's email.",
      "auth": "public",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/auth/registration/verify",
      "endpoint": "auth.verify_registration",
      "group": "auth",
      "title": "Verify registration",
      "description": "Verify a registration token and return the verified email.",
      "auth": "public",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/auth/request-password-reset",
      "endpoint": "auth.request_password_reset",
      "group": "auth",
      "title": "Request password reset",
      "description": "",
      "auth": "public",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/auth/reset-password",
      "endpoint": "auth.reset_password",
      "group": "auth",
      "title": "Reset password",
      "description": "",
      "auth": "public",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/auth/session",
      "endpoint": "auth.session_details",
      "group": "auth",
      "title": "Session details",
      "description": "",
      "auth": "browser",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/auth/tokens",
      "endpoint": "auth.api_tokens",
      "group": "auth",
      "title": "Api tokens",
      "description": "",
      "auth": "browser",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/auth/tokens",
      "endpoint": "auth.api_tokens",
      "group": "auth",
      "title": "Api tokens",
      "description": "",
      "auth": "browser",
      "pathParameters": []
    },
    {
      "method": "DELETE",
      "path": "/api/auth/tokens/<credential_id>",
      "endpoint": "auth.revoke_token",
      "group": "auth",
      "title": "Revoke token",
      "description": "",
      "auth": "browser",
      "pathParameters": [
        {
          "name": "credential_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "GET",
      "path": "/api/auth/validate",
      "endpoint": "auth.validate_session",
      "group": "auth",
      "title": "Validate session",
      "description": "",
      "auth": "browser",
      "pathParameters": []
    },
    {
      "method": "PUT",
      "path": "/api/barGraphs/update",
      "endpoint": "visuals.update_bargraph",
      "group": "visuals",
      "title": "Update bargraph",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/bargraphs",
      "endpoint": "bar_graph_e2e.get_bar_graphs",
      "group": "bar_graph_e2e",
      "title": "Get bar graphs",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/bargraphs/data",
      "endpoint": "bar_graph_e2e.get_bargraph_data",
      "group": "bar_graph_e2e",
      "title": "Get bargraph data",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "DELETE",
      "path": "/api/bargraphs/delete",
      "endpoint": "bar_graph_e2e.delete_bargraph",
      "group": "bar_graph_e2e",
      "title": "Delete bargraph",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/bargraphs/metadata",
      "endpoint": "bar_graph_e2e.get_bargraph_metadata",
      "group": "bar_graph_e2e",
      "title": "Get bargraph metadata",
      "description": "Returns minimal info (id, title, x_label, y_label, position, etc.)  WITHOUT executing SQL.",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/collaboration",
      "endpoint": "collaboration.overview",
      "group": "collaboration",
      "title": "Overview",
      "description": "",
      "auth": "browser",
      "pathParameters": []
    },
    {
      "method": "DELETE",
      "path": "/api/collaboration/invitations/<invitation_id>",
      "endpoint": "collaboration.revoke_invitation",
      "group": "collaboration",
      "title": "Revoke invitation",
      "description": "",
      "auth": "browser",
      "pathParameters": [
        {
          "name": "invitation_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "POST",
      "path": "/api/collaboration/invitations/accept",
      "endpoint": "collaboration.accept_invitation",
      "group": "collaboration",
      "title": "Accept invitation",
      "description": "",
      "auth": "browser",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/collaboration/organizations",
      "endpoint": "collaboration.create_organization",
      "group": "collaboration",
      "title": "Create organization",
      "description": "",
      "auth": "browser",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/collaboration/organizations/<org_id>",
      "endpoint": "collaboration.organization_details",
      "group": "collaboration",
      "title": "Organization details",
      "description": "",
      "auth": "browser",
      "pathParameters": [
        {
          "name": "org_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "PATCH",
      "path": "/api/collaboration/organizations/<org_id>",
      "endpoint": "collaboration.update_organization",
      "group": "collaboration",
      "title": "Update organization",
      "description": "",
      "auth": "browser",
      "pathParameters": [
        {
          "name": "org_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "GET",
      "path": "/api/collaboration/organizations/<org_id>/audit",
      "endpoint": "collaboration.audit_events",
      "group": "collaboration",
      "title": "Audit events",
      "description": "",
      "auth": "browser",
      "pathParameters": [
        {
          "name": "org_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "POST",
      "path": "/api/collaboration/organizations/<org_id>/invitations",
      "endpoint": "collaboration.invite_org",
      "group": "collaboration",
      "title": "Invite org",
      "description": "",
      "auth": "browser",
      "pathParameters": [
        {
          "name": "org_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "PUT",
      "path": "/api/collaboration/organizations/<org_id>/members/<member_id>",
      "endpoint": "collaboration.update_org_member",
      "group": "collaboration",
      "title": "Update org member",
      "description": "",
      "auth": "browser",
      "pathParameters": [
        {
          "name": "org_id",
          "type": "unicode"
        },
        {
          "name": "member_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "POST",
      "path": "/api/collaboration/organizations/<org_id>/recover-report",
      "endpoint": "collaboration.recover_report",
      "group": "collaboration",
      "title": "Recover report",
      "description": "",
      "auth": "browser",
      "pathParameters": [
        {
          "name": "org_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "POST",
      "path": "/api/collaboration/organizations/<org_id>/teams",
      "endpoint": "collaboration.create_team",
      "group": "collaboration",
      "title": "Create team",
      "description": "",
      "auth": "browser",
      "pathParameters": [
        {
          "name": "org_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "POST",
      "path": "/api/collaboration/organizations/<org_id>/teams/<team_id>/invitations",
      "endpoint": "collaboration.invite_team",
      "group": "collaboration",
      "title": "Invite team",
      "description": "",
      "auth": "browser",
      "pathParameters": [
        {
          "name": "org_id",
          "type": "unicode"
        },
        {
          "name": "team_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "POST",
      "path": "/api/collaboration/reports/<report_id>/owner",
      "endpoint": "collaboration.transfer_owner",
      "group": "collaboration",
      "title": "Transfer owner",
      "description": "",
      "auth": "browser",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "PATCH",
      "path": "/api/collaboration/reports/<report_id>/pages/<page_id>/visibility",
      "endpoint": "collaboration.set_page_visibility",
      "group": "collaboration",
      "title": "Set page visibility",
      "description": "",
      "auth": "browser",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "unicode"
        },
        {
          "name": "page_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "GET",
      "path": "/api/collaboration/reports/<report_id>/sharing",
      "endpoint": "collaboration.report_sharing",
      "group": "collaboration",
      "title": "Report sharing",
      "description": "",
      "auth": "browser",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "DELETE",
      "path": "/api/collaboration/reports/<report_id>/teams/<team_id>",
      "endpoint": "collaboration.share_team",
      "group": "collaboration",
      "title": "Share team",
      "description": "",
      "auth": "browser",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "unicode"
        },
        {
          "name": "team_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "PUT",
      "path": "/api/collaboration/reports/<report_id>/teams/<team_id>",
      "endpoint": "collaboration.share_team",
      "group": "collaboration",
      "title": "Share team",
      "description": "",
      "auth": "browser",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "unicode"
        },
        {
          "name": "team_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "GET",
      "path": "/api/collaboration/teams/<team_id>",
      "endpoint": "collaboration.team_details",
      "group": "collaboration",
      "title": "Team details",
      "description": "",
      "auth": "browser",
      "pathParameters": [
        {
          "name": "team_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "PATCH",
      "path": "/api/collaboration/teams/<team_id>",
      "endpoint": "collaboration.update_team",
      "group": "collaboration",
      "title": "Update team",
      "description": "",
      "auth": "browser",
      "pathParameters": [
        {
          "name": "team_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "PUT",
      "path": "/api/collaboration/teams/<team_id>/members/<member_id>",
      "endpoint": "collaboration.update_team_member",
      "group": "collaboration",
      "title": "Update team member",
      "description": "",
      "auth": "browser",
      "pathParameters": [
        {
          "name": "team_id",
          "type": "unicode"
        },
        {
          "name": "member_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "GET",
      "path": "/api/connection-models/<int:connection_id>",
      "endpoint": "connection_model_bp.get_connection_model",
      "group": "connection_model_bp",
      "title": "Get connection model",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": [
        {
          "name": "connection_id",
          "type": "integer"
        }
      ]
    },
    {
      "method": "DELETE",
      "path": "/api/connection-models/<int:connection_id>",
      "endpoint": "connection_model_bp.remove_connection_model",
      "group": "connection_model_bp",
      "title": "Remove connection model",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": [
        {
          "name": "connection_id",
          "type": "integer"
        }
      ]
    },
    {
      "method": "PUT",
      "path": "/api/connection-models/<int:connection_id>",
      "endpoint": "connection_model_bp.upsert_connection_model",
      "group": "connection_model_bp",
      "title": "Upsert connection model",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": [
        {
          "name": "connection_id",
          "type": "integer"
        }
      ]
    },
    {
      "method": "POST",
      "path": "/api/connection-models/<int:connection_id>/assist",
      "endpoint": "connection_model_bp.assist_connection_model",
      "group": "connection_model_bp",
      "title": "Assist connection model",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": [
        {
          "name": "connection_id",
          "type": "integer"
        }
      ]
    },
    {
      "method": "POST",
      "path": "/api/connection-models/<int:connection_id>/assist-entity",
      "endpoint": "connection_model_bp.assist_connection_model_entity",
      "group": "connection_model_bp",
      "title": "Assist connection model entity",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": [
        {
          "name": "connection_id",
          "type": "integer"
        }
      ]
    },
    {
      "method": "POST",
      "path": "/api/connection-models/<int:connection_id>/assist-relationships",
      "endpoint": "connection_model_bp.assist_connection_model_relationships",
      "group": "connection_model_bp",
      "title": "Assist connection model relationships",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": [
        {
          "name": "connection_id",
          "type": "integer"
        }
      ]
    },
    {
      "method": "GET",
      "path": "/api/connection-models/<int:connection_id>/catalog",
      "endpoint": "connection_model_bp.get_model_catalog",
      "group": "connection_model_bp",
      "title": "Get model catalog",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": [
        {
          "name": "connection_id",
          "type": "integer"
        }
      ]
    },
    {
      "method": "DELETE",
      "path": "/api/connection-models/<int:connection_id>/definitions",
      "endpoint": "connection_model_bp.clear_connection_model_definitions",
      "group": "connection_model_bp",
      "title": "Clear connection model definitions",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": [
        {
          "name": "connection_id",
          "type": "integer"
        }
      ]
    },
    {
      "method": "GET",
      "path": "/api/connection-models/<int:connection_id>/definitions",
      "endpoint": "connection_model_bp.get_connection_model_definitions",
      "group": "connection_model_bp",
      "title": "Get connection model definitions",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": [
        {
          "name": "connection_id",
          "type": "integer"
        }
      ]
    },
    {
      "method": "PUT",
      "path": "/api/connection-models/<int:connection_id>/definitions",
      "endpoint": "connection_model_bp.replace_connection_model_definitions",
      "group": "connection_model_bp",
      "title": "Replace connection model definitions",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": [
        {
          "name": "connection_id",
          "type": "integer"
        }
      ]
    },
    {
      "method": "PATCH",
      "path": "/api/connection-models/<int:connection_id>/definitions/<int:definition_id>",
      "endpoint": "connection_model_bp.patch_model_definition",
      "group": "connection_model_bp",
      "title": "Patch model definition",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": [
        {
          "name": "connection_id",
          "type": "integer"
        },
        {
          "name": "definition_id",
          "type": "integer"
        }
      ]
    },
    {
      "method": "POST",
      "path": "/api/connection-models/<int:connection_id>/definitions/validate",
      "endpoint": "connection_model_bp.validate_connection_model_definitions",
      "group": "connection_model_bp",
      "title": "Validate connection model definitions",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": [
        {
          "name": "connection_id",
          "type": "integer"
        }
      ]
    },
    {
      "method": "GET",
      "path": "/api/connection-models/<int:connection_id>/editor-context",
      "endpoint": "connection_model_bp.get_connection_model_editor_context",
      "group": "connection_model_bp",
      "title": "Get connection model editor context",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": [
        {
          "name": "connection_id",
          "type": "integer"
        }
      ]
    },
    {
      "method": "GET",
      "path": "/api/connection-models/<int:connection_id>/entities",
      "endpoint": "connection_model_bp.list_connection_model_entities_route",
      "group": "connection_model_bp",
      "title": "List connection model entities",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": [
        {
          "name": "connection_id",
          "type": "integer"
        }
      ]
    },
    {
      "method": "PUT",
      "path": "/api/connection-models/<int:connection_id>/entities",
      "endpoint": "connection_model_bp.replace_connection_model_entities_route",
      "group": "connection_model_bp",
      "title": "Replace connection model entities",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": [
        {
          "name": "connection_id",
          "type": "integer"
        }
      ]
    },
    {
      "method": "POST",
      "path": "/api/connection-models/<int:connection_id>/entities/preview",
      "endpoint": "connection_model_bp.preview_connection_model_entity",
      "group": "connection_model_bp",
      "title": "Preview connection model entity",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": [
        {
          "name": "connection_id",
          "type": "integer"
        }
      ]
    },
    {
      "method": "POST",
      "path": "/api/connection-models/<int:connection_id>/preview",
      "endpoint": "connection_model_bp.preview_connection_model",
      "group": "connection_model_bp",
      "title": "Preview connection model",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": [
        {
          "name": "connection_id",
          "type": "integer"
        }
      ]
    },
    {
      "method": "GET",
      "path": "/api/connection-models/<int:connection_id>/relationships",
      "endpoint": "connection_model_bp.list_connection_model_relationships_route",
      "group": "connection_model_bp",
      "title": "List connection model relationships",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": [
        {
          "name": "connection_id",
          "type": "integer"
        }
      ]
    },
    {
      "method": "PUT",
      "path": "/api/connection-models/<int:connection_id>/relationships",
      "endpoint": "connection_model_bp.replace_connection_model_relationships_route",
      "group": "connection_model_bp",
      "title": "Replace connection model relationships",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": [
        {
          "name": "connection_id",
          "type": "integer"
        }
      ]
    },
    {
      "method": "GET",
      "path": "/api/connections/active",
      "endpoint": "connections_bp.get_active_connection",
      "group": "connections_bp",
      "title": "Get active connection",
      "description": "Get active connection for a report",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/connections/active",
      "endpoint": "connections_bp.set_active_connection",
      "group": "connections_bp",
      "title": "Set active connection",
      "description": "Set active connection for a report",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/connections/add",
      "endpoint": "connections_bp.add_connection",
      "group": "connections_bp",
      "title": "Add connection",
      "description": "Add a new connection for a user, with backward compatibility",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/connections/check-report-usage/<connection_id>",
      "endpoint": "connections_bp.check_connection_report_usage",
      "group": "connections_bp",
      "title": "Check connection report usage",
      "description": "Check which reports are using a connection before deletion",
      "auth": "workspace:read",
      "pathParameters": [
        {
          "name": "connection_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "DELETE",
      "path": "/api/connections/delete/<connection_id>",
      "endpoint": "connections_bp.delete_connection",
      "group": "connections_bp",
      "title": "Delete connection",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": [
        {
          "name": "connection_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "PUT",
      "path": "/api/connections/rename/<connection_id>",
      "endpoint": "connections_bp.rename_connection",
      "group": "connections_bp",
      "title": "Rename connection",
      "description": "Rename a connection",
      "auth": "workspace:write",
      "pathParameters": [
        {
          "name": "connection_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "GET",
      "path": "/api/connections/report/<report_id>",
      "endpoint": "connections_bp.get_report_connections",
      "group": "connections_bp",
      "title": "Get report connections",
      "description": "Get connections for a report",
      "auth": "workspace:read",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "POST",
      "path": "/api/connections/report/add",
      "endpoint": "connections_bp.add_connection_to_report",
      "group": "connections_bp",
      "title": "Add connection to report",
      "description": "Add a connection to a report",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "DELETE",
      "path": "/api/connections/report/remove",
      "endpoint": "connections_bp.remove_connection_from_report",
      "group": "connections_bp",
      "title": "Remove connection from report",
      "description": "Remove a connection from a report",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "PUT",
      "path": "/api/connections/update/<connection_id>",
      "endpoint": "connections_bp.update_connection",
      "group": "connections_bp",
      "title": "Update connection",
      "description": "Update an existing connection",
      "auth": "workspace:write",
      "pathParameters": [
        {
          "name": "connection_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "GET",
      "path": "/api/connections/user/<user_id>",
      "endpoint": "connections_bp.get_user_connections",
      "group": "connections_bp",
      "title": "Get user connections",
      "description": "Get all connections for a user",
      "auth": "workspace:read",
      "pathParameters": [
        {
          "name": "user_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "POST",
      "path": "/api/contact",
      "endpoint": "email.contact_form",
      "group": "email",
      "title": "Contact form",
      "description": "Receive contact form submissions and email admins.",
      "auth": "public",
      "pathParameters": []
    },
    {
      "method": "PUT",
      "path": "/api/dataCards/update",
      "endpoint": "visuals.update_data_card",
      "group": "visuals",
      "title": "Update data card",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "PUT",
      "path": "/api/dataTables/schema",
      "endpoint": "data_table_e2e.update_datatable_schema",
      "group": "data_table_e2e",
      "title": "Update datatable schema",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "PUT",
      "path": "/api/dataTables/update",
      "endpoint": "visuals.update_datatable",
      "group": "visuals",
      "title": "Update datatable",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/datacards/data",
      "endpoint": "data_card_e2e.get_data_card_data",
      "group": "data_card_e2e",
      "title": "Get data card data",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "DELETE",
      "path": "/api/datacards/delete",
      "endpoint": "data_card_e2e.delete_data_card",
      "group": "data_card_e2e",
      "title": "Delete data card",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/datacards/metadata",
      "endpoint": "data_card_e2e.get_data_card_metadata",
      "group": "data_card_e2e",
      "title": "Get data card metadata",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "DELETE",
      "path": "/api/datachat/delete",
      "endpoint": "e2e_datachat.delete_datachat",
      "group": "e2e_datachat",
      "title": "Delete datachat",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/datachat/e2e",
      "endpoint": "e2e_datachat.datachat_e2e",
      "group": "e2e_datachat",
      "title": "Datachat e2e",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/datachat/e2e/stream",
      "endpoint": "e2e_datachat.datachat_e2e_stream",
      "group": "e2e_datachat",
      "title": "Datachat e2e stream",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/datachat/message",
      "endpoint": "datachats.store_message",
      "group": "datachats",
      "title": "Store message",
      "description": "Stores a single message in dbo.Messages. Expects:   dataChatId, userId, reportId, sender, messageText, sql_query (optional)",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "PUT",
      "path": "/api/datachat/message",
      "endpoint": "datachats.update_message",
      "group": "datachats",
      "title": "Update message",
      "description": "Update SQL and visual data for a single message.",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/datachat/messages",
      "endpoint": "datachats.get_messages",
      "group": "datachats",
      "title": "Get messages",
      "description": "Returns all messages for the given dataChatId, userId, and reportId in ascending time order.",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/datachat/pull_visual",
      "endpoint": "e2e_datachat.pull_visual",
      "group": "e2e_datachat",
      "title": "Pull visual",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/datachat/refresh",
      "endpoint": "datachats.refresh_datachat_visual",
      "group": "datachats",
      "title": "Refresh datachat visual",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/datachat/refresh_visual",
      "endpoint": "e2e_datachat.refresh_visual",
      "group": "e2e_datachat",
      "title": "Refresh visual",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/datachat/sqlassistant",
      "endpoint": "visuals.sql_assistant",
      "group": "visuals",
      "title": "Sql assistant",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/datachat/transcript",
      "endpoint": "datachats.get_transcript",
      "group": "datachats",
      "title": "Get transcript",
      "description": "Load messages and their ordered action receipts in one request.",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/datachats",
      "endpoint": "visuals.get_data_chats",
      "group": "visuals",
      "title": "Get data chats",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/datachats/add",
      "endpoint": "visuals.add_data_chat",
      "group": "visuals",
      "title": "Add data chat",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/datachats/data",
      "endpoint": "datachats.get_datachat_data",
      "group": "datachats",
      "title": "Get datachat data",
      "description": "Returns all chat messages for the given dataChatId, userId, reportId. This is basically the same logic as get_messages(), but named for \"data\" consistency.",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/datachats/metadata",
      "endpoint": "datachats.get_datachats_metadata",
      "group": "datachats",
      "title": "Get datachats metadata",
      "description": "Returns minimal info about each DataChat on a given page: - DataChatID - PageID - Optional: PositionX, PositionY, Width, Height, ZIndex, etc. if your DataChat table has them",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "PUT",
      "path": "/api/datachats/update",
      "endpoint": "datachats.update_datachat_name",
      "group": "datachats",
      "title": "Update datachat name",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/datatables/create-from-entity",
      "endpoint": "data_table_e2e.create_datatable_from_entity",
      "group": "data_table_e2e",
      "title": "Create datatable from entity",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/datatables/data",
      "endpoint": "data_table_e2e.get_datatable_data",
      "group": "data_table_e2e",
      "title": "Get datatable data",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "DELETE",
      "path": "/api/datatables/delete",
      "endpoint": "data_table_e2e.delete_datatable",
      "group": "data_table_e2e",
      "title": "Delete datatable",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/datatables/export",
      "endpoint": "data_table_e2e.export_datatable_data",
      "group": "data_table_e2e",
      "title": "Export datatable data",
      "description": "Given a dataTableId, execute the full query (with filters/sorting) for export.",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/datatables/metadata",
      "endpoint": "data_table_e2e.get_datatable_metadata",
      "group": "data_table_e2e",
      "title": "Get datatable metadata",
      "description": "Returns minimal info (id, title, sql_query, position, etc.) Does NOT return sql_data.",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/debug/check-tables",
      "endpoint": "file_bp.check_tables",
      "group": "file_bp",
      "title": "Check tables",
      "description": "Debug endpoint to verify table existence and performance",
      "auth": "browser",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/declarativeCharts/data",
      "endpoint": "visuals.get_declarative_chart_data",
      "group": "visuals",
      "title": "Get declarative chart data",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "PUT",
      "path": "/api/declarativeCharts/update",
      "endpoint": "visuals.update_declarative_chart",
      "group": "visuals",
      "title": "Update declarative chart",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "DELETE",
      "path": "/api/declarativecharts/delete",
      "endpoint": "visuals.delete_declarative_chart",
      "group": "visuals",
      "title": "Delete declarative chart",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/demo-info-nuke",
      "endpoint": "user_management.demo_info_nuke",
      "group": "user_management",
      "title": "Demo info nuke",
      "description": "Purge all demo users and their data.",
      "auth": "browser",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/file/data",
      "endpoint": "file_bp.get_file_data",
      "group": "file_bp",
      "title": "Get file data",
      "description": "Get file data for a specific report",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/file/datasets",
      "endpoint": "dataset_files.create_upload",
      "group": "dataset_files",
      "title": "Create upload",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "DELETE",
      "path": "/api/file/datasets/<dataset_id>",
      "endpoint": "dataset_files.cancel_upload",
      "group": "dataset_files",
      "title": "Cancel upload",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": [
        {
          "name": "dataset_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "GET",
      "path": "/api/file/datasets/<dataset_id>",
      "endpoint": "dataset_files.upload_status",
      "group": "dataset_files",
      "title": "Upload status",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": [
        {
          "name": "dataset_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "POST",
      "path": "/api/file/datasets/<dataset_id>/import",
      "endpoint": "dataset_files.import_dataset",
      "group": "dataset_files",
      "title": "Import dataset",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": [
        {
          "name": "dataset_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "POST",
      "path": "/api/file/datasets/<dataset_id>/uploaded",
      "endpoint": "dataset_files.uploaded",
      "group": "dataset_files",
      "title": "Uploaded",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": [
        {
          "name": "dataset_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "POST",
      "path": "/api/file/preview",
      "endpoint": "file_bp.preview_file",
      "group": "file_bp",
      "title": "Preview file",
      "description": "Preview CSV file with optimized reading",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/file/upload",
      "endpoint": "file_bp.upload_file",
      "group": "file_bp",
      "title": "Upload file",
      "description": "Optimized file upload with bulk insert",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/file/upload/progress/<upload_id>",
      "endpoint": "file_bp.upload_progress",
      "group": "file_bp",
      "title": "Upload progress",
      "description": "Stream progress updates with enhanced metrics",
      "auth": "workspace:read",
      "pathParameters": [
        {
          "name": "upload_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "GET",
      "path": "/api/file/upload/progress/db/<upload_id>",
      "endpoint": "file_bp.upload_progress_db",
      "group": "file_bp",
      "title": "Upload progress db",
      "description": "Return upload progress by checking the upload status - used for polling",
      "auth": "workspace:read",
      "pathParameters": [
        {
          "name": "upload_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "POST",
      "path": "/api/generate_bar_graph_e2e",
      "endpoint": "bar_graph_e2e.generate_bar_graph_e2e",
      "group": "bar_graph_e2e",
      "title": "Generate bar graph e2e",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/generate_data_card_e2e",
      "endpoint": "data_card_e2e.generate_data_card_e2e",
      "group": "data_card_e2e",
      "title": "Generate data card e2e",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/generate_data_table_e2e",
      "endpoint": "data_table_e2e.generate_data_table_e2e",
      "group": "data_table_e2e",
      "title": "Generate data table e2e",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/generate_line_graph_e2e",
      "endpoint": "line_graph_e2e.generate_line_graph_e2e",
      "group": "line_graph_e2e",
      "title": "Generate line graph e2e",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/generate_pie_chart_e2e",
      "endpoint": "pie_chart_e2e.generate_pie_chart_e2e",
      "group": "pie_chart_e2e",
      "title": "Generate pie chart e2e",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/generate_scatter_plot_e2e",
      "endpoint": "scatter_plot_e2e.generate_scatter_plot_e2e",
      "group": "scatter_plot_e2e",
      "title": "Generate scatter plot e2e",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/html/import/<uuid:report_id>",
      "endpoint": "html_reports.import_experiment",
      "group": "html_reports",
      "title": "Import experiment",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "uuid"
        }
      ]
    },
    {
      "method": "GET",
      "path": "/api/html/reports/<uuid:report_id>",
      "endpoint": "html_reports.read",
      "group": "html_reports",
      "title": "Read",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "uuid"
        }
      ]
    },
    {
      "method": "POST",
      "path": "/api/html/reports/<uuid:report_id>/feedback",
      "endpoint": "html_reports.feedback",
      "group": "html_reports",
      "title": "Feedback",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "uuid"
        }
      ]
    },
    {
      "method": "GET",
      "path": "/api/html/reports/<uuid:report_id>/history",
      "endpoint": "html_reports.history",
      "group": "html_reports",
      "title": "History",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "uuid"
        }
      ]
    },
    {
      "method": "GET",
      "path": "/api/html/reports/<uuid:report_id>/model",
      "endpoint": "html_reports.model",
      "group": "html_reports",
      "title": "Model",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "uuid"
        }
      ]
    },
    {
      "method": "POST",
      "path": "/api/html/reports/<uuid:report_id>/operations",
      "endpoint": "html_reports.change",
      "group": "html_reports",
      "title": "Change",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "uuid"
        }
      ]
    },
    {
      "method": "GET",
      "path": "/api/html/reports/<uuid:report_id>/pages/<uuid:page_id>/data",
      "endpoint": "html_reports.results",
      "group": "html_reports",
      "title": "Results",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "uuid"
        },
        {
          "name": "page_id",
          "type": "uuid"
        }
      ]
    },
    {
      "method": "POST",
      "path": "/api/html/reports/<uuid:report_id>/query",
      "endpoint": "html_reports.query",
      "group": "html_reports",
      "title": "Query",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "uuid"
        }
      ]
    },
    {
      "method": "POST",
      "path": "/api/html/reports/<uuid:report_id>/restore",
      "endpoint": "html_reports.restore",
      "group": "html_reports",
      "title": "Restore",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "uuid"
        }
      ]
    },
    {
      "method": "POST",
      "path": "/api/instagram/store",
      "endpoint": "instagram_bp.store_instagram_data",
      "group": "instagram_bp",
      "title": "Store instagram data",
      "description": "Store Instagram data endpoint with improved validation",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/instructions",
      "endpoint": "report.save_instructions",
      "group": "report",
      "title": "Save instructions",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/instructions/<report_id>",
      "endpoint": "report.get_instructions",
      "group": "report",
      "title": "Get instructions",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "PUT",
      "path": "/api/lineGraphs/update",
      "endpoint": "visuals.update_linegraph",
      "group": "visuals",
      "title": "Update linegraph",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/linegraphs/data",
      "endpoint": "line_graph_e2e.get_linegraph_data",
      "group": "line_graph_e2e",
      "title": "Get linegraph data",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "DELETE",
      "path": "/api/linegraphs/delete",
      "endpoint": "line_graph_e2e.delete_linegraph",
      "group": "line_graph_e2e",
      "title": "Delete linegraph",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/linegraphs/metadata",
      "endpoint": "line_graph_e2e.get_linegraph_metadata",
      "group": "line_graph_e2e",
      "title": "Get linegraph metadata",
      "description": "1) Returns minimal info (LineGraphID, title, x_label, y_label, sql_query, position, etc.) 2) We do NOT execute the SQL here. That happens in the /data route.",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/page-hit",
      "endpoint": "page_hit.record_page_hit",
      "group": "page_hit",
      "title": "Record page hit",
      "description": "",
      "auth": "public",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/pages",
      "endpoint": "page.get_pages",
      "group": "page",
      "title": "Get pages",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/pages/add",
      "endpoint": "page.add_page",
      "group": "page",
      "title": "Add page",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "DELETE",
      "path": "/api/pages/delete",
      "endpoint": "page.delete_page",
      "group": "page",
      "title": "Delete page",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/pages/duplicate",
      "endpoint": "page.duplicate_page",
      "group": "page",
      "title": "Duplicate page",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/pages/restore",
      "endpoint": "page.restore_page_route",
      "group": "page",
      "title": "Restore page",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "PUT",
      "path": "/api/pages/update",
      "endpoint": "page.update_page",
      "group": "page",
      "title": "Update page",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/pages/viewport-settings",
      "endpoint": "page.get_page_viewport_settings",
      "group": "page",
      "title": "Get page viewport settings",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "PUT",
      "path": "/api/pages/viewport-settings",
      "endpoint": "page.update_page_viewport_settings",
      "group": "page",
      "title": "Update page viewport settings",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/pages/visual-shell-manifest",
      "endpoint": "page.get_page_visual_shell_manifest",
      "group": "page",
      "title": "Get page visual shell manifest",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "PUT",
      "path": "/api/pieCharts/update",
      "endpoint": "visuals.update_piechart",
      "group": "visuals",
      "title": "Update piechart",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/piecharts/data",
      "endpoint": "pie_chart_e2e.get_piechart_data",
      "group": "pie_chart_e2e",
      "title": "Get piechart data",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "DELETE",
      "path": "/api/piecharts/delete",
      "endpoint": "pie_chart_e2e.delete_piechart",
      "group": "pie_chart_e2e",
      "title": "Delete piechart",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/piecharts/metadata",
      "endpoint": "pie_chart_e2e.get_piechart_metadata",
      "group": "pie_chart_e2e",
      "title": "Get piechart metadata",
      "description": "Returns minimal info (PieChartID, title, x_label, y_label, sql_query, position, etc.) We do NOT execute the SQL here. That happens in the /data route.",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/pull_out",
      "endpoint": "visuals.pull_out_visual",
      "group": "visuals",
      "title": "Pull out visual",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/reports",
      "endpoint": "report.get_reports",
      "group": "report",
      "title": "Get reports",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/reports/<report_id>/catalog",
      "endpoint": "report.get_report_catalog",
      "group": "report",
      "title": "Get report catalog",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "DELETE",
      "path": "/api/reports/<string:report_id>",
      "endpoint": "report.delete_report",
      "group": "report",
      "title": "Delete report",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "POST",
      "path": "/api/reports/<string:report_id>/access",
      "endpoint": "access.add_report_access",
      "group": "access",
      "title": "Add report access",
      "description": "",
      "auth": "browser",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "GET",
      "path": "/api/reports/<string:report_id>/access",
      "endpoint": "access.get_report_access",
      "group": "access",
      "title": "Get report access",
      "description": "",
      "auth": "browser",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "DELETE",
      "path": "/api/reports/<string:report_id>/access",
      "endpoint": "access.remove_report_access",
      "group": "access",
      "title": "Remove report access",
      "description": "",
      "auth": "browser",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "PUT",
      "path": "/api/reports/<string:report_id>/access",
      "endpoint": "access.update_report_access",
      "group": "access",
      "title": "Update report access",
      "description": "",
      "auth": "browser",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "GET",
      "path": "/api/reports/<string:report_id>/name",
      "endpoint": "report.get_report_name",
      "group": "report",
      "title": "Get report name",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "PUT",
      "path": "/api/reports/<string:report_id>/name",
      "endpoint": "report.update_report_name",
      "group": "report",
      "title": "Update report name",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "GET",
      "path": "/api/reports/<string:report_id>/permission",
      "endpoint": "access.check_report_permission",
      "group": "access",
      "title": "Check report permission",
      "description": "",
      "auth": "browser",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "GET",
      "path": "/api/reports/<string:report_id>/workspace",
      "endpoint": "report.get_report_workspace",
      "group": "report",
      "title": "Get report workspace",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "GET",
      "path": "/api/reports/<uuid:report_id>/assets",
      "endpoint": "report_files.report_assets",
      "group": "report_files",
      "title": "Report assets",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "uuid"
        }
      ]
    },
    {
      "method": "GET",
      "path": "/api/reports/<uuid:report_id>/assets/<asset_id>/content",
      "endpoint": "report_files.asset_image",
      "group": "report_files",
      "title": "Asset image",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "uuid"
        },
        {
          "name": "asset_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "GET",
      "path": "/api/reports/<uuid:report_id>/files",
      "endpoint": "report_files.report_files",
      "group": "report_files",
      "title": "Report files",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "uuid"
        }
      ]
    },
    {
      "method": "POST",
      "path": "/api/reports/<uuid:report_id>/files",
      "endpoint": "report_files.report_files",
      "group": "report_files",
      "title": "Report files",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "uuid"
        }
      ]
    },
    {
      "method": "DELETE",
      "path": "/api/reports/<uuid:report_id>/files/<uuid:file_id>",
      "endpoint": "report_files.report_file",
      "group": "report_files",
      "title": "Report file",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "uuid"
        },
        {
          "name": "file_id",
          "type": "uuid"
        }
      ]
    },
    {
      "method": "GET",
      "path": "/api/reports/<uuid:report_id>/files/<uuid:file_id>",
      "endpoint": "report_files.report_file",
      "group": "report_files",
      "title": "Report file",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "uuid"
        },
        {
          "name": "file_id",
          "type": "uuid"
        }
      ]
    },
    {
      "method": "GET",
      "path": "/api/reports/<uuid:report_id>/files/<uuid:file_id>/assets/<asset_id>/preview",
      "endpoint": "report_files.asset_preview_image",
      "group": "report_files",
      "title": "Asset preview image",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "uuid"
        },
        {
          "name": "file_id",
          "type": "uuid"
        },
        {
          "name": "asset_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "POST",
      "path": "/api/reports/<uuid:report_id>/files/<uuid:file_id>/assets/<asset_id>/reuse",
      "endpoint": "report_files.reuse_asset",
      "group": "report_files",
      "title": "Reuse asset",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "uuid"
        },
        {
          "name": "file_id",
          "type": "uuid"
        },
        {
          "name": "asset_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "GET",
      "path": "/api/reports/<uuid:report_id>/files/<uuid:file_id>/content",
      "endpoint": "report_files.file_content",
      "group": "report_files",
      "title": "File content",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "uuid"
        },
        {
          "name": "file_id",
          "type": "uuid"
        }
      ]
    },
    {
      "method": "GET",
      "path": "/api/reports/<uuid:report_id>/files/<uuid:file_id>/download",
      "endpoint": "report_files.download_file",
      "group": "report_files",
      "title": "Download file",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "uuid"
        },
        {
          "name": "file_id",
          "type": "uuid"
        }
      ]
    },
    {
      "method": "POST",
      "path": "/api/reports/<uuid:report_id>/files/<uuid:file_id>/preview",
      "endpoint": "report_files.file_preview",
      "group": "report_files",
      "title": "File preview",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "uuid"
        },
        {
          "name": "file_id",
          "type": "uuid"
        }
      ]
    },
    {
      "method": "GET",
      "path": "/api/reports/<uuid:report_id>/files/<uuid:file_id>/previews/<int:page>",
      "endpoint": "report_files.preview_image",
      "group": "report_files",
      "title": "Preview image",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "uuid"
        },
        {
          "name": "file_id",
          "type": "uuid"
        },
        {
          "name": "page",
          "type": "integer"
        }
      ]
    },
    {
      "method": "GET",
      "path": "/api/reports/<uuid:report_id>/files/<uuid:file_id>/search",
      "endpoint": "report_files.file_search",
      "group": "report_files",
      "title": "File search",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "uuid"
        },
        {
          "name": "file_id",
          "type": "uuid"
        }
      ]
    },
    {
      "method": "POST",
      "path": "/api/reports/create",
      "endpoint": "report.create_new_report",
      "group": "report",
      "title": "Create new report",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "PUT",
      "path": "/api/scatterPlots/update",
      "endpoint": "visuals.update_scatterplot",
      "group": "visuals",
      "title": "Update scatterplot",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/scatterplots/data",
      "endpoint": "scatter_plot_e2e.get_scatterplot_data",
      "group": "scatter_plot_e2e",
      "title": "Get scatterplot data",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "DELETE",
      "path": "/api/scatterplots/delete",
      "endpoint": "scatter_plot_e2e.delete_scatterplot",
      "group": "scatter_plot_e2e",
      "title": "Delete scatterplot",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/scatterplots/metadata",
      "endpoint": "scatter_plot_e2e.get_scatterplot_metadata",
      "group": "scatter_plot_e2e",
      "title": "Get scatterplot metadata",
      "description": "Returns minimal info (ScatterPlotID, title, x_label, y_label, sql_query, position, etc.) We do NOT execute the SQL here. That happens in the /data route.",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/shapes/add",
      "endpoint": "manual_visuals.add_shape",
      "group": "manual_visuals",
      "title": "Add shape",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "DELETE",
      "path": "/api/shapes/delete",
      "endpoint": "manual_visuals.delete_shape",
      "group": "manual_visuals",
      "title": "Delete shape",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/shapes/metadata",
      "endpoint": "manual_visuals.get_shape_metadata",
      "group": "manual_visuals",
      "title": "Get shape metadata",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "PUT",
      "path": "/api/shapes/update",
      "endpoint": "manual_visuals.update_shape",
      "group": "manual_visuals",
      "title": "Update shape",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "DELETE",
      "path": "/api/sql/delete-query/<int:query_id>",
      "endpoint": "sql_playground.delete_query",
      "group": "sql_playground",
      "title": "Delete query",
      "description": "Delete a saved query",
      "auth": "workspace:write",
      "pathParameters": [
        {
          "name": "query_id",
          "type": "integer"
        }
      ]
    },
    {
      "method": "POST",
      "path": "/api/sql/execute",
      "endpoint": "sql_playground.execute_sql",
      "group": "sql_playground",
      "title": "Execute sql",
      "description": "Execute a query against a specific connection with row limit",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/sql/save-query",
      "endpoint": "sql_playground.save_query",
      "group": "sql_playground",
      "title": "Save query",
      "description": "Save a query for future use",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/sql/saved-queries",
      "endpoint": "sql_playground.get_saved_queries",
      "group": "sql_playground",
      "title": "Get saved queries",
      "description": "Get all saved queries for a user",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/stripe/cancel-subscription",
      "endpoint": "stripe.cancel_subscription",
      "group": "stripe",
      "title": "Cancel subscription",
      "description": "Cancel subscription at period end.",
      "auth": "browser",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/stripe/create-checkout-session",
      "endpoint": "stripe.create_checkout_session",
      "group": "stripe",
      "title": "Create checkout session",
      "description": "Create a Stripe Checkout session based on the currently active plan. Requires 'user_id' in the POST request body.",
      "auth": "browser",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/stripe/create-portal-session",
      "endpoint": "stripe.create_portal_session",
      "group": "stripe",
      "title": "Create portal session",
      "description": "Create a Stripe customer portal session for managing subscriptions.",
      "auth": "browser",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/stripe/renew-subscription",
      "endpoint": "stripe.renew_subscription",
      "group": "stripe",
      "title": "Renew subscription",
      "description": "Remove cancellation schedule.",
      "auth": "browser",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/stripe/subscription-details",
      "endpoint": "stripe.get_subscription_details",
      "group": "stripe",
      "title": "Get subscription details",
      "description": "Retrieve subscription details (status, current period) for a user.",
      "auth": "browser",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/stripe/webhook",
      "endpoint": "stripe.stripe_webhook",
      "group": "stripe",
      "title": "Stripe webhook",
      "description": "Handle Stripe webhook events with detailed logging.",
      "auth": "public",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/subscription-plan",
      "endpoint": "user_management.get_active_plan",
      "group": "user_management",
      "title": "Get active plan",
      "description": "Return the currently active subscription plan.",
      "auth": "public",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/subscription-plan",
      "endpoint": "user_management.set_active_plan",
      "group": "user_management",
      "title": "Set active plan",
      "description": "Set which subscription plan is active.",
      "auth": "browser",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/textboxes/add",
      "endpoint": "manual_visuals.add_textbox",
      "group": "manual_visuals",
      "title": "Add textbox",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "DELETE",
      "path": "/api/textboxes/delete",
      "endpoint": "manual_visuals.delete_textbox",
      "group": "manual_visuals",
      "title": "Delete textbox",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/textboxes/metadata",
      "endpoint": "manual_visuals.get_textbox_metadata",
      "group": "manual_visuals",
      "title": "Get textbox metadata",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "PUT",
      "path": "/api/textboxes/update",
      "endpoint": "manual_visuals.update_textbox",
      "group": "manual_visuals",
      "title": "Update textbox",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/ui/preferences",
      "endpoint": "ui_preferences.get_ui_preferences",
      "group": "ui_preferences",
      "title": "Get ui preferences",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "PUT",
      "path": "/api/ui/preferences",
      "endpoint": "ui_preferences.put_ui_preferences",
      "group": "ui_preferences",
      "title": "Put ui preferences",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/update_column_config",
      "endpoint": "data_table_e2e.update_column_config",
      "group": "data_table_e2e",
      "title": "Update column config",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/users",
      "endpoint": "user_management.get_all_users",
      "group": "user_management",
      "title": "Get all users",
      "description": "",
      "auth": "browser",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/users/admin/promote",
      "endpoint": "user_management.promote_user_to_admin",
      "group": "user_management",
      "title": "Promote user to admin",
      "description": "Set dbo.[User].PlatformAdminTag for a user (default: 'God').",
      "auth": "browser",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/users/by-email",
      "endpoint": "access.get_user_by_email",
      "group": "access",
      "title": "Get user by email",
      "description": "",
      "auth": "browser",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/users/delete",
      "endpoint": "user_management.delete_user",
      "group": "user_management",
      "title": "Delete user",
      "description": "Delete a specific user and all associated data.",
      "auth": "browser",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/users/search",
      "endpoint": "access.search_users",
      "group": "access",
      "title": "Search users",
      "description": "",
      "auth": "browser",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/users/subscription/activate",
      "endpoint": "user_management.activate_subscription",
      "group": "user_management",
      "title": "Activate subscription",
      "description": "Apply a local-only active override for a tester; never call Stripe.",
      "auth": "browser",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/users/subscription/cancel",
      "endpoint": "user_management.cancel_subscription",
      "group": "user_management",
      "title": "Cancel subscription",
      "description": "Apply a local-only inactive override for a tester; never call Stripe.",
      "auth": "browser",
      "pathParameters": []
    },
    {
      "method": "DELETE",
      "path": "/api/visual-assistant-chats",
      "endpoint": "visual_assistant_chat.delete_visual_assistant_chat",
      "group": "visual_assistant_chat",
      "title": "Delete visual assistant chat",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/visual-assistant-chats",
      "endpoint": "visual_assistant_chat.get_visual_assistant_chats",
      "group": "visual_assistant_chat",
      "title": "Get visual assistant chats",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "PUT",
      "path": "/api/visual-assistant-chats",
      "endpoint": "visual_assistant_chat.put_visual_assistant_chat",
      "group": "visual_assistant_chat",
      "title": "Put visual assistant chat",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/visual-assistant-chats/ensure",
      "endpoint": "visual_assistant_chat.ensure_visual_assistant_chat",
      "group": "visual_assistant_chat",
      "title": "Ensure visual assistant chat",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/visual-assistant-chats/move",
      "endpoint": "visual_assistant_chat.move_visual_assistant_chat",
      "group": "visual_assistant_chat",
      "title": "Move visual assistant chat",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/visual-assistant-chats/snapshot",
      "endpoint": "visual_assistant_chat.get_visual_assistant_snapshot",
      "group": "visual_assistant_chat",
      "title": "Get visual assistant snapshot",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/visual-filters",
      "endpoint": "visual_filters.get_visual_filters_route",
      "group": "visual_filters",
      "title": "Get visual filters",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "PUT",
      "path": "/api/visual-filters",
      "endpoint": "visual_filters.replace_visual_filters_route",
      "group": "visual_filters",
      "title": "Replace visual filters",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "DELETE",
      "path": "/api/visual-filters/<filter_uid>",
      "endpoint": "visual_filters.delete_visual_filter_route",
      "group": "visual_filters",
      "title": "Delete visual filter",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": [
        {
          "name": "filter_uid",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "GET",
      "path": "/api/visual-filters/prefetch",
      "endpoint": "visual_filters.prefetch_visual_filters_route",
      "group": "visual_filters",
      "title": "Prefetch visual filters",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/visual-filters/values",
      "endpoint": "visual_filters.list_visual_filter_values_route",
      "group": "visual_filters",
      "title": "List visual filter values",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/visual/position",
      "endpoint": "visuals.handle_visual_position",
      "group": "visuals",
      "title": "Handle visual position",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/visual/position",
      "endpoint": "visuals.handle_visual_position",
      "group": "visuals",
      "title": "Handle visual position",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/visual/zindex",
      "endpoint": "visuals.update_zindex",
      "group": "visuals",
      "title": "Update zindex",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/visual/zindex/next/<int:page_id>",
      "endpoint": "visuals.get_next_zindex_route",
      "group": "visuals",
      "title": "Get next zindex",
      "description": "Route wrapper that returns the next available z-index for the given page.",
      "auth": "workspace:read",
      "pathParameters": [
        {
          "name": "page_id",
          "type": "integer"
        }
      ]
    },
    {
      "method": "GET",
      "path": "/api/visuals/capabilities",
      "endpoint": "visuals.get_visual_capabilities",
      "group": "visuals",
      "title": "Get visual capabilities",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/visuals/copy",
      "endpoint": "visuals.copy_visual_selection",
      "group": "visuals",
      "title": "Copy visual selection",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/visuals/create",
      "endpoint": "visuals.create_native_visual",
      "group": "visuals",
      "title": "Create native visual",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/visuals/delete",
      "endpoint": "visuals.delete_native_visual",
      "group": "visuals",
      "title": "Delete native visual",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/visuals/delete-batch",
      "endpoint": "visuals.delete_visual_selection",
      "group": "visuals",
      "title": "Delete visual selection",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/visuals/preview",
      "endpoint": "visuals.preview_native_visual",
      "group": "visuals",
      "title": "Preview native visual",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "PATCH",
      "path": "/api/visuals/properties",
      "endpoint": "visuals.update_properties",
      "group": "visuals",
      "title": "Update properties",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/visuals/restore",
      "endpoint": "visuals.restore_visuals",
      "group": "visuals",
      "title": "Restore visuals",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/visuals/state",
      "endpoint": "visuals.inspect_native_visual",
      "group": "visuals",
      "title": "Inspect native visual",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/api/visuals/update",
      "endpoint": "visuals.update_native_visual",
      "group": "visuals",
      "title": "Update native visual",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/api/workspaces",
      "endpoint": "workspace.get_workspaces",
      "group": "workspace",
      "title": "Get workspaces",
      "description": "",
      "auth": "workspace:read",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/auth/sqlserver/userpass",
      "endpoint": "auth.auth_sqlserver_userpass",
      "group": "auth",
      "title": "Auth sqlserver userpass",
      "description": "",
      "auth": "browser",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/auth/sqlserver/windows",
      "endpoint": "auth.auth_sqlserver_windows",
      "group": "auth",
      "title": "Auth sqlserver windows",
      "description": "",
      "auth": "browser",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/demo_user",
      "endpoint": "auth.create_demo_user_route",
      "group": "auth",
      "title": "Create demo user",
      "description": "",
      "auth": "public",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/get-schema",
      "endpoint": "schema_bp.get_schema",
      "group": "schema_bp",
      "title": "Get schema",
      "description": "",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/get-selected-schema/<report_id>",
      "endpoint": "schema_bp.get_selected_schema",
      "group": "schema_bp",
      "title": "Get selected schema",
      "description": "Gets the SelectedSchema for a specific report. Checks user-level connections first, then falls back to legacy.",
      "auth": "workspace:read",
      "pathParameters": [
        {
          "name": "report_id",
          "type": "unicode"
        }
      ]
    },
    {
      "method": "GET",
      "path": "/health",
      "endpoint": "health_check",
      "group": "service",
      "title": "Health check",
      "description": "",
      "auth": "public",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/login",
      "endpoint": "auth.login",
      "group": "auth",
      "title": "Login",
      "description": "",
      "auth": "public",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/register",
      "endpoint": "auth.register",
      "group": "auth",
      "title": "Register",
      "description": "",
      "auth": "public",
      "pathParameters": []
    },
    {
      "method": "POST",
      "path": "/store-schema",
      "endpoint": "schema_bp.store_schema",
      "group": "schema_bp",
      "title": "Store schema",
      "description": "Store user-selected schema tables/columns in both legacy and user-based models.",
      "auth": "workspace:write",
      "pathParameters": []
    },
    {
      "method": "GET",
      "path": "/test-db",
      "endpoint": "test_db",
      "group": "service",
      "title": "Test db",
      "description": "",
      "auth": "browser",
      "pathParameters": []
    }
  ],
  "tools": [
    {
      "name": "CreateBarGraphFromChatFunction",
      "description": "Use when the user clearly wants a new bar graph created from the general data chat. Use grouped by default unless the user's request clearly calls for stacked or percentStacked.",
      "effect": "artifact",
      "registeredScopes": [
        "artifact",
        "datachat"
      ],
      "availableScopes": [
        "artifact"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "assistant_response": {
            "type": "string",
            "description": "User-facing response to show in chat (1-3 sentences, no internal reasoning)."
          },
          "action_summary": {
            "type": "string",
            "description": "2-7 word, user-facing summary of the action for the action log (no punctuation if possible)."
          },
          "x_label": {
            "type": "string",
            "description": "Label for the x-axis."
          },
          "y_label": {
            "type": "string",
            "description": "Label for the y-axis."
          },
          "title": {
            "type": "string",
            "description": "Title for the visual."
          },
          "visual_mapping": {
            "type": "object",
            "description": "Light visual mapping for the SQL result. Use x/category for the displayed axis label, series for grouped/stacked breakdowns, value or values for the plotted measure column(s), and hidden_columns for helper columns that should not be shown.",
            "properties": {
              "shape": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "wide",
                  "long",
                  null
                ],
                "description": "Optional result shape hint for the visual."
              },
              "x": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed x-axis or category column."
              },
              "series": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed series or legend column for grouped/stacked visuals."
              },
              "value": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Primary plotted value column."
              },
              "values": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                },
                "description": "Visible plotted value columns for wide visuals."
              },
              "category": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed category column for pie or category-based visuals."
              },
              "hidden_columns": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                },
                "description": "Helper columns that should stay hidden from the visual output."
              }
            },
            "required": [
              "shape",
              "x",
              "series",
              "value",
              "values",
              "category",
              "hidden_columns"
            ],
            "additionalProperties": false
          },
          "sorting": {
            "type": "object",
            "description": "Optional visual sort instruction. Use this when the rendered items should follow a specific order. Helper columns used only for sorting can be listed in visual_mapping.hidden_columns.",
            "properties": {
              "target": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "x",
                  "series",
                  "value",
                  "category",
                  null
                ],
                "description": "Which visual role should be ordered."
              },
              "by": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Column or helper column used to sort the visual."
              },
              "direction": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "asc",
                  "desc",
                  null
                ],
                "description": "Sort direction."
              }
            },
            "required": [
              "target",
              "by",
              "direction"
            ],
            "additionalProperties": false
          },
          "graph_type": {
            "type": "string",
            "enum": [
              "grouped",
              "stacked",
              "percentStacked"
            ],
            "description": "The bar display mode: grouped for side-by-side bars, stacked for stacked bars, or percentStacked for percent-of-total bars."
          },
          "orientation": {
            "type": "string",
            "enum": [
              "vertical",
              "horizontal"
            ],
            "description": "Bar orientation: vertical for standard columns or horizontal for left-to-right bars."
          },
          "sql_query": {
            "type": "string"
          },
          "transform_sql": {
            "type": "string",
            "description": "Optional DuckDB SQL to reshape API data before visualization (use table api_data)."
          }
        },
        "required": [
          "assistant_response",
          "action_summary",
          "x_label",
          "y_label",
          "title",
          "visual_mapping",
          "sorting",
          "graph_type",
          "orientation",
          "sql_query",
          "transform_sql"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "CreateDataCardFromChatFunction",
      "description": "Use when the user clearly wants a new data card created from the general data chat. Create one new data card that focuses on a single key metric.",
      "effect": "artifact",
      "registeredScopes": [
        "artifact",
        "datachat"
      ],
      "availableScopes": [
        "artifact"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "assistant_response": {
            "type": "string",
            "description": "User-facing response to show in chat (1-3 sentences, no internal reasoning)."
          },
          "action_summary": {
            "type": "string",
            "description": "2-7 word, user-facing summary of the action for the action log (no punctuation if possible)."
          },
          "title": {
            "type": "string",
            "description": "The label that should appear as the data card title."
          },
          "subtitle": {
            "type": "string",
            "description": "Optional descriptive text that appears under the title."
          },
          "visual_mapping": {
            "type": "object",
            "description": "Light visual mapping for the SQL result. Use x/category for the displayed axis label, series for grouped/stacked breakdowns, value or values for the plotted measure column(s), and hidden_columns for helper columns that should not be shown.",
            "properties": {
              "shape": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "wide",
                  "long",
                  null
                ],
                "description": "Optional result shape hint for the visual."
              },
              "x": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed x-axis or category column."
              },
              "series": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed series or legend column for grouped/stacked visuals."
              },
              "value": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Primary plotted value column."
              },
              "values": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                },
                "description": "Visible plotted value columns for wide visuals."
              },
              "category": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed category column for pie or category-based visuals."
              },
              "hidden_columns": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                },
                "description": "Helper columns that should stay hidden from the visual output."
              }
            },
            "required": [
              "shape",
              "x",
              "series",
              "value",
              "values",
              "category",
              "hidden_columns"
            ],
            "additionalProperties": false
          },
          "sorting": {
            "type": "object",
            "description": "Optional visual sort instruction. Use this when the rendered items should follow a specific order. Helper columns used only for sorting can be listed in visual_mapping.hidden_columns.",
            "properties": {
              "target": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "x",
                  "series",
                  "value",
                  "category",
                  null
                ],
                "description": "Which visual role should be ordered."
              },
              "by": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Column or helper column used to sort the visual."
              },
              "direction": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "asc",
                  "desc",
                  null
                ],
                "description": "Sort direction."
              }
            },
            "required": [
              "target",
              "by",
              "direction"
            ],
            "additionalProperties": false
          },
          "sql_query": {
            "type": "string"
          },
          "transform_sql": {
            "type": "string",
            "description": "Optional DuckDB SQL to reshape API data before visualization (use table api_data)."
          }
        },
        "required": [
          "assistant_response",
          "action_summary",
          "title",
          "subtitle",
          "visual_mapping",
          "sorting",
          "sql_query",
          "transform_sql"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "CreateDataTableFromChatFunction",
      "description": "Use when the user clearly wants a new data table created from the general data chat. Create one new data table with the final query that returns the visible columns.",
      "effect": "artifact",
      "registeredScopes": [
        "artifact",
        "datachat"
      ],
      "availableScopes": [
        "artifact"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "assistant_response": {
            "type": "string",
            "description": "User-facing response to show in chat (1-3 sentences, no internal reasoning)."
          },
          "action_summary": {
            "type": "string",
            "description": "2-7 word, user-facing summary of the action for the action log (no punctuation if possible)."
          },
          "title": {
            "type": "string",
            "description": "Title or name of this data table."
          },
          "sql_query": {
            "type": "string"
          },
          "transform_sql": {
            "type": "string",
            "description": "Optional DuckDB SQL to reshape API data before visualization (use table api_data)."
          }
        },
        "required": [
          "assistant_response",
          "action_summary",
          "title",
          "sql_query",
          "transform_sql"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "CreateLineGraphFromChatFunction",
      "description": "Use when the user clearly wants a new line graph created from the general data chat. Do not use this for selected-visual replacement.",
      "effect": "artifact",
      "registeredScopes": [
        "artifact",
        "datachat"
      ],
      "availableScopes": [
        "artifact"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "assistant_response": {
            "type": "string",
            "description": "User-facing response to show in chat (1-3 sentences, no internal reasoning)."
          },
          "action_summary": {
            "type": "string",
            "description": "2-7 word, user-facing summary of the action for the action log (no punctuation if possible)."
          },
          "x_label": {
            "type": "string",
            "description": "Label for the x-axis."
          },
          "y_label": {
            "type": "string",
            "description": "Label for the y-axis."
          },
          "title": {
            "type": "string",
            "description": "Title for the visual."
          },
          "visual_mapping": {
            "type": "object",
            "description": "Light visual mapping for the SQL result. Use x/category for the displayed axis label, series for grouped/stacked breakdowns, value or values for the plotted measure column(s), and hidden_columns for helper columns that should not be shown.",
            "properties": {
              "shape": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "wide",
                  "long",
                  null
                ],
                "description": "Optional result shape hint for the visual."
              },
              "x": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed x-axis or category column."
              },
              "series": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed series or legend column for grouped/stacked visuals."
              },
              "value": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Primary plotted value column."
              },
              "values": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                },
                "description": "Visible plotted value columns for wide visuals."
              },
              "category": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed category column for pie or category-based visuals."
              },
              "hidden_columns": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                },
                "description": "Helper columns that should stay hidden from the visual output."
              }
            },
            "required": [
              "shape",
              "x",
              "series",
              "value",
              "values",
              "category",
              "hidden_columns"
            ],
            "additionalProperties": false
          },
          "sorting": {
            "type": "object",
            "description": "Optional visual sort instruction. Use this when the rendered items should follow a specific order. Helper columns used only for sorting can be listed in visual_mapping.hidden_columns.",
            "properties": {
              "target": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "x",
                  "series",
                  "value",
                  "category",
                  null
                ],
                "description": "Which visual role should be ordered."
              },
              "by": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Column or helper column used to sort the visual."
              },
              "direction": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "asc",
                  "desc",
                  null
                ],
                "description": "Sort direction."
              }
            },
            "required": [
              "target",
              "by",
              "direction"
            ],
            "additionalProperties": false
          },
          "sql_query": {
            "type": "string"
          },
          "transform_sql": {
            "type": "string",
            "description": "Optional DuckDB SQL to reshape API data before visualization (use table api_data)."
          }
        },
        "required": [
          "assistant_response",
          "action_summary",
          "x_label",
          "y_label",
          "title",
          "visual_mapping",
          "sorting",
          "sql_query",
          "transform_sql"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "CreatePage",
      "description": "Create a new named page in this report. Returns the new page UUID and an undo receipt. Set page_kind to html for an arbitrary HTML page, or report for a traditional canvas.",
      "effect": "page",
      "registeredScopes": [
        "artifact",
        "datachat"
      ],
      "availableScopes": [
        "artifact",
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "page_kind": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "report",
              "html",
              null
            ]
          }
        },
        "required": [
          "name",
          "page_kind"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "CreatePieChartFromChatFunction",
      "description": "Use when the user clearly wants a new pie chart created from the general data chat. Use only when the user explicitly wants a new pie chart.",
      "effect": "artifact",
      "registeredScopes": [
        "artifact",
        "datachat"
      ],
      "availableScopes": [
        "artifact"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "assistant_response": {
            "type": "string",
            "description": "User-facing response to show in chat (1-3 sentences, no internal reasoning)."
          },
          "action_summary": {
            "type": "string",
            "description": "2-7 word, user-facing summary of the action for the action log (no punctuation if possible)."
          },
          "x_label": {
            "type": "string",
            "description": "Label for the x-axis."
          },
          "y_label": {
            "type": "string",
            "description": "Label for the y-axis."
          },
          "title": {
            "type": "string",
            "description": "Title for the visual."
          },
          "visual_mapping": {
            "type": "object",
            "description": "Light visual mapping for the SQL result. Use x/category for the displayed axis label, series for grouped/stacked breakdowns, value or values for the plotted measure column(s), and hidden_columns for helper columns that should not be shown.",
            "properties": {
              "shape": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "wide",
                  "long",
                  null
                ],
                "description": "Optional result shape hint for the visual."
              },
              "x": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed x-axis or category column."
              },
              "series": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed series or legend column for grouped/stacked visuals."
              },
              "value": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Primary plotted value column."
              },
              "values": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                },
                "description": "Visible plotted value columns for wide visuals."
              },
              "category": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed category column for pie or category-based visuals."
              },
              "hidden_columns": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                },
                "description": "Helper columns that should stay hidden from the visual output."
              }
            },
            "required": [
              "shape",
              "x",
              "series",
              "value",
              "values",
              "category",
              "hidden_columns"
            ],
            "additionalProperties": false
          },
          "sorting": {
            "type": "object",
            "description": "Optional visual sort instruction. Use this when the rendered items should follow a specific order. Helper columns used only for sorting can be listed in visual_mapping.hidden_columns.",
            "properties": {
              "target": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "x",
                  "series",
                  "value",
                  "category",
                  null
                ],
                "description": "Which visual role should be ordered."
              },
              "by": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Column or helper column used to sort the visual."
              },
              "direction": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "asc",
                  "desc",
                  null
                ],
                "description": "Sort direction."
              }
            },
            "required": [
              "target",
              "by",
              "direction"
            ],
            "additionalProperties": false
          },
          "sql_query": {
            "type": "string"
          },
          "transform_sql": {
            "type": "string",
            "description": "Optional DuckDB SQL to reshape API data before visualization (use table api_data)."
          }
        },
        "required": [
          "assistant_response",
          "action_summary",
          "x_label",
          "y_label",
          "title",
          "visual_mapping",
          "sorting",
          "sql_query",
          "transform_sql"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "CreateScatterPlotFromChatFunction",
      "description": "Use when the user clearly wants a new scatter plot created from the general data chat. Use only when the user explicitly wants a new scatter plot.",
      "effect": "artifact",
      "registeredScopes": [
        "artifact",
        "datachat"
      ],
      "availableScopes": [
        "artifact"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "assistant_response": {
            "type": "string",
            "description": "User-facing response to show in chat (1-3 sentences, no internal reasoning)."
          },
          "action_summary": {
            "type": "string",
            "description": "2-7 word, user-facing summary of the action for the action log (no punctuation if possible)."
          },
          "x_label": {
            "type": "string",
            "description": "Label for the x-axis."
          },
          "y_label": {
            "type": "string",
            "description": "Label for the y-axis."
          },
          "title": {
            "type": "string",
            "description": "Title for the visual."
          },
          "visual_mapping": {
            "type": "object",
            "description": "Light visual mapping for the SQL result. Use x/category for the displayed axis label, series for grouped/stacked breakdowns, value or values for the plotted measure column(s), and hidden_columns for helper columns that should not be shown.",
            "properties": {
              "shape": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "wide",
                  "long",
                  null
                ],
                "description": "Optional result shape hint for the visual."
              },
              "x": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed x-axis or category column."
              },
              "series": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed series or legend column for grouped/stacked visuals."
              },
              "value": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Primary plotted value column."
              },
              "values": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                },
                "description": "Visible plotted value columns for wide visuals."
              },
              "category": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed category column for pie or category-based visuals."
              },
              "hidden_columns": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                },
                "description": "Helper columns that should stay hidden from the visual output."
              }
            },
            "required": [
              "shape",
              "x",
              "series",
              "value",
              "values",
              "category",
              "hidden_columns"
            ],
            "additionalProperties": false
          },
          "sorting": {
            "type": "object",
            "description": "Optional visual sort instruction. Use this when the rendered items should follow a specific order. Helper columns used only for sorting can be listed in visual_mapping.hidden_columns.",
            "properties": {
              "target": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "x",
                  "series",
                  "value",
                  "category",
                  null
                ],
                "description": "Which visual role should be ordered."
              },
              "by": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Column or helper column used to sort the visual."
              },
              "direction": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "asc",
                  "desc",
                  null
                ],
                "description": "Sort direction."
              }
            },
            "required": [
              "target",
              "by",
              "direction"
            ],
            "additionalProperties": false
          },
          "sql_query": {
            "type": "string"
          },
          "transform_sql": {
            "type": "string",
            "description": "Optional DuckDB SQL to reshape API data before visualization (use table api_data)."
          }
        },
        "required": [
          "assistant_response",
          "action_summary",
          "x_label",
          "y_label",
          "title",
          "visual_mapping",
          "sorting",
          "sql_query",
          "transform_sql"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "CreateVisual",
      "description": "Create a native visual on the requested report page. InspectVisualCapabilities supplies its definition schema. definition_json contains title, sql_query, output_contract, customization and kind-specific parameters; page_id and position_json are separate tool arguments. Explicit x,y,width,height,zIndex coordinates are preserved; null position lets Unity find free space using the catalog size. Inspect the target page canvasBounds and existing visual positions, even on an empty page. Returns persisted state, layout.fitsWithinPage, layout.overlaps and undo. Correct clipping or unintended overlaps before declaring the dashboard complete. Use preview tools only when the user asks for previews/options. Register new reusable definitions before creating.",
      "effect": "visual",
      "registeredScopes": [
        "artifact",
        "datachat"
      ],
      "availableScopes": [
        "artifact",
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "allow_overlap": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Without explicit x/y, Unity finds free space by default; true skips that automatic placement. Explicit coordinates are always preserved, including intentional layers."
          },
          "visual_type": {
            "type": "string",
            "enum": [
              "barGraph",
              "barChart",
              "lineGraph",
              "pieChart",
              "scatterPlot",
              "dataTable",
              "dataCard",
              "shape",
              "textBox",
              "declarativeChart"
            ],
            "description": "Canonical visual kind. dataCard is a KPI; dataTable is a table. InspectVisualCapabilities lists labels and rendering details."
          },
          "page_id": {
            "type": "string",
            "description": "Stable pageId from InspectReport."
          },
          "connection_id": {
            "type": [
              "integer",
              "null"
            ]
          },
          "definition_json": {
            "type": "string"
          },
          "position_json": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "allow_overlap",
          "visual_type",
          "page_id",
          "connection_id",
          "definition_json",
          "position_json"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "DeletePage",
      "description": "Delete a page and its visuals/filters with an undo receipt. Conversations remain accessible in the report.",
      "effect": "page",
      "registeredScopes": [
        "artifact",
        "datachat"
      ],
      "availableScopes": [
        "artifact",
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "page_id": {
            "type": "string"
          }
        },
        "required": [
          "page_id"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "DeleteVisual",
      "description": "Delete the inspected native visual when requested, using its current revision. Returns an undo snapshot. Do not delete a different visual because its title is similar.",
      "effect": "visual",
      "registeredScopes": [
        "artifact",
        "datachat"
      ],
      "availableScopes": [
        "artifact",
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "visual_type": {
            "type": "string",
            "enum": [
              "barGraph",
              "barChart",
              "lineGraph",
              "pieChart",
              "scatterPlot",
              "dataTable",
              "dataCard",
              "shape",
              "textBox",
              "declarativeChart"
            ],
            "description": "Canonical visual kind. dataCard is a KPI; dataTable is a table. InspectVisualCapabilities lists labels and rendering details."
          },
          "visual_id": {
            "type": "string",
            "description": "Stable visualUid from inspection."
          },
          "expected_revision": {
            "type": "string"
          }
        },
        "required": [
          "visual_type",
          "visual_id",
          "expected_revision"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "DuplicatePage",
      "description": "Copy a page's visual definitions, layout and persistent filters into a new named page.",
      "effect": "page",
      "registeredScopes": [
        "artifact",
        "datachat"
      ],
      "availableScopes": [
        "artifact",
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "page_id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "page_id",
          "name"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "EditPersistentVisualFilters",
      "description": "Create/update/clear backend persistent filters for the currently selected visual. Use this for user requests like adding/removing/editing filters, instead of rewriting SQL WHERE clauses.",
      "effect": "visual",
      "registeredScopes": [],
      "availableScopes": [],
      "parameters": {
        "type": "object",
        "properties": {
          "assistant_response": {
            "type": "string",
            "description": "User-facing response to show in chat (1-3 sentences, no internal reasoning)."
          },
          "action_summary": {
            "type": "string",
            "description": "2-7 word, user-facing summary of the action for the action log (no punctuation if possible)."
          },
          "action_type": {
            "type": "string",
            "enum": [
              "explore_sql",
              "update_visual",
              "update_persistent_filters",
              "create_visual",
              "replace_visual",
              "update_appearance",
              "restore_appearance"
            ],
            "description": "Required action classification so the UI can label the action precisely. Use explore_sql for read-only data exploration, update_visual for SQL changes that update an existing visual, update_persistent_filters when changing backend persistent visual filters, create_visual for net-new visuals, replace_visual when converting/replacing a visual, update_appearance for styling changes, and restore_appearance for resetting styling."
          },
          "filters": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "column": {
                  "type": "string",
                  "description": "Connection-model field/alias to filter."
                },
                "operator": {
                  "type": "string",
                  "enum": [
                    "equals",
                    "not_equals",
                    "contains",
                    "not_contains",
                    "starts_with",
                    "ends_with",
                    "in",
                    "not_in",
                    "gt",
                    "gte",
                    "lt",
                    "lte",
                    "before",
                    "after",
                    "on_or_before",
                    "on_or_after",
                    "between",
                    "is_null",
                    "is_not_null"
                  ],
                  "description": "Filter operator."
                },
                "value": {
                  "type": [
                    "string",
                    "number",
                    "boolean",
                    "null"
                  ],
                  "description": "Single value for equals/contains/gt/gte/lt/lte operators."
                },
                "values": {
                  "type": [
                    "array",
                    "null"
                  ],
                  "items": {
                    "type": [
                      "string",
                      "number",
                      "boolean"
                    ]
                  },
                  "description": "Value list for in/between operators."
                },
                "label": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Optional display label."
                },
                "expression": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Optional SQL expression for this filter field."
                },
                "sourceEntityKey": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Optional source entity key from the connection model."
                },
                "sourceColumns": {
                  "type": [
                    "array",
                    "null"
                  ],
                  "items": {
                    "type": "string"
                  },
                  "description": "Optional source columns backing this filter."
                },
                "sourcePrimaryKeyColumns": {
                  "type": [
                    "array",
                    "null"
                  ],
                  "items": {
                    "type": "string"
                  },
                  "description": "Optional source primary key columns."
                }
              },
              "required": [
                "column",
                "operator",
                "value",
                "values",
                "label",
                "expression",
                "sourceEntityKey",
                "sourceColumns",
                "sourcePrimaryKeyColumns"
              ],
              "additionalProperties": false
            },
            "description": "Final persistent filter set to apply (or filter deltas when merge_with_existing is true). Use [] with merge_with_existing=false to clear all persistent filters."
          },
          "merge_with_existing": {
            "type": "boolean",
            "description": "When true, merge filters with existing persistent filters. When false, replace the current persistent filters with filters."
          }
        },
        "required": [
          "assistant_response",
          "action_summary",
          "action_type",
          "filters",
          "merge_with_existing"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "InspectChanges",
      "description": "List recent saved visual/page changes made by this user's assistants in this report. Returns change IDs for exact native undo; unlike recreating a visual, undo retains its identity, filters and links.",
      "effect": "read",
      "registeredScopes": [
        "artifact",
        "datachat"
      ],
      "availableScopes": [
        "artifact",
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "limit": {
            "type": "integer"
          }
        },
        "required": [
          "limit"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "InspectChatPreview",
      "description": "Inspect an inline chat visual by its source conversation and message IDs, including its query, appearance, data and revision. Use InspectVisual for a saved canvas visual.",
      "effect": "read",
      "registeredScopes": [
        "artifact",
        "datachat"
      ],
      "availableScopes": [
        "artifact",
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "data_chat_id": {
            "type": "integer"
          },
          "message_id": {
            "type": "integer"
          }
        },
        "required": [
          "data_chat_id",
          "message_id"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "InspectDataModel",
      "description": "Search the complete accessible model catalog, including entity source SQL, typed fields, business descriptions, measures, relationships and field usage across accessible reports. Use connection_id from InspectReport or null for the active connection. Read definitionId, fieldUid and versions before editing. Follow nextOffset when incomplete; prompt summaries may omit entries.",
      "effect": "read",
      "registeredScopes": [
        "artifact",
        "datachat"
      ],
      "availableScopes": [
        "artifact",
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "connection_id": {
            "type": [
              "integer",
              "null"
            ]
          },
          "query": {
            "type": "string"
          },
          "kind": {
            "type": "string",
            "enum": [
              "all",
              "entity",
              "field",
              "relationship"
            ]
          },
          "field_uids": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "offset": {
            "type": "integer",
            "minimum": 0
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100
          }
        },
        "required": [
          "connection_id",
          "query",
          "kind",
          "field_uids",
          "offset",
          "limit"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "InspectFile",
      "description": "Inspect a report file's sections, HTML/CSS outline and embedded image inventory. Assets have IDs, dimensions, locations and reuse availability. Reading does not import assets; use ReuseAsset before referencing one in a report.",
      "effect": "read",
      "registeredScopes": [
        "artifact",
        "datachat"
      ],
      "availableScopes": [
        "artifact",
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "fileId": {
            "type": "string"
          }
        },
        "required": [
          "fileId"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "InspectFilters",
      "description": "Inspect saved visual, page, or report filters, including an empty scope. Empty scopes are available for creating filters. Read before replacing existing filters. For page use its page_id, for visual use visual_type and visual_id; unused target fields are null.",
      "effect": "read",
      "registeredScopes": [
        "artifact",
        "datachat"
      ],
      "availableScopes": [
        "artifact",
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "scope": {
            "type": "string",
            "enum": [
              "visual",
              "page",
              "report"
            ]
          },
          "page_id": {
            "type": [
              "string",
              "null"
            ],
            "description": "Stable pageId from InspectReport."
          },
          "visual_type": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "barGraph",
              "barChart",
              "lineGraph",
              "pieChart",
              "scatterPlot",
              "dataTable",
              "dataCard",
              "shape",
              "textBox",
              "declarativeChart",
              null
            ],
            "description": "Canonical visual kind. dataCard is a KPI; dataTable is a table. InspectVisualCapabilities lists labels and rendering details."
          },
          "visual_id": {
            "type": [
              "string",
              "null"
            ],
            "description": "Stable visualUid from inspection."
          }
        },
        "required": [
          "scope",
          "page_id",
          "visual_type",
          "visual_id"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "InspectHtmlHistory",
      "description": "Read saved revisions that can be restored.",
      "effect": "read",
      "registeredScopes": [
        "datachat"
      ],
      "availableScopes": [
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "InspectHtmlPage",
      "description": "Read all page names, IDs and registrations. Supply a pageId to inspect full source.",
      "effect": "read",
      "registeredScopes": [
        "datachat"
      ],
      "availableScopes": [
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "pageId": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "pageId"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "InspectHtmlVisual",
      "description": "Inspect one registered visual's source, bindings, actual query results, filter lineage and renderer failures.",
      "effect": "read",
      "registeredScopes": [
        "datachat"
      ],
      "availableScopes": [
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "pageId": {
            "type": "string"
          },
          "visualId": {
            "type": "string"
          }
        },
        "required": [
          "pageId",
          "visualId"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "InspectReport",
      "description": "Inspect current persisted report state across ALL pages. Search titles or query text, then request detail by visual_keys to retrieve exact SQL, output bindings, appearance and filters. The active page is only the current focus. Page canvasBounds and visual layout.fitsWithinPage/overflowPixels verify geometry against the browser size at submission. All pages clip overflow, including responsive pages. Follow nextOffset until complete when enumerating.",
      "effect": "read",
      "registeredScopes": [
        "artifact",
        "datachat"
      ],
      "availableScopes": [
        "artifact",
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string"
          },
          "kind": {
            "type": "string",
            "enum": [
              "all",
              "page",
              "visual",
              "connection"
            ]
          },
          "page_id": {
            "type": [
              "string",
              "null"
            ],
            "description": "Stable pageId from InspectReport."
          },
          "visual_keys": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "detail": {
            "type": "boolean"
          },
          "offset": {
            "type": "integer",
            "minimum": 0
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100
          }
        },
        "required": [
          "query",
          "kind",
          "page_id",
          "visual_keys",
          "detail",
          "offset",
          "limit"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "InspectVisual",
      "description": "Read current authored visual state, data roles, appearance, layout and revision on any report page. Use the supplied current selected-visual snapshot when already available; inspect other targets or refresh after a conflict. No query execution.",
      "effect": "read",
      "registeredScopes": [
        "artifact",
        "datachat"
      ],
      "availableScopes": [
        "artifact",
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "visual_type": {
            "type": "string",
            "enum": [
              "barGraph",
              "barChart",
              "lineGraph",
              "pieChart",
              "scatterPlot",
              "dataTable",
              "dataCard",
              "shape",
              "textBox",
              "declarativeChart"
            ],
            "description": "Canonical visual kind. dataCard is a KPI; dataTable is a table. InspectVisualCapabilities lists labels and rendering details."
          },
          "visual_id": {
            "type": "string",
            "description": "Stable visualUid from inspection."
          }
        },
        "required": [
          "visual_type",
          "visual_id"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "InspectVisualCapabilities",
      "description": "Inspect Unity's visual schemas and rendering semantics. kinds=[] lists concise options. Request one to three known kinds; section=definition for creation/preview, changes for edits, appearance for styling, or null for all sections.",
      "effect": "read",
      "registeredScopes": [
        "artifact",
        "datachat"
      ],
      "availableScopes": [
        "artifact",
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "kinds": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "barGraph",
                "barChart",
                "lineGraph",
                "pieChart",
                "scatterPlot",
                "dataTable",
                "dataCard",
                "shape",
                "textBox",
                "declarativeChart"
              ],
              "description": "Canonical visual kind. dataCard is a KPI; dataTable is a table. InspectVisualCapabilities lists labels and rendering details."
            },
            "maxItems": 3
          },
          "section": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "definition",
              "changes",
              "appearance",
              "all",
              null
            ]
          }
        },
        "required": [
          "kinds",
          "section"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "ListReportAssets",
      "description": "List images already imported for this report, including stable source references and origin file IDs. Use these directly without reimporting. offset counts assets, limit is 1-100.",
      "effect": "read",
      "registeredScopes": [
        "artifact",
        "datachat"
      ],
      "availableScopes": [
        "artifact",
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "offset": {
            "type": "integer"
          },
          "limit": {
            "type": "integer"
          }
        },
        "required": [
          "offset",
          "limit"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "ListReportFiles",
      "description": "List reference files uploaded to this report. File content is retrieved on demand; files are not data connections.",
      "effect": "read",
      "registeredScopes": [
        "artifact",
        "datachat"
      ],
      "availableScopes": [
        "artifact",
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "ManualBarGraphCreateFunction",
      "description": "Use when the user explicitly chose the bar graph create action. Create one new bar graph.Return the query, graph_type, orientation, visual_mapping, sorting, and labels needed to create the selected bar visual.",
      "effect": "artifact",
      "registeredScopes": [
        "manual"
      ],
      "availableScopes": [
        "manual"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "assistant_response": {
            "type": "string",
            "description": "User-facing response to show in chat (1-3 sentences, no internal reasoning)."
          },
          "x_label": {
            "type": "string",
            "description": "Label for the x-axis."
          },
          "y_label": {
            "type": "string",
            "description": "Label for the y-axis."
          },
          "title": {
            "type": "string",
            "description": "Title for the visual."
          },
          "visual_mapping": {
            "type": "object",
            "description": "Light visual mapping for the SQL result. Use x/category for the displayed axis label, series for grouped/stacked breakdowns, value or values for the plotted measure column(s), and hidden_columns for helper columns that should not be shown.",
            "properties": {
              "shape": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "wide",
                  "long",
                  null
                ],
                "description": "Optional result shape hint for the visual."
              },
              "x": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed x-axis or category column."
              },
              "series": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed series or legend column for grouped/stacked visuals."
              },
              "value": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Primary plotted value column."
              },
              "values": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                },
                "description": "Visible plotted value columns for wide visuals."
              },
              "category": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed category column for pie or category-based visuals."
              },
              "hidden_columns": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                },
                "description": "Helper columns that should stay hidden from the visual output."
              }
            },
            "required": [
              "shape",
              "x",
              "series",
              "value",
              "values",
              "category",
              "hidden_columns"
            ],
            "additionalProperties": false
          },
          "sorting": {
            "type": "object",
            "description": "Optional visual sort instruction. Use this when the rendered items should follow a specific order. Helper columns used only for sorting can be listed in visual_mapping.hidden_columns.",
            "properties": {
              "target": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "x",
                  "series",
                  "value",
                  "category",
                  null
                ],
                "description": "Which visual role should be ordered."
              },
              "by": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Column or helper column used to sort the visual."
              },
              "direction": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "asc",
                  "desc",
                  null
                ],
                "description": "Sort direction."
              }
            },
            "required": [
              "target",
              "by",
              "direction"
            ],
            "additionalProperties": false
          },
          "graph_type": {
            "type": "string",
            "enum": [
              "grouped",
              "stacked",
              "percentStacked"
            ],
            "description": "The bar display mode: grouped for side-by-side bars, stacked for stacked bars, or percentStacked for percent-of-total bars."
          },
          "orientation": {
            "type": "string",
            "enum": [
              "vertical",
              "horizontal"
            ],
            "description": "Bar orientation: vertical for standard columns or horizontal for left-to-right bars."
          },
          "sql_query": {
            "type": "string"
          },
          "transform_sql": {
            "type": "string",
            "description": "Optional DuckDB SQL to reshape API data before visualization (use table api_data)."
          }
        },
        "required": [
          "assistant_response",
          "x_label",
          "y_label",
          "title",
          "visual_mapping",
          "sorting",
          "graph_type",
          "orientation",
          "sql_query",
          "transform_sql"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "ManualDataCardCreateFunction",
      "description": "Use when the user explicitly chose the data-card create action. Create one new data card that focuses on a single key metric.",
      "effect": "artifact",
      "registeredScopes": [
        "manual"
      ],
      "availableScopes": [
        "manual"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "assistant_response": {
            "type": "string",
            "description": "User-facing response to show in chat (1-3 sentences, no internal reasoning)."
          },
          "title": {
            "type": "string",
            "description": "The label that should appear as the data card title."
          },
          "subtitle": {
            "type": "string",
            "description": "Optional descriptive text that appears under the title."
          },
          "visual_mapping": {
            "type": "object",
            "description": "Light visual mapping for the SQL result. Use x/category for the displayed axis label, series for grouped/stacked breakdowns, value or values for the plotted measure column(s), and hidden_columns for helper columns that should not be shown.",
            "properties": {
              "shape": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "wide",
                  "long",
                  null
                ],
                "description": "Optional result shape hint for the visual."
              },
              "x": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed x-axis or category column."
              },
              "series": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed series or legend column for grouped/stacked visuals."
              },
              "value": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Primary plotted value column."
              },
              "values": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                },
                "description": "Visible plotted value columns for wide visuals."
              },
              "category": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed category column for pie or category-based visuals."
              },
              "hidden_columns": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                },
                "description": "Helper columns that should stay hidden from the visual output."
              }
            },
            "required": [
              "shape",
              "x",
              "series",
              "value",
              "values",
              "category",
              "hidden_columns"
            ],
            "additionalProperties": false
          },
          "sorting": {
            "type": "object",
            "description": "Optional visual sort instruction. Use this when the rendered items should follow a specific order. Helper columns used only for sorting can be listed in visual_mapping.hidden_columns.",
            "properties": {
              "target": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "x",
                  "series",
                  "value",
                  "category",
                  null
                ],
                "description": "Which visual role should be ordered."
              },
              "by": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Column or helper column used to sort the visual."
              },
              "direction": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "asc",
                  "desc",
                  null
                ],
                "description": "Sort direction."
              }
            },
            "required": [
              "target",
              "by",
              "direction"
            ],
            "additionalProperties": false
          },
          "sql_query": {
            "type": "string"
          },
          "transform_sql": {
            "type": "string",
            "description": "Optional DuckDB SQL to reshape API data before visualization (use table api_data)."
          }
        },
        "required": [
          "assistant_response",
          "title",
          "subtitle",
          "visual_mapping",
          "sorting",
          "sql_query",
          "transform_sql"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "ManualDataTableCreateFunction",
      "description": "Use when the user explicitly chose the data-table create action. Create one new data table with the final query that returns the visible columns.",
      "effect": "artifact",
      "registeredScopes": [
        "manual"
      ],
      "availableScopes": [
        "manual"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "assistant_response": {
            "type": "string",
            "description": "User-facing response to show in chat (1-3 sentences, no internal reasoning)."
          },
          "title": {
            "type": "string",
            "description": "Title or name of this data table."
          },
          "sql_query": {
            "type": "string"
          },
          "transform_sql": {
            "type": "string",
            "description": "Optional DuckDB SQL to reshape API data before visualization (use table api_data)."
          }
        },
        "required": [
          "assistant_response",
          "title",
          "sql_query",
          "transform_sql"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "ManualLineGraphCreateFunction",
      "description": "Use when the user explicitly chose the line graph create action. Create one new line graph.Return the query, visual_mapping, sorting, and labels needed to create the selected line visual.",
      "effect": "artifact",
      "registeredScopes": [
        "manual"
      ],
      "availableScopes": [
        "manual"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "assistant_response": {
            "type": "string",
            "description": "User-facing response to show in chat (1-3 sentences, no internal reasoning)."
          },
          "x_label": {
            "type": "string",
            "description": "Label for the x-axis."
          },
          "y_label": {
            "type": "string",
            "description": "Label for the y-axis."
          },
          "title": {
            "type": "string",
            "description": "Title for the visual."
          },
          "visual_mapping": {
            "type": "object",
            "description": "Light visual mapping for the SQL result. Use x/category for the displayed axis label, series for grouped/stacked breakdowns, value or values for the plotted measure column(s), and hidden_columns for helper columns that should not be shown.",
            "properties": {
              "shape": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "wide",
                  "long",
                  null
                ],
                "description": "Optional result shape hint for the visual."
              },
              "x": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed x-axis or category column."
              },
              "series": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed series or legend column for grouped/stacked visuals."
              },
              "value": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Primary plotted value column."
              },
              "values": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                },
                "description": "Visible plotted value columns for wide visuals."
              },
              "category": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed category column for pie or category-based visuals."
              },
              "hidden_columns": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                },
                "description": "Helper columns that should stay hidden from the visual output."
              }
            },
            "required": [
              "shape",
              "x",
              "series",
              "value",
              "values",
              "category",
              "hidden_columns"
            ],
            "additionalProperties": false
          },
          "sorting": {
            "type": "object",
            "description": "Optional visual sort instruction. Use this when the rendered items should follow a specific order. Helper columns used only for sorting can be listed in visual_mapping.hidden_columns.",
            "properties": {
              "target": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "x",
                  "series",
                  "value",
                  "category",
                  null
                ],
                "description": "Which visual role should be ordered."
              },
              "by": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Column or helper column used to sort the visual."
              },
              "direction": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "asc",
                  "desc",
                  null
                ],
                "description": "Sort direction."
              }
            },
            "required": [
              "target",
              "by",
              "direction"
            ],
            "additionalProperties": false
          },
          "sql_query": {
            "type": "string"
          },
          "transform_sql": {
            "type": "string",
            "description": "Optional DuckDB SQL to reshape API data before visualization (use table api_data)."
          }
        },
        "required": [
          "assistant_response",
          "x_label",
          "y_label",
          "title",
          "visual_mapping",
          "sorting",
          "sql_query",
          "transform_sql"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "ManualPieChartCreateFunction",
      "description": "Use when the user explicitly chose the pie chart create action. Create one new pie chart.Return the query, visual_mapping, sorting, and labels needed to create the selected pie chart.",
      "effect": "artifact",
      "registeredScopes": [
        "manual"
      ],
      "availableScopes": [
        "manual"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "assistant_response": {
            "type": "string",
            "description": "User-facing response to show in chat (1-3 sentences, no internal reasoning)."
          },
          "x_label": {
            "type": "string",
            "description": "Label for the x-axis."
          },
          "y_label": {
            "type": "string",
            "description": "Label for the y-axis."
          },
          "title": {
            "type": "string",
            "description": "Title for the visual."
          },
          "visual_mapping": {
            "type": "object",
            "description": "Light visual mapping for the SQL result. Use x/category for the displayed axis label, series for grouped/stacked breakdowns, value or values for the plotted measure column(s), and hidden_columns for helper columns that should not be shown.",
            "properties": {
              "shape": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "wide",
                  "long",
                  null
                ],
                "description": "Optional result shape hint for the visual."
              },
              "x": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed x-axis or category column."
              },
              "series": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed series or legend column for grouped/stacked visuals."
              },
              "value": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Primary plotted value column."
              },
              "values": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                },
                "description": "Visible plotted value columns for wide visuals."
              },
              "category": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed category column for pie or category-based visuals."
              },
              "hidden_columns": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                },
                "description": "Helper columns that should stay hidden from the visual output."
              }
            },
            "required": [
              "shape",
              "x",
              "series",
              "value",
              "values",
              "category",
              "hidden_columns"
            ],
            "additionalProperties": false
          },
          "sorting": {
            "type": "object",
            "description": "Optional visual sort instruction. Use this when the rendered items should follow a specific order. Helper columns used only for sorting can be listed in visual_mapping.hidden_columns.",
            "properties": {
              "target": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "x",
                  "series",
                  "value",
                  "category",
                  null
                ],
                "description": "Which visual role should be ordered."
              },
              "by": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Column or helper column used to sort the visual."
              },
              "direction": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "asc",
                  "desc",
                  null
                ],
                "description": "Sort direction."
              }
            },
            "required": [
              "target",
              "by",
              "direction"
            ],
            "additionalProperties": false
          },
          "sql_query": {
            "type": "string"
          },
          "transform_sql": {
            "type": "string",
            "description": "Optional DuckDB SQL to reshape API data before visualization (use table api_data)."
          }
        },
        "required": [
          "assistant_response",
          "x_label",
          "y_label",
          "title",
          "visual_mapping",
          "sorting",
          "sql_query",
          "transform_sql"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "ManualScatterPlotCreateFunction",
      "description": "Use when the user explicitly chose the scatter plot create action. Create one new scatter plot.Return the query, visual_mapping, sorting, and labels needed to create the selected scatter plot.",
      "effect": "artifact",
      "registeredScopes": [
        "manual"
      ],
      "availableScopes": [
        "manual"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "assistant_response": {
            "type": "string",
            "description": "User-facing response to show in chat (1-3 sentences, no internal reasoning)."
          },
          "x_label": {
            "type": "string",
            "description": "Label for the x-axis."
          },
          "y_label": {
            "type": "string",
            "description": "Label for the y-axis."
          },
          "title": {
            "type": "string",
            "description": "Title for the visual."
          },
          "visual_mapping": {
            "type": "object",
            "description": "Light visual mapping for the SQL result. Use x/category for the displayed axis label, series for grouped/stacked breakdowns, value or values for the plotted measure column(s), and hidden_columns for helper columns that should not be shown.",
            "properties": {
              "shape": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "wide",
                  "long",
                  null
                ],
                "description": "Optional result shape hint for the visual."
              },
              "x": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed x-axis or category column."
              },
              "series": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed series or legend column for grouped/stacked visuals."
              },
              "value": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Primary plotted value column."
              },
              "values": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                },
                "description": "Visible plotted value columns for wide visuals."
              },
              "category": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed category column for pie or category-based visuals."
              },
              "hidden_columns": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                },
                "description": "Helper columns that should stay hidden from the visual output."
              }
            },
            "required": [
              "shape",
              "x",
              "series",
              "value",
              "values",
              "category",
              "hidden_columns"
            ],
            "additionalProperties": false
          },
          "sorting": {
            "type": "object",
            "description": "Optional visual sort instruction. Use this when the rendered items should follow a specific order. Helper columns used only for sorting can be listed in visual_mapping.hidden_columns.",
            "properties": {
              "target": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "x",
                  "series",
                  "value",
                  "category",
                  null
                ],
                "description": "Which visual role should be ordered."
              },
              "by": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Column or helper column used to sort the visual."
              },
              "direction": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "asc",
                  "desc",
                  null
                ],
                "description": "Sort direction."
              }
            },
            "required": [
              "target",
              "by",
              "direction"
            ],
            "additionalProperties": false
          },
          "sql_query": {
            "type": "string"
          },
          "transform_sql": {
            "type": "string",
            "description": "Optional DuckDB SQL to reshape API data before visualization (use table api_data)."
          }
        },
        "required": [
          "assistant_response",
          "x_label",
          "y_label",
          "title",
          "visual_mapping",
          "sorting",
          "sql_query",
          "transform_sql"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "PatchHtmlSource",
      "description": "Make exact, targeted replacements in existing page HTML or one registered visual's html/css/script. Inspect current source first. visualId:null targets page HTML. Edits apply in order; each must match expectedMatches exactly or NOTHING is saved. Preserves other source, data, bindings and filters. One undoable revision; call PreviewHtmlPage after saving.",
      "effect": "html",
      "registeredScopes": [
        "datachat"
      ],
      "availableScopes": [
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "baseRevision": {
            "type": "integer"
          },
          "pageId": {
            "type": "string"
          },
          "visualId": {
            "type": [
              "string",
              "null"
            ]
          },
          "part": {
            "type": "string",
            "enum": [
              "html",
              "css",
              "script"
            ]
          },
          "edits": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "find": {
                  "type": "string"
                },
                "replace": {
                  "type": "string"
                },
                "expectedMatches": {
                  "type": "integer"
                }
              },
              "required": [
                "find",
                "replace",
                "expectedMatches"
              ],
              "additionalProperties": false
            }
          },
          "label": {
            "type": "string"
          }
        },
        "required": [
          "baseRevision",
          "pageId",
          "visualId",
          "part",
          "edits",
          "label"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "PreviewFile",
      "description": "See a rendered image of a report file, slide or document page. page is 1-based. Use for style/layout inspection alongside ReadFile. HTML previews are static: scripts and network are disabled. Office previews use LibreOffice and may substitute fonts. Excel uses printed pages. Returns an image to the model, not just a filename.",
      "effect": "read",
      "registeredScopes": [
        "artifact",
        "datachat"
      ],
      "availableScopes": [
        "artifact",
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "fileId": {
            "type": "string"
          },
          "page": {
            "type": "integer"
          },
          "assetId": {
            "type": [
              "string",
              "null"
            ],
            "description": "An embedded asset ID from InspectFile previews that image alone; null previews the file page."
          }
        },
        "required": [
          "fileId",
          "page",
          "assetId"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "PreviewHtmlPage",
      "description": "See a real screenshot of a saved page using Unity's renderer, live queries and saved filters. Returns the image to the model, revision, readiness/errors, image geometry and viewport coverage. Separate from the user's transient browser state. Inspect appearance before completing visual edits. Use nextScrollY for lower sections or visualId to scroll to one registered visual. Width/height null use the last editor viewport (bounded) or 1280x900. theme only emulates browser prefers-color-scheme; null/system use light. It never overrides authored appearance or clicks an HTML theme toggle. This tool does not edit the report.",
      "effect": "read",
      "registeredScopes": [
        "datachat"
      ],
      "availableScopes": [
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "pageId": {
            "type": "string"
          },
          "visualId": {
            "type": [
              "string",
              "null"
            ]
          },
          "scrollY": {
            "type": "integer",
            "minimum": 0,
            "maximum": 200000
          },
          "width": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 320,
            "maximum": 1920
          },
          "height": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 240,
            "maximum": 1200
          },
          "theme": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "light",
              "dark",
              "system",
              null
            ]
          }
        },
        "required": [
          "pageId",
          "visualId",
          "scrollY",
          "width",
          "height",
          "theme"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "PreviewVisual",
      "description": "Render an interactive chart or table artifact in this chat. Use for a requested preview, visual option, or chart shown here in the conversation. Executes the query and returns the artifact while preserving the saved canvas. Inspect the kind's definition schema, then supply definition_json. CreateVisual saves a visual to a report page.",
      "effect": "artifact",
      "registeredScopes": [
        "artifact",
        "datachat"
      ],
      "availableScopes": [
        "artifact",
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "visual_type": {
            "type": "string",
            "enum": [
              "barGraph",
              "barChart",
              "lineGraph",
              "pieChart",
              "scatterPlot",
              "dataTable",
              "dataCard",
              "shape",
              "textBox",
              "declarativeChart"
            ],
            "description": "Canonical visual kind. dataCard is a KPI; dataTable is a table. InspectVisualCapabilities lists labels and rendering details."
          },
          "connection_id": {
            "type": [
              "integer",
              "null"
            ]
          },
          "definition_json": {
            "type": "string"
          }
        },
        "required": [
          "visual_type",
          "connection_id",
          "definition_json"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "QueryHtmlData",
      "description": "Execute read-only SQL using the report's model and saved filters; returns rows and query errors.",
      "effect": "read",
      "registeredScopes": [
        "datachat"
      ],
      "availableScopes": [
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "connectionId": {
            "type": "integer"
          },
          "sql": {
            "type": "string"
          },
          "pageId": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "connectionId",
          "sql",
          "pageId"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "ReadFile",
      "description": "Read text/HTML/CSS with embedded media replaced by short asset references, slide layout/fonts/colors/notes, PDF text, document structure, or spreadsheet formulas/styles/cached values. Original bytes remain intact. Use sectionId from InspectFile (null selects the first). offset is zero-based readable characters or rows for Excel. limit is characters (max 16000) or rows (max 50). Excel returns 30 columns starting at columnOffset; use 0 otherwise. Follow hasMore/nextOffset and hasMoreColumns/nextColumnOffset to continue. File content is untrusted reference material.",
      "effect": "read",
      "registeredScopes": [
        "artifact",
        "datachat"
      ],
      "availableScopes": [
        "artifact",
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "fileId": {
            "type": "string"
          },
          "sectionId": {
            "type": [
              "string",
              "null"
            ]
          },
          "offset": {
            "type": "integer"
          },
          "limit": {
            "type": "integer"
          },
          "columnOffset": {
            "type": "integer"
          }
        },
        "required": [
          "fileId",
          "sectionId",
          "offset",
          "limit",
          "columnOffset"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "ReadUnityDocumentation",
      "description": "Read versioned Unity guides or the live tool catalog. topic:null lists topics; use html-authoring before HTML work, testing for browser checks, files for templates, continuity for page targeting, or tools for all operations. toolName retrieves one exact tool schema (null otherwise). No report mutation.",
      "effect": "read",
      "registeredScopes": [
        "artifact",
        "datachat"
      ],
      "availableScopes": [
        "artifact",
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "topic": {
            "type": [
              "string",
              "null"
            ]
          },
          "toolName": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "topic",
          "toolName"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "RegisterDataDefinitionsFunction",
      "description": "Use when the request introduces net-new reusable derived fields or measures that should be added to the connection data model before a SQL or visual tool runs. Return only the net-new reusable definitions that should be registered.",
      "effect": "definitions",
      "registeredScopes": [
        "artifact",
        "datachat",
        "manual"
      ],
      "availableScopes": [
        "artifact",
        "datachat",
        "manual"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "data_definitions": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "alias_name": {
                  "type": "string",
                  "description": "User-facing field/measure name to register."
                },
                "description": {
                  "type": "string",
                  "description": "Business meaning, including relevant inclusions, exclusions, units and date interpretation. State uncertainty; do not invent business rules."
                },
                "sql_expression": {
                  "type": "string",
                  "description": "SQL expression that defines the field/measure."
                },
                "definition_type": {
                  "type": "string",
                  "enum": [
                    "direct_column",
                    "derived_column",
                    "measure"
                  ],
                  "description": "Type of definition being registered."
                },
                "canonical_type": {
                  "type": "string",
                  "enum": [
                    "string",
                    "integer",
                    "decimal",
                    "boolean",
                    "date",
                    "datetime",
                    "json",
                    "unknown"
                  ],
                  "description": "Canonical data type for this definition."
                },
                "source_entity_key": {
                  "type": "string",
                  "description": "Owning connection-model entity key for this definition."
                },
                "source_columns": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "description": "Backing fields from source_entity_key that this definition depends on."
                }
              },
              "required": [
                "alias_name",
                "description",
                "sql_expression",
                "definition_type",
                "canonical_type",
                "source_entity_key",
                "source_columns"
              ],
              "additionalProperties": false
            },
            "description": "List of new reusable fields/measures that must be registered before executing sql_query. Return only net-new registrations here; do not repeat aliases that already exist in the provided data model context. Existing direct/derived model fields are already queryable as columns on their owning entity. Existing measures may be referenced in sql_query through an entity-qualified alias (for example, a.[TotalCost]); the backend expands them into executable SQL. Each new item must declare the owning source_entity_key and the backing source_columns. If the query uses only existing model fields/measures and introduces nothing new, return an empty array.",
            "minItems": 1
          }
        },
        "required": [
          "data_definitions"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "ReplaceSelectedWithBarGraphFunction",
      "description": "Use only in the selected-visual assistant when the current visual should be replaced with a bar graph. Preserve selected-visual context; this action replaces the current visual rather than creating an unrelated new one.",
      "effect": "visual",
      "registeredScopes": [],
      "availableScopes": [],
      "parameters": {
        "type": "object",
        "properties": {
          "assistant_response": {
            "type": "string",
            "description": "User-facing response to show in chat (1-3 sentences, no internal reasoning)."
          },
          "action_summary": {
            "type": "string",
            "description": "2-7 word, user-facing summary of the action for the action log (no punctuation if possible)."
          },
          "x_label": {
            "type": "string",
            "description": "Label for the x-axis."
          },
          "y_label": {
            "type": "string",
            "description": "Label for the y-axis."
          },
          "title": {
            "type": "string",
            "description": "Title for the visual."
          },
          "visual_mapping": {
            "type": "object",
            "description": "Light visual mapping for the SQL result. Use x/category for the displayed axis label, series for grouped/stacked breakdowns, value or values for the plotted measure column(s), and hidden_columns for helper columns that should not be shown.",
            "properties": {
              "shape": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "wide",
                  "long",
                  null
                ],
                "description": "Optional result shape hint for the visual."
              },
              "x": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed x-axis or category column."
              },
              "series": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed series or legend column for grouped/stacked visuals."
              },
              "value": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Primary plotted value column."
              },
              "values": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                },
                "description": "Visible plotted value columns for wide visuals."
              },
              "category": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed category column for pie or category-based visuals."
              },
              "hidden_columns": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                },
                "description": "Helper columns that should stay hidden from the visual output."
              }
            },
            "required": [
              "shape",
              "x",
              "series",
              "value",
              "values",
              "category",
              "hidden_columns"
            ],
            "additionalProperties": false
          },
          "sorting": {
            "type": "object",
            "description": "Optional visual sort instruction. Use this when the rendered items should follow a specific order. Helper columns used only for sorting can be listed in visual_mapping.hidden_columns.",
            "properties": {
              "target": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "x",
                  "series",
                  "value",
                  "category",
                  null
                ],
                "description": "Which visual role should be ordered."
              },
              "by": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Column or helper column used to sort the visual."
              },
              "direction": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "asc",
                  "desc",
                  null
                ],
                "description": "Sort direction."
              }
            },
            "required": [
              "target",
              "by",
              "direction"
            ],
            "additionalProperties": false
          },
          "graph_type": {
            "type": "string",
            "enum": [
              "grouped",
              "stacked",
              "percentStacked"
            ],
            "description": "The bar display mode: grouped for side-by-side bars, stacked for stacked bars, or percentStacked for percent-of-total bars."
          },
          "orientation": {
            "type": "string",
            "enum": [
              "vertical",
              "horizontal"
            ],
            "description": "Bar orientation: vertical for standard columns or horizontal for left-to-right bars."
          },
          "sql_query": {
            "type": "string"
          },
          "transform_sql": {
            "type": "string",
            "description": "Optional DuckDB SQL to reshape API data before visualization (use table api_data)."
          }
        },
        "required": [
          "assistant_response",
          "action_summary",
          "x_label",
          "y_label",
          "title",
          "visual_mapping",
          "sorting",
          "graph_type",
          "orientation",
          "sql_query",
          "transform_sql"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "ReplaceSelectedWithDataCardFunction",
      "description": "Use only in the selected-visual assistant when the current visual should be replaced with a data card. Preserve selected-visual context; this action replaces the current visual rather than creating an unrelated new one.",
      "effect": "visual",
      "registeredScopes": [],
      "availableScopes": [],
      "parameters": {
        "type": "object",
        "properties": {
          "assistant_response": {
            "type": "string",
            "description": "User-facing response to show in chat (1-3 sentences, no internal reasoning)."
          },
          "action_summary": {
            "type": "string",
            "description": "2-7 word, user-facing summary of the action for the action log (no punctuation if possible)."
          },
          "title": {
            "type": "string",
            "description": "The label that should appear as the data card title."
          },
          "subtitle": {
            "type": "string",
            "description": "Optional descriptive text that appears under the title."
          },
          "visual_mapping": {
            "type": "object",
            "description": "Light visual mapping for the SQL result. Use x/category for the displayed axis label, series for grouped/stacked breakdowns, value or values for the plotted measure column(s), and hidden_columns for helper columns that should not be shown.",
            "properties": {
              "shape": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "wide",
                  "long",
                  null
                ],
                "description": "Optional result shape hint for the visual."
              },
              "x": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed x-axis or category column."
              },
              "series": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed series or legend column for grouped/stacked visuals."
              },
              "value": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Primary plotted value column."
              },
              "values": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                },
                "description": "Visible plotted value columns for wide visuals."
              },
              "category": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed category column for pie or category-based visuals."
              },
              "hidden_columns": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                },
                "description": "Helper columns that should stay hidden from the visual output."
              }
            },
            "required": [
              "shape",
              "x",
              "series",
              "value",
              "values",
              "category",
              "hidden_columns"
            ],
            "additionalProperties": false
          },
          "sorting": {
            "type": "object",
            "description": "Optional visual sort instruction. Use this when the rendered items should follow a specific order. Helper columns used only for sorting can be listed in visual_mapping.hidden_columns.",
            "properties": {
              "target": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "x",
                  "series",
                  "value",
                  "category",
                  null
                ],
                "description": "Which visual role should be ordered."
              },
              "by": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Column or helper column used to sort the visual."
              },
              "direction": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "asc",
                  "desc",
                  null
                ],
                "description": "Sort direction."
              }
            },
            "required": [
              "target",
              "by",
              "direction"
            ],
            "additionalProperties": false
          },
          "sql_query": {
            "type": "string"
          },
          "transform_sql": {
            "type": "string",
            "description": "Optional DuckDB SQL to reshape API data before visualization (use table api_data)."
          }
        },
        "required": [
          "assistant_response",
          "action_summary",
          "title",
          "subtitle",
          "visual_mapping",
          "sorting",
          "sql_query",
          "transform_sql"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "ReplaceSelectedWithDataTableFunction",
      "description": "Use only in the selected-visual assistant when the current visual should be replaced with a data table. Preserve selected-visual context; this action replaces the current visual rather than creating an unrelated new one.",
      "effect": "visual",
      "registeredScopes": [],
      "availableScopes": [],
      "parameters": {
        "type": "object",
        "properties": {
          "assistant_response": {
            "type": "string",
            "description": "User-facing response to show in chat (1-3 sentences, no internal reasoning)."
          },
          "action_summary": {
            "type": "string",
            "description": "2-7 word, user-facing summary of the action for the action log (no punctuation if possible)."
          },
          "title": {
            "type": "string",
            "description": "Title or name of this data table."
          },
          "sql_query": {
            "type": "string"
          },
          "transform_sql": {
            "type": "string",
            "description": "Optional DuckDB SQL to reshape API data before visualization (use table api_data)."
          }
        },
        "required": [
          "assistant_response",
          "action_summary",
          "title",
          "sql_query",
          "transform_sql"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "ReplaceSelectedWithLineGraphFunction",
      "description": "Use only in the selected-visual assistant when the current visual should be replaced with a line graph. Preserve selected-visual context; this action replaces the current visual rather than creating an unrelated new one.",
      "effect": "visual",
      "registeredScopes": [],
      "availableScopes": [],
      "parameters": {
        "type": "object",
        "properties": {
          "assistant_response": {
            "type": "string",
            "description": "User-facing response to show in chat (1-3 sentences, no internal reasoning)."
          },
          "action_summary": {
            "type": "string",
            "description": "2-7 word, user-facing summary of the action for the action log (no punctuation if possible)."
          },
          "x_label": {
            "type": "string",
            "description": "Label for the x-axis."
          },
          "y_label": {
            "type": "string",
            "description": "Label for the y-axis."
          },
          "title": {
            "type": "string",
            "description": "Title for the visual."
          },
          "visual_mapping": {
            "type": "object",
            "description": "Light visual mapping for the SQL result. Use x/category for the displayed axis label, series for grouped/stacked breakdowns, value or values for the plotted measure column(s), and hidden_columns for helper columns that should not be shown.",
            "properties": {
              "shape": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "wide",
                  "long",
                  null
                ],
                "description": "Optional result shape hint for the visual."
              },
              "x": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed x-axis or category column."
              },
              "series": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed series or legend column for grouped/stacked visuals."
              },
              "value": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Primary plotted value column."
              },
              "values": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                },
                "description": "Visible plotted value columns for wide visuals."
              },
              "category": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed category column for pie or category-based visuals."
              },
              "hidden_columns": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                },
                "description": "Helper columns that should stay hidden from the visual output."
              }
            },
            "required": [
              "shape",
              "x",
              "series",
              "value",
              "values",
              "category",
              "hidden_columns"
            ],
            "additionalProperties": false
          },
          "sorting": {
            "type": "object",
            "description": "Optional visual sort instruction. Use this when the rendered items should follow a specific order. Helper columns used only for sorting can be listed in visual_mapping.hidden_columns.",
            "properties": {
              "target": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "x",
                  "series",
                  "value",
                  "category",
                  null
                ],
                "description": "Which visual role should be ordered."
              },
              "by": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Column or helper column used to sort the visual."
              },
              "direction": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "asc",
                  "desc",
                  null
                ],
                "description": "Sort direction."
              }
            },
            "required": [
              "target",
              "by",
              "direction"
            ],
            "additionalProperties": false
          },
          "sql_query": {
            "type": "string"
          },
          "transform_sql": {
            "type": "string",
            "description": "Optional DuckDB SQL to reshape API data before visualization (use table api_data)."
          }
        },
        "required": [
          "assistant_response",
          "action_summary",
          "x_label",
          "y_label",
          "title",
          "visual_mapping",
          "sorting",
          "sql_query",
          "transform_sql"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "ReplaceSelectedWithPieChartFunction",
      "description": "Use only in the selected-visual assistant when the current visual should be replaced with a pie chart. Preserve selected-visual context; this action replaces the current visual rather than creating an unrelated new one.",
      "effect": "visual",
      "registeredScopes": [],
      "availableScopes": [],
      "parameters": {
        "type": "object",
        "properties": {
          "assistant_response": {
            "type": "string",
            "description": "User-facing response to show in chat (1-3 sentences, no internal reasoning)."
          },
          "action_summary": {
            "type": "string",
            "description": "2-7 word, user-facing summary of the action for the action log (no punctuation if possible)."
          },
          "x_label": {
            "type": "string",
            "description": "Label for the x-axis."
          },
          "y_label": {
            "type": "string",
            "description": "Label for the y-axis."
          },
          "title": {
            "type": "string",
            "description": "Title for the visual."
          },
          "visual_mapping": {
            "type": "object",
            "description": "Light visual mapping for the SQL result. Use x/category for the displayed axis label, series for grouped/stacked breakdowns, value or values for the plotted measure column(s), and hidden_columns for helper columns that should not be shown.",
            "properties": {
              "shape": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "wide",
                  "long",
                  null
                ],
                "description": "Optional result shape hint for the visual."
              },
              "x": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed x-axis or category column."
              },
              "series": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed series or legend column for grouped/stacked visuals."
              },
              "value": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Primary plotted value column."
              },
              "values": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                },
                "description": "Visible plotted value columns for wide visuals."
              },
              "category": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed category column for pie or category-based visuals."
              },
              "hidden_columns": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                },
                "description": "Helper columns that should stay hidden from the visual output."
              }
            },
            "required": [
              "shape",
              "x",
              "series",
              "value",
              "values",
              "category",
              "hidden_columns"
            ],
            "additionalProperties": false
          },
          "sorting": {
            "type": "object",
            "description": "Optional visual sort instruction. Use this when the rendered items should follow a specific order. Helper columns used only for sorting can be listed in visual_mapping.hidden_columns.",
            "properties": {
              "target": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "x",
                  "series",
                  "value",
                  "category",
                  null
                ],
                "description": "Which visual role should be ordered."
              },
              "by": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Column or helper column used to sort the visual."
              },
              "direction": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "asc",
                  "desc",
                  null
                ],
                "description": "Sort direction."
              }
            },
            "required": [
              "target",
              "by",
              "direction"
            ],
            "additionalProperties": false
          },
          "sql_query": {
            "type": "string"
          },
          "transform_sql": {
            "type": "string",
            "description": "Optional DuckDB SQL to reshape API data before visualization (use table api_data)."
          }
        },
        "required": [
          "assistant_response",
          "action_summary",
          "x_label",
          "y_label",
          "title",
          "visual_mapping",
          "sorting",
          "sql_query",
          "transform_sql"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "ReplaceSelectedWithScatterPlotFunction",
      "description": "Use only in the selected-visual assistant when the current visual should be replaced with a scatter plot. Preserve selected-visual context; this action replaces the current visual rather than creating an unrelated new one.",
      "effect": "visual",
      "registeredScopes": [],
      "availableScopes": [],
      "parameters": {
        "type": "object",
        "properties": {
          "assistant_response": {
            "type": "string",
            "description": "User-facing response to show in chat (1-3 sentences, no internal reasoning)."
          },
          "action_summary": {
            "type": "string",
            "description": "2-7 word, user-facing summary of the action for the action log (no punctuation if possible)."
          },
          "x_label": {
            "type": "string",
            "description": "Label for the x-axis."
          },
          "y_label": {
            "type": "string",
            "description": "Label for the y-axis."
          },
          "title": {
            "type": "string",
            "description": "Title for the visual."
          },
          "visual_mapping": {
            "type": "object",
            "description": "Light visual mapping for the SQL result. Use x/category for the displayed axis label, series for grouped/stacked breakdowns, value or values for the plotted measure column(s), and hidden_columns for helper columns that should not be shown.",
            "properties": {
              "shape": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "wide",
                  "long",
                  null
                ],
                "description": "Optional result shape hint for the visual."
              },
              "x": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed x-axis or category column."
              },
              "series": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed series or legend column for grouped/stacked visuals."
              },
              "value": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Primary plotted value column."
              },
              "values": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                },
                "description": "Visible plotted value columns for wide visuals."
              },
              "category": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed category column for pie or category-based visuals."
              },
              "hidden_columns": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                },
                "description": "Helper columns that should stay hidden from the visual output."
              }
            },
            "required": [
              "shape",
              "x",
              "series",
              "value",
              "values",
              "category",
              "hidden_columns"
            ],
            "additionalProperties": false
          },
          "sorting": {
            "type": "object",
            "description": "Optional visual sort instruction. Use this when the rendered items should follow a specific order. Helper columns used only for sorting can be listed in visual_mapping.hidden_columns.",
            "properties": {
              "target": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "x",
                  "series",
                  "value",
                  "category",
                  null
                ],
                "description": "Which visual role should be ordered."
              },
              "by": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Column or helper column used to sort the visual."
              },
              "direction": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "asc",
                  "desc",
                  null
                ],
                "description": "Sort direction."
              }
            },
            "required": [
              "target",
              "by",
              "direction"
            ],
            "additionalProperties": false
          },
          "sql_query": {
            "type": "string"
          },
          "transform_sql": {
            "type": "string",
            "description": "Optional DuckDB SQL to reshape API data before visualization (use table api_data)."
          }
        },
        "required": [
          "assistant_response",
          "action_summary",
          "x_label",
          "y_label",
          "title",
          "visual_mapping",
          "sorting",
          "sql_query",
          "transform_sql"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "ReplaceVisual",
      "description": "Change a saved data visual's kind when the user requests a different representation. Inspect the source and target capability first. Supply its revision and the target definition. Preserves logical identity, page, connection, filters and assistant history atomically. Returns undo. Same-kind SQL or styling edits use UpdateVisual.",
      "effect": "visual",
      "registeredScopes": [
        "artifact",
        "datachat"
      ],
      "availableScopes": [
        "artifact",
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "visual_type": {
            "type": "string",
            "enum": [
              "barGraph",
              "barChart",
              "lineGraph",
              "pieChart",
              "scatterPlot",
              "dataTable",
              "dataCard",
              "shape",
              "textBox",
              "declarativeChart"
            ],
            "description": "Canonical visual kind. dataCard is a KPI; dataTable is a table. InspectVisualCapabilities lists labels and rendering details."
          },
          "visual_id": {
            "type": "string",
            "description": "Stable visualUid from inspection."
          },
          "expected_revision": {
            "type": "string"
          },
          "target_type": {
            "type": "string",
            "enum": [
              "barGraph",
              "barChart",
              "lineGraph",
              "pieChart",
              "scatterPlot",
              "dataTable",
              "dataCard",
              "shape",
              "textBox",
              "declarativeChart"
            ],
            "description": "Canonical visual kind. dataCard is a KPI; dataTable is a table. InspectVisualCapabilities lists labels and rendering details."
          },
          "definition_json": {
            "type": "string"
          }
        },
        "required": [
          "visual_type",
          "visual_id",
          "expected_revision",
          "target_type",
          "definition_json"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "RestoreDefaultAppearance",
      "description": "Reset the currently selected visual's appearance back to the default settings. Use this when the user asks to restore defaults or remove custom styling. No arguments are required.",
      "effect": "visual",
      "registeredScopes": [
        "artifact"
      ],
      "availableScopes": [
        "artifact"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "assistant_response": {
            "type": "string",
            "description": "User-facing response to show in chat (1-3 sentences, no internal reasoning)."
          },
          "action_summary": {
            "type": "string",
            "description": "2-7 word, user-facing summary of the action for the action log (no punctuation if possible)."
          },
          "action_type": {
            "type": "string",
            "enum": [
              "explore_sql",
              "update_visual",
              "update_persistent_filters",
              "create_visual",
              "replace_visual",
              "update_appearance",
              "restore_appearance"
            ],
            "description": "Required action classification so the UI can label the action precisely. Use explore_sql for read-only data exploration, update_visual for SQL changes that update an existing visual, update_persistent_filters when changing backend persistent visual filters, create_visual for net-new visuals, replace_visual when converting/replacing a visual, update_appearance for styling changes, and restore_appearance for resetting styling."
          }
        },
        "required": [
          "assistant_response",
          "action_summary",
          "action_type"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "ReuseAsset",
      "description": "Import an exact embedded/original image from an inspected file into this report's private asset library. Idempotent by content; survives removal of the source upload. Returns a stable unity-asset reference for HTML img src, CSS url(), SVG href or a JavaScript image source. Never reproduce base64 bytes. This imports media only; use PatchHtmlSource/SaveHtmlVisuals to place it, then PreviewHtmlPage.",
      "effect": "read",
      "registeredScopes": [
        "datachat"
      ],
      "availableScopes": [
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "fileId": {
            "type": "string"
          },
          "assetId": {
            "type": "string"
          }
        },
        "required": [
          "fileId",
          "assetId"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "SaveHtmlVisuals",
      "description": "Create/update individually registered custom visuals and optionally compose page HTML in one atomic save. Source strings are direct, not JSON-encoded. Top-level data:[]/visuals:[] preserve registrations. Each supplied visual replaces its full source and bindings; bindings:[] gives it no dataset access. html:null preserves composition. A save still needs PreviewHtmlPage and visual inspection.",
      "effect": "html",
      "registeredScopes": [
        "datachat"
      ],
      "availableScopes": [
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "baseRevision": {
            "type": "integer"
          },
          "pageId": {
            "type": "string"
          },
          "data": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "connectionId": {
                  "type": "integer"
                },
                "sql": {
                  "type": "string"
                },
                "paging": {
                  "type": "boolean"
                }
              },
              "required": [
                "id",
                "title",
                "connectionId",
                "sql",
                "paging"
              ],
              "additionalProperties": false
            }
          },
          "visuals": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "bindings": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "dataId": {
                        "type": "string"
                      },
                      "roles": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "role": {
                              "type": "string",
                              "enum": [
                                "category",
                                "x",
                                "series",
                                "value",
                                "hidden"
                              ]
                            },
                            "column": {
                              "type": "string"
                            }
                          },
                          "required": [
                            "role",
                            "column"
                          ],
                          "additionalProperties": false
                        }
                      }
                    },
                    "required": [
                      "dataId",
                      "roles"
                    ],
                    "additionalProperties": false
                  },
                  "description": "Complete dataset access for this visual. Tables use [{dataId:'details',roles:[]}]. bindings:[] means NO datasets, not preserve previous bindings. dataIds are derived from these bindings."
                },
                "html": {
                  "type": "string"
                },
                "css": {
                  "type": "string"
                },
                "script": {
                  "type": "string"
                }
              },
              "required": [
                "id",
                "title",
                "bindings",
                "html",
                "css",
                "script"
              ],
              "additionalProperties": false
            }
          },
          "html": {
            "type": [
              "string",
              "null"
            ]
          },
          "label": {
            "type": "string"
          }
        },
        "required": [
          "baseRevision",
          "pageId",
          "data",
          "visuals",
          "html",
          "label"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "SearchFile",
      "description": "Search literal text across a file's readable source, slides, document pages or all spreadsheet cells/formulas. sectionId:null searches the whole file. Returns excerpts with locations usable by ReadFile. offset counts matches, limit is 1-50; follow hasMore/nextOffset. Encoded image bytes are excluded. Use to locate logos, CSS selectors, headings and named ranges before reading nearby source.",
      "effect": "read",
      "registeredScopes": [
        "artifact",
        "datachat"
      ],
      "availableScopes": [
        "artifact",
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "fileId": {
            "type": "string"
          },
          "query": {
            "type": "string"
          },
          "sectionId": {
            "type": [
              "string",
              "null"
            ]
          },
          "offset": {
            "type": "integer"
          },
          "limit": {
            "type": "integer"
          },
          "caseSensitive": {
            "type": "boolean"
          }
        },
        "required": [
          "fileId",
          "query",
          "sectionId",
          "offset",
          "limit",
          "caseSensitive"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "TestHtmlPage",
      "description": "Run your own JavaScript assertions and measurements in a disposable saved-page browser, then inspect its screenshot. script is an async function BODY with check(name,boolean,actual?,expected?) and record(name,value). May click authored controls or inspect DOM; cannot save the report, use arbitrary network/server access, or test host navigation/cross-filtering. Read Unity's testing guide first. Returns individual checks/errors and observations, not a verdict that the user request is complete.",
      "effect": "read",
      "registeredScopes": [
        "datachat"
      ],
      "availableScopes": [
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "pageId": {
            "type": "string"
          },
          "script": {
            "type": "string"
          },
          "width": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 320,
            "maximum": 1920
          },
          "height": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 240,
            "maximum": 1200
          },
          "theme": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "light",
              "dark",
              "system",
              null
            ]
          }
        },
        "required": [
          "pageId",
          "script",
          "width",
          "height",
          "theme"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "UndoChange",
      "description": "Reverse a saved change using its changeId from the mutation result or InspectChanges. Uses its original snapshot; refuses to overwrite conflicting later authored changes. The undo itself has a receipt and can be undone again to redo.",
      "effect": "visual",
      "registeredScopes": [
        "artifact",
        "datachat"
      ],
      "availableScopes": [
        "artifact",
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "change_id": {
            "type": "string",
            "description": "Exact changeId returned by a successful native mutation or InspectChanges."
          }
        },
        "required": [
          "change_id"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "UpdateChatPreview",
      "description": "Edit an existing inline chat preview in place, preserving its source conversation. Inspect first for expected_revision. changes_json contains native visual definition fields; omitted fields are preserved, customization:null restores defaults. visual_type:null keeps its type. This never creates or updates a canvas visual.",
      "effect": "visual",
      "registeredScopes": [
        "artifact",
        "datachat"
      ],
      "availableScopes": [
        "artifact",
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "data_chat_id": {
            "type": "integer"
          },
          "message_id": {
            "type": "integer"
          },
          "expected_revision": {
            "type": "string"
          },
          "changes_json": {
            "type": "string"
          },
          "visual_type": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              null,
              "lineGraph",
              "barGraph",
              "barChart",
              "pieChart",
              "scatterPlot",
              "dataCard",
              "dataTable",
              "declarativeChart"
            ]
          }
        },
        "required": [
          "data_chat_id",
          "message_id",
          "expected_revision",
          "changes_json",
          "visual_type"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "UpdateDataDefinition",
      "description": "Intentionally update an existing shared field or measure when the user explicitly asks to change its logic or meaning. Inspect it first. The model validates its dependencies and rejects stale versions. Existing queries referencing this field use the new definition. For a distinct concept, register a new definition instead. Null change values mean unchanged; an empty description clears it.",
      "effect": "definitions",
      "registeredScopes": [
        "artifact",
        "datachat"
      ],
      "availableScopes": [
        "artifact",
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "connection_id": {
            "type": [
              "integer",
              "null"
            ]
          },
          "definition_id": {
            "type": "integer"
          },
          "expected_model_revision": {
            "type": "integer",
            "minimum": 0
          },
          "expected_definition_version": {
            "type": "integer",
            "minimum": 1
          },
          "sql_expression": {
            "type": [
              "string",
              "null"
            ]
          },
          "description": {
            "type": [
              "string",
              "null"
            ]
          },
          "canonical_type": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "connection_id",
          "definition_id",
          "expected_model_revision",
          "expected_definition_version",
          "sql_expression",
          "description",
          "canonical_type"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "UpdateFilters",
      "description": "Add, edit, remove, or clear persistent visual/page/report filters. These remain visible and editable in Unity's filter panel. Use the scope the user asks for; page/report scopes work even if they currently have no filters. InspectDataModel supplies typed filter fields. merge_with_existing=true adds/updates predicates; false replaces the scope, and [] clears it. Prefer saved filters to hardcoded SQL WHERE clauses for user-facing constraints.",
      "effect": "visual",
      "registeredScopes": [
        "artifact",
        "datachat"
      ],
      "availableScopes": [
        "artifact",
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "scope": {
            "type": "string",
            "enum": [
              "visual",
              "page",
              "report"
            ]
          },
          "page_id": {
            "type": [
              "string",
              "null"
            ],
            "description": "Stable pageId from InspectReport."
          },
          "visual_type": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "barGraph",
              "barChart",
              "lineGraph",
              "pieChart",
              "scatterPlot",
              "dataTable",
              "dataCard",
              "shape",
              "textBox",
              "declarativeChart",
              null
            ],
            "description": "Canonical visual kind. dataCard is a KPI; dataTable is a table. InspectVisualCapabilities lists labels and rendering details."
          },
          "visual_id": {
            "type": [
              "string",
              "null"
            ],
            "description": "Stable visualUid from inspection."
          },
          "connection_id": {
            "type": [
              "integer",
              "null"
            ]
          },
          "filters": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "column": {
                  "type": "string",
                  "description": "Connection-model field/alias to filter."
                },
                "operator": {
                  "type": "string",
                  "enum": [
                    "equals",
                    "not_equals",
                    "contains",
                    "not_contains",
                    "starts_with",
                    "ends_with",
                    "in",
                    "not_in",
                    "gt",
                    "gte",
                    "lt",
                    "lte",
                    "before",
                    "after",
                    "on_or_before",
                    "on_or_after",
                    "between",
                    "is_null",
                    "is_not_null"
                  ],
                  "description": "Filter operator."
                },
                "value": {
                  "type": [
                    "string",
                    "number",
                    "boolean",
                    "null"
                  ],
                  "description": "Single value for equals/contains/gt/gte/lt/lte operators."
                },
                "values": {
                  "type": [
                    "array",
                    "null"
                  ],
                  "items": {
                    "type": [
                      "string",
                      "number",
                      "boolean"
                    ]
                  },
                  "description": "Value list for in/between operators."
                },
                "label": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Optional display label."
                },
                "expression": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Optional SQL expression for this filter field."
                },
                "sourceEntityKey": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Optional source entity key from the connection model."
                },
                "sourceColumns": {
                  "type": [
                    "array",
                    "null"
                  ],
                  "items": {
                    "type": "string"
                  },
                  "description": "Optional source columns backing this filter."
                },
                "sourcePrimaryKeyColumns": {
                  "type": [
                    "array",
                    "null"
                  ],
                  "items": {
                    "type": "string"
                  },
                  "description": "Optional source primary key columns."
                }
              },
              "required": [
                "column",
                "operator",
                "value",
                "values",
                "label",
                "expression",
                "sourceEntityKey",
                "sourceColumns",
                "sourcePrimaryKeyColumns"
              ],
              "additionalProperties": false
            }
          },
          "merge_with_existing": {
            "type": "boolean"
          }
        },
        "required": [
          "scope",
          "page_id",
          "visual_type",
          "visual_id",
          "connection_id",
          "filters",
          "merge_with_existing"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "UpdateHtmlPage",
      "description": "Apply one atomic, undoable document operation. See the operation examples in instructions.",
      "effect": "html",
      "registeredScopes": [
        "datachat"
      ],
      "availableScopes": [
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "baseRevision": {
            "type": "integer"
          },
          "operation": {
            "type": "string"
          },
          "label": {
            "type": "string"
          }
        },
        "required": [
          "baseRevision",
          "operation",
          "label"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "UpdateMultipleVisualAppearance",
      "description": "Update appearance settings for each selected visual. Return one object per visual that includes visual_id, visual_type, and appearance_json (JSON string). Include position details for every visual. Do not omit any keys unless you are intentionally leaving them unchanged.",
      "effect": "visual",
      "registeredScopes": [],
      "availableScopes": [],
      "parameters": {
        "type": "object",
        "properties": {
          "visual_updates": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "visual_id": {
                  "type": [
                    "string",
                    "number"
                  ],
                  "description": "The visual identifier."
                },
                "visual_type": {
                  "type": "string",
                  "description": "The type of the visual (barGraph, dataCard, etc.)."
                },
                "appearance_json": {
                  "type": "string",
                  "description": "Fully structured appearance config encoded as a JSON string."
                },
                "position": {
                  "type": "object",
                  "properties": {
                    "x": {
                      "type": "number"
                    },
                    "y": {
                      "type": "number"
                    },
                    "width": {
                      "type": "number"
                    },
                    "height": {
                      "type": "number"
                    },
                    "zIndex": {
                      "type": "number"
                    }
                  },
                  "required": [
                    "x",
                    "y",
                    "width",
                    "height",
                    "zIndex"
                  ],
                  "additionalProperties": false,
                  "description": "Position and size for the visual."
                }
              },
              "required": [
                "visual_id",
                "visual_type",
                "appearance_json",
                "position"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "visual_updates"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "UpdatePage",
      "description": "Edit a page name, canvas dimensions, canvas background and outer background. InspectReport supplies saved settings and resolved canvasBounds. Returns the resulting bounds and undo; visuals are preserved. Dimensions are logical canvas pixels, independent of zoom.",
      "effect": "page",
      "registeredScopes": [
        "artifact",
        "datachat"
      ],
      "availableScopes": [
        "artifact",
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "page_id": {
            "type": "string"
          },
          "name": {
            "type": [
              "string",
              "null"
            ]
          },
          "viewport_json": {
            "type": [
              "string",
              "null"
            ],
            "description": "JSON patch with width, height (1–3000), backgroundColor, outerBackgroundColor. Null dimensions use finite browser-responsive sizing, never an unlimited canvas. Omit fields to preserve them; null patch preserves all settings."
          }
        },
        "required": [
          "page_id",
          "name",
          "viewport_json"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "UpdateVisual",
      "description": "Edit a native visual on any page. Supply the revision from the current selected-visual snapshot or InspectVisual. changes_json is a small JSON object with only the intended changes: title, customization, sql_query, output_contract, position, pageId; optional x_label/y_label for charts, subtitle for cards, graph_type for bars, shapeType for shapes, columnConfig or columns for tables, renderer_spec for declarativeChart. InspectVisualCapabilities supplies the kind-specific change schema. Appearance merges; arrays replace. Presentation edits do not run SQL. Existing business logic changes require the user's intent. Stale revisions fail visibly; inspect again and reason before retrying.",
      "effect": "visual",
      "registeredScopes": [
        "artifact",
        "datachat"
      ],
      "availableScopes": [
        "artifact",
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "visual_type": {
            "type": "string",
            "enum": [
              "barGraph",
              "barChart",
              "lineGraph",
              "pieChart",
              "scatterPlot",
              "dataTable",
              "dataCard",
              "shape",
              "textBox",
              "declarativeChart"
            ],
            "description": "Canonical visual kind. dataCard is a KPI; dataTable is a table. InspectVisualCapabilities lists labels and rendering details."
          },
          "visual_id": {
            "type": "string",
            "description": "Stable visualUid from inspection."
          },
          "expected_revision": {
            "type": "string"
          },
          "changes_json": {
            "type": "string",
            "description": "JSON patch of editable fields shown in inspection. When SQL output aliases change, include output_contract with matching roles and sorting in this same patch. InspectVisualCapabilities section=changes provides the schema."
          }
        },
        "required": [
          "visual_type",
          "visual_id",
          "expected_revision",
          "changes_json"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "UpdateVisualAppearance",
      "description": "Update the appearance configuration for the currently selected visual. Use this only when the user explicitly asks to change styling, colors, fonts, or other appearance settings. Provide JSON only in appearance_json; do not return it in assistant text unless the user explicitly asks for the JSON.",
      "effect": "visual",
      "registeredScopes": [
        "artifact"
      ],
      "availableScopes": [
        "artifact"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "assistant_response": {
            "type": "string",
            "description": "User-facing response to show in chat (1-3 sentences, no internal reasoning)."
          },
          "action_summary": {
            "type": "string",
            "description": "2-7 word, user-facing summary of the action for the action log (no punctuation if possible)."
          },
          "action_type": {
            "type": "string",
            "enum": [
              "explore_sql",
              "update_visual",
              "update_persistent_filters",
              "create_visual",
              "replace_visual",
              "update_appearance",
              "restore_appearance"
            ],
            "description": "Required action classification so the UI can label the action precisely. Use explore_sql for read-only data exploration, update_visual for SQL changes that update an existing visual, update_persistent_filters when changing backend persistent visual filters, create_visual for net-new visuals, replace_visual when converting/replacing a visual, update_appearance for styling changes, and restore_appearance for resetting styling."
          },
          "appearance_json": {
            "type": "string",
            "description": "JSON string containing appearance config overrides to apply to the visual."
          }
        },
        "required": [
          "assistant_response",
          "action_summary",
          "action_type",
          "appearance_json"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "UpdateVisualProperties",
      "description": "Update non-data properties of the currently selected visual without regenerating or rerunning its query. Use this for title changes, chart axis-label changes, data-card subtitle changes, and canvas layout changes such as moving, resizing, or placing the selected visual relative to another visual. Use relation='keep' when layout should not change.",
      "effect": "visual",
      "registeredScopes": [
        "artifact"
      ],
      "availableScopes": [
        "artifact"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "assistant_response": {
            "type": "string",
            "description": "User-facing response to show in chat (1-3 sentences, no internal reasoning)."
          },
          "action_summary": {
            "type": "string",
            "description": "2-7 word, user-facing summary of the action for the action log (no punctuation if possible)."
          },
          "action_type": {
            "type": "string",
            "enum": [
              "explore_sql",
              "update_visual",
              "update_persistent_filters",
              "create_visual",
              "replace_visual",
              "update_appearance",
              "restore_appearance"
            ],
            "description": "Required action classification so the UI can label the action precisely. Use explore_sql for read-only data exploration, update_visual for SQL changes that update an existing visual, update_persistent_filters when changing backend persistent visual filters, create_visual for net-new visuals, replace_visual when converting/replacing a visual, update_appearance for styling changes, and restore_appearance for resetting styling."
          },
          "title": {
            "type": [
              "string",
              "null"
            ],
            "description": "New title for the selected visual, or null to preserve the current title."
          },
          "subtitle": {
            "type": [
              "string",
              "null"
            ],
            "description": "New subtitle for a selected data card, or null to preserve it. Use null for visual types that do not support subtitles."
          },
          "x_label": {
            "type": [
              "string",
              "null"
            ],
            "description": "New x-axis label for a chart visual, or null to preserve it. Use null for visual types that do not support axes."
          },
          "y_label": {
            "type": [
              "string",
              "null"
            ],
            "description": "New y-axis label for a chart visual, or null to preserve it. Use null for visual types that do not support axes."
          },
          "layout": {
            "type": "object",
            "description": "Canvas layout update. Relative placement is resolved deterministically by the application; absolute coordinates and dimensions may be supplied only when explicitly requested.",
            "properties": {
              "relation": {
                "type": "string",
                "enum": [
                  "keep",
                  "absolute",
                  "below",
                  "above",
                  "left",
                  "right"
                ]
              },
              "relative_visual_id": {
                "type": [
                  "string",
                  "number",
                  "null"
                ],
                "description": "Reference visual identifier for below/above/left/right placement. Use null only when exactly one visual of relative_visual_type exists in the canvas context."
              },
              "relative_visual_type": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Reference visual type for relative placement."
              },
              "x": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "y": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "width": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "height": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "zIndex": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "gap": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Spacing in pixels for relative placement; null uses the application default."
              }
            },
            "required": [
              "relation",
              "relative_visual_id",
              "relative_visual_type",
              "x",
              "y",
              "width",
              "height",
              "zIndex",
              "gap"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "assistant_response",
          "action_summary",
          "action_type",
          "title",
          "subtitle",
          "x_label",
          "y_label",
          "layout"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "VerifyHtmlPage",
      "description": "Read renderer execution feedback: data readiness and reported query, binding, runtime or resource errors. This does not test layout, template fidelity, interactions, values or request completion. Use PreviewHtmlPage for an image and TestHtmlPage for your own browser checks.",
      "effect": "read",
      "registeredScopes": [
        "datachat"
      ],
      "availableScopes": [
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "pageId": {
            "type": "string"
          }
        },
        "required": [
          "pageId"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "generate_sql_query_function",
      "description": "Return a read-only query to run against the user's DB, or API query JSON for API connections. Use this only for data exploration and question-answering. Do not use this tool when the user explicitly asks to create, make, build, show, or generate a chart, graph, plot, data table, data card, or other visual from chat; use the matching Create*FromChatFunction instead so the UI can render it inline. This query will return you the database results that you can summarize for the user.",
      "effect": "query",
      "registeredScopes": [
        "artifact",
        "datachat"
      ],
      "availableScopes": [
        "artifact",
        "datachat"
      ],
      "parameters": {
        "type": "object",
        "properties": {
          "assistant_response": {
            "type": "string",
            "description": "User-facing response to show in chat (1-3 sentences, no internal reasoning)."
          },
          "action_summary": {
            "type": "string",
            "description": "2-7 word, user-facing summary of the action for the action log (no punctuation if possible)."
          },
          "action_type": {
            "type": "string",
            "enum": [
              "explore_sql",
              "update_visual",
              "update_persistent_filters",
              "create_visual",
              "replace_visual",
              "update_appearance",
              "restore_appearance"
            ],
            "description": "Required action classification so the UI can label the action precisely. Use explore_sql for read-only data exploration, update_visual for SQL changes that update an existing visual, update_persistent_filters when changing backend persistent visual filters, create_visual for net-new visuals, replace_visual when converting/replacing a visual, update_appearance for styling changes, and restore_appearance for resetting styling."
          },
          "sql_query": {
            "type": "string"
          },
          "transform_sql": {
            "type": "string",
            "description": "Optional DuckDB SQL to reshape API data before visualization (use table api_data)."
          },
          "data_definitions": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "alias_name": {
                  "type": "string",
                  "description": "User-facing field/measure name to register."
                },
                "description": {
                  "type": "string",
                  "description": "Business meaning, including relevant inclusions, exclusions, units and date interpretation. State uncertainty; do not invent business rules."
                },
                "sql_expression": {
                  "type": "string",
                  "description": "SQL expression that defines the field/measure."
                },
                "definition_type": {
                  "type": "string",
                  "enum": [
                    "direct_column",
                    "derived_column",
                    "measure"
                  ],
                  "description": "Type of definition being registered."
                },
                "canonical_type": {
                  "type": "string",
                  "enum": [
                    "string",
                    "integer",
                    "decimal",
                    "boolean",
                    "date",
                    "datetime",
                    "json",
                    "unknown"
                  ],
                  "description": "Canonical data type for this definition."
                },
                "source_entity_key": {
                  "type": "string",
                  "description": "Owning connection-model entity key for this definition."
                },
                "source_columns": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "description": "Backing fields from source_entity_key that this definition depends on."
                }
              },
              "required": [
                "alias_name",
                "description",
                "sql_expression",
                "definition_type",
                "canonical_type",
                "source_entity_key",
                "source_columns"
              ],
              "additionalProperties": false
            },
            "description": "List of new reusable fields/measures that must be registered before executing sql_query. Return only net-new registrations here; do not repeat aliases that already exist in the provided data model context. Existing direct/derived model fields are already queryable as columns on their owning entity. Existing measures may be referenced in sql_query through an entity-qualified alias (for example, a.[TotalCost]); the backend expands them into executable SQL. Each new item must declare the owning source_entity_key and the backing source_columns. If the query uses only existing model fields/measures and introduces nothing new, return an empty array."
          },
          "visual_mapping": {
            "type": "object",
            "description": "Light visual mapping for the SQL result. Use x/category for the displayed axis label, series for grouped/stacked breakdowns, value or values for the plotted measure column(s), and hidden_columns for helper columns that should not be shown.",
            "properties": {
              "shape": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "wide",
                  "long",
                  null
                ],
                "description": "Optional result shape hint for the visual."
              },
              "x": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed x-axis or category column."
              },
              "series": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed series or legend column for grouped/stacked visuals."
              },
              "value": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Primary plotted value column."
              },
              "values": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                },
                "description": "Visible plotted value columns for wide visuals."
              },
              "category": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Displayed category column for pie or category-based visuals."
              },
              "hidden_columns": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                },
                "description": "Helper columns that should stay hidden from the visual output."
              }
            },
            "required": [
              "shape",
              "x",
              "series",
              "value",
              "values",
              "category",
              "hidden_columns"
            ],
            "additionalProperties": false
          },
          "sorting": {
            "type": "object",
            "description": "Optional visual sort instruction. Use this when the rendered items should follow a specific order. Helper columns used only for sorting can be listed in visual_mapping.hidden_columns.",
            "properties": {
              "target": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "x",
                  "series",
                  "value",
                  "category",
                  null
                ],
                "description": "Which visual role should be ordered."
              },
              "by": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Column or helper column used to sort the visual."
              },
              "direction": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "asc",
                  "desc",
                  null
                ],
                "description": "Sort direction."
              }
            },
            "required": [
              "target",
              "by",
              "direction"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "assistant_response",
          "action_summary",
          "action_type",
          "sql_query",
          "transform_sql",
          "data_definitions",
          "visual_mapping",
          "sorting"
        ],
        "additionalProperties": false
      },
      "strict": true
    },
    {
      "name": "reply_to_user",
      "description": "Signals that the agent is done reasoning and ready to speak to the human.",
      "effect": "read",
      "registeredScopes": [
        "datachat"
      ],
      "availableScopes": [],
      "parameters": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      },
      "strict": true
    }
  ],
  "topics": {
    "index": "Unity agent documentation",
    "html-authoring": "HTML authoring process and renderer API",
    "testing": "Execution diagnostics, screenshots and custom browser checks",
    "files": "Report files, templates and exact asset reuse",
    "continuity": "Conversation scope and page continuity",
    "visual-editing": "Shared chat, selected visuals and inline previews",
    "tools": "All registered tools and their current availability"
  }
}
