import { type CodexReasoningEffort, type ProviderKind, RuntimeMode, ProviderInteractionMode, } from "@t3tools/contracts"; import { getDefaultReasoningEffort } from "@t3tools/shared/model"; import { memo } from "react"; import { EllipsisIcon, ListTodoIcon } from "lucide-react"; import { Button } from "../ui/button"; import { Menu, MenuGroup, MenuItem, MenuPopup, MenuRadioGroup, MenuRadioItem, MenuSeparator as MenuDivider, MenuTrigger, } from "../ui/menu"; export const CompactComposerControlsMenu = memo(function CompactComposerControlsMenu(props: { activePlan: boolean; interactionMode: ProviderInteractionMode; planSidebarOpen: boolean; runtimeMode: RuntimeMode; selectedEffort: CodexReasoningEffort | null; selectedProvider: ProviderKind; selectedCodexFastModeEnabled: boolean; reasoningOptions: ReadonlyArray; onEffortSelect: (effort: CodexReasoningEffort) => void; onCodexFastModeChange: (enabled: boolean) => void; onToggleInteractionMode: () => void; onTogglePlanSidebar: () => void; onToggleRuntimeMode: () => void; }) { const defaultReasoningEffort = getDefaultReasoningEffort("codex"); const reasoningLabelByOption: Record = { low: "Low", medium: "Medium", high: "High", xhigh: "Extra High", }; return ( } > {props.selectedProvider === "codex" && props.selectedEffort != null ? ( <>
Reasoning
{ if (!value) return; const nextEffort = props.reasoningOptions.find((option) => option === value); if (!nextEffort) return; props.onEffortSelect(nextEffort); }} > {props.reasoningOptions.map((effort) => ( {reasoningLabelByOption[effort]} {effort === defaultReasoningEffort ? " (default)" : ""} ))}
Fast Mode
{ props.onCodexFastModeChange(value === "on"); }} > off on
) : null}
Mode
{ if (!value || value === props.interactionMode) return; props.onToggleInteractionMode(); }} > Chat Plan
Access
{ if (!value || value === props.runtimeMode) return; props.onToggleRuntimeMode(); }} > Supervised Full access
{props.activePlan ? ( <> {props.planSidebarOpen ? "Hide plan sidebar" : "Show plan sidebar"} ) : null}
); });