Refactor/整理项目对话错误相关代码 #593

Merged
k88936 merged 40 commits from refactor/turn-error-to-explicit-struct into master 2026-10-03 15:58:25 +08:00
Showing only changes of commit 2dbbf72450 - Show all commits
@@ -2012,11 +2012,17 @@ fn direct_codex_error_code(failure: &TurnError) -> &'static str {
Deadline::TurnHardLimit => "turn-hard-timeout",
},
TurnError::TransportClosed(_) => "transport-closed",
// typed 分类优先于文本判据:通道断开的原文不一定带 "transport closed",
// 不能让分类结果取决于宿主换了哪句 Display。
TurnError::ModelCallFailed(payload) => match payload.kind {
ModelCallKind::TransportBroken => "transport-closed",
// 其余 kind 还没有专属 code,仍按宿主原文兜底(TODO(文本判据))。
_ => classify_direct_codex_error(&payload.detail),
},
// 产生层还没有 typed 出口:按宿主原文分类(TODO(文本判据))。
TurnError::ProjectRootUnanchored(_)
| TurnError::EnvironmentNotReady(_)
| TurnError::HostStateUnavailable(_)
| TurnError::ModelCallFailed(_)
| TurnError::TurnInterrupted(_)
| TurnError::ReviewRequired { .. }
| TurnError::RepairRequired { .. } => {
@@ -7417,6 +7423,22 @@ mod tests {
assert!(!diagnostic.contains("provider.example"));
}
/// typed 分类优先于文本判据:`ModelCallKind::TransportBroken` 的原文里没有
/// `transport closed` / `连接已关闭`,也要标成 `transport-closed`。
#[test]
fn model_call_transport_broken_is_classified_from_the_typed_kind() {
let parent = tempfile::tempdir().expect("temp dir");
let root = parent.path().join("project");
init_local_game_project_at(&root, "direct-diagnostic", "直连诊断").expect("init project");
let error = TurnError::from_model_call(&LlmError::Transport(
"宿主自己写的收场说明,不含分类标记".to_string(),
));
let text = record_direct_codex_failure(&root, &error, None);
assert!(text.contains("code=transport-closed"), "{text}");
}
#[test]
fn direct_failure_diagnostic_marks_project_history_shape_failure_as_not_retryable() {
let parent = tempfile::tempdir().expect("temp dir");