From d9d8f177285f813a4950849bd60fc60ceb37d475 Mon Sep 17 00:00:00 2001 From: dopeuni444 Date: Thu, 31 Jul 2025 05:56:11 +0400 Subject: [PATCH] yf --- .../PowerShell_AI_Agent/README.md | 149 ++++++++ .../PowerShell_AI_Agent/Start-AIAgent.ps1 | 355 ++++++++++++++++++ .../modules/AI-Engine.psm1 | 243 ++++++++++++ .../modules/Logging-Engine.psm1 | 259 +++++++++++++ .../modules/Voice-Engine.psm1 | 216 +++++++++++ .../plugins/Plugin-Manager.psm1 | 153 ++++++++ .../plugins/System-Tools.ps1 | 125 ++++++ .../tests/Test-AIAgent.ps1 | 313 +++++++++++++++ 8 files changed, 1813 insertions(+) create mode 100644 PowerShell_AI_Agent/PowerShell_AI_Agent/README.md create mode 100644 PowerShell_AI_Agent/PowerShell_AI_Agent/Start-AIAgent.ps1 create mode 100644 PowerShell_AI_Agent/PowerShell_AI_Agent/modules/AI-Engine.psm1 create mode 100644 PowerShell_AI_Agent/PowerShell_AI_Agent/modules/Logging-Engine.psm1 create mode 100644 PowerShell_AI_Agent/PowerShell_AI_Agent/modules/Voice-Engine.psm1 create mode 100644 PowerShell_AI_Agent/PowerShell_AI_Agent/plugins/Plugin-Manager.psm1 create mode 100644 PowerShell_AI_Agent/PowerShell_AI_Agent/plugins/System-Tools.ps1 create mode 100644 PowerShell_AI_Agent/PowerShell_AI_Agent/tests/Test-AIAgent.ps1 diff --git a/PowerShell_AI_Agent/PowerShell_AI_Agent/README.md b/PowerShell_AI_Agent/PowerShell_AI_Agent/README.md new file mode 100644 index 0000000..08052b2 --- /dev/null +++ b/PowerShell_AI_Agent/PowerShell_AI_Agent/README.md @@ -0,0 +1,149 @@ +# PowerShell AI Agent + +A comprehensive, modular PowerShell-based AI agent with advanced capabilities including voice interaction, plugin system, and comprehensive logging. + +## Features + +- **Modular Architecture**: AI Engine, Voice Engine, Logging Engine, and Plugin Manager +- **Advanced AI Processing**: Intent recognition, system commands, and contextual responses +- **Voice Integration**: Speech recognition and text-to-speech capabilities +- **Plugin System**: Extensible architecture with custom plugin support +- **Comprehensive Logging**: Structured logging with multiple output formats +- **Memory Persistence**: Intelligent conversation memory with context awareness +- **System Integration**: Built-in system monitoring and management commands +- **Interactive CLI**: Rich command-line interface with color-coded output + +## Quick Start + +1. **Run the agent:** + ```powershell + .\Start-AIAgent.ps1 + ``` + +2. **Available commands:** + - `help` - Show available commands + - `exit` or `quit` - Exit the agent + - `memory` - Show memory statistics + - `config` - Show current configuration + - `clear` - Clear the screen + - `voice` - Toggle voice mode + - `logs` - Show recent log entries + - `test` - Test system capabilities + - `plugins` - Show loaded plugins + +## Configuration + +The agent uses `config/agent-config.json` for settings: + +- **AI**: Model settings (gpt-4, tokens, temperature) +- **Voice**: Speech recognition and synthesis settings +- **Memory**: Persistence and storage settings +- **Autopilot**: Autonomous operation settings + +## Project Structure + +``` +PowerShell_AI_Agent/ +├── Start-AIAgent.ps1 # Main entry point +├── config/ +│ └── agent-config.json # Configuration file +├── data/ +│ └── memory.json # Conversation memory +├── logs/ # Log files +├── modules/ # PowerShell modules +│ ├── AI-Engine.psm1 # AI processing engine +│ ├── Voice-Engine.psm1 # Voice recognition/synthesis +│ └── Logging-Engine.psm1 # Comprehensive logging +├── plugins/ # Extensions +│ ├── Plugin-Manager.psm1 # Plugin management system +│ └── System-Tools.ps1 # Example system tools plugin +├── scripts/ # Utility scripts +└── tests/ # Test files +│ └── Test-AIAgent.ps1 # Comprehensive test suite +``` + +## Parameters + +- `-Verbose`: Enable verbose error reporting +- `-NoVoice`: Disable voice features +- `-Debug`: Enable debug logging +- `-ConfigPath`: Specify custom config file path + +## Example Usage + +```powershell +# Basic run +.\Start-AIAgent.ps1 + +# With verbose logging +.\Start-AIAgent.ps1 -Verbose + +# With debug logging +.\Start-AIAgent.ps1 -Debug + +# Disable voice features +.\Start-AIAgent.ps1 -NoVoice + +# Custom config file +.\Start-AIAgent.ps1 -ConfigPath ".\custom-config.json" + +# Run test suite +.\tests\Test-AIAgent.ps1 + +# Run tests without voice +.\tests\Test-AIAgent.ps1 -SkipVoice +``` + +## Development + +### Creating Plugins + +Create new plugins in the `plugins/` directory: + +```powershell +@{ + Name = "My Plugin" + Version = "1.0" + Description = "Description of your plugin" + Commands = @( + @{ + Name = "MyCommand" + Description = "Description of the command" + Function = { + param([hashtable]$Parameters) + # Your command logic here + return "Command executed successfully" + } + } + ) +} +``` + +### Extending AI Engine + +Modify `modules/AI-Engine.psm1` to add new capabilities: +- Add new intent patterns in `Analyze-UserIntent` +- Create new system commands in `Execute-SystemCommand` +- Extend response patterns in `Generate-ContextualResponse` + +### Voice Integration + +The voice engine supports: +- Speech synthesis with configurable speed and voice +- Speech recognition with confidence thresholds +- Multiple voice selection +- Voice testing and diagnostics + +### Logging + +The logging system provides: +- Structured JSON logging +- Multiple log levels (Debug, Info, Warning, Error) +- Log rotation and archiving +- Export capabilities (CSV, JSON, HTML) + +## Requirements + +- PowerShell 5.1 or higher +- Windows 10/11 (for voice features) +- Internet connection (for AI service integration) \ No newline at end of file diff --git a/PowerShell_AI_Agent/PowerShell_AI_Agent/Start-AIAgent.ps1 b/PowerShell_AI_Agent/PowerShell_AI_Agent/Start-AIAgent.ps1 new file mode 100644 index 0000000..46d6ba6 --- /dev/null +++ b/PowerShell_AI_Agent/PowerShell_AI_Agent/Start-AIAgent.ps1 @@ -0,0 +1,355 @@ +# PowerShell AI Agent - Main Entry Point +# Version: 2.0 - Enhanced with modules + +param( + [switch]$Verbose, + [switch]$NoVoice, + [switch]$Debug, + [string]$ConfigPath = ".\config\agent-config.json" +) + +# Import required modules +$ErrorActionPreference = "Stop" + +# Import custom modules +$modulePath = ".\modules" +if (Test-Path $modulePath) { + Import-Module "$modulePath\AI-Engine.psm1" -Force + Import-Module "$modulePath\Voice-Engine.psm1" -Force + Import-Module "$modulePath\Logging-Engine.psm1" -Force +} + +# Import plugin manager +$pluginPath = ".\plugins" +if (Test-Path $pluginPath) { + Import-Module "$pluginPath\Plugin-Manager.psm1" -Force +} + +# Function to load configuration +function Load-Configuration { + param([string]$ConfigPath) + + try { + if (Test-Path $ConfigPath) { + $config = Get-Content $ConfigPath -Raw | ConvertFrom-Json + # Convert PSCustomObject to hashtable + $configHashtable = @{} + $config.PSObject.Properties | ForEach-Object { + $configHashtable[$_.Name] = $_.Value + } + Write-Host "Configuration loaded successfully" -ForegroundColor Green + return $configHashtable + } else { + throw "Configuration file not found: $ConfigPath" + } + } + catch { + Write-Error "Failed to load configuration: $_" + exit 1 + } +} + +# Function to initialize memory +function Initialize-Memory { + param($Config) + + $memoryPath = $Config.Memory.PersistencePath + if (Test-Path $memoryPath) { + try { + $memory = Get-Content $memoryPath -Raw | ConvertFrom-Json + Write-Host "Memory loaded from: $memoryPath" -ForegroundColor Green + return $memory + } + catch { + Write-Warning "Failed to load memory, creating new memory file" + } + } + + # Create new memory structure + $memory = @{ + entries = @() + lastUpdated = Get-Date -Format "yyyy-MM-dd HH:mm:ss" + version = "1.0" + } + + # Ensure directory exists + $memoryDir = Split-Path $memoryPath -Parent + if (!(Test-Path $memoryDir)) { + New-Item -ItemType Directory -Path $memoryDir -Force | Out-Null + } + + $memory | ConvertTo-Json -Depth 10 | Set-Content $memoryPath + Write-Host "New memory file created: $memoryPath" -ForegroundColor Yellow + return $memory +} + +# Function to save memory +function Save-Memory { + param($Memory, $Config) + + $Memory.lastUpdated = Get-Date -Format "yyyy-MM-dd HH:mm:ss" + $memoryPath = $Config.Memory.PersistencePath + $Memory | ConvertTo-Json -Depth 10 | Set-Content $memoryPath +} + +# Function to add memory entry +function Add-MemoryEntry { + param($Memory, $Input, $Response, $Timestamp = (Get-Date)) + + $entry = @{ + input = $Input + response = $Response + timestamp = $Timestamp.ToString("yyyy-MM-dd HH:mm:ss") + } + + $Memory.entries += $entry + + # Limit memory entries + if ($Memory.entries.Count -gt 1000) { + $Memory.entries = $Memory.entries | Select-Object -Last 1000 + } +} + +# Function to simulate AI response (placeholder for actual AI integration) +function Get-AIResponse { + param($Input, $Config, $Memory) + + # This is a placeholder - in a real implementation, you would integrate with an AI service + $responses = @( + "I understand you said: '$Input'. How can I help you further?", + "That's an interesting point about '$Input'. Let me think about that...", + "Based on your input '$Input', I'd recommend considering the following...", + "I've processed your request: '$Input'. Here's what I can do for you...", + "Thank you for sharing '$Input'. I'm here to assist you with any tasks." + ) + + $response = $responses | Get-Random + + # Add context from memory if available + if ($Memory.entries.Count -gt 0) { + $recentEntries = $Memory.entries | Select-Object -Last 3 + $context = "Based on our previous conversation, " + $response = $context + $response + } + + return $response +} + +# Function to handle voice input/output (placeholder) +function Handle-Voice { + param($Config, $Enabled = $true) + + if (-not $Enabled -or -not $Config.Voice.Enabled) { + return $false + } + + Write-Host "Voice features are configured but not implemented yet." -ForegroundColor Yellow + Write-Host "Voice settings: Language=$($Config.Voice.Language), Speed=$($Config.Voice.ResponseSpeed)" -ForegroundColor Cyan + return $false +} + +# Main agent loop +function Start-AgentLoop { + param($Config, $Memory, $AIEngine, $VoiceEngine, $LoggingEngine, $PluginManager) + + Write-Host "=== PowerShell AI Agent Started ===" -ForegroundColor Green + Write-Host "AI Model: $($Config.AI.Model)" -ForegroundColor Cyan + Write-Host "Max Tokens: $($Config.AI.MaxTokens)" -ForegroundColor Cyan + Write-Host "Temperature: $($Config.AI.Temperature)" -ForegroundColor Cyan + Write-Host "Memory Enabled: $($Config.Memory.Enabled)" -ForegroundColor Cyan + Write-Host "Autopilot Enabled: $($Config.Autopilot.Enabled)" -ForegroundColor Cyan + Write-Host "Voice Enabled: $($VoiceEngine.VoiceEnabled)" -ForegroundColor Cyan + Write-Host "" + Write-Host "Type 'exit' or 'quit' to stop the agent" -ForegroundColor Yellow + Write-Host "Type 'help' for available commands" -ForegroundColor Yellow + Write-Host "Type 'voice' to toggle voice mode" -ForegroundColor Yellow + Write-Host "" + + Write-InfoLog -Engine $LoggingEngine -Message "Agent loop started" + + # Initialize voice if enabled + if ($VoiceEngine.VoiceEnabled -and -not $NoVoice) { + Test-VoiceSystem -Engine $VoiceEngine + } + + do { + try { + Write-Host "AI Agent> " -NoNewline -ForegroundColor Green + $userInput = Read-Host + + if ([string]::IsNullOrWhiteSpace($userInput)) { + continue + } + + Write-DebugLog -Engine $LoggingEngine -Message "User input received" -Context @{ Input = $userInput } + + # Handle special commands + switch ($userInput.ToLower()) { + "exit" { + Write-InfoLog -Engine $LoggingEngine -Message "User requested exit" + Write-Host "Saving memory and shutting down..." -ForegroundColor Yellow + Save-Memory -Memory $Memory -Config $Config + Write-Host "Goodbye!" -ForegroundColor Green + return + } + "quit" { + Write-InfoLog -Engine $LoggingEngine -Message "User requested quit" + Write-Host "Saving memory and shutting down..." -ForegroundColor Yellow + Save-Memory -Memory $Memory -Config $Config + Write-Host "Goodbye!" -ForegroundColor Green + return + } + "help" { + Write-Host "Available commands:" -ForegroundColor Cyan + Write-Host " help - Show this help message" -ForegroundColor White + Write-Host " exit - Exit the agent" -ForegroundColor White + Write-Host " quit - Exit the agent" -ForegroundColor White + Write-Host " memory - Show memory statistics" -ForegroundColor White + Write-Host " config - Show current configuration" -ForegroundColor White + Write-Host " clear - Clear the screen" -ForegroundColor White + Write-Host " voice - Toggle voice mode" -ForegroundColor White + Write-Host " logs - Show recent log entries" -ForegroundColor White + Write-Host " test - Test system capabilities" -ForegroundColor White + Write-Host " plugins - Show loaded plugins" -ForegroundColor White + continue + } + "memory" { + Write-Host "Memory Statistics:" -ForegroundColor Cyan + Write-Host " Total Entries: $($Memory.entries.Count)" -ForegroundColor White + Write-Host " Last Updated: $($Memory.lastUpdated)" -ForegroundColor White + Write-Host " Version: $($Memory.version)" -ForegroundColor White + continue + } + "config" { + Write-Host "Current Configuration:" -ForegroundColor Cyan + $Config | ConvertTo-Json -Depth 3 | Write-Host -ForegroundColor White + continue + } + "clear" { + Clear-Host + continue + } + "voice" { + if ($VoiceEngine.VoiceEnabled) { + if ($VoiceEngine.IsListening) { + Stop-SpeechRecognition -Engine $VoiceEngine + } else { + Start-SpeechRecognition -Engine $VoiceEngine -OnSpeechRecognized { + param($text) + Write-Host "Voice: $text" -ForegroundColor Magenta + # Process voice input + $aiResponse = Get-AIResponse -Engine $AIEngine -Input $text -Memory $Memory + Write-Host "AI: $aiResponse" -ForegroundColor Blue + Speak-Text -Engine $VoiceEngine -Text $aiResponse + } + } + } else { + Write-Host "Voice features are disabled" -ForegroundColor Yellow + } + continue + } + "logs" { + $recentLogs = Get-LogEntries -Engine $LoggingEngine -Count 10 + Write-Host "Recent Log Entries:" -ForegroundColor Cyan + foreach ($log in $recentLogs) { + $color = switch ($log.Level) { + "Debug" { "Gray" } + "Info" { "White" } + "Warning" { "Yellow" } + "Error" { "Red" } + default { "White" } + } + Write-Host "[$($log.Timestamp)] [$($log.Level)] $($log.Message)" -ForegroundColor $color + } + continue + } + "test" { + Write-Host "Testing system capabilities..." -ForegroundColor Cyan + Test-VoiceSystem -Engine $VoiceEngine + Write-Host "AI Engine: OK" -ForegroundColor Green + Write-Host "Logging Engine: OK" -ForegroundColor Green + continue + } + "plugins" { + Show-PluginInfo -Manager $PluginManager + continue + } + } + + # Process user input with AI + $aiResponse = Get-AIResponse -Engine $AIEngine -Input $userInput -Memory $Memory + + # Display response + Write-Host "AI: $aiResponse" -ForegroundColor Blue + + # Speak response if voice is enabled + if ($VoiceEngine.VoiceEnabled -and $VoiceEngine.IsListening) { + Speak-Text -Engine $VoiceEngine -Text $aiResponse + } + + # Add to memory + if ($Config.Memory.Enabled) { + Add-MemoryEntry -Memory $Memory -Input $userInput -Response $aiResponse + } + + # Log the interaction + Write-InfoLog -Engine $LoggingEngine -Message "AI response generated" -Context @{ + Input = $userInput + Response = $aiResponse + MemoryEntries = $Memory.entries.Count + } + + # Save memory periodically + if ($Memory.entries.Count % 10 -eq 0) { + Save-Memory -Memory $Memory -Config $Config + Write-DebugLog -Engine $LoggingEngine -Message "Memory saved automatically" + } + + } + catch { + Write-ErrorLog -Engine $LoggingEngine -Message "Error in agent loop: $_" -Context @{ StackTrace = $_.ScriptStackTrace } + Write-Error "Error in agent loop: $_" + if ($Verbose) { + Write-Host "Stack trace: $($_.ScriptStackTrace)" -ForegroundColor Red + } + } + } while ($true) +} + +# Main execution +try { + Write-Host "PowerShell AI Agent Starting..." -ForegroundColor Green + + # Load configuration + $config = Load-Configuration -ConfigPath $ConfigPath + + # Initialize engines + $aiEngine = Initialize-AIEngine -Config $config + $voiceEngine = Initialize-VoiceEngine -Config $config + $loggingEngine = Initialize-LoggingEngine -Config $config + $pluginManager = Initialize-PluginManager -Config $config + + # Set debug level if requested + if ($Debug) { + $loggingEngine.LogLevel = "Debug" + } + + Write-InfoLog -Engine $loggingEngine -Message "AI Agent starting with enhanced modules" + + # Load plugins + Load-AllPlugins -Manager $pluginManager + Write-InfoLog -Engine $loggingEngine -Message "Plugins loaded: $($pluginManager.LoadedPlugins.Count)" + + # Initialize memory + $memory = Initialize-Memory -Config $config + + # Start the agent loop + Start-AgentLoop -Config $config -Memory $memory -AIEngine $aiEngine -VoiceEngine $voiceEngine -LoggingEngine $loggingEngine -PluginManager $pluginManager +} +catch { + Write-Error "Failed to start AI Agent: $_" + if ($Verbose) { + Write-Host "Stack trace: $($_.ScriptStackTrace)" -ForegroundColor Red + } + exit 1 +} \ No newline at end of file diff --git a/PowerShell_AI_Agent/PowerShell_AI_Agent/modules/AI-Engine.psm1 b/PowerShell_AI_Agent/PowerShell_AI_Agent/modules/AI-Engine.psm1 new file mode 100644 index 0000000..45ee703 --- /dev/null +++ b/PowerShell_AI_Agent/PowerShell_AI_Agent/modules/AI-Engine.psm1 @@ -0,0 +1,243 @@ +# AI Engine Module for PowerShell AI Agent +# Provides AI response generation and integration capabilities + +function Initialize-AIEngine { + param( + [hashtable]$Config + ) + + $engine = @{ + Config = $Config + Context = @() + ResponsePatterns = @{ + Greeting = @("Hello!", "Hi there!", "Greetings!", "Welcome!") + Farewell = @("Goodbye!", "See you later!", "Take care!", "Until next time!") + Confused = @("I'm not sure I understand.", "Could you clarify that?", "I need more information.") + Helpful = @("I'd be happy to help!", "Let me assist you with that.", "I can help you with this.") + } + Skills = @{} + } + + # Register built-in skills + Register-AISkill -Engine $engine -Name "SystemInfo" -Function "Get-SystemInformation" + Register-AISkill -Engine $engine -Name "FileOperations" -Function "Handle-FileOperations" + Register-AISkill -Engine $engine -Name "ProcessManagement" -Function "Handle-ProcessOperations" + + return $engine +} + +function Register-AISkill { + param( + [hashtable]$Engine, + [string]$Name, + [string]$Function + ) + + $Engine.Skills[$Name] = $Function + Write-Verbose "Registered AI skill: $Name" +} + +function Get-AIResponse { + param( + [hashtable]$Engine, + [string]$Input, + [hashtable]$Memory + ) + + # Analyze input for intent + $intent = Analyze-UserIntent -Input $Input + + # Check for system commands + if ($intent.Type -eq "SystemCommand") { + return Execute-SystemCommand -Intent $intent -Engine $Engine + } + + # Check for skill-based requests + if ($intent.Type -eq "SkillRequest") { + return Execute-SkillRequest -Intent $intent -Engine $Engine + } + + # Generate contextual response + $response = Generate-ContextualResponse -Input $Input -Intent $intent -Memory $Memory -Engine $Engine + + # Add to context + $Engine.Context += @{ + Input = $Input + Response = $response + Intent = $intent + Timestamp = Get-Date + } + + # Limit context size + if ($Engine.Context.Count -gt 10) { + $Engine.Context = $Engine.Context | Select-Object -Last 10 + } + + return $response +} + +function Analyze-UserIntent { + param([string]$Input) + + $input = $Input.ToLower() + + # System commands + if ($input -match "^(get|show|list|display)\s+(system|computer|info|information)") { + return @{ Type = "SystemCommand"; Command = "SystemInfo"; Parameters = @{} } + } + + if ($input -match "^(get|show|list|display)\s+(process|processes)") { + return @{ Type = "SystemCommand"; Command = "ProcessList"; Parameters = @{} } + } + + if ($input -match "^(kill|stop|terminate)\s+(process|processes)") { + $processName = $input -replace "^(kill|stop|terminate)\s+(process|processes)\s+", "" + return @{ Type = "SystemCommand"; Command = "KillProcess"; Parameters = @{ ProcessName = $processName } } + } + + # File operations + if ($input -match "^(list|show|dir|directory)\s+(files|files in|contents of)") { + $path = $input -replace "^(list|show|dir|directory)\s+(files|files in|contents of)\s+", "" + return @{ Type = "SystemCommand"; Command = "ListFiles"; Parameters = @{ Path = $path } } + } + + # Greetings + if ($input -match "^(hello|hi|hey|greetings)") { + return @{ Type = "Greeting"; Command = "Greet"; Parameters = @{} } + } + + # Farewells + if ($input -match "^(goodbye|bye|see you|exit|quit)") { + return @{ Type = "Farewell"; Command = "Farewell"; Parameters = @{} } + } + + # Help requests + if ($input -match "^(help|what can you do|capabilities)") { + return @{ Type = "Help"; Command = "ShowHelp"; Parameters = @{} } + } + + # Default to conversation + return @{ Type = "Conversation"; Command = "Chat"; Parameters = @{} } +} + +function Execute-SystemCommand { + param( + [hashtable]$Intent, + [hashtable]$Engine + ) + + switch ($Intent.Command) { + "SystemInfo" { + $info = Get-ComputerInfo | Select-Object WindowsProductName, WindowsVersion, TotalPhysicalMemory, CsProcessors + return "Here's your system information:`n$($info | Format-Table | Out-String)" + } + "ProcessList" { + $processes = Get-Process | Select-Object Name, Id, CPU, WorkingSet -First 10 + return "Top 10 processes by memory usage:`n$($processes | Format-Table | Out-String)" + } + "KillProcess" { + $processName = $Intent.Parameters.ProcessName + try { + $processes = Get-Process -Name $processName -ErrorAction Stop + $processes | Stop-Process -Force + return "Successfully terminated $($processes.Count) process(es) named '$processName'" + } + catch { + return "Error: Could not find or terminate process '$processName'" + } + } + "ListFiles" { + $path = $Intent.Parameters.Path + if ([string]::IsNullOrWhiteSpace($path)) { $path = "." } + + try { + $files = Get-ChildItem -Path $path | Select-Object Name, Length, LastWriteTime + return "Files in '$path':`n$($files | Format-Table | Out-String)" + } + catch { + return "Error: Could not list files in '$path'" + } + } + default { + return "I'm not sure how to handle that system command." + } + } +} + +function Execute-SkillRequest { + param( + [hashtable]$Intent, + [hashtable]$Engine + ) + + $skillName = $Intent.Command + if ($Engine.Skills.ContainsKey($skillName)) { + $functionName = $Engine.Skills[$skillName] + return & $functionName -Parameters $Intent.Parameters + } + + return "I don't have that skill available yet." +} + +function Generate-ContextualResponse { + param( + [string]$Input, + [hashtable]$Intent, + [hashtable]$Memory, + [hashtable]$Engine + ) + + switch ($Intent.Type) { + "Greeting" { + $greetings = $Engine.ResponsePatterns.Greeting + return $greetings | Get-Random + } + "Farewell" { + $farewells = $Engine.ResponsePatterns.Farewell + return $farewells | Get-Random + } + "Help" { + return @" +I can help you with various tasks: + +System Commands: +- Get system information +- List processes +- Kill processes +- List files in directories + +Conversation: +- Chat and respond to questions +- Remember our conversation history + +Try asking me to: +- "Show system information" +- "List processes" +- "What can you do?" +"@ + } + "Conversation" { + # Generate contextual response based on input and memory + $context = "" + if ($Memory.entries.Count -gt 0) { + $recentEntries = $Memory.entries | Select-Object -Last 3 + $context = "Based on our conversation, " + } + + $responses = @( + "I understand you're asking about '$Input'. Let me help you with that.", + "That's an interesting point about '$Input'. I'd be happy to assist.", + "Regarding '$Input', I can help you explore this further.", + "I've processed your input about '$Input'. How can I best assist you?" + ) + + return $context + ($responses | Get-Random) + } + default { + return "I'm processing your request: '$Input'. How can I help you further?" + } + } +} + +# Export functions +Export-ModuleMember -Function Initialize-AIEngine, Get-AIResponse, Register-AISkill \ No newline at end of file diff --git a/PowerShell_AI_Agent/PowerShell_AI_Agent/modules/Logging-Engine.psm1 b/PowerShell_AI_Agent/PowerShell_AI_Agent/modules/Logging-Engine.psm1 new file mode 100644 index 0000000..bf7bf0f --- /dev/null +++ b/PowerShell_AI_Agent/PowerShell_AI_Agent/modules/Logging-Engine.psm1 @@ -0,0 +1,259 @@ +# Logging Engine Module for PowerShell AI Agent +# Provides comprehensive logging capabilities + +function Initialize-LoggingEngine { + param( + [hashtable]$Config, + [string]$LogPath = ".\logs" + ) + + $engine = @{ + Config = $Config + LogPath = $LogPath + LogLevel = "Info" # Debug, Info, Warning, Error + MaxLogFiles = 10 + MaxLogSize = 10MB + } + + # Ensure log directory exists + if (!(Test-Path $LogPath)) { + New-Item -ItemType Directory -Path $LogPath -Force | Out-Null + } + + # Create log file name with timestamp + $timestamp = Get-Date -Format "yyyy-MM-dd" + $engine.LogFile = Join-Path $LogPath "ai-agent-$timestamp.log" + + Write-Verbose "Logging engine initialized. Log file: $($engine.LogFile)" + return $engine +} + +function Write-Log { + param( + [hashtable]$Engine, + [string]$Message, + [string]$Level = "Info", + [hashtable]$Context = @{} + ) + + $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" + $logEntry = @{ + Timestamp = $timestamp + Level = $Level + Message = $Message + Context = $Context + } + + # Convert to JSON for structured logging + $logLine = $logEntry | ConvertTo-Json -Compress + + try { + Add-Content -Path $Engine.LogFile -Value $logLine -ErrorAction Stop + + # Also write to console with color coding + $color = switch ($Level) { + "Debug" { "Gray" } + "Info" { "White" } + "Warning" { "Yellow" } + "Error" { "Red" } + default { "White" } + } + + Write-Host "[$timestamp] [$Level] $Message" -ForegroundColor $color + } + catch { + Write-Warning "Failed to write to log file: $_" + } +} + +function Write-DebugLog { + param( + [hashtable]$Engine, + [string]$Message, + [hashtable]$Context = @{} + ) + + if ($Engine.LogLevel -eq "Debug") { + Write-Log -Engine $Engine -Message $Message -Level "Debug" -Context $Context + } +} + +function Write-InfoLog { + param( + [hashtable]$Engine, + [string]$Message, + [hashtable]$Context = @{} + ) + + Write-Log -Engine $Engine -Message $Message -Level "Info" -Context $Context +} + +function Write-WarningLog { + param( + [hashtable]$Engine, + [string]$Message, + [hashtable]$Context = @{} + ) + + Write-Log -Engine $Engine -Message $Message -Level "Warning" -Context $Context +} + +function Write-ErrorLog { + param( + [hashtable]$Engine, + [string]$Message, + [hashtable]$Context = @{} + ) + + Write-Log -Engine $Engine -Message $Message -Level "Error" -Context $Context +} + +function Get-LogEntries { + param( + [hashtable]$Engine, + [int]$Count = 50, + [string]$Level = $null, + [string]$SearchTerm = $null + ) + + if (!(Test-Path $Engine.LogFile)) { + return @() + } + + try { + $entries = Get-Content $Engine.LogFile | ForEach-Object { + try { + $entry = $_ | ConvertFrom-Json + return $entry + } + catch { + # Skip invalid JSON entries + return $null + } + } | Where-Object { $null -ne $_ } + + # Filter by level if specified + if ($Level) { + $entries = $entries | Where-Object { $_.Level -eq $Level } + } + + # Filter by search term if specified + if ($SearchTerm) { + $entries = $entries | Where-Object { $_.Message -match $SearchTerm } + } + + # Return the most recent entries + return $entries | Select-Object -Last $Count + } + catch { + Write-Warning "Failed to read log entries: $_" + return @() + } +} + +function Clear-LogFiles { + param([hashtable]$Engine) + + try { + # Get all log files + $logFiles = Get-ChildItem -Path $Engine.LogPath -Filter "*.log" | Sort-Object LastWriteTime -Descending + + # Keep only the most recent files + if ($logFiles.Count -gt $Engine.MaxLogFiles) { + $filesToDelete = $logFiles | Select-Object -Skip $Engine.MaxLogFiles + $filesToDelete | Remove-Item -Force + + Write-InfoLog -Engine $Engine -Message "Cleaned up $($filesToDelete.Count) old log files" + } + + # Check log file size + $currentLog = Get-Item $Engine.LogFile -ErrorAction SilentlyContinue + if ($currentLog -and $currentLog.Length -gt $Engine.MaxLogSize) { + # Archive current log and start new one + $archiveName = $Engine.LogFile -replace "\.log$", "-$(Get-Date -Format 'HHmmss').log" + Move-Item $Engine.LogFile $archiveName + + Write-InfoLog -Engine $Engine -Message "Log file archived: $archiveName" + } + } + catch { + Write-Warning "Failed to clean up log files: $_" + } +} + +function Export-LogReport { + param( + [hashtable]$Engine, + [string]$OutputPath, + [string]$Format = "CSV" + ) + + try { + $entries = Get-LogEntries -Engine $Engine -Count 1000 + + switch ($Format.ToLower()) { + "CSV" { + $entries | Export-Csv -Path $OutputPath -NoTypeInformation + } + "JSON" { + $entries | ConvertTo-Json -Depth 3 | Set-Content $OutputPath + } + "HTML" { + $html = @" + + + + AI Agent Log Report + + + +

