/* ┌──────────────────────────────────────────────────────────────────┐ │ Author: Ivan Murzak (https://github.com/IvanMurzak) │ │ Repository: GitHub (https://github.com/IvanMurzak/Unity-MCP) │ │ Copyright (c) 2025 Ivan Murzak │ │ Licensed under the Apache License, Version 2.0. │ │ See the LICENSE file in the project root for more information. │ └──────────────────────────────────────────────────────────────────┘ */ #nullable enable using System; using System.Linq; using System.Threading; using com.IvanMurzak.McpPlugin.Common.Utils; using com.IvanMurzak.ReflectorNet.Utils; using com.IvanMurzak.Unity.MCP.Editor.UI.Controls; using com.IvanMurzak.Unity.MCP.Editor.Utils; using Microsoft.Extensions.Logging; using R3; using UnityEngine; using UnityEngine.UIElements; using TransportMethod = com.IvanMurzak.McpPlugin.Common.Consts.MCP.Server.TransportMethod; namespace com.IvanMurzak.Unity.MCP.Editor.UI { public partial class MainWindowEditor { internal static bool IsMcpServerControlEnabled(TransportMethod transport) => transport != TransportMethod.stdio; private void SetupAiAgentSection(VisualElement root) { UnityMcpPluginEditor.PluginProperty .WhereNotNull() .Subscribe(plugin => { plugin.McpManager.OnClientConnected .Subscribe(data => { Logger.LogInformation("On AI agent connected: {clientName} ({clientVersion})", data.ClientName, data.ClientVersion); if (Logger.IsEnabled(Microsoft.Extensions.Logging.LogLevel.Trace)) Logger.LogTrace("AI Agent Data: {data}", data.ToPrettyJson()); }) .AddTo(_disposables); plugin.McpManager.OnClientDisconnected .Subscribe(mcpClientData => { Logger.LogInformation("On AI agent disconnected: {clientName} ({clientVersion})", mcpClientData.ClientName, mcpClientData.ClientVersion); }) .AddTo(_disposables); plugin.McpManager.OnClientsChanged .ObserveOnCurrentSynchronizationContext() .Subscribe(mcpClients => { Logger.LogDebug("On AI agents changed: {count} clients", mcpClients.Count); var connectedAgents = mcpClients.Where(c => c.IsConnected).ToList(); if (connectedAgents.Count == 0) { Logger.LogDebug("No connected AI agents found in clients list."); SetAiAgentStatus(false); return; } SetAiAgentStatus(true, connectedAgents.Select(a => $"AI agent: {a.ClientName} ({a.ClientVersion})")); }) .AddTo(_disposables); FetchAiAgentData(); }).AddTo(_disposables); UnityMcpPluginEditor.IsConnected .Where(isConnected => isConnected) .ObserveOnCurrentSynchronizationContext() .Subscribe(_ => FetchAiAgentData()) .AddTo(_disposables); var containerMcpServer = root.Q("mcpServerStatusControl") ?? throw new InvalidOperationException("mcpServerStatusControl element not found."); var btnStartStopMcpServer = root.Q