export type GrowthStage = 'SEED' | 'SEEDLING' | 'MATURE'; export type PlantType = 'Indica' | 'Sativa' | 'Hybrid'; export type NumericTraitKey = 'THC' | 'CBD' | 'Yield' | 'GrowTime'; export type ColorTraitKey = 'LeafColor' | 'BudColor'; export type ColorPattern = 'solid' | 'speckled' | 'split' | 'mosaic' | 'rimmed' | 'polycolor'; export type TraitKey = NumericTraitKey | ColorTraitKey; export type Rgb = [number, number, number]; export type Hsv = [number, number, number]; export type NumericAlleles = [number, number]; export type ColorAlleles = { Hue: NumericAlleles; Saturation: NumericAlleles; Value: NumericAlleles; }; export type Alleles = { THC: NumericAlleles; CBD: NumericAlleles; Yield: NumericAlleles; GrowTime: NumericAlleles; LeafColor: ColorAlleles; BudColor: ColorAlleles; }; export type Stabilities = Record; export type SeedProfile = { seedId: string; strainName: string; type: PlantType; alleles: Alleles; stabilities: Stabilities; thc: number; cbd: number; yield: number; growTime: number; budColor: Rgb; leafColor: Rgb; budPalette: Rgb[]; leafPalette: Rgb[]; budPattern: ColorPattern; leafPattern: ColorPattern; baseImageName: string; growthStage: GrowthStage; maturesAt?: string | null; lineage: [string | null, string | null]; description: string; quantity: number; attemptsUsed: number; maxAttempts: number; isStarter: boolean; }; export type StarterProfile = { name: string; type: PlantType; traits_base: { THC: number; CBD: number; Yield: number; GrowTime: number; }; alleles: Alleles; stabilities: Stabilities; base_image_name: string; description?: string; }; export type GameState = { schema: 'weedsim.game_state/v1'; seeds: SeedProfile[]; selection: string[]; updatedAt: string; }; export type TraitVariable = { key: string; label: string; unit: string; min: number; max: number; scale: 'numeric' | 'circular'; }; export type GermplasmRecord = { germplasmDbId: string; germplasmName: string; germplasmType: PlantType; generation: number; pedigree: string; parents: [string | null, string | null]; isStarter: boolean; stage: GrowthStage; THC: number; CBD: number; Yield: number; GrowTime: number; BudHue: number; LeafHue: number; Stability: number; Volatility: number; Bloom: number; budColor: Rgb; leafColor: Rgb; budPalette: Rgb[]; leafPalette: Rgb[]; budPattern: ColorPattern; leafPattern: ColorPattern; budBloom: { score: number; colorCount: number; hueSpread: number; averageSaturation: number; averageValue: number; muddyStops: number; pattern: ColorPattern }; leafBloom: { score: number; colorCount: number; hueSpread: number; averageSaturation: number; averageValue: number; muddyStops: number; pattern: ColorPattern }; budFamily: string; alleles: Alleles; attemptsUsed: number; maxAttempts: number; canAttempt: boolean; }; export type LabPayload = { variables: TraitVariable[]; records: GermplasmRecord[]; facets: Record>; count: number; }; export type DistributionSummary = { min: number; max: number; mean: number; median: number; values: number[]; }; export type BloomPredictionSummary = { score: DistributionSummary; volatility: DistributionSummary; colorCount: DistributionSummary; maxColors: number; patterns: Record; hint: string; }; export type CrossPrediction = { n: number; parents: [string, string]; THC: DistributionSummary; CBD: DistributionSummary; Yield: DistributionSummary; GrowTime: DistributionSummary; budCloud: Rgb[]; leafCloud: Rgb[]; budBloom: BloomPredictionSummary; leafBloom: BloomPredictionSummary; }; export type DeckSummary = { accessions: number; byStage: Record; byType: Record; byGeneration: Record; byBudFamily: Record; maxGeneration: number; breedableCount: number; growingCount: number; traitAverages: Record; gamut: Rgb[]; recentCrosses: Array<{ id: string; name: string; generation: number; pedigree: string; budColor: Rgb; leafColor: Rgb; THC: number; }>; topBloom: Array<{ id: string; name: string; generation: number; pedigree: string; budColor: Rgb; leafColor: Rgb; budPalette: Rgb[]; Bloom: number; Volatility: number; budPattern: ColorPattern; colorCount: number; hueSpread: number; THC: number; }>; breedable: Array<{ id: string; name: string }>; };