Add per-subreddit R4R conversation modes

This commit is contained in:
jjbrunton committed 2026-08-09 11:30:32 +01:00
1 parent 23d4c3a320
commit 0f76bcf59a
14 files changed
+343 -24

No files matched your search

+5
View File
@@ -25,6 +25,10 @@ export const RuntimeConfigSchema = z.strictObject({
browser: z.strictObject({ dryRun: z.boolean() }),
reddit: RuntimeRedditConfigSchema,
});
export const ConversationBehaviourSchema = z.strictObject({
mode: z.union([z.literal('legacy'), z.literal('r4r'), z.literal('manual')]).default('legacy'),
maxAutomatedTurns: z.number().int().min(1).max(20).default(3),
}).default({ mode: 'legacy', maxAutomatedTurns: 3 });
export const SubredditConfigSchema = z.strictObject({
name: z.string(),
enabled: z.boolean().default(true),
@@ -32,6 +36,7 @@ export const SubredditConfigSchema = z.strictObject({
weight: z.number().optional(),
tone: ToneKeySchema,
scripted: z.string().optional(),
conversation: ConversationBehaviourSchema,
});
export const ConfigResponseSchema = RuntimeConfigSchema.extend({
subreddits: z.array(SubredditConfigSchema),
@@ -145,7 +145,13 @@ describe('dashboard endpoint contracts', () => {
subreddits: [{ name: 'example', enabled: true, type: 'chat', weight: 2, tone: 'direct' }],
tones: ['default', 'direct'],
};
expect(ConfigResponseSchema.parse(payload)).toEqual(payload);
expect(ConfigResponseSchema.parse(payload)).toEqual({
...payload,
subreddits: [{
...payload.subreddits[0],
conversation: { mode: 'legacy', maxAutomatedTurns: 3 },
}],
});
expect(ConfigResponseSchema.safeParse({ ...payload, tones: [1] }).success).toBe(false);
expect(ConfigUpdateRequestSchema.safeParse({
rateLimit: { maxMessagesPerHour: 10 }, browser: { dryRun: true }, advanced: { media: { syncEnabled: false } },