// Copyright (c) 2025 Bytedance Ltd. and/or its affiliates // SPDX-License-Identifier: MIT import { zodResolver } from "@hookform/resolvers/zod"; import { Settings } from "lucide-react"; import { useEffect, useMemo } from "react"; import { useForm } from "react-hook-form"; import { z } from "zod"; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from "~/components/ui/form"; import { Input } from "~/components/ui/input"; import type { SettingsState } from "~/core/store"; import type { Tab } from "./types"; const generalFormSchema = z.object({ maxPlanIterations: z.number().min(1, { message: "Max plan iterations must be at least 1.", }), maxStepNum: z.number().min(1, { message: "Max step number must be at least 1.", }), }); export const GeneralTab: Tab = ({ settings, onChange, }: { settings: SettingsState; onChange: (changes: Partial) => void; }) => { const generalSettings = useMemo(() => settings.general, [settings]); const form = useForm>({ resolver: zodResolver(generalFormSchema, undefined, undefined), values: generalSettings, }); const currentSettings = form.watch(); useEffect(() => { let hasChanges = false; for (const key in currentSettings) { if ( currentSettings[key as keyof typeof currentSettings] !== settings.general[key as keyof SettingsState["general"]] ) { hasChanges = true; break; } } if (hasChanges) { onChange({ general: currentSettings }); } }, [currentSettings, onChange, settings]); return (

General

( Max plan iterations field.onChange(parseInt(event.target.value)) } /> Set to 1 for single-step planning. Set to 2 to enable re-planning. )} /> ( Max steps of a research plan field.onChange(parseInt(event.target.value)) } /> By default, each research plan has 3 steps. )} />
); }; GeneralTab.displayName = ""; GeneralTab.icon = Settings;