aboutsummaryrefslogtreecommitdiffstats
path: root/crates/atuin-ai/src/driver.rs
diff options
context:
space:
mode:
authorMichelle Tilley <michelle@michelletilley.net>2026-04-21 15:30:46 -0700
committerGitHub <noreply@github.com>2026-04-21 15:30:46 -0700
commit8dec33f5f9a972a38978b5600fde5bc292fb6401 (patch)
tree19708731284c8ba810a5acede4720d3396f9e5a2 /crates/atuin-ai/src/driver.rs
parentfix: shell tool preview stuck as Running after completion (#3436) (diff)
downloadatuin-8dec33f5f9a972a38978b5600fde5bc292fb6401.zip
feat: shell tool execution timeouts (#3437)
Diffstat (limited to 'crates/atuin-ai/src/driver.rs')
-rw-r--r--crates/atuin-ai/src/driver.rs40
1 files changed, 25 insertions, 15 deletions
diff --git a/crates/atuin-ai/src/driver.rs b/crates/atuin-ai/src/driver.rs
index 2d610203..3acb9798 100644
--- a/crates/atuin-ai/src/driver.rs
+++ b/crates/atuin-ai/src/driver.rs
@@ -506,20 +506,20 @@ fn execute_effect(effect: &Effect, ctx: DriverContext) {
)
.await;
- let preview = if let crate::tools::ToolOutcome::Structured {
- exit_code,
- interrupted,
- ..
- } = &outcome
- {
- Some(ToolPreviewData::Shell {
- lines: vec![],
- exit_code: *exit_code,
- interrupted: *interrupted,
- })
- } else {
- None
- };
+ let preview =
+ if let crate::tools::ToolOutcome::Structured { exit_code, .. } =
+ &outcome
+ {
+ Some(ToolPreviewData::Shell {
+ lines: vec![],
+ exit_code: *exit_code,
+ // Reason is set by the FSM in handle_tool_done
+ // based on whether it was a user interrupt or timeout.
+ interrupted: None,
+ })
+ } else {
+ None
+ };
let _ = tx.send(DriverEvent::Fsm(Event::ToolExecutionDone {
tool_id,
@@ -694,13 +694,23 @@ fn execute_effect(effect: &Effect, ctx: DriverContext) {
Effect::ScheduleTimeout {
timeout_id,
duration,
+ kind,
} => {
let timeout_id = *timeout_id;
let duration = *duration;
+ let kind = kind.clone();
let tx = tx.clone();
tokio::spawn(async move {
tokio::time::sleep(duration).await;
- let _ = tx.send(DriverEvent::Fsm(Event::ConfirmationTimeout { timeout_id }));
+ use crate::fsm::effects::TimeoutKind;
+ let event = match kind {
+ TimeoutKind::Confirmation => Event::ConfirmationTimeout { timeout_id },
+ TimeoutKind::ToolExecution { tool_id } => Event::ToolExecutionTimeout {
+ timeout_id,
+ tool_id,
+ },
+ };
+ let _ = tx.send(DriverEvent::Fsm(event));
});
}