mirror of
https://github.com/Nezumi-2711/9router.git
synced 2026-09-22 13:38:31 +00:00
# v0.5.45 (2026-07-30)
## Features - **Providers**: add Poolside (OpenAI-compatible) - **Providers**: add api-airforce, baidu, bazaarlink, bluesminds, kilo-gateway, llm7, morph, sambanova, tencent - **OAuth**: zed / trae / windsurf providers + harden callback proxies - **CLI tools**: set Claude Code max context tokens - **Qoder**: PAT auth + refresh model list - **Gemini**: Gemini 3.6 Flash tier routing + Gemini 3.5 Flash Lite - **Claude**: bump default Opus to `claude-opus-5` - **Kiro**: add Claude Opus 5 models - **Usage**: Kimi and DeepSeek usage handlers - **Usage**: SuperGrok weekly pool via gRPC-web ## Fixes - **Refresh**: rotate `refresh_token` between retry attempts - **Kiro**: canonicalize tool history and route API keys correctly - **Kiro**: normalize dashboard thinking intensity models - **Cursor**: stop leaking agent tool errors as text - **Gemini**: fill empty tool schemas after `$ref` strip - **Antigravity**: strip `stream_options` from non-stream requests - **Jina-reader**: recover after transient errors, use JSON POST API - **Usage**: record exact embedding tokens - **Tunnel**: preserve successor cloudflared PID - **Console-log**: initialize capture at server boot + prevent SSE proxy buffering - **Dashboard**: count dual-auth, free-tier OAuth and API-key connections correctly - **Dashboard**: flex quota rows, thin global scrollbars, no hidden-row overflow ## Docs - **i18n**: expand pt-BR translation to 986 terms - README: Indonesian translation
This commit is contained in:
@@ -32,26 +32,34 @@ function resolveDevinBin() {
|
||||
const envBin = process.env.CLI_DEVIN_BIN?.trim();
|
||||
if (envBin) return envBin;
|
||||
|
||||
// 2. Common name (PATH lookup handled by spawn shell option)
|
||||
const isWin = process.platform === "win32";
|
||||
|
||||
// 3. Windows installer default: %LOCALAPPDATA%\devin\cli\bin\devin.exe
|
||||
if (isWin) {
|
||||
const localAppData = process.env.LOCALAPPDATA || path.join(os.homedir(), "AppData", "Local");
|
||||
const winPath = path.join(localAppData, "devin", "cli", "bin", "devin.exe");
|
||||
if (fs.existsSync(winPath)) return winPath;
|
||||
}
|
||||
|
||||
// 4. Linux/macOS installer paths
|
||||
const home = os.homedir();
|
||||
for (const candidate of [
|
||||
path.join(home, ".local", "share", "devin", "bin", "devin"),
|
||||
path.join(home, ".devin", "bin", "devin"),
|
||||
]) {
|
||||
|
||||
// 2. Known installer / package-manager locations. spawn uses shell:false on
|
||||
// macOS/Linux, so process.env.PATH alone may miss ~/.local/bin, Homebrew,
|
||||
// Scoop, etc. when the server runs detached (tray/daemon/launchd) without
|
||||
// a login shell — probe these explicitly before falling back to PATH.
|
||||
const candidates = isWin
|
||||
? [
|
||||
// Official installer: %LOCALAPPDATA%\devin\cli\bin\devin.exe
|
||||
path.join(process.env.LOCALAPPDATA || path.join(home, "AppData", "Local"), "devin", "cli", "bin", "devin.exe"),
|
||||
path.join(home, ".local", "bin", "devin.exe"),
|
||||
path.join(home, "scoop", "shims", "devin.exe"),
|
||||
path.join(process.env.LOCALAPPDATA || path.join(home, "AppData", "Local"), "Programs", "devin", "devin.exe"),
|
||||
]
|
||||
: [
|
||||
path.join(home, ".local", "share", "devin", "bin", "devin"),
|
||||
path.join(home, ".devin", "bin", "devin"),
|
||||
path.join(home, ".local", "bin", "devin"), // pipx / user install
|
||||
"/opt/homebrew/bin/devin", // Homebrew (Apple Silicon)
|
||||
"/usr/local/bin/devin", // Homebrew (Intel) / manual
|
||||
"/usr/bin/devin",
|
||||
];
|
||||
for (const candidate of candidates) {
|
||||
if (fs.existsSync(candidate)) return candidate;
|
||||
}
|
||||
|
||||
// Fallback — rely on PATH
|
||||
// 3. Fallback — rely on process.env.PATH
|
||||
return isWin ? "devin.exe" : "devin";
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user