From 710e452c91af72ec51a5a5ce89090e1526b1f376 Mon Sep 17 00:00:00 2001 From: xintaofei Date: Thu, 12 Mar 2026 22:29:18 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=8D=87=E7=BA=A7Gemini=20CLI=E7=9A=84SDK?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-tauri/src/acp/registry.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src-tauri/src/acp/registry.rs b/src-tauri/src/acp/registry.rs index f0e421f..3742985 100644 --- a/src-tauri/src/acp/registry.rs +++ b/src-tauri/src/acp/registry.rs @@ -297,8 +297,8 @@ pub fn get_agent_meta(agent_type: AgentType) -> AcpAgentMeta { name: "Gemini CLI", description: "Google's official CLI for Gemini", distribution: AgentDistribution::Npx { - version: "0.32.1", - package: "@google/gemini-cli@0.32.1", + version: "0.33.0", + package: "@google/gemini-cli@0.33.0", args: &["--experimental-acp"], env: &[], node_required: None, From 7a6ddb87baf3741c6ff4314bae700c8314f83397 Mon Sep 17 00:00:00 2001 From: xintaofei Date: Thu, 12 Mar 2026 22:44:02 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dgit=E4=BB=93=E5=BA=93?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-tauri/src/commands/folders.rs | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src-tauri/src/commands/folders.rs b/src-tauri/src/commands/folders.rs index 396a8bd..e250084 100644 --- a/src-tauri/src/commands/folders.rs +++ b/src-tauri/src/commands/folders.rs @@ -432,15 +432,31 @@ pub async fn get_git_branch(path: String) -> Result, AppCommandEr .await .map_err(AppCommandError::io)?; - if !output.status.success() { - return Ok(None); + if output.status.success() { + let branch = String::from_utf8_lossy(&output.stdout).trim().to_string(); + if !branch.is_empty() && branch != "HEAD" { + return Ok(Some(branch)); + } } - let branch = String::from_utf8_lossy(&output.stdout).trim().to_string(); - if branch.is_empty() || branch == "HEAD" { - return Ok(None); + // Fallback: symbolic-ref works on unborn branches (after git init, before first commit) + let sym_output = crate::process::tokio_command("git") + .args(["symbolic-ref", "--short", "HEAD"]) + .current_dir(&path) + .output() + .await + .map_err(AppCommandError::io)?; + + if sym_output.status.success() { + let branch = String::from_utf8_lossy(&sym_output.stdout) + .trim() + .to_string(); + if !branch.is_empty() { + return Ok(Some(branch)); + } } - Ok(Some(branch)) + + Ok(None) } #[tauri::command] From 080a969c1e009fb34b3da8930589ad182018db05 Mon Sep 17 00:00:00 2001 From: xintaofei Date: Thu, 12 Mar 2026 22:51:53 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8F=B3=E4=BE=A7?= =?UTF-8?q?=E8=BE=B9=E6=A0=8F=E2=80=9C=E6=8F=90=E4=BA=A4=E2=80=9D=E5=8C=BA?= =?UTF-8?q?=E5=9F=9F=E5=9C=A8=E6=B2=A1=E6=9C=89=E6=8F=90=E4=BA=A4=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E6=97=B6=E6=98=BE=E7=A4=BA=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-tauri/src/commands/folders.rs | 7 +++++++ src/components/layout/aux-panel-file-tree-tab.tsx | 3 ++- src/components/layout/aux-panel-git-log-tab.tsx | 5 +++-- src/contexts/folder-context.tsx | 3 ++- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src-tauri/src/commands/folders.rs b/src-tauri/src/commands/folders.rs index e250084..b790a04 100644 --- a/src-tauri/src/commands/folders.rs +++ b/src-tauri/src/commands/folders.rs @@ -2475,6 +2475,13 @@ pub async fn git_log( .map_err(AppCommandError::io)?; if !output.status.success() { + // Empty repo (no commits yet) — return empty list instead of error + let stderr_str = String::from_utf8_lossy(&output.stderr); + if stderr_str.contains("does not have any commits yet") + || stderr_str.contains("unknown revision or path not in the working tree") + { + return Ok(Vec::new()); + } return Err(git_command_error("log", &output.stderr)); } diff --git a/src/components/layout/aux-panel-file-tree-tab.tsx b/src/components/layout/aux-panel-file-tree-tab.tsx index 8cda1d6..4df8655 100644 --- a/src/components/layout/aux-panel-file-tree-tab.tsx +++ b/src/components/layout/aux-panel-file-tree-tab.tsx @@ -13,6 +13,7 @@ import { revealItemInDir } from "@tauri-apps/plugin-opener" import ignore from "ignore" import { Check, ChevronRight } from "lucide-react" import { useTranslations } from "next-intl" +import { toErrorMessage } from "@/lib/app-error" import { toast } from "sonner" import { useFolderContext } from "@/contexts/folder-context" import { useAuxPanelContext } from "@/contexts/aux-panel-context" @@ -947,7 +948,7 @@ export function FileTreeTab() { setGitStatusByPath(new Map()) } } catch (e) { - setError(e instanceof Error ? e.message : String(e)) + setError(toErrorMessage(e)) } finally { if (!silent && !loadingReleased) setLoading(false) } diff --git a/src/components/layout/aux-panel-git-log-tab.tsx b/src/components/layout/aux-panel-git-log-tab.tsx index b195100..4a805dc 100644 --- a/src/components/layout/aux-panel-git-log-tab.tsx +++ b/src/components/layout/aux-panel-git-log-tab.tsx @@ -83,6 +83,7 @@ import { } from "@/lib/tauri" import type { GitBranchList, GitLogEntry, GitLogFileChange } from "@/lib/types" import { toast } from "sonner" +import { toErrorMessage } from "@/lib/app-error" function formatRelativeTime( dateStr: string, @@ -684,7 +685,7 @@ export function GitLogTab() { } catch (e) { setBranchesError((prev) => ({ ...prev, - [fullHash]: e instanceof Error ? e.message : String(e), + [fullHash]: toErrorMessage(e), })) } finally { setBranchesLoading((prev) => ({ ...prev, [fullHash]: false })) @@ -727,7 +728,7 @@ export function GitLogTab() { ) } } catch (e) { - setError(e instanceof Error ? e.message : String(e)) + setError(toErrorMessage(e)) } finally { if (inline) { setRefreshing(false) diff --git a/src/contexts/folder-context.tsx b/src/contexts/folder-context.tsx index 475bdf6..2786458 100644 --- a/src/contexts/folder-context.tsx +++ b/src/contexts/folder-context.tsx @@ -10,6 +10,7 @@ import { useRef, type ReactNode, } from "react" +import { toErrorMessage } from "@/lib/app-error" import { getFolder, listFolderConversations } from "@/lib/tauri" import type { AgentType, @@ -174,7 +175,7 @@ export function FolderProvider({ } catch (e) { if (!mountedRef.current) return if (!cached) { - setError(e instanceof Error ? e.message : String(e)) + setError(toErrorMessage(e)) } } finally { if (mountedRef.current) {