use tracing::info;
use crate::agent::config::{AgentConfig, Scope, WorkspaceContext};
use crate::agent::orchestrator::Orchestrator;
use crate::agent::{Agent, EventEmitter, Output};
use crate::error::{Error, Result};
use crate::llm::LlmClient;
use crate::query::QueryPipeline;
pub async fn dispatch(
query: &str,
scope: Scope<'_>,
config: &AgentConfig,
llm: &LlmClient,
emitter: &EventEmitter,
) -> Result<Output> {
let (ws, skip_analysis) = match scope {
Scope::Specified(docs) => {
info!(
docs = docs.len(),
"Dispatch (user-specified, skip analysis)"
);
(WorkspaceContext::new(docs), true)
}
Scope::Workspace(ws) => {
info!(docs = ws.doc_count(), "Dispatch (workspace, full flow)");
(ws, false)
}
};
let query_plan = QueryPipeline::understand(query, llm).await?;
info!(
intent = %query_plan.intent,
complexity = %query_plan.complexity,
concepts = query_plan.key_concepts.len(),
"Query understanding complete"
);
let orchestrator = Orchestrator::new(
query,
&ws,
config.clone(),
llm.clone(),
emitter.clone(),
skip_analysis,
query_plan,
);
orchestrator
.run()
.await
.map_err(|e| Error::Retrieval(e.to_string()))
}