use crate::agent::tools::background::BackgroundStore;
use crate::agent::tools::plan::PlanSwitchSender;
use crate::agent::tools::question::QuestionSender;
use crate::cli::Cli;
use crate::config::Config;
use crate::permission::ask::AskSender;
use crate::permission::checker::PermCheck;
use crate::provider::AnyClient;
use crate::sandbox::Sandbox;
use crate::session::Session;
use crate::ui::renderer::Renderer;
use crate::ui::tool_display::CollapsedToolResult;
#[cfg(feature = "mcp")]
use crate::extras::mcp::McpClientManager;
#[cfg(feature = "semantic")]
use crate::semantic::SemanticManager;
pub(super) mod context_compacted;
pub(super) mod context_overflow;
pub(super) mod done;
pub(super) mod error;
pub(super) mod interjected;
pub(super) mod notices;
pub(super) mod plan_review;
pub(super) mod streaming;
pub(super) mod tool_call;
pub(super) mod tool_result;
#[cfg(feature = "plugin")]
pub(super) mod turn;
#[cfg(test)]
mod dirge_5h5_repro;
pub(super) use context_compacted::handle_context_compacted;
pub(super) use context_overflow::handle_context_overflow;
pub(super) use done::handle_done;
pub(super) use error::handle_error;
pub(super) use interjected::handle_interjected;
pub(super) use tool_call::handle_tool_call;
pub(super) use tool_result::handle_tool_result;
pub(super) struct RunCtx<'a> {
pub renderer: &'a mut Renderer,
pub session: &'a mut Session,
pub response_buf: &'a mut String,
pub response_start_line: &'a mut Option<usize>,
pub reasoning_buf: &'a mut String,
pub reasoning_start_line: &'a mut Option<usize>,
pub agent_line_started: &'a mut bool,
pub last_tool_name: &'a mut Option<String>,
pub last_tool_call_id: &'a mut Option<String>,
pub tool_chamber_open: &'a mut bool,
pub chamber_top_start: &'a mut Option<usize>,
pub chamber_top_end: &'a mut Option<usize>,
pub tool_calls_buf: &'a mut Vec<crate::session::ToolCallEntry>,
pub tool_calls_this_run: &'a mut u32,
pub last_collapsed: &'a mut Option<CollapsedToolResult>,
pub last_thinking: &'a mut Option<String>,
pub expand_target: &'a mut crate::ui::state::ExpandTarget,
pub expansion_anchor: &'a mut Option<(usize, usize, u64)>,
pub last_user_prompt: &'a mut String,
pub cli: &'a Cli,
pub cfg: &'a Config,
pub active_plan: &'a mut Option<crate::agent::plan::runtime::ActivePlan>,
}
impl RunCtx<'_> {
pub(super) fn end_reasoning(&mut self) {
if !self.reasoning_buf.is_empty() {
*self.last_thinking = Some(self.reasoning_buf.clone());
*self.expand_target = crate::ui::state::ExpandTarget::Thinking;
*self.expansion_anchor = None;
}
self.reasoning_buf.clear();
}
pub(super) fn note_tool_truncation(&mut self) {
if self.last_collapsed.is_some() {
*self.expand_target = crate::ui::state::ExpandTarget::Tool;
*self.expansion_anchor = None;
}
}
}
pub(crate) struct AgentBuildDeps<'a> {
pub client: &'a AnyClient,
pub permission: &'a Option<PermCheck>,
pub ask_tx: &'a Option<AskSender>,
pub question_tx: &'a Option<QuestionSender>,
pub plan_tx: &'a Option<PlanSwitchSender>,
pub bg_store: &'a Option<BackgroundStore>,
pub sandbox: &'a Sandbox,
pub user_tx: &'a tokio::sync::mpsc::UnboundedSender<crate::event::UserEvent>,
#[cfg(feature = "mcp")]
pub mcp_manager: Option<&'a McpClientManager>,
#[cfg(feature = "semantic")]
pub semantic_manager: Option<&'a SemanticManager>,
#[cfg(feature = "lsp")]
pub lsp_manager: Option<&'a std::sync::Arc<crate::lsp::manager::LspManager>>,
}