AI Agent Log Report

+ + + + + + +"@ + + foreach ($entry in $entries) { + $class = $entry.Level.ToLower() + $html += @" + + + + + +"@ + } + + $html += @" +
TimestampLevelMessage
$($entry.Timestamp)$($entry.Level)$($entry.Message)
+ + +"@ + + $html | Set-Content $OutputPath + } + } + + Write-InfoLog -Engine $Engine -Message "Log report exported to: $OutputPath" + return $true + } + catch { + Write-ErrorLog -Engine $Engine -Message "Failed to export log report: $_" + return $false + } +} + +# Export functions +Export-ModuleMember -Function Initialize-LoggingEngine, Write-Log, Write-DebugLog, Write-InfoLog, Write-WarningLog, Write-ErrorLog, Get-LogEntries, Clear-LogFiles, Export-LogReport \ No newline at end of file diff --git a/PowerShell_AI_Agent/PowerShell_AI_Agent/modules/Voice-Engine.psm1 b/PowerShell_AI_Agent/PowerShell_AI_Agent/modules/Voice-Engine.psm1 new file mode 100644 index 0000000..7b3b5eb --- /dev/null +++ b/PowerShell_AI_Agent/PowerShell_AI_Agent/modules/Voice-Engine.psm1 @@ -0,0 +1,216 @@ +# Voice Engine Module for PowerShell AI Agent +# Provides speech recognition and text-to-speech capabilities + +function Initialize-VoiceEngine { + param( + [hashtable]$Config + ) + + $engine = @{ + Config = $Config + SpeechSynthesizer = $null + SpeechRecognizer = $null + IsListening = $false + VoiceEnabled = $Config.Voice.Enabled + Language = $Config.Voice.Language + ResponseSpeed = $Config.Voice.ResponseSpeed + RecognitionSensitivity = $Config.Voice.RecognitionSensitivity + } + + # Initialize speech synthesizer + try { + Add-Type -AssemblyName System.Speech + $engine.SpeechSynthesizer = New-Object System.Speech.Synthesis.SpeechSynthesizer + + # Configure speech synthesizer + $engine.SpeechSynthesizer.Rate = Get-SpeechRate -Speed $Config.Voice.ResponseSpeed + $engine.SpeechSynthesizer.Volume = 100 + + Write-Verbose "Speech synthesizer initialized successfully" + } + catch { + Write-Warning "Failed to initialize speech synthesizer: $_" + $engine.VoiceEnabled = $false + } + + return $engine +} + +function Get-SpeechRate { + param([string]$Speed) + + switch ($Speed.ToLower()) { + "slow" { return -2 } + "normal" { return 0 } + "fast" { return 2 } + "veryfast" { return 4 } + default { return 0 } + } +} + +function Speak-Text { + param( + [hashtable]$Engine, + [string]$Text + ) + + if (-not $Engine.VoiceEnabled -or $null -eq $Engine.SpeechSynthesizer) { + return $false + } + + try { + $Engine.SpeechSynthesizer.SpeakAsync($Text) + return $true + } + catch { + Write-Warning "Failed to speak text: $_" + return $false + } +} + +function Start-SpeechRecognition { + param( + [hashtable]$Engine, + [scriptblock]$OnSpeechRecognized + ) + + if (-not $Engine.VoiceEnabled) { + return $false + } + + try { + # Create speech recognition engine + $grammar = New-Object System.Speech.Recognition.DictationGrammar + $Engine.SpeechRecognizer = New-Object System.Speech.Recognition.SpeechRecognitionEngine + $Engine.SpeechRecognizer.LoadGrammar($grammar) + + # Set recognition sensitivity + $Engine.SpeechRecognizer.SpeechRecognized += { + param($sender, $e) + if ($e.Result.Confidence -ge $Engine.RecognitionSensitivity) { + $OnSpeechRecognized.Invoke($e.Result.Text) + } + } + + $Engine.SpeechRecognizer.SetInputToDefaultAudioDevice() + $Engine.SpeechRecognizer.RecognizeAsync() + $Engine.IsListening = $true + + Write-Host "Voice recognition started. Speak now..." -ForegroundColor Green + return $true + } + catch { + Write-Warning "Failed to start speech recognition: $_" + return $false + } +} + +function Stop-SpeechRecognition { + param([hashtable]$Engine) + + if ($Engine.IsListening -and $null -ne $Engine.SpeechRecognizer) { + try { + $Engine.SpeechRecognizer.RecognizeAsyncStop() + $Engine.SpeechRecognizer.Dispose() + $Engine.SpeechRecognizer = $null + $Engine.IsListening = $false + + Write-Host "Voice recognition stopped." -ForegroundColor Yellow + return $true + } + catch { + Write-Warning "Failed to stop speech recognition: $_" + return $false + } + } + + return $false +} + +function Get-AvailableVoices { + param([hashtable]$Engine) + + if ($null -eq $Engine.SpeechSynthesizer) { + return @() + } + + try { + return $Engine.SpeechSynthesizer.GetInstalledVoices() | ForEach-Object { + @{ + Name = $_.VoiceInfo.Name + Culture = $_.VoiceInfo.Culture + Gender = $_.VoiceInfo.Gender + Age = $_.VoiceInfo.Age + } + } + } + catch { + Write-Warning "Failed to get available voices: $_" + return @() + } +} + +function Set-Voice { + param( + [hashtable]$Engine, + [string]$VoiceName + ) + + if ($null -eq $Engine.SpeechSynthesizer) { + return $false + } + + try { + $voices = Get-AvailableVoices -Engine $Engine + $selectedVoice = $voices | Where-Object { $_.Name -eq $VoiceName } + + if ($selectedVoice) { + $Engine.SpeechSynthesizer.SelectVoice($VoiceName) + Write-Host "Voice changed to: $VoiceName" -ForegroundColor Green + return $true + } + else { + Write-Warning "Voice '$VoiceName' not found" + return $false + } + } + catch { + Write-Warning "Failed to set voice: $_" + return $false + } +} + +function Test-VoiceSystem { + param([hashtable]$Engine) + + Write-Host "Testing voice system..." -ForegroundColor Cyan + + # Test speech synthesis + if ($null -ne $Engine.SpeechSynthesizer) { + Write-Host "Speech synthesizer: OK" -ForegroundColor Green + Speak-Text -Engine $Engine -Text "Voice system is working correctly." + } + else { + Write-Host "Speech synthesizer: FAILED" -ForegroundColor Red + } + + # Test speech recognition + if ($Engine.VoiceEnabled) { + Write-Host "Speech recognition: Available" -ForegroundColor Green + } + else { + Write-Host "Speech recognition: Disabled" -ForegroundColor Yellow + } + + # Show available voices + $voices = Get-AvailableVoices -Engine $Engine + if ($voices.Count -gt 0) { + Write-Host "Available voices:" -ForegroundColor Cyan + $voices | ForEach-Object { + Write-Host " - $($_.Name) ($($_.Culture))" -ForegroundColor White + } + } +} + +# Export functions +Export-ModuleMember -Function Initialize-VoiceEngine, Speak-Text, Start-SpeechRecognition, Stop-SpeechRecognition, Get-AvailableVoices, Set-Voice, Test-VoiceSystem \ No newline at end of file diff --git a/PowerShell_AI_Agent/PowerShell_AI_Agent/plugins/Plugin-Manager.psm1 b/PowerShell_AI_Agent/PowerShell_AI_Agent/plugins/Plugin-Manager.psm1 new file mode 100644 index 0000000..d7050be --- /dev/null +++ b/PowerShell_AI_Agent/PowerShell_AI_Agent/plugins/Plugin-Manager.psm1 @@ -0,0 +1,153 @@ +# Plugin Manager Module for PowerShell AI Agent +# Provides plugin loading and management capabilities + +function Initialize-PluginManager { + param( + [hashtable]$Config, + [string]$PluginPath = ".\plugins" + ) + + $manager = @{ + Config = $Config + PluginPath = $PluginPath + Plugins = @{} + LoadedPlugins = @() + } + + # Ensure plugin directory exists + if (!(Test-Path $PluginPath)) { + New-Item -ItemType Directory -Path $PluginPath -Force | Out-Null + } + + Write-Verbose "Plugin manager initialized. Plugin path: $PluginPath" + return $manager +} + +function Load-Plugin { + param( + [hashtable]$Manager, + [string]$PluginName + ) + + $pluginFile = Join-Path $Manager.PluginPath "$PluginName.ps1" + + if (!(Test-Path $pluginFile)) { + Write-Warning "Plugin file not found: $pluginFile" + return $false + } + + try { + # Load plugin script + $pluginScript = Get-Content $pluginFile -Raw + $plugin = Invoke-Expression $pluginScript + + # Validate plugin structure + if (-not $plugin.Name -or -not $plugin.Version -or -not $plugin.Commands) { + Write-Warning "Invalid plugin structure: $PluginName" + return $false + } + + # Register plugin + $Manager.Plugins[$PluginName] = $plugin + $Manager.LoadedPlugins += $PluginName + + Write-Host "Plugin loaded: $($plugin.Name) v$($plugin.Version)" -ForegroundColor Green + return $true + } + catch { + Write-Warning "Failed to load plugin $PluginName : $_" + return $false + } +} + +function Load-AllPlugins { + param([hashtable]$Manager) + + $pluginFiles = Get-ChildItem -Path $Manager.PluginPath -Filter "*.ps1" -Exclude "Plugin-Manager.psm1" + + foreach ($pluginFile in $pluginFiles) { + $pluginName = $pluginFile.BaseName + Load-Plugin -Manager $Manager -PluginName $pluginName + } + + Write-Host "Loaded $($Manager.LoadedPlugins.Count) plugins" -ForegroundColor Green +} + +function Get-PluginCommands { + param([hashtable]$Manager) + + $commands = @() + + foreach ($plugin in $Manager.Plugins.Values) { + foreach ($command in $plugin.Commands) { + $commands += @{ + Name = $command.Name + Description = $command.Description + Plugin = $plugin.Name + Function = $command.Function + } + } + } + + return $commands +} + +function Execute-PluginCommand { + param( + [hashtable]$Manager, + [string]$CommandName, + [hashtable]$Parameters = @{} + ) + + $commands = Get-PluginCommands -Manager $Manager + $command = $commands | Where-Object { $_.Name -eq $CommandName } + + if ($command) { + try { + $result = & $command.Function -Parameters $Parameters + return @{ + Success = $true + Result = $result + Plugin = $command.Plugin + } + } + catch { + return @{ + Success = $false + Error = $_.Exception.Message + Plugin = $command.Plugin + } + } + } + + return @{ + Success = $false + Error = "Command '$CommandName' not found" + } +} + +function Show-PluginInfo { + param([hashtable]$Manager) + + Write-Host "Loaded Plugins:" -ForegroundColor Cyan + + if ($Manager.LoadedPlugins.Count -eq 0) { + Write-Host " No plugins loaded" -ForegroundColor Yellow + return + } + + foreach ($pluginName in $Manager.LoadedPlugins) { + $plugin = $Manager.Plugins[$pluginName] + Write-Host " $($plugin.Name) v$($plugin.Version)" -ForegroundColor White + Write-Host " Description: $($plugin.Description)" -ForegroundColor Gray + Write-Host " Commands: $($plugin.Commands.Count)" -ForegroundColor Gray + + foreach ($command in $plugin.Commands) { + Write-Host " - $($command.Name): $($command.Description)" -ForegroundColor Gray + } + Write-Host "" + } +} + +# Export functions +Export-ModuleMember -Function Initialize-PluginManager, Load-Plugin, Load-AllPlugins, Get-PluginCommands, Execute-PluginCommand, Show-PluginInfo \ No newline at end of file diff --git a/PowerShell_AI_Agent/PowerShell_AI_Agent/plugins/System-Tools.ps1 b/PowerShell_AI_Agent/PowerShell_AI_Agent/plugins/System-Tools.ps1 new file mode 100644 index 0000000..eb85b43 --- /dev/null +++ b/PowerShell_AI_Agent/PowerShell_AI_Agent/plugins/System-Tools.ps1 @@ -0,0 +1,125 @@ +@{ + Name = "System Tools" + Version = "1.0" + Description = "Provides system utility commands for the AI agent" + Author = "AI Agent Team" + Commands = @( + @{ + Name = "Get-SystemStatus" + Description = "Get comprehensive system status information" + Function = { + param([hashtable]$Parameters) + + $status = @{ + ComputerName = $env:COMPUTERNAME + OS = (Get-ComputerInfo).WindowsProductName + Version = (Get-ComputerInfo).WindowsVersion + Uptime = (Get-Date) - (Get-CimInstance Win32_OperatingSystem).LastBootUpTime + CPU = (Get-CimInstance Win32_Processor).Name + Memory = [math]::Round((Get-CimInstance Win32_ComputerSystem).TotalPhysicalMemory / 1GB, 2) + DiskSpace = Get-WmiObject Win32_LogicalDisk | ForEach-Object { + [math]::Round($_.Size / 1GB, 2) + } + FreeSpace = Get-WmiObject Win32_LogicalDisk | ForEach-Object { + [math]::Round($_.FreeSpace / 1GB, 2) + } + } + + return "System Status:`n" + + "Computer: $($status.ComputerName)`n" + + "OS: $($status.OS) $($status.Version)`n" + + "Uptime: $($status.Uptime.Days) days, $($status.Uptime.Hours) hours`n" + + "CPU: $($status.CPU)`n" + + "Memory: $($status.Memory) GB`n" + + "Disk Space: $($status.DiskSpace) GB`n" + + "Free Space: $($status.FreeSpace) GB" + } + }, + @{ + Name = "Get-NetworkInfo" + Description = "Get network configuration and status" + Function = { + param([hashtable]$Parameters) + + $network = Get-NetAdapter | Where-Object { $_.Status -eq "Up" } + $ipConfig = Get-NetIPAddress | Where-Object { $_.AddressFamily -eq "IPv4" } + + $result = "Network Information:`n" + foreach ($adapter in $network) { + $ip = $ipConfig | Where-Object { $_.InterfaceIndex -eq $adapter.InterfaceIndex } + $result += "Adapter: $($adapter.Name)`n" + $result += "Status: $($adapter.Status)`n" + $result += "IP: $($ip.IPAddress)`n" + $result += "Speed: $($adapter.LinkSpeed)`n`n" + } + + return $result + } + }, + @{ + Name = "Get-ServiceStatus" + Description = "Get status of important Windows services" + Function = { + param([hashtable]$Parameters) + + $services = @("spooler", "themes", "wsearch", "wuauserv", "bits") + $result = "Service Status:`n" + + foreach ($service in $services) { + try { + $svc = Get-Service -Name $service -ErrorAction Stop + $status = $svc.Status + $color = if ($status -eq "Running") { "Green" } else { "Red" } + $result += "$service`: $status`n" + } + catch { + $result += "$service`: Not Found`n" + } + } + + return $result + } + }, + @{ + Name = "Get-ProcessInfo" + Description = "Get detailed information about running processes" + Function = { + param([hashtable]$Parameters) + + $processes = Get-Process | Sort-Object CPU -Descending | Select-Object -First 10 + $result = "Top 10 Processes by CPU:`n" + + foreach ($process in $processes) { + $cpu = [math]::Round($process.CPU, 2) + $memory = [math]::Round($process.WorkingSet / 1MB, 2) + $result += "$($process.Name): CPU=$cpu, Memory=${memory}MB`n" + } + + return $result + } + }, + @{ + Name = "Test-Connectivity" + Description = "Test network connectivity to common services" + Function = { + param([hashtable]$Parameters) + + $hosts = @("8.8.8.8", "1.1.1.1", "google.com", "microsoft.com") + $result = "Connectivity Test:`n" + + foreach ($host in $hosts) { + try { + $ping = Test-Connection -ComputerName $host -Count 1 -Quiet + $status = if ($ping) { "OK" } else { "FAILED" } + $result += "$host`: $status`n" + } + catch { + $result += "$host`: ERROR`n" + } + } + + return $result + } + } + ) +} \ No newline at end of file diff --git a/PowerShell_AI_Agent/PowerShell_AI_Agent/tests/Test-AIAgent.ps1 b/PowerShell_AI_Agent/PowerShell_AI_Agent/tests/Test-AIAgent.ps1 new file mode 100644 index 0000000..8155659 --- /dev/null +++ b/PowerShell_AI_Agent/PowerShell_AI_Agent/tests/Test-AIAgent.ps1 @@ -0,0 +1,313 @@ +# Test Script for PowerShell AI Agent +# Comprehensive testing of all components + +param( + [switch]$Verbose, + [switch]$SkipVoice, + [string]$ConfigPath = ".\config\agent-config.json" +) + +# Import modules +$modulePath = ".\modules" +if (Test-Path $modulePath) { + Import-Module "$modulePath\AI-Engine.psm1" -Force + Import-Module "$modulePath\Voice-Engine.psm1" -Force + Import-Module "$modulePath\Logging-Engine.psm1" -Force +} + +# Import plugin manager +$pluginPath = ".\plugins" +if (Test-Path $pluginPath) { + Import-Module "$pluginPath\Plugin-Manager.psm1" -Force +} + +function Test-Configuration { + Write-Host "Testing Configuration..." -ForegroundColor Cyan + + try { + $config = Get-Content $ConfigPath -Raw | ConvertFrom-Json + Write-Host "✓ Configuration loaded successfully" -ForegroundColor Green + + # Test required sections + $requiredSections = @("AI", "Voice", "Memory", "Autopilot") + foreach ($section in $requiredSections) { + if ($config.$section) { + Write-Host "✓ $section section present" -ForegroundColor Green + } else { + Write-Host "✗ $section section missing" -ForegroundColor Red + return $false + } + } + + return $true + } + catch { + Write-Host "✗ Configuration test failed: $_" -ForegroundColor Red + return $false + } +} + +function Test-AIEngine { + Write-Host "Testing AI Engine..." -ForegroundColor Cyan + + try { + $config = Get-Content $ConfigPath -Raw | ConvertFrom-Json + $aiEngine = Initialize-AIEngine -Config $config + Write-Host "✓ AI Engine initialized" -ForegroundColor Green + + # Test response generation + $response = Get-AIResponse -Engine $aiEngine -Input "Hello" -Memory @{ entries = @() } + if ($response) { + Write-Host "✓ AI response generation working" -ForegroundColor Green + } else { + Write-Host "✗ AI response generation failed" -ForegroundColor Red + return $false + } + + # Test system commands + $systemResponse = Get-AIResponse -Engine $aiEngine -Input "Show system information" -Memory @{ entries = @() } + if ($systemResponse -and $systemResponse.Contains("system information")) { + Write-Host "✓ System command processing working" -ForegroundColor Green + } else { + Write-Host "✗ System command processing failed" -ForegroundColor Red + return $false + } + + return $true + } + catch { + Write-Host "✗ AI Engine test failed: $_" -ForegroundColor Red + return $false + } +} + +function Test-VoiceEngine { + if ($SkipVoice) { + Write-Host "Skipping Voice Engine test..." -ForegroundColor Yellow + return $true + } + + Write-Host "Testing Voice Engine..." -ForegroundColor Cyan + + try { + $config = Get-Content $ConfigPath -Raw | ConvertFrom-Json + $voiceEngine = Initialize-VoiceEngine -Config $config + + if ($voiceEngine.VoiceEnabled) { + Write-Host "✓ Voice Engine initialized" -ForegroundColor Green + + # Test speech synthesis + $speakResult = Speak-Text -Engine $voiceEngine -Text "Voice test successful" + if ($speakResult) { + Write-Host "✓ Speech synthesis working" -ForegroundColor Green + } else { + Write-Host "⚠ Speech synthesis not available" -ForegroundColor Yellow + } + + # Test voice availability + $voices = Get-AvailableVoices -Engine $voiceEngine + if ($voices.Count -gt 0) { + Write-Host "✓ $($voices.Count) voices available" -ForegroundColor Green + } else { + Write-Host "⚠ No voices available" -ForegroundColor Yellow + } + } else { + Write-Host "⚠ Voice Engine disabled in configuration" -ForegroundColor Yellow + } + + return $true + } + catch { + Write-Host "✗ Voice Engine test failed: $_" -ForegroundColor Red + return $false + } +} + +function Test-LoggingEngine { + Write-Host "Testing Logging Engine..." -ForegroundColor Cyan + + try { + $config = Get-Content $ConfigPath -Raw | ConvertFrom-Json + $loggingEngine = Initialize-LoggingEngine -Config $config + Write-Host "✓ Logging Engine initialized" -ForegroundColor Green + + # Test log writing + Write-InfoLog -Engine $loggingEngine -Message "Test log entry" + Write-WarningLog -Engine $loggingEngine -Message "Test warning" + Write-ErrorLog -Engine $loggingEngine -Message "Test error" + + # Test log reading + $entries = Get-LogEntries -Engine $loggingEngine -Count 5 + if ($entries.Count -gt 0) { + Write-Host "✓ Log writing and reading working" -ForegroundColor Green + } else { + Write-Host "✗ Log reading failed" -ForegroundColor Red + return $false + } + + return $true + } + catch { + Write-Host "✗ Logging Engine test failed: $_" -ForegroundColor Red + return $false + } +} + +function Test-PluginManager { + Write-Host "Testing Plugin Manager..." -ForegroundColor Cyan + + try { + $config = Get-Content $ConfigPath -Raw | ConvertFrom-Json + $pluginManager = Initialize-PluginManager -Config $config + Write-Host "✓ Plugin Manager initialized" -ForegroundColor Green + + # Load plugins + Load-AllPlugins -Manager $pluginManager + + if ($pluginManager.LoadedPlugins.Count -gt 0) { + Write-Host "✓ $($pluginManager.LoadedPlugins.Count) plugins loaded" -ForegroundColor Green + + # Test plugin commands + $commands = Get-PluginCommands -Manager $pluginManager + if ($commands.Count -gt 0) { + Write-Host "✓ $($commands.Count) plugin commands available" -ForegroundColor Green + + # Test a plugin command + $testCommand = $commands[0] + $result = Execute-PluginCommand -Manager $pluginManager -CommandName $testCommand.Name + if ($result.Success) { + Write-Host "✓ Plugin command execution working" -ForegroundColor Green + } else { + Write-Host "⚠ Plugin command execution failed: $($result.Error)" -ForegroundColor Yellow + } + } else { + Write-Host "⚠ No plugin commands available" -ForegroundColor Yellow + } + } else { + Write-Host "⚠ No plugins loaded" -ForegroundColor Yellow + } + + return $true + } + catch { + Write-Host "✗ Plugin Manager test failed: $_" -ForegroundColor Red + return $false + } +} + +function Test-MemorySystem { + Write-Host "Testing Memory System..." -ForegroundColor Cyan + + try { + $config = Get-Content $ConfigPath -Raw | ConvertFrom-Json + + # Test memory initialization + $memory = @{ + entries = @() + lastUpdated = Get-Date -Format "yyyy-MM-dd HH:mm:ss" + version = "1.0" + } + + # Test memory operations + $memory.entries += @{ + input = "Test input" + response = "Test response" + timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" + } + + if ($memory.entries.Count -eq 1) { + Write-Host "✓ Memory operations working" -ForegroundColor Green + } else { + Write-Host "✗ Memory operations failed" -ForegroundColor Red + return $false + } + + return $true + } + catch { + Write-Host "✗ Memory System test failed: $_" -ForegroundColor Red + return $false + } +} + +function Test-Integration { + Write-Host "Testing Integration..." -ForegroundColor Cyan + + try { + $config = Get-Content $ConfigPath -Raw | ConvertFrom-Json + + # Initialize all engines + $aiEngine = Initialize-AIEngine -Config $config + $voiceEngine = Initialize-VoiceEngine -Config $config + $loggingEngine = Initialize-LoggingEngine -Config $config + $pluginManager = Initialize-PluginManager -Config $config + + # Test integrated workflow + Write-InfoLog -Engine $loggingEngine -Message "Integration test started" + + $memory = @{ entries = @() } + $response = Get-AIResponse -Engine $aiEngine -Input "Integration test" -Memory $memory + + Write-InfoLog -Engine $loggingEngine -Message "Integration test completed" + + if ($response) { + Write-Host "✓ Integration test passed" -ForegroundColor Green + return $true + } else { + Write-Host "✗ Integration test failed" -ForegroundColor Red + return $false + } + } + catch { + Write-Host "✗ Integration test failed: $_" -ForegroundColor Red + return $false + } +} + +# Main test execution +function Start-TestSuite { + Write-Host "=== PowerShell AI Agent Test Suite ===" -ForegroundColor Green + Write-Host "" + + $tests = @( + @{ Name = "Configuration"; Function = "Test-Configuration" }, + @{ Name = "AI Engine"; Function = "Test-AIEngine" }, + @{ Name = "Voice Engine"; Function = "Test-VoiceEngine" }, + @{ Name = "Logging Engine"; Function = "Test-LoggingEngine" }, + @{ Name = "Plugin Manager"; Function = "Test-PluginManager" }, + @{ Name = "Memory System"; Function = "Test-MemorySystem" }, + @{ Name = "Integration"; Function = "Test-Integration" } + ) + + $passed = 0 + $total = $tests.Count + + foreach ($test in $tests) { + Write-Host "Running $($test.Name) test..." -ForegroundColor White + $result = & $test.Function + + if ($result) { + $passed++ + Write-Host "✓ $($test.Name) test PASSED" -ForegroundColor Green + } else { + Write-Host "✗ $($test.Name) test FAILED" -ForegroundColor Red + } + + Write-Host "" + } + + # Summary + Write-Host "=== Test Summary ===" -ForegroundColor Cyan + Write-Host "Passed: $passed/$total" -ForegroundColor $(if ($passed -eq $total) { "Green" } else { "Yellow" }) + + if ($passed -eq $total) { + Write-Host "All tests passed! AI Agent is ready to use." -ForegroundColor Green + return $true + } else { + Write-Host "Some tests failed. Please check the issues above." -ForegroundColor Red + return $false + } +} + +# Run tests +Start-TestSuite \ No newline at end of file