Files
tkmind_go/ui/desktop/src/components/settings/mode/ModeSection.tsx
T
2026-03-16 11:37:21 +00:00

75 lines
2.2 KiB
TypeScript

import { useEffect, useState, useCallback } from 'react';
import { all_goose_modes, ModeSelectionItem } from './ModeSelectionItem';
import { useConfig } from '../../ConfigContext';
import { ConversationLimitsDropdown } from './ConversationLimitsDropdown';
import { updateSession } from '../../../api';
export const ModeSection = ({ sessionId }: { sessionId?: string }) => {
const [currentMode, setCurrentMode] = useState('auto');
const [maxTurns, setMaxTurns] = useState<number>(1000);
const { config, read, upsert } = useConfig();
const handleModeChange = async (newMode: string) => {
try {
if (sessionId) {
await updateSession({ body: { session_id: sessionId, goose_mode: newMode } });
}
await upsert('GOOSE_MODE', newMode, false);
setCurrentMode(newMode);
} catch (error) {
console.error('Error updating goose mode:', error);
throw new Error(`Failed to store new goose mode: ${newMode}`);
}
};
useEffect(() => {
const mode = config.GOOSE_MODE as string | undefined;
if (mode) {
setCurrentMode(mode);
}
}, [config.GOOSE_MODE]);
const fetchMaxTurns = useCallback(async () => {
try {
const turns = (await read('GOOSE_MAX_TURNS', false)) as number;
if (turns) {
setMaxTurns(turns);
}
} catch (error) {
console.error('Error fetching max turns:', error);
}
}, [read]);
const handleMaxTurnsChange = async (value: number) => {
try {
await upsert('GOOSE_MAX_TURNS', value, false);
setMaxTurns(value);
} catch (error) {
console.error('Error updating max turns:', error);
}
};
useEffect(() => {
fetchMaxTurns();
}, [fetchMaxTurns]);
return (
<div className="space-y-1">
{/* Mode Selection */}
{all_goose_modes.map((mode) => (
<ModeSelectionItem
key={mode.key}
mode={mode}
currentMode={currentMode}
showDescription={true}
isApproveModeConfigure={false}
handleModeChange={handleModeChange}
/>
))}
{/* Conversation Limits Dropdown */}
<ConversationLimitsDropdown maxTurns={maxTurns} onMaxTurnsChange={handleMaxTurnsChange} />
</div>
);
};