feat: label AI-generated conversation messages

This commit is contained in:
jjbrunton committed 2026-08-08 23:23:26 +01:00
1 parent 3beb8aada2
commit 5ad7f1bf77
10 files changed
+69 -11

No files matched your search

+19
View File
@@ -4,6 +4,7 @@ import type { WebContext } from '../context.js';
import {
buildConversationState,
chooseConversationIntent,
conversationMessageFingerprint,
mergeConversationState,
remainingAutomationTurns,
} from '../../services/conversation-state.js';
@@ -169,12 +170,14 @@ export function createConversationsRouter(ctx: WebContext): Router {
imageUrl: string | null;
sentAt: number;
} | null = null;
let automatedOpener: string | null = null;
try {
const messagesRepo = resolved.runtime?.resources.messagesRepo ?? ctx.repos.messages;
const sent = conversation.roomId
? messagesRepo.getByChatRoomId(conversation.roomId)
?? messagesRepo.getLatestByRecipient(conversation.username)
: messagesRepo.getLatestByRecipient(conversation.username);
automatedOpener = sent?.message ?? null;
if (sent && sent.postId) {
const url = sent.postUrl ?? (sent.subreddit
? `https://www.reddit.com/r/${sent.subreddit}/comments/${sent.postId}/`
@@ -205,9 +208,25 @@ export function createConversationsRouter(ctx: WebContext): Router {
intelligence.state.automation.handoffReason = intelligence.state.boundaries.join('; ');
}
if (conversation.roomId) stateRepo?.save(conversation.roomId, intelligence.state);
const aiFingerprints = new Map<string, number>();
if (automatedOpener) {
aiFingerprints.set(conversationMessageFingerprint(automatedOpener), 1);
}
for (const fingerprint of intelligence.state.automation.aiMessageFingerprints) {
aiFingerprints.set(fingerprint, (aiFingerprints.get(fingerprint) ?? 0) + 1);
}
const annotatedMessages = conversation.messages?.map((message) => {
if (!message.isSelf) return message;
const fingerprint = conversationMessageFingerprint(message.text);
const remainingMatches = aiFingerprints.get(fingerprint) ?? 0;
if (remainingMatches === 0) return message;
aiFingerprints.set(fingerprint, remainingMatches - 1);
return { ...message, isAi: true };
});
res.json({
...conversation,
...(annotatedMessages ? { messages: annotatedMessages } : {}),
owner: resolved.runtime
? { accountId: resolved.runtime.session.accountId, redditUsername: resolved.runtime.session.redditUsername }
: currentOwner(),