diff --git a/src/app/api/cli-tools/status/route.ts b/src/app/api/cli-tools/status/route.ts index 21d2ebcc93..2d8108aaf4 100644 --- a/src/app/api/cli-tools/status/route.ts +++ b/src/app/api/cli-tools/status/route.ts @@ -98,7 +98,10 @@ export async function GET() { await Promise.all( settingsTools.map(async (toolId) => { - if (!statuses[toolId]?.installed || !statuses[toolId]?.runnable) { + if (!statuses[toolId]) { + return; + } + if (!statuses[toolId].installed || !statuses[toolId].runnable) { statuses[toolId].configStatus = "not_installed"; return; } diff --git a/src/shared/services/cliRuntime.ts b/src/shared/services/cliRuntime.ts index ca3f64641c..2c06854914 100644 --- a/src/shared/services/cliRuntime.ts +++ b/src/shared/services/cliRuntime.ts @@ -327,8 +327,15 @@ const getExpectedParentPaths = (): string[] => { const npmPrefix = getNpmGlobalPrefix(); + // Add common user bin directories + const userBinPaths = [ + path.join(home, "bin"), + path.join(home, ".local", "bin"), + ]; + return [ home, + ...userBinPaths, userProfile, validatedAppData, validatedLocalAppData, @@ -374,7 +381,10 @@ const getKnownToolPaths = (toolId: string): string[] => { ["claude.exe", "claude"], ], codex: [["codex.cmd", "codex"]], - droid: [["droid.cmd", "droid"]], + droid: [ + ["droid.cmd", "droid"], + ["droid.exe", "droid"], + ], openclaw: [["openclaw.cmd", "openclaw"]], cursor: [ ["agent.cmd", "agent"], @@ -404,6 +414,10 @@ const getKnownToolPaths = (toolId: string): string[] => { } } + if (toolId === "droid") { + paths.push(path.join(home, "bin", "droid.exe")); + } + for (const [winName] of bins) { if (npmPrefix) paths.push(path.join(npmPrefix, winName)); if (appData) {