use agent_base::{AgentResult, AgentRuntime, SessionId};
use super::MultiAgentRuntime;
impl MultiAgentRuntime {
pub(crate) async fn resolve_fork_history(
&self,
fork_history: Option<String>,
parent_session_id: &SessionId,
) -> Vec<agent_base::ChatMessage> {
use agent_base::ChatMessage;
let mode = match fork_history.as_deref() {
None | Some("none") => return vec![],
Some(s) => s,
};
let sm = match self.session_manager.lock().unwrap().as_ref() {
Some(sm) => sm.clone(),
None => {
tracing::warn!("fork_history requested but no session_manager set");
return vec![];
}
};
let all_messages = match sm.session_or_err(parent_session_id).await {
Ok(session) => session.chat_messages().to_vec(),
Err(e) => {
tracing::warn!(session_id = parent_session_id.id, error = %e, "failed to load parent session for fork_history");
return vec![];
}
};
if all_messages.is_empty() {
return vec![];
}
let non_system: Vec<ChatMessage> = all_messages
.into_iter()
.filter(|m| !matches!(m, ChatMessage::System { .. }))
.collect();
match mode {
"all" => non_system,
n_str => {
let n: usize = match n_str.parse() {
Ok(n) if n > 0 => n,
_ => {
tracing::warn!(
fork_history = n_str,
"invalid fork_history value, treating as 'none'"
);
return vec![];
}
};
let mut turns = 0usize;
let mut cutoff = non_system.len();
for (i, msg) in non_system.iter().enumerate().rev() {
if matches!(msg, ChatMessage::User { .. }) {
turns += 1;
if turns >= n {
cutoff = i;
break;
}
}
}
non_system[cutoff..].to_vec()
}
}
}
pub(crate) async fn prefill_child_session(
&self,
child_runtime: &AgentRuntime,
session_id: &SessionId,
parent_messages: &[agent_base::ChatMessage],
) -> AgentResult<()> {
use agent_base::ChatMessage;
for msg in parent_messages {
match msg {
ChatMessage::User { content, .. } => {
child_runtime.add_user_message(session_id, content).await?;
}
ChatMessage::Assistant {
content: Some(text),
..
} => {
child_runtime
.add_system_message(
session_id,
format!("[Parent assistant response]: {}", text),
)
.await?;
}
ChatMessage::Assistant { tool_calls, .. } if tool_calls.is_some() => {
}
ChatMessage::Tool {
tool_call_id,
content,
..
} => {
child_runtime
.add_system_message(
session_id,
format!("[Parent tool result ({}): {}]", tool_call_id, content),
)
.await?;
}
_ => {} }
}
Ok(())
}
}