import { useEffect, useState } from "react"; import { invoke } from "@tauri-apps/api/core"; import { useTranslation } from "../i18n"; import type { TranslationKey } from "../i18n/zh"; import type { ExperimentalEnvStatus, Model } from "../types"; import { EXPERIMENTAL_FLAGS, clearSecondaryModel, forcedEnvValue, getExperimentalFlags, getSecondaryModel, isFlagLockedByEnv, isMasterEnvOn, setExperimentalFlag, setSecondaryModelOnly, type ExperimentalFlagDef, } from "../lib/subagent-settings"; import { Card, Toggle } from "./ui/controls"; interface SubagentSettingsPageProps { /** config.raw_other — hosts the `[experimental]` and `[secondary_model]` sections. */ rawOther: unknown; /** All configured models (alias → entry) for the secondary-model picker. */ models: Record; onChange: (nextRawOther: unknown) => void; onBack: () => void; } const EFFORTS = ["low", "medium", "high", "max"] as const; const EFFORT_LABELS: Record<(typeof EFFORTS)[number], TranslationKey> = { low: "thinkingLow", medium: "thinkingMedium", high: "thinkingHigh", max: "thinkingMax", }; const FLAG_LABELS: Record = { "secondary-model": { name: "flagSecondaryModel", desc: "flagSecondaryModelDesc" }, "tool-select": { name: "flagToolSelect", desc: "flagToolSelectDesc" }, "acp-v2": { name: "flagAcpV2", desc: "flagAcpV2Desc" }, persistence_minidb_readmodel: { name: "flagMinidbReadmodel", desc: "flagMinidbReadmodelDesc", }, }; export function SubagentSettingsPage({ rawOther, models, onChange, onBack, }: SubagentSettingsPageProps) { const { t } = useTranslation(); const [env, setEnv] = useState(null); useEffect(() => { invoke("get_experimental_env_status") .then(setEnv) .catch(() => setEnv({})); }, []); const flags = getExperimentalFlags(rawOther); const secondary = getSecondaryModel(rawOther); const masterOn = isMasterEnvOn(env); const secondaryFlag = EXPERIMENTAL_FLAGS[0]; // "secondary-model" const otherFlags = EXPERIMENTAL_FLAGS.slice(1); /** Effective state of the secondary-model flag (env overrides config). */ const secondaryEnabled = masterOn ? true : isFlagLockedByEnv(env, secondaryFlag) ? forcedEnvValue(env, secondaryFlag) : flags["secondary-model"] === true; const secondaryLocked = masterOn || isFlagLockedByEnv(env, secondaryFlag); const aliasList = Object.keys(models).sort(); // Inherited settings shown for the picked model: subagents bind the pointed // entry directly (no patch fields), so context size and effort come from the // model entry / global [thinking], not from a `[secondary_model]` patch. const selectedEntry = secondary.model ? models[secondary.model] : undefined; const inheritedContext = selectedEntry?.max_context_size; const modelEffort = selectedEntry && typeof (selectedEntry.raw_other as Record | undefined) ?.default_effort === "string" ? ((selectedEntry.raw_other as Record).default_effort as string) : undefined; const thinkingEffort = (() => { const ro = rawOther as Record | undefined; const thinking = ro?.thinking as Record | undefined; return thinking && typeof thinking.effort === "string" && thinking.effort ? thinking.effort : undefined; })(); const inheritedEffort = modelEffort ?? thinkingEffort; const fmtContext = (n: number): string => n >= 1_000_000 ? `${(n / 1_000_000).toFixed(1)}M` : n >= 1000 ? `${Math.round(n / 1000)}K` : String(n); const effortLabel = (e: string): string => { const key = EFFORT_LABELS[e as (typeof EFFORTS)[number]]; return key ? t(key) : e; }; const renderFlagRow = (flag: ExperimentalFlagDef) => { const labels = FLAG_LABELS[flag.id]; const locked = masterOn || isFlagLockedByEnv(env, flag); const on = masterOn ? true : isFlagLockedByEnv(env, flag) ? forcedEnvValue(env, flag) : flags[flag.id] === true; return (
{t(labels.name)}
{t(labels.desc)} {flag.envVar}
{locked && ( 🔒 {t("lockedByEnv")} )} onChange(setExperimentalFlag(rawOther, flag.id, checked)) } />
); }; return (
{/* Header */}

{t("subagentSettings")}

{masterOn && (
{t("masterEnvOnHint")}
)} {/* Kimi Code WebUI quick open */}

{t("webuiDesc")}

{/* Subagent: secondary model picker + inherited settings */}
{t(FLAG_LABELS[secondaryFlag.id].desc)} {secondaryFlag.envVar}
{secondaryLocked && ( 🔒 {t("lockedByEnv")} )} onChange(setExperimentalFlag(rawOther, secondaryFlag.id, checked)) } />
{secondary.model !== undefined && (
{t("secondaryModelInheritedContext")} {inheritedContext ? fmtContext(inheritedContext) : "—"}
{t("secondaryModelInheritedEffort")} {inheritedEffort ? effortLabel(inheritedEffort) : "—"}

{t("secondaryModelInheritedHint")}

)}

{t("secondaryModelPriorityHint")}

{/* Other experimental features (not subagent-related) */} {otherFlags.map(renderFlagRow)}

{t("experimentalFlagsHint")}

); }