mod arch;
mod core;
mod iter;
mod perf;
mod worker;
pub use arch::{execute_plan, run_architect_code_loop};
pub use core::run_loop_with_mcp;
use crate::agent::approval::ApprovalGate;
use crate::agent::context::ConversationContext;
use crate::api::provider::OpenAiCompatibleProvider;
use crate::config::Config;
use tokio::sync::mpsc;
use tokio_util::sync::CancellationToken;
pub use core::run_loop;
pub enum AgentEvent {
Token(String),
Response(String),
ToolCall {
name: String,
args: String,
call_id: Option<String>,
},
ToolResult {
name: String,
result: String,
success: bool,
call_id: Option<String>,
},
FileModified { path: String },
LspInstalled { language: String, server: String },
Done {
context: ConversationContext,
stop_reason: Option<crate::agent::guard::StopReason>,
},
Error(String),
GuardStop(String),
StreamRetry {
attempt: u32,
max: u32,
message: String,
},
Status {
iteration: u32,
elapsed_secs: u64,
prompt_tokens: u32,
completion_tokens: u32,
cached_tokens: u32,
context_tokens: usize,
},
ImageNotice {
notice: String,
install_hint: Option<String>,
},
PhaseChange { label: String },
PlanReady {
plan: String,
context: ConversationContext,
user_msg: String,
},
SwarmAgentStarted {
agent_id: String,
agent_name: String,
task_preview: String,
},
SwarmAgentProgress {
agent_id: String,
agent_name: String,
iteration: u32,
status: String,
},
SwarmAgentToolCall {
agent_id: String,
name: String,
args: String,
},
SwarmAgentToolResult {
agent_id: String,
name: String,
result: String,
success: bool,
},
SwarmAgentToken { agent_id: String, text: String },
SwarmAgentResponse { agent_id: String, text: String },
SwarmAgentDone {
agent_id: String,
agent_name: String,
success: bool,
modified_files: Vec<String>,
tool_calls: u32,
input_tokens: u64,
output_tokens: u64,
response: String,
},
SwarmModeSwitch { label: String },
SwarmResolvedToSingle { agent_label: String },
SwarmConflict {
conflicts: Vec<(String, Vec<String>)>,
},
SwarmWorkerApproaching {
agent_id: String,
task_preview: String,
remaining: u32,
},
PerformanceUpdate {
tool_latency_avg_ms: f64,
tool_latency_max_ms: u64,
api_latency_avg_ms: f64,
api_latency_max_ms: u64,
tool_success_count: u32,
tool_failure_count: u32,
total_iterations: u32,
total_tokens_used: u64,
total_tool_calls_made: u32,
top_tools: Vec<(String, u32)>,
},
ApprovalRequired {
tool_name: String,
tool_args: String,
},
ApprovalDenied { tool_name: String },
McpPids { pids: Vec<u32> },
ShellOutput {
cmd: String,
stdout: String,
stderr: String,
exit_code: i32,
},
SoulReflecting { agent_name: String },
SwarmDone {
context: ConversationContext,
merged_response: String,
agent_count: usize,
total_tool_calls: u32,
conflicts_resolved: usize,
},
SwarmWorkersDispatched,
SwarmWorkerPaused { agent_id: String },
SwarmWorkerResumed { agent_id: String },
Evolution(crate::evolution::EvolutionEvent),
ToolBatchProgress {
running: usize,
total: usize,
},
StreamWaiting {
elapsed_secs: u64,
},
#[allow(dead_code)]
CompactionStarted {
before_tokens: usize,
target_tokens: usize,
},
CompactionDone {
before_tokens: usize,
after_tokens: usize,
},
ToolResultTruncated {
tool_name: String,
original_bytes: usize,
truncated_bytes: usize,
},
}
pub struct AgentParams {
pub client: OpenAiCompatibleProvider,
pub config: Config,
pub context: ConversationContext,
pub user_msg: String,
pub working_dir: String,
pub event_tx: mpsc::UnboundedSender<AgentEvent>,
pub cancel: CancellationToken,
pub lsp_manager: crate::lsp::manager::LspManager,
pub trust_level: crate::trust::TrustLevel,
pub approval_gate: ApprovalGate,
pub images: Vec<crate::api::ImageData>,
}
pub struct SwarmParams {
pub mcp_manager: std::sync::Arc<crate::mcp::manager::McpManager>,
pub shared_knowledge: Option<crate::agent::swarm::knowledge::SharedKnowledge>,
pub shared_tool_index: Option<std::sync::Arc<crate::tools::tool_index::ToolIndex>>,
pub shared_skill_registry: Option<std::sync::Arc<crate::skills::SkillRegistry>>,
pub instruction_rx: Option<
tokio::sync::mpsc::UnboundedReceiver<crate::agent::swarm::knowledge::WorkerInstruction>,
>,
}
pub struct ExecutePlanParams {
pub client: OpenAiCompatibleProvider,
pub config: Config,
pub system_prompt: String,
pub plan: String,
pub user_msg: String,
pub working_dir: String,
pub event_tx: mpsc::UnboundedSender<AgentEvent>,
pub cancel: CancellationToken,
pub lsp_manager: crate::lsp::manager::LspManager,
pub arch_context: Option<ConversationContext>,
pub approval_gate: ApprovalGate,
}
pub async fn run(params: AgentParams) {
run_loop(params).await;
}
pub async fn run_with_mode(params: AgentParams) {
run_loop(params).await;
}
pub async fn run_with_shared_mcp(params: AgentParams, swarm: SwarmParams) {
run_loop_with_mcp(params, Some(swarm)).await;
}