aboutsummaryrefslogtreecommitdiffstats
path: root/crates/atuin-ai/src/commands/inline.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/atuin-ai/src/commands/inline.rs')
-rw-r--r--crates/atuin-ai/src/commands/inline.rs48
1 files changed, 45 insertions, 3 deletions
diff --git a/crates/atuin-ai/src/commands/inline.rs b/crates/atuin-ai/src/commands/inline.rs
index 70f26c65..989b95c0 100644
--- a/crates/atuin-ai/src/commands/inline.rs
+++ b/crates/atuin-ai/src/commands/inline.rs
@@ -292,6 +292,17 @@ async fn run_inline_tui(
.bracketed_paste(true)
.with_context(tui_tx)
.extra_newlines_at_exit(1)
+ .on_commit(|committed, state| {
+ if let Some(key) = &committed.key
+ && let Some(id_str) = key.strip_prefix("turn-")
+ && let Ok(id) = id_str.parse::<usize>()
+ {
+ let new_count = id + 1;
+ if new_count > state.committed_turn_count {
+ state.committed_turn_count = new_count;
+ }
+ }
+ })
.build()?;
// ─── Driver loop ────────────────────────────────────────────
@@ -349,17 +360,48 @@ fn build_view_state(
skill_names.insert(skill.name.clone());
}
+ let tools = fsm.ctx.tools.clone();
+ let visible_events = fsm.ctx.events[safe_start..].to_vec();
+ let archived_events = fsm.ctx.archived_events.clone();
+
+ let mut archived_builder = crate::tui::view::turn::TurnBuilder::new(&tools);
+ for event in &archived_events {
+ archived_builder.add_event(event);
+ }
+ let archived_turns = archived_builder.build();
+ let archived_turn_count = archived_turns.len();
+
+ let mut visible_builder =
+ crate::tui::view::turn::TurnBuilder::new_starting_at(&tools, archived_turn_count);
+ for event in &visible_events {
+ visible_builder.add_event(event);
+ }
+ let visible_turns = visible_builder.build();
+
+ let mut turns = archived_turns;
+ turns.extend(visible_turns);
+
+ let has_command = visible_events.iter().any(|e| {
+ matches!(e, ConversationEvent::ToolCall { name, input, .. }
+ if name == "suggest_command"
+ && input.get("command").and_then(|v| v.as_str()).is_some())
+ });
+
ViewState {
agent_state: fsm.state.clone(),
- visible_events: fsm.ctx.events[safe_start..].to_vec(),
+ visible_events,
all_events: fsm.ctx.events.clone(),
session_id: fsm.ctx.session_id.clone(),
- tools: fsm.ctx.tools.clone(),
+ tools,
current_response: fsm.ctx.current_response.clone(),
is_resumed: fsm.ctx.is_resumed,
last_event_time: fsm.ctx.last_event_time,
in_git_project,
- archived_events: fsm.ctx.archived_events.clone(),
+ archived_events,
+ turns,
+ has_command,
+ committed_turn_count: 0,
+ archived_turn_count,
is_input_blank: true,
slash_command_input: None,
slash_command_search_results: Vec::new(),