import type { AssertEqual, Equals, Keys, Values, ExperimentId, Experiments } from "@roo-code/types" export const EXPERIMENT_IDS = { PREVENT_FOCUS_DISRUPTION: "preventFocusDisruption", IMAGE_GENERATION: "imageGeneration", RUN_SLASH_COMMAND: "runSlashCommand", CUSTOM_TOOLS: "customTools", SUBAGENT: "subagent", } as const satisfies Record type _AssertExperimentIds = AssertEqual>> type ExperimentKey = Keys interface ExperimentConfig { enabled: boolean } export const experimentConfigsMap: Record = { PREVENT_FOCUS_DISRUPTION: { enabled: false }, IMAGE_GENERATION: { enabled: false }, RUN_SLASH_COMMAND: { enabled: false }, CUSTOM_TOOLS: { enabled: false }, SUBAGENT: { enabled: false }, } export const experimentDefault = Object.fromEntries( Object.entries(experimentConfigsMap).map(([_, config]) => [ EXPERIMENT_IDS[_ as keyof typeof EXPERIMENT_IDS] as ExperimentId, config.enabled, ]), ) as Record export const experiments = { get: (id: ExperimentKey): ExperimentConfig | undefined => experimentConfigsMap[id], isEnabled: (experimentsConfig: Experiments, id: ExperimentId) => experimentsConfig[id] ?? experimentDefault[id], } as const