fix(natives): make Windows-host builds and addon loading work end to end

Runtime: the loader's AVX2 probe used [System.Runtime.Intrinsics.X86.Avx2]
via powershell.exe, which only exists on .NET Core — stock Windows PowerShell
5.1 raised TypeNotFound, so every Windows host silently loaded the baseline
addon and paid ~270ms for the spawn on the startup path. Ask the kernel via
bun:ffi (IsProcessorFeaturePresent(PF_AVX2_INSTRUCTIONS_AVAILABLE), ~0.5ms)
and fall back to pwsh-then-powershell for Node embeds. scripts/host-detect.ts
shared the same broken probe for build-time variant selection.

Build: `bun run build:native` on a win32 host died deep inside the bazel msvc
repo rules (linux/mac exec hosts only, by design). The `host` pseudo-target
now delegates to the local napi build against real VS Build Tools, and other
targets fail fast with guidance. build-bindings.ts resolves the @napi-rs/cli
JS entry from its manifest (the node_modules/.bin shim is a PE launcher Bun
cannot parse) and auto-appends VS Build Tools' bundled CMake/Ninja to PATH
via vswhere so a vcvars prompt is no longer required. Cap maudio at
opt-level=1 to dodge a rustc ICE codegenning MaybeUninit<ma_fence> for
x86_64-pc-windows-msvc under the pinned nightly (Bazel's older pin is
unaffected).

Compile: Bun.Glob.scan yields backslash paths on Windows; the legacy Pi
virtual module used them verbatim for export keys and generated identifiers,
producing invalid JavaScript in compiled-binary builds.

Tests: strip ConPTY negotiation escapes in the pty argv test; ignore the
bazel-oh-my-pi convenience symlink.
This commit is contained in:
zero
2026-08-07 16:50:52 +08:00
parent ab78d3091e
commit 82436b0e93
10 changed files with 201 additions and 27 deletions
+7 -1
View File
@@ -640,7 +640,13 @@ describe("pi-natives", () => {
expect(callbackError).toBeNull();
expect(result.exitCode).toBe(0);
expect(result.timedOut).toBeFalse();
expect(JSON.parse(output.trim())).toEqual(expected);
// ConPTY interleaves terminal negotiation with the child's own bytes
// (`ESC[6n`, SGR reset, an OSC 0 title set, cursor show), so strip the
// escape sequences before parsing the payload.
const payload = output
.replace(/\u001b\][^\u0007]*(?:\u0007|\u001b\\)|\u001b\[[0-9;?]*[ -/]*[@-~]/g, "")
.trim();
expect(JSON.parse(payload)).toEqual(expected);
});
it("reports the child PID as soon as the PTY process starts", async () => {