assistant: Support retrying empty workflow step (#16301)

Co-Authored-by: Nathan <nathan@zed.dev>
Co-Authored-by: Kirill <kirill@zed.dev>

Release Notes:

- N/A

Co-authored-by: Nathan <nathan@zed.dev>
Co-authored-by: Kirill <kirill@zed.dev>
This commit is contained in:
Bennet Bo Fenner 2024-08-15 19:05:30 +02:00 committed by GitHub
parent 7434b56e68
commit 0b3e5b2649
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -1387,8 +1387,10 @@ struct WorkflowStep {
impl WorkflowStep {
fn status(&self, cx: &AppContext) -> WorkflowStepStatus {
match self.resolved_step.as_ref() {
Some(Ok(_)) => {
if let Some(assist) = self.assist.as_ref() {
Some(Ok(step)) => {
if step.suggestions.is_empty() {
WorkflowStepStatus::Empty
} else if let Some(assist) = self.assist.as_ref() {
let assistant = InlineAssistant::global(cx);
if assist
.assist_ids
@ -1424,6 +1426,7 @@ impl WorkflowStep {
enum WorkflowStepStatus {
Resolving,
Error(Arc<anyhow::Error>),
Empty,
Idle,
Pending,
Done,
@ -1435,6 +1438,45 @@ impl WorkflowStepStatus {
matches!(self, Self::Confirmed)
}
fn render_workflow_step_error(
id: EntityId,
editor: WeakView<ContextEditor>,
step_range: Range<language::Anchor>,
error: String,
) -> AnyElement {
h_flex()
.gap_2()
.child(
div()
.id("step-resolution-failure")
.child(
Label::new("Step Resolution Failed")
.size(LabelSize::Small)
.color(Color::Error),
)
.tooltip(move |cx| Tooltip::text(error.clone(), cx)),
)
.child(
Button::new(("transform", id), "Retry")
.icon(IconName::Update)
.icon_position(IconPosition::Start)
.icon_size(IconSize::Small)
.label_size(LabelSize::Small)
.on_click({
let editor = editor.clone();
let step_range = step_range.clone();
move |_, cx| {
editor
.update(cx, |this, cx| {
this.resolve_workflow_step(step_range.clone(), cx)
})
.ok();
}
}),
)
.into_any()
}
pub(crate) fn into_element(
&self,
step_range: Range<language::Anchor>,
@ -1469,40 +1511,18 @@ impl WorkflowStepStatus {
|label, delta| label.alpha(delta),
)
.into_any_element(),
WorkflowStepStatus::Error(error) => {
let error = error.clone();
h_flex()
.gap_2()
.child(
div()
.id("step-resolution-failure")
.child(
Label::new("Step Resolution Failed")
.size(LabelSize::Small)
.color(Color::Error),
)
.tooltip(move |cx| Tooltip::text(error.to_string(), cx)),
)
.child(
Button::new(("transform", id), "Retry")
.icon(IconName::Update)
.icon_position(IconPosition::Start)
.icon_size(IconSize::Small)
.label_size(LabelSize::Small)
.on_click({
let editor = editor.clone();
let step_range = step_range.clone();
move |_, cx| {
editor
.update(cx, |this, cx| {
this.resolve_workflow_step(step_range.clone(), cx)
})
.ok();
}
}),
)
.into_any()
}
WorkflowStepStatus::Error(error) => Self::render_workflow_step_error(
id,
editor.clone(),
step_range.clone(),
error.to_string(),
),
WorkflowStepStatus::Empty => Self::render_workflow_step_error(
id,
editor.clone(),
step_range.clone(),
"Model was unable to locate the code to edit".to_string(),
),
WorkflowStepStatus::Idle => Button::new(("transform", id), "Transform")
.icon(IconName::SparkleAlt)
.icon_position(IconPosition::Start)
@ -1871,7 +1891,7 @@ impl ContextEditor {
self.confirm_workflow_step(range, cx);
true
}
WorkflowStepStatus::Error(_) => {
WorkflowStepStatus::Error(_) | WorkflowStepStatus::Empty => {
self.resolve_workflow_step(range, cx);
true
}
@ -3545,7 +3565,7 @@ impl ContextEditor {
let button_text = match self.active_workflow_step() {
Some(step) => match step.status(cx) {
WorkflowStepStatus::Resolving => "Resolving Step...",
WorkflowStepStatus::Error(_) => "Retry Step Resolution",
WorkflowStepStatus::Empty | WorkflowStepStatus::Error(_) => "Retry Step Resolution",
WorkflowStepStatus::Idle => "Transform",
WorkflowStepStatus::Pending => "Transforming...",
WorkflowStepStatus::Done => "Accept Transformation",