# 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 () => {
|
||||
|
||||
@@ -302,9 +302,26 @@ export default function Sidebar({ onClose }) {
|
||||
<span className="material-symbols-outlined text-[18px] group-hover:text-primary transition-colors">
|
||||
computer
|
||||
</span>
|
||||
<span className="text-[13px] font-medium">Remote</span>
|
||||
<span className="text-[13px] font-medium">9Remote</span>
|
||||
</button>
|
||||
|
||||
{/* 9English */}
|
||||
<a
|
||||
href="https://9english.net/"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
onClick={onClose}
|
||||
className={cn(
|
||||
"flex items-center gap-3 px-3 py-1 rounded-lg transition-all group w-full",
|
||||
"text-text-muted hover:bg-surface-2 hover:text-text-main"
|
||||
)}
|
||||
>
|
||||
<span className="material-symbols-outlined text-[18px] group-hover:text-primary transition-colors">
|
||||
translate
|
||||
</span>
|
||||
<span className="text-[13px] font-medium">9English</span>
|
||||
</a>
|
||||
|
||||
{/* Settings */}
|
||||
<Link
|
||||
href="/dashboard/profile"
|
||||
|
||||
Reference in New Issue
Block a user