#requires -Version 5.1
# Dev-точка входа MCP-сервера КОМПАС-3D: запуск из теневой копии локальной сборки.
# Прод-аналог (плагин, скачивание релиза по server.lock.json) — plugin/scripts/launch-kompas-mcp.ps1.
# ИНВАРИАНТ: до запуска сервера в stdout не уходит ни байта — stdout занят JSON-RPC.
Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'
$ProgressPreference = 'SilentlyContinue'

$exe = $null
try {
    if (-not [string]::IsNullOrWhiteSpace($env:KOMPAS_MCP_EXE)) {
        # Аварийный обход теневой копии: запуск строго указанного бинаря как есть.
        $exe = $env:KOMPAS_MCP_EXE
    }
    else {
        $repo = Split-Path -Parent (Split-Path -Parent $PSScriptRoot)

        $source = $env:KOMPAS_MCP_DEV_BUILD_DIR
        if ([string]::IsNullOrWhiteSpace($source)) {
            $source = Join-Path $repo 'src\Kompas.Mcp.Host\bin\x64\Release\net8.0-windows'
        }

        if (-not (Test-Path -LiteralPath $source -PathType Container)) {
            throw "нет каталога сборки: $source. Соберите сервер: dotnet build -c Release"
        }

        Import-Module (Join-Path $PSScriptRoot 'KompasMcpDev.psm1') -Force
        $exe = Resolve-KompasMcpDevExecutable -SourceDirectory $source -InstallRoot $env:KOMPAS_MCP_DEV_ROOT
    }

    # -PathType Leaf: без него путь к существующему каталогу молча проходит проверку,
    # а падает уже голый вызов "& $exe" сырым CommandNotFoundException в обход catch ниже.
    if (-not (Test-Path -LiteralPath $exe -PathType Leaf)) {
        throw "не найден сервер: $exe"
    }
}
catch {
    [Console]::Error.WriteLine("kompas-mcp dev-launcher: $($_.Exception.Message)")
    exit 1
}

try {
    & $exe @args
    $serverExit = $LASTEXITCODE
}
catch {
    # Сбой самого запуска (битый бинарь, недостающая зависимость, отказ в доступе) —
    # не путать с ненулевым кодом возврата уже запущенного сервера, это не exception.
    [Console]::Error.WriteLine("kompas-mcp dev-launcher: не удалось запустить сервер: $($_.Exception.Message)")
    exit 1
}

exit $serverExit
