@@ -577,6 +577,7 @@ fn get_or_npm_install_builtin_agent(
     package_name: SharedString,
     entrypoint_path: PathBuf,
     minimum_version: Option<semver::Version>,
+    channel: &'static str,
     status_tx: Option<watch::Sender<SharedString>>,
     new_version_available: Option<watch::Sender<Option<String>>>,
     fs: Arc<dyn Fs>,
@@ -648,9 +649,13 @@ fn get_or_npm_install_builtin_agent(
                 let dir = dir.clone();
                 let fs = fs.clone();
                 async move {
-                    let latest_version =
-                        node_runtime.npm_package_latest_version(&package_name).await;
-                    if let Ok(latest_version) = latest_version
+                    // TODO remove the filter
+                    let latest_version = node_runtime
+                        .npm_package_latest_version(&package_name)
+                        .await
+                        .ok()
+                        .filter(|_| channel == "latest");
+                    if let Some(latest_version) = latest_version
                         && &latest_version != &file_name.to_string_lossy()
                     {
                         let download_result = download_latest_version(
@@ -658,6 +663,7 @@ fn get_or_npm_install_builtin_agent(
                             dir.clone(),
                             node_runtime,
                             package_name.clone(),
+                            channel,
                         )
                         .await
                         .log_err();
@@ -681,6 +687,7 @@ fn get_or_npm_install_builtin_agent(
                 dir.clone(),
                 node_runtime,
                 package_name.clone(),
+                channel,
             ))
             .await?
             .into()
@@ -729,13 +736,14 @@ async fn download_latest_version(
     dir: PathBuf,
     node_runtime: NodeRuntime,
     package_name: SharedString,
+    channel: &'static str,
 ) -> Result<String> {
     log::debug!("downloading latest version of {package_name}");
 
     let tmp_dir = tempfile::tempdir_in(&dir)?;
 
     node_runtime
-        .npm_install_packages(tmp_dir.path(), &[(&package_name, "latest")])
+        .npm_install_packages(tmp_dir.path(), &[(&package_name, channel)])
         .await?;
 
     let version = node_runtime
@@ -878,7 +886,17 @@ impl ExternalAgentServer for LocalGemini {
                     GEMINI_NAME.into(),
                     "@google/gemini-cli".into(),
                     "node_modules/@google/gemini-cli/dist/index.js".into(),
-                    Some("0.2.1".parse().unwrap()),
+                    // TODO remove these windows-specific workarounds once v0.9.0 stable is released
+                    if cfg!(windows) {
+                        Some("0.9.0-preview.4".parse().unwrap())
+                    } else {
+                        Some("0.2.1".parse().unwrap())
+                    },
+                    if cfg!(windows) {
+                        "0.9.0-preview.4"
+                    } else {
+                        "latest"
+                    },
                     status_tx,
                     new_version_available_tx,
                     fs,
@@ -962,6 +980,7 @@ impl ExternalAgentServer for LocalClaudeCode {
                     "@zed-industries/claude-code-acp".into(),
                     "node_modules/@zed-industries/claude-code-acp/dist/index.js".into(),
                     Some("0.5.2".parse().unwrap()),
+                    "latest",
                     status_tx,
                     new_version_available_tx,
                     fs,