. (Join-Path $PSScriptRoot 'bell-common.ps1') try { $root = Get-BellPackageRoot $pidFile = Join-Path $root 'runtime\bell.pid' if (-not (Test-Path -LiteralPath $pidFile -PathType Leaf)) { Write-Host 'Bell is not running (no pid file).'; exit 0 } $processId = 0 if (-not [int]::TryParse((Get-Content -LiteralPath $pidFile -Raw).Trim(), [ref]$processId)) { throw 'Bell pid file is invalid.' } $process = Get-CimInstance Win32_Process -Filter "ProcessId = $processId" -ErrorAction SilentlyContinue if (-not $process) { Remove-Item -LiteralPath $pidFile -Force; Write-Host 'Removed stale Bell pid file.'; exit 0 } $rootPattern = [regex]::Escape($root) if ($process.Name -notmatch '^(pwsh|powershell)\.exe$' -or $process.CommandLine -notmatch 'start-bell\.ps1' -or $process.CommandLine -notmatch $rootPattern) { throw "Process $processId is not the Bell package launcher; it was not stopped." } & taskkill.exe /PID $processId /T /F | Out-Null if ($LASTEXITCODE -ne 0) { throw 'Failed to stop the Bell process tree.' } Remove-Item -LiteralPath $pidFile -Force -ErrorAction SilentlyContinue Write-Host 'Bell backend and web process tree stopped.' exit 0 } catch { Write-Error $_.Exception.Message; exit 1 }