Add account browsing simulation

This commit is contained in:
jjbrunton committed 2026-08-11 21:40:31 +01:00
1 parent e2d7dc4b82
commit 27012399ec
31 files changed
+1476 -28

No files matched your search

+65
View File
@@ -15,6 +15,51 @@ export const GrowthQuietHoursSchema = z.strictObject({
endHour: z.number().int().min(0).max(23),
});
export const BrowsingSettingsSchema = z.strictObject({
enabled: z.boolean(),
dailyTargetMin: z.number().int(),
dailyTargetMax: z.number().int(),
postWeight: z.number(),
commentWeight: z.number(),
quietHours: GrowthQuietHoursSchema,
minimumGapMs: z.number().int(),
jitterMs: z.number().int(),
allowNsfw: z.boolean(),
nextDueAt: z.number().nullable(),
updatedAt: z.number(),
});
export const BrowsingStatsSchema = z.strictObject({
selected: z.number().int(),
posts: z.number().int(),
comments: z.number().int(),
rejected: z.number().int(),
skipped: z.number().int(),
});
export const BrowsingDecisionSchema = z.strictObject({
thingFullname: z.string(),
thingKind: z.enum(['post', 'comment']),
postId: z.string(),
subreddit: z.string(),
author: z.string(),
permalink: z.string(),
decision: z.enum(['simulated-upvote', 'skipped', 'rejected']),
reason: z.string(),
decidedAt: z.number(),
});
export const BrowsingSummarySchema = z.strictObject({
settings: BrowsingSettingsSchema,
todayTarget: z.number().int(),
stats: BrowsingStatsSchema,
noVotesSubmitted: z.literal(true),
});
export const BrowsingDetailSchema = BrowsingSummarySchema.extend({
recentDecisions: z.array(BrowsingDecisionSchema),
});
export const GrowthSubredditSchema = z.strictObject({
subreddit: z.string(),
enabled: z.boolean(),
@@ -82,11 +127,13 @@ export const GrowthAccountSummarySchema = z.strictObject({
stats: GrowthStatsSchema,
subredditCount: z.number().int(),
activeSubredditCount: z.number().int(),
browsing: BrowsingSummarySchema,
});
export const GrowthAccountDetailSchema = GrowthAccountSummarySchema.extend({
subreddits: z.array(GrowthSubredditSchema),
recentComments: z.array(GrowthCommentSchema),
browsing: BrowsingDetailSchema,
});
export const GrowthOverviewResponseSchema = z.strictObject({
@@ -104,6 +151,18 @@ export const GrowthSettingsUpdateRequestSchema = z.strictObject({
allowNsfw: z.boolean().optional(),
});
export const BrowsingSettingsUpdateRequestSchema = z.strictObject({
enabled: z.boolean().optional(),
dailyTargetMin: z.number().int().min(1).max(12).optional(),
dailyTargetMax: z.number().int().min(1).max(12).optional(),
postWeight: z.number().min(0).max(100).optional(),
commentWeight: z.number().min(0).max(100).optional(),
quietHours: GrowthQuietHoursSchema.optional(),
minimumGapMs: z.number().int().min(45 * 60_000).max(24 * 60 * 60_000).optional(),
jitterMs: z.number().int().min(0).max(6 * 60 * 60_000).optional(),
allowNsfw: z.boolean().optional(),
});
export const GrowthPauseRequestSchema = z.strictObject({
reason: z.string().min(1).max(200).optional(),
});
@@ -138,3 +197,9 @@ export type GrowthSettingsUpdateRequest = z.infer<typeof GrowthSettingsUpdateReq
export type GrowthSubredditCreateRequest = z.infer<typeof GrowthSubredditCreateRequestSchema>;
export type GrowthSubredditUpdateRequest = z.infer<typeof GrowthSubredditUpdateRequestSchema>;
export type GrowthAccountResponse = z.infer<typeof GrowthAccountResponseSchema>;
export type BrowsingSettings = z.infer<typeof BrowsingSettingsSchema>;
export type BrowsingStats = z.infer<typeof BrowsingStatsSchema>;
export type BrowsingDecision = z.infer<typeof BrowsingDecisionSchema>;
export type BrowsingSummary = z.infer<typeof BrowsingSummarySchema>;
export type BrowsingDetail = z.infer<typeof BrowsingDetailSchema>;
export type BrowsingSettingsUpdateRequest = z.infer<typeof BrowsingSettingsUpdateRequestSchema>;