From a81da822c1f84c2b885b60b353baeaa0701135a7 Mon Sep 17 00:00:00 2001 From: vaston-viji <215998886+vaston-viji@users.noreply.github.com> Date: Tue, 4 Aug 2026 14:58:15 +1000 Subject: [PATCH] fix: raise gbrain version-probe timeout to 10s on Windows On Windows the gbrain CLI is a .cmd shim that runs `bun run cli.ts`. A cold spawn takes over the 2s timeout in resolveGbrainBin (warm runs are ~700ms), so the probe times out, localEngineStatus classifies the engine as "no-cli", and the 60s status cache then serves that false negative to every skill preamble and sync run. /sync-gbrain skips the memory stage with "gbrain CLI not on PATH" even though the CLI works. Give the shim 10s of headroom, gated on NEEDS_SHELL_ON_WINDOWS so POSIX keeps the cheap 2s probe. Applies to both resolveGbrainBin and readGbrainVersion. Observed on Windows 11, bun 1.3.14, gbrain 0.42.59.0. Co-Authored-By: Claude Fable 5 --- lib/gbrain-local-status.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/gbrain-local-status.ts b/lib/gbrain-local-status.ts index 2b6caa7808..44d7a416df 100644 --- a/lib/gbrain-local-status.ts +++ b/lib/gbrain-local-status.ts @@ -140,6 +140,10 @@ function hashPath(p: string): string { * call share one fork-exec (~200ms saved per skill preamble). */ const _gbrainBinCache = new Map(); +// On Windows the shim is `gbrain.cmd` → `bun run cli.ts`; a cold spawn can +// exceed 2s, and a false negative here poisons the 60s status cache with +// "no-cli". Give the shim headroom; POSIX keeps the tight timeout. +const VERSION_PROBE_TIMEOUT_MS = NEEDS_SHELL_ON_WINDOWS ? 10_000 : 2_000; export function resolveGbrainBin(env?: NodeJS.ProcessEnv): string | null { const e = env ?? process.env; const key = e.PATH || ""; @@ -148,7 +152,7 @@ export function resolveGbrainBin(env?: NodeJS.ProcessEnv): string | null { try { execFileSync("gbrain", ["--version"], { encoding: "utf-8", - timeout: 2_000, + timeout: VERSION_PROBE_TIMEOUT_MS, stdio: ["ignore", "ignore", "ignore"], env: e, shell: NEEDS_SHELL_ON_WINDOWS, // #1731: gbrain is a .cmd shim on Windows @@ -171,7 +175,7 @@ export function readGbrainVersion(env?: NodeJS.ProcessEnv): string { try { const out = execFileSync("gbrain", ["--version"], { encoding: "utf-8", - timeout: 2_000, + timeout: VERSION_PROBE_TIMEOUT_MS, stdio: ["ignore", "pipe", "ignore"], env: e, shell: NEEDS_SHELL_ON_WINDOWS, // #1731: gbrain is a .cmd shim on Windows