feat(ai-moderation): enrich analysis context with recency, repetition, user history and channel topic
- <message> targets now carry time (ISO), repetitions (N identical short texts = spam signal), bot and edited flags; escape id/user XML - rich <user_reputation>: total_infractions, clean_streak, last_offense_days_ago, repeat_offender (7-day window) - <user_history> with last flagged messages for repeat offenders (wires dead getUserRecentInfractions) - <user_profile as_of> staleness signal; <location_context topic> from captured channel topic - prompt framing + output instructions teach the LLM to use the new signals without treating history as proof - tests: contextEnrichment.test.ts (13) + topic cases in conversationContext.test.ts
This commit is contained in:
@@ -165,6 +165,7 @@ export function buildLocationContext(targets: MessageRecord[]): string {
|
||||
channel?: {
|
||||
channelName?: string | null;
|
||||
threadName?: string | null;
|
||||
topic?: string | null;
|
||||
nsfw?: boolean;
|
||||
ageRestricted?: boolean;
|
||||
nsfwLevel?: string | null;
|
||||
@@ -181,6 +182,13 @@ export function buildLocationContext(targets: MessageRecord[]): string {
|
||||
if (ch.threadName)
|
||||
attrs.push(`thread_name="${escapeXml(ch.threadName)}"`);
|
||||
}
|
||||
if (typeof ch.topic === "string" && ch.topic.trim().length > 0) {
|
||||
const topic =
|
||||
ch.topic.length > 200
|
||||
? `${ch.topic.slice(0, 200).trimEnd()}…`
|
||||
: ch.topic;
|
||||
attrs.push(`topic="${escapeXml(topic)}"`);
|
||||
}
|
||||
if (typeof ch.nsfw === "boolean") attrs.push(`nsfw="${ch.nsfw}"`);
|
||||
if (typeof ch.ageRestricted === "boolean") {
|
||||
attrs.push(`age_restricted="${ch.ageRestricted}"`);
|
||||
|
||||
Reference in New Issue
Block a user