|
| 1 | +use spinners::{ |
| 2 | + Spinner, |
| 3 | + Spinners, |
| 4 | +}; |
| 5 | + |
1 | 6 | use crate::theme::StyledText; |
2 | 7 | use crate::util::ui::should_send_structured_message; |
3 | 8 | pub mod cli; |
4 | 9 | mod consts; |
5 | 10 | pub mod context; |
6 | 11 | mod conversation; |
7 | | -mod custom_spinner; |
8 | 12 | mod input_source; |
9 | 13 | mod message; |
10 | 14 | mod parse; |
@@ -83,7 +87,6 @@ use crossterm::{ |
83 | 87 | style, |
84 | 88 | terminal, |
85 | 89 | }; |
86 | | -use custom_spinner::Spinners; |
87 | 90 | use eyre::{ |
88 | 91 | Report, |
89 | 92 | Result, |
@@ -576,7 +579,7 @@ pub struct ChatSession { |
576 | 579 | input_source: InputSource, |
577 | 580 | /// Width of the terminal, required for [ParseState]. |
578 | 581 | terminal_width_provider: fn() -> Option<usize>, |
579 | | - spinner: Option<Spinners>, |
| 582 | + spinner: Option<Spinner>, |
580 | 583 | /// [ConversationState]. |
581 | 584 | conversation: ConversationState, |
582 | 585 | /// Tool uses requested by the model that are actively being handled. |
@@ -829,6 +832,11 @@ impl ChatSession { |
829 | 832 |
|
830 | 833 | if self.spinner.is_some() { |
831 | 834 | drop(self.spinner.take()); |
| 835 | + queue!( |
| 836 | + self.stderr, |
| 837 | + terminal::Clear(terminal::ClearType::CurrentLine), |
| 838 | + cursor::MoveToColumn(0), |
| 839 | + )?; |
832 | 840 | } |
833 | 841 |
|
834 | 842 | let (context, report, display_err_message) = match err { |
@@ -1138,6 +1146,10 @@ impl ChatSession { |
1138 | 1146 |
|
1139 | 1147 | impl Drop for ChatSession { |
1140 | 1148 | fn drop(&mut self) { |
| 1149 | + if let Some(spinner) = &mut self.spinner { |
| 1150 | + spinner.stop(); |
| 1151 | + } |
| 1152 | + |
1141 | 1153 | execute!( |
1142 | 1154 | self.stderr, |
1143 | 1155 | cursor::MoveToColumn(0), |
@@ -1435,7 +1447,7 @@ impl ChatSession { |
1435 | 1447 | .await?; |
1436 | 1448 |
|
1437 | 1449 | if self.interactive { |
1438 | | - self.spinner = Some(Spinners::new("Creating summary...".to_string())); |
| 1450 | + self.spinner = Some(Spinner::new(Spinners::Dots, "Creating summary...".to_string())); |
1439 | 1451 | } |
1440 | 1452 |
|
1441 | 1453 | let mut response = match self |
@@ -1548,6 +1560,11 @@ impl ChatSession { |
1548 | 1560 |
|
1549 | 1561 | if self.spinner.is_some() { |
1550 | 1562 | drop(self.spinner.take()); |
| 1563 | + queue!( |
| 1564 | + self.stderr, |
| 1565 | + terminal::Clear(terminal::ClearType::CurrentLine), |
| 1566 | + cursor::MoveToColumn(0), |
| 1567 | + )?; |
1551 | 1568 | } |
1552 | 1569 |
|
1553 | 1570 | self.conversation |
@@ -1718,10 +1735,10 @@ impl ChatSession { |
1718 | 1735 |
|
1719 | 1736 | if self.interactive { |
1720 | 1737 | execute!(self.stderr, cursor::Hide, style::Print("\n"))?; |
1721 | | - self.spinner = Some(Spinners::new(format!( |
1722 | | - "Generating agent config for '{}'...", |
1723 | | - agent_name |
1724 | | - ))); |
| 1738 | + self.spinner = Some(Spinner::new( |
| 1739 | + Spinners::Dots, |
| 1740 | + format!("Generating agent config for '{}'...", agent_name), |
| 1741 | + )); |
1725 | 1742 | } |
1726 | 1743 |
|
1727 | 1744 | let mut response = match self |
@@ -1783,6 +1800,11 @@ impl ChatSession { |
1783 | 1800 |
|
1784 | 1801 | if self.spinner.is_some() { |
1785 | 1802 | drop(self.spinner.take()); |
| 1803 | + queue!( |
| 1804 | + self.stderr, |
| 1805 | + terminal::Clear(terminal::ClearType::CurrentLine), |
| 1806 | + cursor::MoveToColumn(0), |
| 1807 | + )?; |
1786 | 1808 | } |
1787 | 1809 | // Parse and validate the initial generated config |
1788 | 1810 | let initial_agent_config = match serde_json::from_str::<Agent>(&agent_config_json) { |
@@ -2174,7 +2196,7 @@ impl ChatSession { |
2174 | 2196 | queue!(self.stderr, cursor::Hide)?; |
2175 | 2197 |
|
2176 | 2198 | if self.interactive { |
2177 | | - self.spinner = Some(Spinners::new("Thinking...".to_owned())); |
| 2199 | + self.spinner = Some(Spinner::new(Spinners::Dots, "Thinking...".to_owned())); |
2178 | 2200 | } |
2179 | 2201 |
|
2180 | 2202 | Ok(ChatState::HandleResponseStream(conv_state)) |
@@ -2601,7 +2623,7 @@ impl ChatSession { |
2601 | 2623 | execute!(self.stderr, cursor::Hide)?; |
2602 | 2624 | execute!(self.stderr, style::Print("\n"), StyledText::reset_attributes())?; |
2603 | 2625 | if self.interactive { |
2604 | | - self.spinner = Some(Spinners::new("Thinking...".to_string())); |
| 2626 | + self.spinner = Some(Spinner::new(Spinners::Dots, "Thinking...".to_string())); |
2605 | 2627 | } |
2606 | 2628 |
|
2607 | 2629 | self.send_chat_telemetry(os, TelemetryResult::Succeeded, None, None, None, false) |
@@ -2657,6 +2679,11 @@ impl ChatSession { |
2657 | 2679 |
|
2658 | 2680 | if self.spinner.is_some() { |
2659 | 2681 | drop(self.spinner.take()); |
| 2682 | + queue!( |
| 2683 | + self.stderr, |
| 2684 | + terminal::Clear(terminal::ClearType::CurrentLine), |
| 2685 | + cursor::MoveToColumn(0), |
| 2686 | + )?; |
2660 | 2687 | } |
2661 | 2688 |
|
2662 | 2689 | loop { |
@@ -2699,6 +2726,11 @@ impl ChatSession { |
2699 | 2726 | parser::ResponseEvent::ToolUse(tool_use) => { |
2700 | 2727 | if self.spinner.is_some() { |
2701 | 2728 | drop(self.spinner.take()); |
| 2729 | + queue!( |
| 2730 | + self.stderr, |
| 2731 | + terminal::Clear(terminal::ClearType::CurrentLine), |
| 2732 | + cursor::MoveToColumn(0), |
| 2733 | + )?; |
2702 | 2734 | } |
2703 | 2735 | tool_uses.push(tool_use); |
2704 | 2736 | tool_name_being_recvd = None; |
@@ -2748,7 +2780,7 @@ impl ChatSession { |
2748 | 2780 | ); |
2749 | 2781 |
|
2750 | 2782 | execute!(self.stderr, cursor::Hide)?; |
2751 | | - self.spinner = Some(Spinners::new("Dividing up the work...".to_string())); |
| 2783 | + self.spinner = Some(Spinner::new(Spinners::Dots, "Dividing up the work...".to_string())); |
2752 | 2784 |
|
2753 | 2785 | // For stream timeouts, we'll tell the model to try and split its response into |
2754 | 2786 | // smaller chunks. |
@@ -2940,7 +2972,7 @@ impl ChatSession { |
2940 | 2972 | if tool_name_being_recvd.is_some() { |
2941 | 2973 | queue!(self.stderr, cursor::Hide)?; |
2942 | 2974 | if self.interactive { |
2943 | | - self.spinner = Some(Spinners::new("Thinking...".to_string())); |
| 2975 | + self.spinner = Some(Spinner::new(Spinners::Dots, "Thinking...".to_string())); |
2944 | 2976 | } |
2945 | 2977 | } |
2946 | 2978 |
|
@@ -3263,7 +3295,7 @@ impl ChatSession { |
3263 | 3295 | } |
3264 | 3296 |
|
3265 | 3297 | if self.interactive { |
3266 | | - self.spinner = Some(Spinners::new("Thinking...".to_owned())); |
| 3298 | + self.spinner = Some(Spinner::new(Spinners::Dots, "Thinking...".to_owned())); |
3267 | 3299 | } |
3268 | 3300 |
|
3269 | 3301 | Ok(ChatState::HandleResponseStream( |
@@ -3708,7 +3740,7 @@ where |
3708 | 3740 | Fut: std::future::Future<Output = Result<T, E>>, |
3709 | 3741 | { |
3710 | 3742 | queue!(output, cursor::Hide,).ok(); |
3711 | | - let spinner = Spinners::new(spinner_text.to_owned()); |
| 3743 | + let spinner = Spinner::new(Spinners::Dots, spinner_text.to_owned()); |
3712 | 3744 |
|
3713 | 3745 | let result = f().await; |
3714 | 3746 |
|
|
0 commit comments