import * as z from "zod"; import { Id } from "./ids.js"; /** Upper bounds on one scan's choices; the server lists at most this many projects and facts. */ export const ONBOARDING_SCAN_MAX_PROJECTS = 30; export const ONBOARDING_SCAN_MAX_FACTS = 20; /** The folder a consented scan would read, or null when this account cannot scan. */ export const OnboardingScanTargetSchema = z.object({ folder: z.string().nullable() }); export type OnboardingScanTarget = z.infer; export const OnboardingScanProjectSchema = z.object({ id: z.string(), name: z.string(), /** Relative to the scanned folder. */ path: z.string(), }); export type OnboardingScanProject = z.infer; export const OnboardingScanFactSchema = z.object({ id: z.string(), /** A language or tool name, e.g. "TypeScript". */ label: z.string(), }); export type OnboardingScanFact = z.infer; export const OnboardingScanStatusSchema = z.discriminatedUnion("status", [ z.object({ status: z.literal("scanning") }), z.object({ status: z.literal("failed") }), z.object({ status: z.literal("complete"), projects: z.array(OnboardingScanProjectSchema), facts: z.array(OnboardingScanFactSchema), }), ]); export type OnboardingScanStatus = z.infer; export const OnboardingScanApplyInputSchema = z.object({ scanId: z.string(), projectIds: z.array(z.string()).max(ONBOARDING_SCAN_MAX_PROJECTS), factIds: z.array(z.string()).max(ONBOARDING_SCAN_MAX_FACTS), }); export type OnboardingScanApplyInput = z.infer; export const OnboardingScanApplyResultSchema = z.object({ spaces: z.array(z.object({ id: Id, name: z.string() })), factsAdded: z.number().int().nonnegative(), }); export type OnboardingScanApplyResult = z.infer;