mirror of
https://github.com/Nezumi-2711/9router.git
synced 2026-09-22 20:00:47 +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:
@@ -13,15 +13,25 @@ const execAsync = promisify(exec);
|
||||
// matches what the runtime actually spawns.
|
||||
const candidateDevinPaths = () => {
|
||||
const home = os.homedir();
|
||||
const paths = [
|
||||
path.join(home, ".local", "share", "devin", "bin", "devin"),
|
||||
path.join(home, ".devin", "bin", "devin"),
|
||||
];
|
||||
if (process.platform === "win32") {
|
||||
const localAppData = process.env.LOCALAPPDATA || path.join(home, "AppData", "Local");
|
||||
paths.push(path.join(localAppData, "devin", "cli", "bin", "devin.exe"));
|
||||
}
|
||||
return paths;
|
||||
const isWin = os.platform() === "win32";
|
||||
const localAppData = process.env.LOCALAPPDATA || path.join(home, "AppData", "Local");
|
||||
// Mirror resolveDevinBin in the executor — cover installer + common
|
||||
// package-manager locations so detection matches runtime resolution.
|
||||
return isWin
|
||||
? [
|
||||
path.join(localAppData, "devin", "cli", "bin", "devin.exe"),
|
||||
path.join(home, ".local", "bin", "devin.exe"),
|
||||
path.join(home, "scoop", "shims", "devin.exe"),
|
||||
path.join(localAppData, "Programs", "devin", "devin.exe"),
|
||||
]
|
||||
: [
|
||||
path.join(home, ".local", "share", "devin", "bin", "devin"),
|
||||
path.join(home, ".devin", "bin", "devin"),
|
||||
path.join(home, ".local", "bin", "devin"),
|
||||
"/opt/homebrew/bin/devin",
|
||||
"/usr/local/bin/devin",
|
||||
"/usr/bin/devin",
|
||||
];
|
||||
};
|
||||
|
||||
const checkDevinInstalled = async () => {
|
||||
|
||||
Reference in New Issue
Block a user