use log::debug;
use tracing::info;
use crate::agent::per_coord::{PerCoordinator, PerCoordinatorInit};
use self::orchestration_entry::{TurnOrchestrationTransition, log_orchestration_transition};
pub(crate) mod host;
pub(crate) mod plan_reflect;
#[path = "loop/mod.rs"]
pub(crate) mod turn_loop;
pub(crate) use host::{
errors, execute, execute_tools, params, run_command_dedupe, sub_agent_policy, turn_sink,
};
pub(crate) use plan_reflect::{intent, plan, reflect};
#[allow(unused_imports)] pub(crate) use turn_loop::turn_completion;
pub(crate) use turn_loop::{orchestration_entry, run_dispatch};
pub(crate) mod messages {
pub(crate) use crate::cm_agent::agent_turn::messages::*;
}
pub(crate) use errors::{AgentTurnJobOutcomeKind, AgentTurnSubPhase, RunAgentTurnError};
#[allow(unused_imports)]
pub(crate) use execute::tool_execution_host::{
CrabmateParallelToolDispatch, CrabmateRegistryToolDispatch, ParallelHttpFetchParams,
};
#[allow(unused_imports)]
pub(crate) use execute_tools::{
ExecuteToolsBatchOutcome, WebExecuteCtx, per_execute_tools_web, sse_sender_closed,
};
pub(crate) use intent::intent_at_turn_start;
#[allow(unused_imports)]
pub(crate) use messages::push_assistant_merging_trailing_empty_placeholder;
pub(crate) use params::{
RunLoopAttach, RunLoopCore, RunLoopCtx, RunLoopIo, RunLoopObs, RunLoopParams, RunLoopTurnState,
TurnPlannerHints,
};
#[allow(unused_imports)]
pub(crate) use plan::{PerPlanCallModelParams, per_plan_call_model_retrying};
#[allow(unused_imports)]
pub(crate) use reflect::{ReflectOnAssistantOutcome, per_reflect_after_assistant};
#[allow(unused_imports)]
pub(crate) use sub_agent_policy::filter_tool_defs_for_executor_kind;
pub(crate) use turn_sink::TurnControlSink;
#[cfg(test)]
mod http_sse_failure_path_golden;
#[cfg(test)]
mod tests;
#[cfg(test)]
mod turn_route_decision_golden;
pub(crate) async fn run_agent_turn_common(
p: &mut RunLoopParams<'_>,
) -> Result<(), RunAgentTurnError> {
debug!(
target: "crabmate",
"run_agent_turn 开始 message_count={} messages_revision={} last_user_preview={} planner_executor_mode={} work_dir={}",
p.turn.messages().len(),
p.turn.messages_buffer_revision(),
crate::redact::last_user_message_preview_for_log(p.turn.messages()),
p.ctx.core.cfg.per_plan_policy.planner_executor_mode.as_str(),
p.ctx.core.effective_working_dir.display()
);
p.turn.insert_separator_after_last_user_for_turn();
log_orchestration_transition(TurnOrchestrationTransition::EnterCommon, None, &[]);
info!(
target: "crabmate::agent_turn",
planner_executor_mode = p.ctx.core.cfg.per_plan_policy.planner_executor_mode.as_str(),
session_mode = %p.ctx.attach.session_mode,
"run_agent_turn_common enter"
);
let mut per_coord = PerCoordinator::new(PerCoordinatorInit::from_agent_config(
p.ctx.core.cfg.as_ref(),
));
log_orchestration_transition(TurnOrchestrationTransition::DispatchReAct, None, &[]);
run_dispatch::dispatch_react_turn(p, &mut per_coord).await
}