From f00fa4d760252602cf8db2f9bd292ebbf9f7ef21 Mon Sep 17 00:00:00 2001 From: Sebastian Herrlinger Date: Tue, 30 Jun 2026 17:43:14 +0200 Subject: [PATCH] debug: clean up Windows repro scenarios --- .github/workflows/test.yml | 2 -- script/repro-windows-opentui-crash.ps1 | 22 ++++++++++++++++++-- script/repro-windows-opentui-pty-session.mjs | 7 ++++--- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 57af1f7bc1..f9726df969 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -173,8 +173,6 @@ jobs: host: windows-latest - version: "1.17.10" host: windows-2022 - - version: "1.17.10" - host: blacksmith-4vcpu-windows-2025 runs-on: ${{ matrix.host }} defaults: run: diff --git a/script/repro-windows-opentui-crash.ps1 b/script/repro-windows-opentui-crash.ps1 index f5842c6305..f99cdb019f 100644 --- a/script/repro-windows-opentui-crash.ps1 +++ b/script/repro-windows-opentui-crash.ps1 @@ -112,7 +112,8 @@ function Invoke-PtyScenario { node (Join-Path $PSScriptRoot "repro-windows-opentui-pty-session.mjs") -- --exe $Exe --project $Project --version $Version --seconds $Seconds --scenario $Scenario if ($LASTEXITCODE -ne 0) { - throw "PTY scenario '$Scenario' failed with exit code $LASTEXITCODE" + $script:PtyFailures += "PTY scenario '$Scenario' failed with exit code $LASTEXITCODE" + Write-Host "::error::$($script:PtyFailures[-1])" } } @@ -125,6 +126,9 @@ Write-Host "PROCESSOR_ARCHITECTURE=$env:PROCESSOR_ARCHITECTURE" Write-Section "Install opencode-ai@$Version" npm uninstall -g opencode-ai opencode-windows-x64 2>$null | Out-Host npm install -g "opencode-ai@$Version" +if ($LASTEXITCODE -ne 0) { + throw "npm install opencode-ai@$Version failed with exit code $LASTEXITCODE" +} $npmRoot = (npm root -g).Trim() $exe = Join-Path $npmRoot "opencode-ai\bin\opencode.exe" @@ -190,16 +194,30 @@ New-Item -ItemType Directory -Force $ptyRoot | Out-Null Push-Location $ptyRoot try { npm init -y | Out-Host + if ($LASTEXITCODE -ne 0) { + throw "npm init for PTY harness failed with exit code $LASTEXITCODE" + } npm install "@lydell/node-pty@1.2.0-beta.12" | Out-Host + if ($LASTEXITCODE -ne 0) { + throw "npm install @lydell/node-pty failed with exit code $LASTEXITCODE" + } + $script:PtyFailures = @() Invoke-PtyScenario -Scenario "text" -Exe $exe -Project $sessionProject -Version $Version -Seconds $PtySeconds + if ($Version -eq "1.17.10") { + Invoke-PtyScenario -Scenario "markdown-no-native-render" -Exe $exe -Project $sessionProject -Version $Version -Seconds $PtySeconds + } Invoke-PtyScenario -Scenario "markdown" -Exe $exe -Project $sessionProject -Version $Version -Seconds $PtySeconds - Invoke-PtyScenario -Scenario "bash-auto" -Exe $exe -Project $sessionProject -Version $Version -Seconds $PtySeconds Invoke-PtyScenario -Scenario "bash-permission" -Exe $exe -Project $sessionProject -Version $Version -Seconds $PtySeconds Invoke-PtyScenario -Scenario "task-permission" -Exe $exe -Project $sessionProject -Version $Version -Seconds $PtySeconds Invoke-PtyScenario -Scenario "mcp-npx" -Exe $exe -Project $sessionProject -Version $Version -Seconds $PtySeconds if ($Version -eq "1.17.10") { Invoke-PtyScenario -Scenario "mcp-npx-no-native-render" -Exe $exe -Project $sessionProject -Version $Version -Seconds $PtySeconds } + if ($script:PtyFailures.Count -gt 0) { + Write-Section "PTY Failures" + $script:PtyFailures | ForEach-Object { Write-Host $_ } + throw "$($script:PtyFailures.Count) PTY scenario(s) failed" + } } finally { Pop-Location } diff --git a/script/repro-windows-opentui-pty-session.mjs b/script/repro-windows-opentui-pty-session.mjs index f16478a0ee..78d1319e5b 100644 --- a/script/repro-windows-opentui-pty-session.mjs +++ b/script/repro-windows-opentui-pty-session.mjs @@ -126,7 +126,7 @@ function responseText() { return "The MCP npx spawn storm initialized and the session completed." } - if (scenario === "markdown") { + if (scenario.startsWith("markdown")) { const sections = [] for (let i = 0; i < 40; i++) { sections.push(`## Section ${i + 1}`) @@ -380,7 +380,6 @@ const proc = pty.spawn( : scenario.startsWith("task-") ? "delegate a small task to a subagent, then summarize" : "start a CI repro session and answer briefly", - ...(scenario === "bash-auto" ? ["--auto"] : []), ], { name: "xterm-256color", @@ -411,10 +410,12 @@ proc.onExit((event) => { }) const deadline = Date.now() + seconds * 1000 +let completedAt while (Date.now() < deadline) { if (crashPattern.test(output)) break if (exited) break - if (providerRequests > 0 && output.includes("fake provider")) break + if (!completedAt && output.includes("message=\"exiting loop\"")) completedAt = Date.now() + if (completedAt && Date.now() - completedAt > 8000) break await delay(500) }