diff --git a/lib/gbrain-local-status.ts b/lib/gbrain-local-status.ts index f2ca41cb1..ec2b115e1 100644 --- a/lib/gbrain-local-status.ts +++ b/lib/gbrain-local-status.ts @@ -221,6 +221,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 || ""; @@ -229,7 +233,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 @@ -252,7 +256,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