diff --git a/crates/assistant2/src/active_thread.rs b/crates/assistant2/src/active_thread.rs index 15fc434eebf325e8dd9edd74fb85d4df3340fa42..a128b403b02d8bd6c5bf3b0154ade9db96fda3aa 100644 --- a/crates/assistant2/src/active_thread.rs +++ b/crates/assistant2/src/active_thread.rs @@ -76,6 +76,16 @@ impl ActiveThread { for message in thread.read(cx).messages().cloned().collect::>() { this.push_message(&message.id, message.text.clone(), window, cx); + + for tool_use in thread.read(cx).scripting_tool_uses_for_message(message.id) { + this.render_scripting_tool_use_markdown( + tool_use.id.clone(), + tool_use.name.as_ref(), + tool_use.input.clone(), + window, + cx, + ); + } } this @@ -242,6 +252,32 @@ impl ActiveThread { }) } + /// Renders the input of a scripting tool use to Markdown. + /// + /// Does nothing if the tool use does not correspond to the scripting tool. + fn render_scripting_tool_use_markdown( + &mut self, + tool_use_id: LanguageModelToolUseId, + tool_name: &str, + tool_input: serde_json::Value, + window: &mut Window, + cx: &mut Context, + ) { + if tool_name != ScriptingTool::NAME { + return; + } + + let lua_script = serde_json::from_value::(tool_input) + .map(|input| input.lua_script) + .unwrap_or_default(); + + let lua_script = + self.render_markdown(format!("```lua\n{lua_script}\n```").into(), window, cx); + + self.rendered_scripting_tool_uses + .insert(tool_use_id, lua_script); + } + fn handle_thread_event( &mut self, _thread: &Entity, @@ -303,21 +339,13 @@ impl ActiveThread { pending_tool_use, .. } => { if let Some(tool_use) = pending_tool_use { - if tool_use.name.as_ref() == ScriptingTool::NAME { - let lua_script = - serde_json::from_value::(tool_use.input.clone()) - .map(|input| input.lua_script) - .unwrap_or_default(); - - let lua_script = self.render_markdown( - format!("```lua\n{lua_script}\n```").into(), - window, - cx, - ); - - self.rendered_scripting_tool_uses - .insert(tool_use.id.clone(), lua_script.clone()); - } + self.render_scripting_tool_use_markdown( + tool_use.id.clone(), + tool_use.name.as_ref(), + tool_use.input.clone(), + window, + cx, + ); } if self.thread.read(cx).all_tools_finished() { @@ -837,8 +865,13 @@ impl ActiveThread { .border_b_1() .border_color(cx.theme().colors().border) .child(Label::new("Input:")) - .children(lua_script_markdown.map(|lua_script| { - div().p_2p5().text_ui(cx).child(lua_script) + .child(div().p_2p5().text_ui(cx).map(|parent| { + if let Some(markdown) = lua_script_markdown { + parent.child(markdown) + } else { + parent + .child("Failed to render script input to Markdown") + } })), ) .map(|parent| match tool_use.status {