Add duplicate message check in slack-agent-task

- Introduced a new function `checkForDuplicateMessages` in the database queries to verify if a message already exists in the same chat.
- Integrated the duplicate check in the `slackAgentTask` to prevent processing of duplicate messages, enhancing task efficiency and logging warnings for duplicates detected.
This commit is contained in:
dal 2025-07-18 22:53:02 -06:00
parent 0e46d64683
commit 8daceae2e3
No known key found for this signature in database
GPG Key ID: 16F4B0E1E9F61122
2 changed files with 73 additions and 2 deletions

View File

@ -1,4 +1,11 @@
import { chats, db, eq, messages, updateMessage } from '@buster/database';
import {
chats,
checkForDuplicateMessages,
db,
eq,
messages,
updateMessage,
} from '@buster/database';
import {
SlackMessagingService,
addReaction,
@ -244,6 +251,26 @@ export const slackAgentTask: ReturnType<
prompt = `Please fulfill the request from this slack conversation:\n${formattedMessages}`;
}
// Check for duplicate messages before creating
const duplicateCheck = await checkForDuplicateMessages({
chatId: payload.chatId,
requestMessage: prompt,
});
if (duplicateCheck.isDuplicate) {
logger.warn('Duplicate message detected, stopping task', {
chatId: payload.chatId,
duplicateMessageIds: duplicateCheck.duplicateMessageIds,
requestMessage: prompt,
});
return {
success: false,
messageId: '',
triggerRunId: '',
};
}
// Step 4: Create message
const message = await createMessage({
chatId: payload.chatId,

View File

@ -1,5 +1,5 @@
import type { InferSelectModel } from 'drizzle-orm';
import { and, desc, eq, isNull } from 'drizzle-orm';
import { and, desc, eq, isNull, ne } from 'drizzle-orm';
import { db } from '../../connection';
import { messages } from '../../schema';
@ -233,3 +233,47 @@ export async function updateMessage(
throw new Error(`Failed to update message ${messageId}`);
}
}
/**
* Check for duplicate messages in the same chat
* @param options - Options for duplicate checking
* @returns Object indicating if duplicate exists and duplicate message IDs
*/
export async function checkForDuplicateMessages(options: {
chatId: string;
requestMessage: string;
excludeMessageId?: string;
}): Promise<{ isDuplicate: boolean; duplicateMessageIds: string[] }> {
const { chatId, requestMessage, excludeMessageId } = options;
try {
// Build query conditions
const conditions = [
eq(messages.chatId, chatId),
eq(messages.requestMessage, requestMessage),
isNull(messages.deletedAt),
];
// Only add exclusion if messageId provided
if (excludeMessageId) {
conditions.push(ne(messages.id, excludeMessageId));
}
// Query for messages with same chatId and requestMessage
const duplicateMessages = await db
.select({
id: messages.id,
})
.from(messages)
.where(and(...conditions))
.orderBy(desc(messages.createdAt));
return {
isDuplicate: duplicateMessages.length > 0,
duplicateMessageIds: duplicateMessages.map((msg) => msg.id),
};
} catch (error) {
console.error('Failed to check for duplicate messages:', error);
throw new Error(`Failed to check for duplicate messages in chat ${chatId}`);
}
}