fix: restore Windows routing paths and release v0.3.20

This commit is contained in:
sky
2026-09-18 11:37:45 +08:00
parent e1e8f3c7c2
commit fb9048fb03
10 changed files with 44 additions and 9 deletions
+1 -1
View File
@@ -2,7 +2,7 @@
记录 Codex-X 的新功能、体验改进和问题修复。
## [v0.3.19] - 2026-09-18
## [v0.3.20] - 2026-09-18
- 新增「设置 → 路由与故障转移」:可管理本地路由、安排供应商优先顺序,并在服务异常时自动切换;支持调整超时和重试参数,官方登录也可使用本地路由。
- 修复添加或切换第三方供应商时,MCP、桌面设置等配置丢失的问题。
+1 -1
View File
@@ -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",
+1 -1
View File
@@ -492,7 +492,7 @@ dependencies = [
[[package]]
name = "codex-x"
version = "0.3.19"
version = "0.3.20"
dependencies = [
"base64 0.22.1",
"chrono",
+1 -1
View File
@@ -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"
@@ -1486,8 +1486,14 @@ fn stored_directories() -> Result<Vec<PathBuf>> {
.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
+5 -1
View File
@@ -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();
@@ -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();
+1 -1
View File
@@ -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",
+10
View File
@@ -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 → 数据库 → 运行时链路,
+1 -1
View File
@@ -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",