aboutsummaryrefslogtreecommitdiffstats
path: root/crates/atuin-ai/src/fsm/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/atuin-ai/src/fsm/mod.rs')
-rw-r--r--crates/atuin-ai/src/fsm/mod.rs50
1 files changed, 50 insertions, 0 deletions
diff --git a/crates/atuin-ai/src/fsm/mod.rs b/crates/atuin-ai/src/fsm/mod.rs
index 25de41f3..3d72a3ae 100644
--- a/crates/atuin-ai/src/fsm/mod.rs
+++ b/crates/atuin-ai/src/fsm/mod.rs
@@ -309,6 +309,33 @@ impl AgentFsm {
vec![]
}
+ (
+ AgentState::Idle { .. },
+ Event::SkillLoaded {
+ name,
+ arguments,
+ content,
+ },
+ ) => {
+ self.ctx.events.push(ConversationEvent::SkillInvocation {
+ name,
+ arguments,
+ content,
+ });
+ self.ctx.current_response.clear();
+ self.ctx.current_turn_tool_ids.clear();
+
+ let messages = self.build_messages();
+ let session_id = self.ctx.session_id.clone();
+ self.state = AgentState::Turn {
+ stream: StreamPhase::Connecting,
+ };
+ vec![Effect::StartStream {
+ messages,
+ session_id,
+ }]
+ }
+
// ================================================================
// Turn — stream lifecycle
// ================================================================
@@ -584,6 +611,29 @@ impl AgentFsm {
vec![]
}
+ // RequestSkillLoad during non-idle: still emit the effect
+ (_, Event::RequestSkillLoad { name, arguments }) => {
+ vec![Effect::LoadSkill { name, arguments }]
+ }
+
+ // SkillLoaded during non-idle: queue so it's visible
+ // in context for the next turn.
+ (
+ _,
+ Event::SkillLoaded {
+ name,
+ arguments,
+ content,
+ },
+ ) => {
+ self.ctx.events.push(ConversationEvent::SkillInvocation {
+ name,
+ arguments,
+ content,
+ });
+ vec![]
+ }
+
_ => vec![],
}
}