diff --git a/code-rs/core/src/agent_tool.rs b/code-rs/core/src/agent_tool.rs index aee0cdc7ef9..296a310e184 100644 --- a/code-rs/core/src/agent_tool.rs +++ b/code-rs/core/src/agent_tool.rs @@ -2542,7 +2542,7 @@ async fn execute_model_with_permissions( final_args.push(effort_override.clone()); final_args.push("-c".into()); final_args.push(auto_effort_override.clone()); - prompt_stdin = deliver_agent_prompt(family, &mut final_args, prompt, use_current_exe, false)?; + prompt_stdin = deliver_agent_prompt(family, &mut final_args, prompt, true, false)?; } "cloud" => { if built_in_cloud { @@ -4650,11 +4650,12 @@ mod tests { assert!(err.contains("argv delivery threshold")); } + #[cfg(unix)] #[tokio::test] - async fn large_custom_code_command_prompt_fails_before_spawn() { + async fn large_custom_code_command_prompt_uses_stdin() { let dir = tempdir().expect("tempdir"); let custom_code = script_path(dir.path(), "custom-code"); - write_argv_script(&custom_code); + write_large_prompt_probe_script(&custom_code); let cfg = AgentConfig { name: "code-gpt-5.4".to_string(), @@ -4670,7 +4671,7 @@ mod tests { }; let prompt = "x".repeat(super::AGENT_PROMPT_STDIN_THRESHOLD_BYTES + 1); - let err = execute_model_with_permissions( + let output = execute_model_with_permissions( "agent-test", "code-gpt-5.4", &prompt, @@ -4683,9 +4684,12 @@ mod tests { None, ) .await - .expect_err("large custom code prompt should fail"); + .expect("large custom code prompt should use stdin"); - assert!(err.contains("does not support large-prompt stdin delivery")); + assert_eq!( + output.trim(), + format!("prompt_arg=- stdin_len={}", prompt.len()) + ); } #[cfg(not(target_os = "windows"))] diff --git a/code-rs/core/src/review_store.rs b/code-rs/core/src/review_store.rs index d7c17fe2f2e..006e7df3487 100644 --- a/code-rs/core/src/review_store.rs +++ b/code-rs/core/src/review_store.rs @@ -466,6 +466,9 @@ impl AutoReviewRunStore { || run.status == AutoReviewRunStatus::Superseded || run.finding_count > 0 || !run.finding_digests.is_empty() + || run.error_class.is_some() + || run.error_summary.is_some() + || run.cancel_reason.is_some() { continue; } @@ -1059,7 +1062,7 @@ mod tests { #[test] #[serial] - fn supersede_by_fingerprint_omits_runs_with_findings() { + fn supersede_by_fingerprint_omits_runs_with_findings_and_errors() { let code_home = TempDir::new().unwrap(); let repo = TempDir::new().unwrap(); set_code_home(code_home.path()); @@ -1068,6 +1071,7 @@ mod tests { let new_id = Uuid::new_v4(); let clean_id = Uuid::new_v4(); let finding_id = Uuid::new_v4(); + let failed_id = Uuid::new_v4(); let mut clean = AutoReviewRun::new(clean_id, AutoReviewRunSource::Tui, 1); clean.diff_fingerprint = Some("diff:abc".to_string()); @@ -1080,6 +1084,13 @@ mod tests { finding.mark_status(AutoReviewRunStatus::Completed, 4); store.upsert(finding).unwrap(); + let mut failed = AutoReviewRun::new(failed_id, AutoReviewRunSource::Tui, 5); + failed.diff_fingerprint = Some("diff:abc".to_string()); + failed.error_class = Some("exec".to_string()); + failed.error_summary = Some("agent failed".to_string()); + failed.mark_status(AutoReviewRunStatus::Failed, 6); + store.upsert(failed).unwrap(); + let changed = store .mark_superseded_by_fingerprint("diff:abc", new_id, 10) .unwrap(); @@ -1093,6 +1104,11 @@ mod tests { let finding = loaded.get(finding_id).unwrap(); assert_eq!(finding.status, AutoReviewRunStatus::Completed); assert_eq!(finding.superseded_by, None); + + let failed = loaded.get(failed_id).unwrap(); + assert_eq!(failed.status, AutoReviewRunStatus::Failed); + assert_eq!(failed.superseded_by, None); + assert_eq!(failed.error_summary.as_deref(), Some("agent failed")); } #[test]