feat: add shared dashboard API contracts

This commit is contained in:
jjbrunton committed 2026-08-08 14:52:06 +01:00
1 parent 939cf408a0
commit 59c3a61a88
14 files changed
+648

No files matched your search

+53
View File
@@ -0,0 +1,53 @@
import { z } from 'zod';
export const ToneKeySchema = z.union([
z.literal('default'),
z.literal('dominant'),
z.literal('submissive'),
z.literal('playful'),
z.literal('direct'),
z.literal('gentle'),
z.literal('kink-friendly'),
z.literal('teasing'),
]);
export const RateLimitConfigSchema = z.strictObject({
minDelayBetweenMessagesMs: z.number(),
maxMessagesPerHour: z.number(),
jitterMs: z.number(),
});
export const RuntimeRedditConfigSchema = z.strictObject({
prioritizeRecentPosts: z.boolean(),
recentWindowMinutes: z.number(),
});
export const RuntimeConfigSchema = z.strictObject({
rateLimit: RateLimitConfigSchema,
browser: z.strictObject({ dryRun: z.boolean() }),
reddit: RuntimeRedditConfigSchema,
});
export const SubredditConfigSchema = z.strictObject({
name: z.string(),
type: z.union([z.literal('image'), z.literal('chat')]),
weight: z.number().optional(),
tone: ToneKeySchema,
scripted: z.string().optional(),
});
export const ConfigResponseSchema = RuntimeConfigSchema.extend({
subreddits: z.array(SubredditConfigSchema),
tones: z.array(ToneKeySchema),
});
export const ConfigUpdateRequestSchema = z.strictObject({
rateLimit: RateLimitConfigSchema.partial().optional(),
browser: z.strictObject({ dryRun: z.boolean().optional() }).optional(),
reddit: RuntimeRedditConfigSchema.partial().optional(),
subreddits: z.array(SubredditConfigSchema).min(1).optional(),
});
export const ConfigUpdateResponseSchema = z.strictObject({
success: z.literal(true),
config: RuntimeConfigSchema,
subreddits: z.array(SubredditConfigSchema),
});
export type RuntimeConfig = z.infer<typeof RuntimeConfigSchema>;
export type ConfigResponse = z.infer<typeof ConfigResponseSchema>;
export type ConfigUpdateRequest = z.infer<typeof ConfigUpdateRequestSchema>;