Skip to content

切换账号成功,实际上还是旧账号在zcode #6

Closed

Description

@zhengkanghua
Image Image

切换账号成功了,实际上,zcode打开还是旧账号。

最新版本zcode-switch+3.11.2 zcode。
已尝试操作:
1、关闭zcode,切换账号,再打开zcode,还是大号账号。
2、重新安装zcode,关闭zcode,切换账号,再打开zcode,还是大号账号。
3、在zcode-switch中删除小号账号,点击保存当前登录,保存的是小号账号(可能和zcode读取的账号列表出现冲突了)
4、升级zcode-switch,依旧切换失败。
5、zcode-switch中修改zcode的.exe位置,还是一样。

前置情况:
我之前用scoop安装的zcode,且用scoop升级过zcode,现在scoop的zcode已卸载,用官网安装包安装,问题依旧存在。
上一次可以切换的情况:zcode也是用scoop安装的。
可以切换到现在,中间的操作:zcode使用scoop升级;zcode-switch中修改zcode的.exe位置为正确位置;

Activity

  1. muhammadbabartemp-lab commented on Sep 5, 2026

    @muhammadbabartemp-lab

    i tested also when you switch then soon as possible fastly go ot settings and model settings and just three to four times refresh the model settings option here so with this new switched account working

  2. pjpv commented on Sep 5, 2026

    @pjpv
    Owner

    v1.5.4 修复了更换/重装 zcode 后路径识别失效导致的此类问题(你从 scoop 升级→卸载→官网重装正属此列)。

    请升级到 v1.5.4,到设置里把 zcode 路径清空保存(会自动探测),再试一次切换。若仍复现,请附上设置页显示的路径。

  3. yangtao109 commented on Sep 7, 2026

    @yangtao109

    v1.5.4 修复了更换/重装 zcode 后路径识别失效导致的此类问题(你从 scoop 升级→卸载→官网重装正属此列)。

    请升级到 v1.5.4,到设置里把 zcode 路径清空保存(会自动探测),再试一次切换。若仍复现,请附上设置页显示的路径。

    我也遇到这个问题了,我让ai自己解决了,不知道原因是否和他的一样。

    我是因为自己在zcode的设置中修改了数据存放目录,zcode的逻辑是改了这个后它的读、存账号登录态文件也同步修改到新设置的目录了,所以switch切账号改它的默认目录就没用了。
    因为修改数据目录后zcode只是部分配置文件的读、存同步改到新目录中,它的设置文件配置还是在默认目录,同时设置文件中有新目录的路径,所以ai给我修改的是改账号文件的目录不在用写死的那种了,改为去读设置文件里的信息来获取需要的路径了。。

    自己重编译挺麻烦,还是希望作者核实下在新版本中修复这个问题吧

  4. codeyy2023 commented on Sep 24, 2026

    @codeyy2023
    Contributor

    补充排查:这条 issue 里其实混着两个不同的根因(附实测证据)

    在自己的机器上完整复现并定位了「切换成功但 ZCode 仍是旧账号」。结论:楼主的成因和 3 楼 @yangtao109 的成因不是同一个,而 3 楼描述的那条在 v1.6.0(当前最新)里依然存在。

    @yangtao109 的判断完全正确 —— 下面是代码级证据和最小修复方案。


    一、结论

    ZCode 的数据根由 ~/.zcode/v2/setting.json 里的 dataBaseDir 决定。在 ZCode 里改过「数据目录」之后,账号登录态文件本身也跟着搬到了新目录,而 zcode-switch v1.6.0 仍然只会读写 ~/.zcode/v2/ —— 它改的是一份 ZCode 根本不读的僵尸副本。

    二、ZCode 侧的路径规则(从 app.asar 提取,非猜测)

    getDataBaseDir()      = setting.json.dataBaseDir || env.ZCODE_DATA_BASE_DIR || homedir()
    getZCodeDataRootDir() = <dataBaseDir>/.zcode
    getAppConfigDir()     = <dataBaseDir>/.zcode/v2
    getCredentialsFile()  = <getAppConfigDir()>/credentials.json   // 唯一路径,没有 home 回退

    其中 setting.json 自身是 bootstrap 文件,永远留在 ~/.zcode/v2/(它要存放 dataBaseDir 本身);而 credentials.json、telemetry-state.json、coding-plan-cache.json、provider_config.json、logs/ 全部在 <dataBaseDir>/.zcode/v2/ 下。

    三、zcode-switch 侧(v1.6.0 store.rs:66-70)

    pub fn live_file(&self)     -> PathBuf { self.home.join(".zcode").join("v2").join("credentials.json") }
    pub fn live_config(&self)   -> PathBuf { self.home.join(".zcode").join("v2").join("config.json") }
    pub fn live_telemetry(&self)-> PathBuf { self.home.join(".zcode").join("v2").join("telemetry-state.json") }
    pub fn live_setting(&self)  -> PathBuf { self.home.join(".zcode").join("v2").join("setting.json") }
    pub fn live_plan_cache(&self)->PathBuf { self.home.join(".zcode").join("v2").join("coding-plan-cache.json") }

    全部硬编码在 home 下,仓库里没有任何地方读取 dataBaseDir。

    四、实测数据

    (用户名已打码;<user> = Windows 用户名。设置:ZCode 的「数据目录」改成了 F:\zcode。)

    文件 C:\Users\<user>\.zcode\v2\(home 根) F:\zcode\.zcode\v2\(dataBaseDir 根) ZCode 实际在用
    credentials.json 01:06:29(switch 写入的 账号A) 09-20(账号B) 右侧
    telemetry-state.json 01:06:29(账号A 的 deviceMid) 当天 00:00:10(账号B 的 deviceMid) 右侧
    config.json 01:06:29(账号A 的 start-plan JWT) 09-17(账号B 的 JWT) 右侧
    provider_config.json 09-18(遗留) 09-24(在用) 右侧
    logs/*.log 最后一条停在 09-18 持续写入(含当天) 右侧
    setting.json 持续写入 不存在 左侧(bootstrap)

    用 zcode-switch 自己的 zcrypto 算法把两边的 oauth:bigmodel:user_info 解开:

    secret = SHA256("zcode-credential-fallback:win32:" + home + ":" + username)
    格式   = enc:v1:<b64url(nonce)>.<b64url(tag)>.<b64url(ciphertext)>     // AES-256-GCM
    
    • F:\zcode\.zcode\v2\credentials.json → {"username":"账号B", ...}
    • C:\Users\<user>\.zcode\v2\credentials.json → {"username":"账号A", ...}

    ZCode 界面上显示的是账号B,Z·SWITCH 界面「使用中」标记的是账号A —— 两边各说各话,与楼主的截图完全一致。

    时间线也吻合:01:06:29 switch 把账号A 写进 home 根(同时杀掉 ZCode,因 zcode_path 失效没有自动拉起)→ 01:08:43 用户手动启动 ZCode → ZCode 读 dataBaseDir 根,显示账号B。

    五、顺带提醒:不要用 ZCODE_SWITCH_HOME 绕过

    ZCODE_SWITCH_HOME 看起来可以直接指到 dataBaseDir 目录绕过,但实测会坏掉:它改的是 home,而 home 同时是 enc:v1 的解密密钥基准(zcrypto::default_secret)。改完之后所有密文字段都解不开(account_identity、find_same_login、already_active)判定全部失效,还可能重新触发 v1.5.0 修过的「Auto xx 重复账号」。这个问题只能改代码。

    六、已验证的修复

    • Paths 增加 data_root,优先级与 ZCode 完全同序:setting.json.dataBaseDir > env.ZCODE_DATA_BASE_DIR > home;
    • live_file / live_config / live_telemetry / live_plan_cache 改走 data_root;
    • home 保持不变(密钥基准 + .zcode-switch 账号库位置);
    • live_setting() 保持 home 根(bootstrap 文件);
    • quota.rs 的 device_mid() 读的 telemetry-state.json 一并改走数据根(原先读的也是僵尸副本);
    • atomic_write() 补上父目录 create_dir_all。

    编译后实测:--cli state 的 live_identity 与 ZCode 界面一致;往返切换(账号B ↔ 账号A)后解密 F:\...\credentials.json 内容随之变化,而 C:\...\credentials.json 的 SHA256 完全没变(补丁后不再碰它)。

    若维护者认可,我可以直接提交 PR。

    七、另外两个小问题(附带反馈)

    1. exe 自动探测覆盖不到非默认安装目录:client_path_candidates("windows") 只有 C:\Program Files\ZCode\ZCode.exe 和 %LOCALAPPDATA%\Programs\ZCode\ZCode.exe。ZCode 装在 D:\Zcode 这类目录时,"清空路径让它自动探测"不会生效,只能手动选文件;此时 zcode_path_ok=false,「启动 ZCode」按钮被禁用、切换后不会自动重启(用户容易误以为"切换失败")。
    2. 源码自行编译的坑:cargo build --release 必须带 --features tauri/custom-protocol。tauri/build.rs 里是 let dev = !custom_protocol;,漏掉它即使是 release 构建也会被当成 dev 模式,窗口去连 http://127.0.0.1:5173 并显示 ERR_CONNECTION_REFUSED。(官方 release 走 tauri-action,CLI 会自动带上这个 feature,所以只在手工编译时踩得到。)
  5. pjpv commented on Sep 25, 2026

    @pjpv
    Owner

    这个 issue 里混着的两个成因都已处理:楼主这类(重装/更换 ZCode 后路径识别失效)v1.5.4 已修复;3 楼 @yangtao109 这类(自定义过 ZCode「数据目录」)已在 v1.7.0-beta.1 修复(感谢 @codeyy2023 的定位与 #18)。请升级验证,有问题可重开。

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

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions