Skip to content

[Bug] Windows 下子 Agent 创建 Worktree 返回 \\?\ Verbatim 路径前缀,导致路径畸变及子 Agent 执行失败 #764

Description

@biihuu

Affected area

Desktop core (Tauri / Rust)

Version or commit

v1.3.1

Environment

windows环境
liveagent:过去版本到最近最新的版本

Steps to reproduce

让子agent修改或者创建代码的时候,会用worktree来隔离,但是在执行过程中出现了这个问题。

Image

Expected behavior

希望可以修复这个问题,让子agent也可以参与修改代码的行为。

以下文字是根据antigravity gemini-3.7-flash-medium在liveagent 1.3.1版本的代码bug预测,希望能够有所帮助:

你遇到的这个现象,是由 Windows 下 Rust 标准库 std::fs::canonicalize 的特殊规范化行为(Verbatim Path / 扩展长度路径前缀) 引起的。


1. 根本原因定位

在 Windows 操作系统中,当 Rust 后端调用 std::fs::canonicalize 解析绝对路径时,底层会调用 Win32 API 将路径转换为扩展长度前缀(Verbatim Path),即:

$$\texttt{C:\textbackslash Users\textbackslash admin\textbackslash ...} \quad \xrightarrow{\text{fs::canonicalize}} \quad \mathbf{\backslash\backslash ?\backslash}\texttt{C:\textbackslash Users\textbackslash admin\textbackslash ...}$$

产生错误的链路:

  1. Rust 后端未做前缀剥离
    subagent_worktree.rsgit.rs 中,创建完 Worktree 之后,直接执行了:
    let worktree_root = fs::canonicalize(&target)?;
    // 输出直接变成了 "\\?\C:\Users\xxx\.liveagent\worktree\..."
  2. 传递给前端/大模型/终端工具后的畸变
    • 转义符丢失 / 斜杠转换:前端或工具将 Windows 反斜杠 \ 统一转为正斜杠 / 时,\\?\ 会变成 //?/C:/...
    • URL 协议与 Markdown 解析:在转换成 file:// 或经过某些正则匹配/字符串分割时,由于开头的特殊问号 ?,路径经常被错误地截断或解析为 ?/ C:\...\??\C:\...
    • 外部命令行(cmd/powershell/git)不兼容:Windows 自带的 cmd.exepowershell 和部分版本的 git 无法将 \\?\ 开头的路径作为当前工作目录(cwd),会直接报错找不到目录。

2. 项目中已有的规范做法与缺失处

实际上,项目在 crates/agent-gui/src-tauri/src/runtime/platform.rs 中专门实现过去除该前缀的工具函数:

/// `fs::canonicalize` returns `\\?\`-verbatim paths on Windows. Classic Win32
/// form is required for child-process cwd (cmd.exe / Windows PowerShell
/// mishandle verbatim) and for user-facing workdir strings. No-op elsewhere.
pub(crate) fn strip_windows_verbatim_prefix(path: PathBuf) -> PathBuf {
    #[cfg(windows)]
    {
        let raw = path.to_string_lossy();
        if let Some(stripped) = raw.strip_prefix(r"\\?\UNC\") {
            return PathBuf::from(format!(r"\\{stripped}"));
        }
        if let Some(stripped) = raw.strip_prefix(r"\\?\") {
            return PathBuf::from(stripped.to_string());
        }
    }
    path
}

但是在 Worktree 创建返回的地方(subagent_worktree.rsgit.rs,遗漏了对 strip_windows_verbatim_prefix 的调用,导致带有 \\?\ 前缀的裸路径被直接返回给了前端和子 Agent。


3. 解决思路

只需在 Rust 后端 subagent_worktree_create 以及 git_create_worktree 返回路径之前,用 strip_windows_verbatim_prefix(或使用 dunce::canonicalize)将 \\?\ 前缀剥除,恢复成标准正常的经典 Win32 路径格式 C:\Users\<用户名>\... 即可彻底根治。

Actual behavior

在子agent执行中,因为worktree路径生成错误导致子agent创建错误。

Logs / screenshots

No response

Pre-submit checklist

  • I searched existing issues and pull requests and found no duplicates.
  • This is not a security vulnerability (report those privately via Security Advisories).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions