Skip to content

Commit 759bdce

Browse files
committed
fix: MOIM injection crashes session when conversation ends with assistant message
1 parent c8d4057 commit 759bdce

File tree

1 file changed

+37
-4
lines changed

1 file changed

+37
-4
lines changed

crates/goose/src/agents/moim.rs

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,14 @@ pub async fn inject_moim(
2424
.await
2525
{
2626
let mut messages = conversation.messages().clone();
27-
let idx = messages
28-
.iter()
29-
.rposition(|m| m.role == Role::Assistant)
30-
.unwrap_or(0);
27+
let idx = if messages.last().is_some_and(|m| m.role == Role::Assistant) {
28+
messages.len()
29+
} else {
30+
messages
31+
.iter()
32+
.rposition(|m| m.role == Role::Assistant)
33+
.unwrap_or(0)
34+
};
3135
messages.insert(idx, Message::user().with_text(moim));
3236

3337
let (fixed, issues) = fix_conversation(Conversation::new_unvalidated(messages));
@@ -104,6 +108,35 @@ mod tests {
104108
assert!(merged_content.contains("Working directory: /test/dir"));
105109
}
106110

111+
#[tokio::test]
112+
async fn test_moim_injection_trailing_assistant() {
113+
let temp_dir = tempfile::tempdir().unwrap();
114+
let em = ExtensionManager::new_without_provider(temp_dir.path().to_path_buf());
115+
let working_dir = PathBuf::from("/test/dir");
116+
117+
let conv = Conversation::new_unvalidated(vec![
118+
Message::user().with_text("Hello"),
119+
Message::assistant().with_text("Hi there"),
120+
Message::user().with_text("Do something"),
121+
Message::assistant().with_text("I'll do that now."),
122+
]);
123+
let result = inject_moim("test-session-id", conv, &em, &working_dir).await;
124+
let msgs = result.messages();
125+
126+
assert_eq!(
127+
msgs.last().unwrap().role,
128+
Role::User,
129+
"Conversation must end with a user message"
130+
);
131+
132+
let has_moim = msgs.iter().any(|m| {
133+
m.content
134+
.iter()
135+
.any(|c| c.as_text().is_some_and(|t| t.contains("<info-msg>")))
136+
});
137+
assert!(has_moim, "MOIM should be injected");
138+
}
139+
107140
#[tokio::test]
108141
async fn test_moim_with_tool_calls() {
109142
let temp_dir = tempfile::tempdir().unwrap();

0 commit comments

Comments
 (0)