src/TechToolbox.Agent/Execution/PowerShellBridge.cs
|
using System.Management.Automation;
using TechToolbox.Agent.Agent; namespace TechToolbox.Agent.Execution; public static class PowerShellBridge { public static object? RunTool(string toolName, IDictionary<string, object?> args) { if (string.IsNullOrWhiteSpace(toolName)) throw new ArgumentException("Tool name must not be empty.", nameof(toolName)); // Safety check for destructive tools Safety.RequireDestructiveConfirmation(toolName, args); using var ps = PowerShell.Create(); // Import the TechToolbox module explicitly // (Assumes the module is discoverable via PSModulePath) ps.AddCommand("Import-Module") .AddParameter("Name", "TechToolbox") .AddParameter("ErrorAction", "Stop") .Invoke(); if (ps.HadErrors) throw new InvalidOperationException($"Failed to import TechToolbox module: {ps.Streams.Error[0]}"); ps.Commands.Clear(); // Add the tool command ps.AddCommand(toolName); // Add parameters foreach (var kv in args) { // Skip internal agent control keys if (kv.Key.StartsWith("__", StringComparison.Ordinal)) continue; ps.AddParameter(kv.Key, kv.Value); } // Execute var results = ps.Invoke(); if (ps.HadErrors) throw new InvalidOperationException($"Tool '{toolName}' failed: {ps.Streams.Error[0]}"); // Normalize output if (results is null || results.Count == 0) return null; if (results.Count == 1) return results[0].BaseObject; return results.Select(r => r.BaseObject).ToList(); } } |