From fb9048fb03f024000c162097c32102a6d9c33298 Mon Sep 17 00:00:00 2001 From: sky Date: Fri, 18 Sep 2026 11:37:45 +0800 Subject: [PATCH] fix: restore Windows routing paths and release v0.3.20 --- CHANGELOG.md | 2 +- apps/desktop/package.json | 2 +- apps/desktop/src-tauri/Cargo.lock | 2 +- apps/desktop/src-tauri/Cargo.toml | 2 +- apps/desktop/src-tauri/src/failover/controller.rs | 10 ++++++++-- apps/desktop/src-tauri/src/failover/proxy.rs | 6 +++++- apps/desktop/src-tauri/src/failover/tests.rs | 15 +++++++++++++++ apps/desktop/src-tauri/tauri.conf.json | 2 +- docs/PROJECT_LOG.md | 10 ++++++++++ package.json | 2 +- 10 files changed, 44 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 896c249..8131186 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ 记录 Codex-X 的新功能、体验改进和问题修复。 -## [v0.3.19] - 2026-09-18 +## [v0.3.20] - 2026-09-18 - 新增「设置 → 路由与故障转移」:可管理本地路由、安排供应商优先顺序,并在服务异常时自动切换;支持调整超时和重试参数,官方登录也可使用本地路由。 - 修复添加或切换第三方供应商时,MCP、桌面设置等配置丢失的问题。 diff --git a/apps/desktop/package.json b/apps/desktop/package.json index ea69567..c21fb40 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -1,6 +1,6 @@ { "name": "codex-x", - "version": "0.3.19", + "version": "0.3.20", "private": true, "description": "Codex Switch & Instruct desktop manager", "type": "module", diff --git a/apps/desktop/src-tauri/Cargo.lock b/apps/desktop/src-tauri/Cargo.lock index fab2a91..b775b74 100644 --- a/apps/desktop/src-tauri/Cargo.lock +++ b/apps/desktop/src-tauri/Cargo.lock @@ -492,7 +492,7 @@ dependencies = [ [[package]] name = "codex-x" -version = "0.3.19" +version = "0.3.20" dependencies = [ "base64 0.22.1", "chrono", diff --git a/apps/desktop/src-tauri/Cargo.toml b/apps/desktop/src-tauri/Cargo.toml index 524fd33..e25ef0a 100644 --- a/apps/desktop/src-tauri/Cargo.toml +++ b/apps/desktop/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "codex-x" -version = "0.3.19" +version = "0.3.20" description = "Codex Switch & Instruct desktop manager" authors = ["yynxxxxx"] license = "MIT" diff --git a/apps/desktop/src-tauri/src/failover/controller.rs b/apps/desktop/src-tauri/src/failover/controller.rs index 80ebf5a..319e32b 100644 --- a/apps/desktop/src-tauri/src/failover/controller.rs +++ b/apps/desktop/src-tauri/src/failover/controller.rs @@ -1486,8 +1486,14 @@ fn stored_directories() -> Result> { .query_map([], |row| row.get::<_, String>(0)) .map_err(|e| CodexxError::Database(e.to_string()))? .map(|row| { - row.map(PathBuf::from) - .map_err(|e| CodexxError::Database(e.to_string())) + let scope = row.map_err(|e| CodexxError::Database(e.to_string()))?; + // Database scopes use lowercase forward slashes on Windows. They + // are comparison keys, not the canonical native paths used by the + // running-instance map (including Windows' verbatim \\?\ prefix). + // Rehydrate using the same path resolution as interactive IPC. + #[cfg(target_os = "windows")] + let scope = scope.replace('/', "\\"); + directory(Some(scope)) }) .collect(); paths diff --git a/apps/desktop/src-tauri/src/failover/proxy.rs b/apps/desktop/src-tauri/src/failover/proxy.rs index c63e4c7..c7f6f71 100644 --- a/apps/desktop/src-tauri/src/failover/proxy.rs +++ b/apps/desktop/src-tauri/src/failover/proxy.rs @@ -2357,7 +2357,11 @@ mod tests { let started = Instant::now(); proxy.shutdown(); assert!(started.elapsed() < Duration::from_millis(500)); - assert!(TcpStream::connect((std::net::Ipv4Addr::LOCALHOST, proxy.port())).is_err()); + // Windows can delay a refused connect beyond this fixture's 2-second + // stream-idle timeout. Bound the probe while the upstream is paused so + // it tests listener shutdown rather than causing an unrelated timeout. + let stopped_address = SocketAddr::new(proxy.listen_address(), proxy.port()); + assert!(TcpStream::connect_timeout(&stopped_address, Duration::from_millis(100)).is_err()); release.send(()).unwrap(); let mut last = String::new(); reader.read_to_string(&mut last).unwrap(); diff --git a/apps/desktop/src-tauri/src/failover/tests.rs b/apps/desktop/src-tauri/src/failover/tests.rs index 2fca6f7..5ae6433 100644 --- a/apps/desktop/src-tauri/src/failover/tests.rs +++ b/apps/desktop/src-tauri/src/failover/tests.rs @@ -435,6 +435,21 @@ fn failed_restore_keeps_the_listener_alive() { stop(&fixture); } +#[test] +fn persisted_directory_scopes_resolve_to_the_interactive_runtime_key() { + let _guard = crate::app_db::test_db_guard(); + let fixture = Fixture::new(); + fixture.enable(); + let scope = normalized_path_scope(&fixture.dir); + let stored = stored_directories().unwrap(); + let restored = stored + .iter() + .find(|dir| normalized_path_scope(dir) == scope) + .unwrap(); + assert_eq!(*restored, directory(fixture.scope()).unwrap()); + assert!(lock_manager().unwrap().contains_key(restored)); +} + #[test] fn exit_restores_and_rejects_queued_enabling_then_restart_resumes_same_port() { let _guard = crate::app_db::test_db_guard(); diff --git a/apps/desktop/src-tauri/tauri.conf.json b/apps/desktop/src-tauri/tauri.conf.json index 7af1348..54d8270 100644 --- a/apps/desktop/src-tauri/tauri.conf.json +++ b/apps/desktop/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "Codex-X", - "version": "0.3.19", + "version": "0.3.20", "identifier": "com.yynxxxxx.codexx", "build": { "frontendDist": "../dist", diff --git a/docs/PROJECT_LOG.md b/docs/PROJECT_LOG.md index 7f1b238..6e6586b 100644 --- a/docs/PROJECT_LOG.md +++ b/docs/PROJECT_LOG.md @@ -8,6 +8,16 @@ 日志不得包含 Token、认证文件内容、用户数据或仅适用于某台电脑的隐私路径。 +## 2026-09-18:Windows 发布验证修正 + +- v0.3.19 草稿构建在 Windows 测试阶段发现路由重启恢复问题,未公开发布该版本。 + 数据库存储的目录比较键会统一斜线和大小写,启动恢复却直接将其用作原生路径和运行实例键; + Windows 的 verbatim 前缀及规范大小写因此与交互入口不一致。恢复时现先还原原生分隔符, + 再使用交互入口相同的路径解析,新增持久化目录与运行实例一致性的回归。 +- 流式停止测试在上游等待期间同步探测已关闭端口,Windows 的默认连接等待耗尽了测试的静默期限; + 改为有明确短期限的连接探测,仍验证停止监听不截断已经开始的响应,不放宽运行时超时策略。 +- 修正沿用新的 v0.3.20 标签重新发布,保留失败构建记录,不覆盖 v0.3.19 标签。 + ## 2026-09-18:按 CC Switch 对齐路由控制与故障转移 - 对照 CC Switch `06082e189d65e6d6dbadc35dacdac1ce6c79d89a` 的 UI → IPC → 数据库 → 运行时链路, diff --git a/package.json b/package.json index f232735..b438f14 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "codex-x-workspace", "private": true, - "version": "0.3.19", + "version": "0.3.20", "scripts": { "dev": "pnpm --dir apps/desktop tauri dev", "build": "pnpm --dir apps/desktop tauri build",