use std::path::Path;
use crate::inner_socrates::personas;
use crate::inner_socrates::slow;
use crate::inner_socrates::types::{Persona, SocraticFinding};
pub(super) fn dialectician(project: &Path) -> Persona {
personas::by_id(project, "philosophical-reader")
}
pub(super) fn build_prompts(
persona: &Persona,
genre: Option<&str>,
facts_block: &str,
) -> (String, String) {
let system = slow::slow_system_for(persona.stance, genre);
let lang = crate::world::fact_check_lang::detect(facts_block);
let user = slow::build_slow_prompt(persona, facts_block, "None.", &[], lang);
(system, user)
}
pub(super) fn parse(raw: &str, persona_id: &str) -> Vec<SocraticFinding> {
slow::parse_slow_findings(raw, persona_id)
}
pub(super) fn render(topic: &str, findings: &[SocraticFinding]) -> String {
if findings.is_empty() {
return "No Socratic questions rose from the corpus — the facts examined here go, \
for now, unquestioned. (Try a narrower topic, or gather more.)"
.to_string();
}
let target = if topic.trim().is_empty() {
"the collected facts".to_string()
} else {
format!("“{}”", topic.trim())
};
let mut s = format!(
"The Dialectician's questions on {target} ({}) — the questions your facts must answer to stand:\n",
findings.len()
);
for f in findings {
s.push_str(&format!(
"\n · [{} · {}] {}\n",
f.category.label(),
f.severity.label(),
f.question
));
}
s
}