use crate::engine::SymbolicAnswer;
use crate::event_log::EventLog;
use crate::solver::{ConversationRole, ConversationTurn, SolverConfig, UniversalSolver};
use crate::translation::{detect_comprehension_failure, detect_response_language};
pub fn try_response_language_followup(
_prompt: &str,
normalized: &str,
log: &mut EventLog,
history: &[ConversationTurn],
config: SolverConfig,
) -> Option<SymbolicAnswer> {
if config.forced_response_language.is_some() {
return None;
}
let target_language = detect_response_language(normalized)?;
if !is_language_reanswer_followup(normalized) {
return None;
}
let previous_index = history
.iter()
.rposition(|turn| turn.role == ConversationRole::User)?;
let previous_user = history[previous_index].content.trim().to_owned();
if previous_user.is_empty() {
return None;
}
let prior_history = &history[..previous_index];
let mut replay_config = config;
replay_config.forced_response_language = Some(target_language);
let replay =
UniversalSolver::new(replay_config).solve_with_history(&previous_user, prior_history);
if is_inconclusive(&replay.intent) {
return None;
}
log.append(
"response_language_followup:target",
target_language.to_owned(),
);
log.append("language_to", target_language.to_owned());
log.append("response_language_followup:prior_user", previous_user);
log.append("response_language_followup:handler", replay.intent.clone());
let mut answer = replay;
push_unique(
&mut answer.evidence_links,
format!("response_language_followup:target:{target_language}"),
);
push_unique(
&mut answer.evidence_links,
format!("language_to:{target_language}"),
);
push_unique(
&mut answer.evidence_links,
format!("response_language_followup:handler:{}", answer.intent),
);
Some(answer)
}
fn is_language_reanswer_followup(normalized: &str) -> bool {
let normalized = normalized.trim();
if normalized.is_empty() {
return false;
}
if detect_comprehension_failure(normalized) {
return true;
}
normalized.split_whitespace().count() <= 4
}
fn is_inconclusive(intent: &str) -> bool {
matches!(intent, "unknown" | "ill_formed" | "punctuation_only_prompt")
|| intent.starts_with("clarify")
}
fn push_unique(links: &mut Vec<String>, link: String) {
if !links.contains(&link) {
links.push(link);
}
}