doum_cli/core/
auto_mode.rs

1use 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
11/// 자동 모드 선택 및 실행
12/// 
13/// 사용자 입력을 분석하여 적절한 모드(ask/suggest/execute)를 선택하고 실행합니다.
14pub async fn select_and_execute(
15    input: &str,
16    client: &dyn LLMClient,
17    system_info: &SystemInfo,
18    config: &Config,
19) -> Result<()> {
20    // 프롬프트 빌더 생성
21    let builder = PromptBuilder::new(system_info.clone());
22    
23    // 스피너 시작
24    let spinner = create_spinner("Analyzing input...");
25    
26    // LLM에게 모드 선택 요청
27    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    // 스피너 완료 및 선택된 모드 출력
42    finish_spinner(spinner, None);
43    println!("📌 Selected mode: {} mode\n", mode_response.mode);
44    
45    // 해당 모드 실행
46    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            // Execute 모드는 suggest로 통합됨 (suggest에서 실행 선택 가능)
56            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}