namespace LehrerApp.Core.Mcp; /// /// Named-Pipe-Konvention zwischen dem Avalonia-Hauptprozess (Pipe-Server, siehe /// LehrerApp.Desktop/Services/Mcp) und LehrerApp.McpBridge (Pipe-Client). Bewusst als einzelne /// geteilte Konstante statt eigener Bibliothek — die Bridge reicht JSON-RPC-Nachrichten unverändert /// durch und braucht sonst keine gemeinsamen Typen mit der App (siehe Planungsdokument). /// public static class McpPipeConstants { public const string PipeName = "LehrerApp.Mcp"; /// /// Unter macOS/Linux emuliert .NET Named Pipes über eine Socket-Datei unter /// (intern "CoreFxPipe_" + Name), und die liest dafür die /// TMPDIR-Umgebungsvariable des jeweiligen Prozesses. LehrerApp.Desktop (von Finder/Dock /// gestartet) bekommt das reguläre per-Login-Session-TMPDIR unter /var/folders/.../T, /// während LehrerApp.McpBridge als Kindprozess von Claude Desktop oft eine reduzierte /// Umgebung mit TMPDIR=/tmp erbt - beide Prozesse suchen die Pipe-Datei dann an /// unterschiedlichen Orten und finden sich nie ("MCP nicht erreichbar, obwohl LehrerApp /// läuft", auch wenn beide Prozesse laufen und die Pipe grundsätzlich offen ist). Fix: TMPDIR /// für beide Prozesse hart auf denselben Ordner setzen, bevor die erste /// NamedPipeServerStream/-ClientStream-Instanz entsteht - dieselbe ApplicationData-Basis wie /// AppBootstrapper (siehe dort) wird anders als TMPDIR zuverlässig an Kindprozesse /// weitergereicht. Muss als eine der ersten Anweisungen in Main aufgerufen werden (Desktop wie /// Bridge), auf Windows ein No-op (dort nutzen Named Pipes den Kernel-Namespace, keine /// Socket-Datei). /// public static void EnsureStableUnixSocketDirectory() { if (OperatingSystem.IsWindows()) return; var dir = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "LehrerApp", "ipc"); Directory.CreateDirectory(dir); Environment.SetEnvironmentVariable("TMPDIR", dir); } }