doum_cli/core/
auto_mode.rs1use crate::llm::Message;
2use crate::llm::client::LLMRequest;
3use crate::system::error::Result;
4use crate::system::Config;
5use crate::system::SystemInfo;
6use crate::llm::{LLMClient, PromptBuilder, parse_mode_select};
7use crate::core::{handle_ask, handle_suggest};
8use crate::llm::retry_with_parse;
9use crate::cli::ui::{create_spinner, finish_spinner};
10
11pub async fn select_and_execute(
15 input: &str,
16 client: &dyn LLMClient,
17 system_info: &SystemInfo,
18 config: &Config,
19) -> Result<()> {
20 let builder = PromptBuilder::new(system_info.clone());
22
23 let spinner = create_spinner("Analyzing input...");
25
26 let mode_response = retry_with_parse(
28 || {
29 let request = LLMRequest {
30 system: builder.build_mode_select(),
31 messages: vec![Message::user(input)],
32 use_websearch: false,
33 };
34 Box::pin(client.generate(request))
35 },
36 parse_mode_select,
37 config.llm.max_retries,
38 )
39 .await?;
40
41 finish_spinner(spinner, None);
43 println!("📌 Selected mode: {} mode\n", mode_response.mode);
44
45 match mode_response.mode.as_str() {
47 "ask" => {
48 handle_ask(input, client, system_info, config).await
49 }
50 "suggest" => {
51 handle_suggest(input, client, system_info, config).await?;
52 Ok(())
53 }
54 "execute" => {
55 handle_suggest(input, client, system_info, config).await?;
57 Ok(())
58 }
59 unknown => {
60 println!("⚠️ Unknown mode: {}", unknown);
61 println!("💡 Falling back to Ask mode.\n");
62 handle_ask(input, client, system_info, config).await
63 }
64 }
65}