vtcode_core/ui/
user_confirmation.rs1use anyhow::Result;
7use console::style;
8use dialoguer::{Confirm, Select};
9pub struct UserConfirmation;
13
14impl UserConfirmation {
15 pub fn confirm_pro_model_usage(current_model: &str) -> Result<bool> {
18 use crate::config::constants::models;
19 println!("{}", style("Model Upgrade Required").yellow().bold());
20 println!("Current model: {}", style(current_model).cyan());
21 println!(
22 "Requested model: {}",
23 style(models::GEMINI_2_5_PRO).cyan().bold()
24 );
25 println!();
26 println!("The Gemini 2.5 Pro model is the most capable but also:");
27 println!("• More expensive per token");
28 println!("• Slower response times");
29 println!("• Higher resource usage");
30 println!();
31
32 let confirmed = Confirm::new()
33 .with_prompt("Do you want to proceed with the more capable (and expensive) Gemini 2.5 Pro model?")
34 .default(false)
35 .interact()?;
36
37 if confirmed {
38 println!("{}", style("Confirmed: Using Gemini 2.5 Pro model").green());
39 } else {
40 println!("{}", style("Cancelled: Keeping current model").yellow());
41 }
42
43 Ok(confirmed)
44 }
45
46 pub fn select_agent_mode() -> Result<AgentMode> {
48 println!("{}", style("Agent Mode Selection").cyan().bold());
49 println!(
50 "VTCode now uses single-agent mode with Decision Ledger for reliable task execution."
51 );
52
53 Ok(AgentMode::SingleCoder)
54 }
55
56 pub fn assess_task_complexity(task_description: &str) -> Result<TaskComplexity> {
58 println!("{}", style("Task Complexity Assessment").cyan().bold());
59 println!("Task: {}", style(task_description).cyan());
60 println!();
61
62 let options = vec![
63 "Simple (single file edit, basic question, straightforward task)",
64 "Moderate (multiple files, refactoring, testing)",
65 "Complex (architecture changes, cross-cutting concerns, large refactoring)",
66 ];
67
68 let selection = Select::new()
69 .with_prompt("How would you classify this task's complexity?")
70 .default(0)
71 .items(&options)
72 .interact()?;
73
74 let complexity = match selection {
75 0 => TaskComplexity::Simple,
76 1 => TaskComplexity::Moderate,
77 2 => TaskComplexity::Complex,
78 _ => TaskComplexity::Simple, };
80
81 match complexity {
82 TaskComplexity::Simple => {
83 println!(
84 "{}",
85 style("Simple task - Single agent recommended").green()
86 );
87 }
88 TaskComplexity::Moderate => {
89 println!(
90 "{}",
91 style("Moderate task - Single agent usually sufficient").yellow()
92 );
93 }
94 TaskComplexity::Complex => {
95 println!(
96 "{}",
97 style("Complex task detected - proceeding with single-agent mode").blue()
98 );
99 }
100 }
101
102 Ok(complexity)
103 }
104
105 pub fn confirm_action(message: &str, default: bool) -> Result<bool> {
107 Confirm::new()
108 .with_prompt(message)
109 .default(default)
110 .interact()
111 .map_err(Into::into)
112 }
113
114 pub fn show_warning(message: &str) -> Result<()> {
116 println!("{}", style(" Warning").yellow().bold());
117 println!("{}", message);
118 println!();
119
120 Confirm::new()
121 .with_prompt("Press Enter to continue or Ctrl+C to cancel")
122 .default(true)
123 .interact()?;
124
125 Ok(())
126 }
127}
128
129#[derive(Debug, Clone, PartialEq)]
131pub enum AgentMode {
132 SingleCoder,
134}
135
136#[derive(Debug, Clone, PartialEq)]
138pub enum TaskComplexity {
139 Simple,
141 Moderate,
143 Complex,
145}
146
147impl TaskComplexity {
148 pub fn recommended_agent_mode(&self) -> AgentMode {
150 match self {
151 TaskComplexity::Simple | TaskComplexity::Moderate => AgentMode::SingleCoder,
152 TaskComplexity::Complex => AgentMode::SingleCoder, }
154 }
155}