storkit: merge 401_bug_whatsapp_and_slack_missing_start_command_handler
This commit is contained in:
@@ -885,6 +885,35 @@ async fn handle_incoming_message(
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let Some(start_cmd) = crate::chat::transport::matrix::start::extract_start_command(
|
||||||
|
message,
|
||||||
|
&ctx.bot_name,
|
||||||
|
&ctx.bot_user_id,
|
||||||
|
) {
|
||||||
|
let response = match start_cmd {
|
||||||
|
crate::chat::transport::matrix::start::StartCommand::Start {
|
||||||
|
story_number,
|
||||||
|
agent_hint,
|
||||||
|
} => {
|
||||||
|
slog!("[slack] Handling start command from {user} in {channel}: story {story_number}");
|
||||||
|
crate::chat::transport::matrix::start::handle_start(
|
||||||
|
&ctx.bot_name,
|
||||||
|
&story_number,
|
||||||
|
agent_hint.as_deref(),
|
||||||
|
&ctx.project_root,
|
||||||
|
&ctx.agents,
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
}
|
||||||
|
crate::chat::transport::matrix::start::StartCommand::BadArgs => {
|
||||||
|
format!("Usage: `{} start <number>`", ctx.bot_name)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let response = markdown_to_slack(&response);
|
||||||
|
let _ = ctx.transport.send_message(channel, &response, "").await;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// No command matched — forward to LLM for conversational response.
|
// No command matched — forward to LLM for conversational response.
|
||||||
slog!("[slack] No command matched, forwarding to LLM for {user} in {channel}");
|
slog!("[slack] No command matched, forwarding to LLM for {user} in {channel}");
|
||||||
handle_llm_message(ctx, channel, user, message).await;
|
handle_llm_message(ctx, channel, user, message).await;
|
||||||
@@ -1806,4 +1835,43 @@ mod tests {
|
|||||||
assert!(conv.session_id.is_none(), "session_id should be cleared");
|
assert!(conv.session_id.is_none(), "session_id should be cleared");
|
||||||
assert!(conv.entries.is_empty(), "entries should be cleared");
|
assert!(conv.entries.is_empty(), "entries should be cleared");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn start_command_extracted_from_plain_slack_message() {
|
||||||
|
// Slack messages may arrive without a bot mention prefix.
|
||||||
|
// extract_start_command must recognise "start 42" by itself.
|
||||||
|
let result = crate::chat::transport::matrix::start::extract_start_command(
|
||||||
|
"start 42",
|
||||||
|
"Timmy",
|
||||||
|
"@timmy:home.local",
|
||||||
|
);
|
||||||
|
assert!(result.is_some(), "plain 'start 42' should be recognised");
|
||||||
|
assert_eq!(
|
||||||
|
result,
|
||||||
|
Some(crate::chat::transport::matrix::start::StartCommand::Start {
|
||||||
|
story_number: "42".to_string(),
|
||||||
|
agent_hint: None,
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn start_command_extracted_with_bot_name_prefix_slack() {
|
||||||
|
let result = crate::chat::transport::matrix::start::extract_start_command(
|
||||||
|
"Timmy start 99",
|
||||||
|
"Timmy",
|
||||||
|
"@timmy:home.local",
|
||||||
|
);
|
||||||
|
assert!(result.is_some(), "'Timmy start 99' should be recognised");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn non_start_slack_message_not_extracted() {
|
||||||
|
let result = crate::chat::transport::matrix::start::extract_start_command(
|
||||||
|
"help",
|
||||||
|
"Timmy",
|
||||||
|
"@timmy:home.local",
|
||||||
|
);
|
||||||
|
assert!(result.is_none(), "'help' should not be recognised as start");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1146,6 +1146,34 @@ async fn handle_incoming_message(ctx: &WhatsAppWebhookContext, sender: &str, mes
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let Some(start_cmd) = crate::chat::transport::matrix::start::extract_start_command(
|
||||||
|
message,
|
||||||
|
&ctx.bot_name,
|
||||||
|
&ctx.bot_user_id,
|
||||||
|
) {
|
||||||
|
let response = match start_cmd {
|
||||||
|
crate::chat::transport::matrix::start::StartCommand::Start {
|
||||||
|
story_number,
|
||||||
|
agent_hint,
|
||||||
|
} => {
|
||||||
|
slog!("[whatsapp] Handling start command from {sender}: story {story_number}");
|
||||||
|
crate::chat::transport::matrix::start::handle_start(
|
||||||
|
&ctx.bot_name,
|
||||||
|
&story_number,
|
||||||
|
agent_hint.as_deref(),
|
||||||
|
&ctx.project_root,
|
||||||
|
&ctx.agents,
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
}
|
||||||
|
crate::chat::transport::matrix::start::StartCommand::BadArgs => {
|
||||||
|
format!("Usage: `{} start <number>`", ctx.bot_name)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let _ = ctx.transport.send_message(sender, &response, "").await;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// No command matched — forward to LLM for conversational response.
|
// No command matched — forward to LLM for conversational response.
|
||||||
slog!("[whatsapp] No command matched, forwarding to LLM for {sender}");
|
slog!("[whatsapp] No command matched, forwarding to LLM for {sender}");
|
||||||
handle_llm_message(ctx, sender, message).await;
|
handle_llm_message(ctx, sender, message).await;
|
||||||
@@ -2208,4 +2236,43 @@ mod tests {
|
|||||||
assert!(conv.session_id.is_none(), "session_id should be cleared");
|
assert!(conv.session_id.is_none(), "session_id should be cleared");
|
||||||
assert!(conv.entries.is_empty(), "entries should be cleared");
|
assert!(conv.entries.is_empty(), "entries should be cleared");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn start_command_extracted_from_plain_message() {
|
||||||
|
// WhatsApp messages arrive without a bot mention prefix.
|
||||||
|
// extract_start_command must recognise "start 42" by itself.
|
||||||
|
let result = crate::chat::transport::matrix::start::extract_start_command(
|
||||||
|
"start 42",
|
||||||
|
"Timmy",
|
||||||
|
"@timmy:home.local",
|
||||||
|
);
|
||||||
|
assert!(result.is_some(), "plain 'start 42' should be recognised");
|
||||||
|
assert_eq!(
|
||||||
|
result,
|
||||||
|
Some(crate::chat::transport::matrix::start::StartCommand::Start {
|
||||||
|
story_number: "42".to_string(),
|
||||||
|
agent_hint: None,
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn start_command_extracted_with_bot_name_prefix() {
|
||||||
|
let result = crate::chat::transport::matrix::start::extract_start_command(
|
||||||
|
"Timmy start 99",
|
||||||
|
"Timmy",
|
||||||
|
"@timmy:home.local",
|
||||||
|
);
|
||||||
|
assert!(result.is_some(), "'Timmy start 99' should be recognised");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn non_start_whatsapp_message_not_extracted() {
|
||||||
|
let result = crate::chat::transport::matrix::start::extract_start_command(
|
||||||
|
"help",
|
||||||
|
"Timmy",
|
||||||
|
"@timmy:home.local",
|
||||||
|
);
|
||||||
|
assert!(result.is_none(), "'help' should not be recognised as start");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user