Infra-RunbookEngine.psm1

# Infra-RunbookEngine - Automated Runbook Execution Engine
# YAML decision trees, AI-generated runbooks, blast radius checks, approval workflows

$Public = @(Get-ChildItem -Path "$PSScriptRoot\Public\*.ps1" -ErrorAction SilentlyContinue)
$Private = @(Get-ChildItem -Path "$PSScriptRoot\Private\*.ps1" -ErrorAction SilentlyContinue)

foreach ($file in @($Public + $Private)) {
    try {
        . $file.FullName
    }
    catch {
        Write-Error "Failed to import $($file.FullName): $_"
    }
}

# Ensure engine state directories exist
$script:EngineRoot = Join-Path $env:USERPROFILE '.runbookengine'
$script:ExecutionsPath = Join-Path $script:EngineRoot 'executions'
$script:LearningsPath = Join-Path $script:EngineRoot 'learnings.json'
$script:RunbooksPath = Join-Path $script:EngineRoot 'runbooks'
$script:MaintenanceWindowsPath = Join-Path $script:EngineRoot 'maintenance-windows.json'
$script:TemplatePath = Join-Path $PSScriptRoot 'Templates'

foreach ($dir in @($script:EngineRoot, $script:ExecutionsPath, $script:RunbooksPath)) {
    if (-not (Test-Path $dir)) {
        New-Item -Path $dir -ItemType Directory -Force | Out-Null
    }
}

# Initialize learnings file if absent
if (-not (Test-Path $script:LearningsPath)) {
    '[]' | Set-Content -Path $script:LearningsPath -Encoding UTF8
}

# Initialize maintenance windows file if absent
if (-not (Test-Path $script:MaintenanceWindowsPath)) {
    '[]' | Set-Content -Path $script:MaintenanceWindowsPath -Encoding UTF8
}

Export-ModuleMember -Function $Public.BaseName