- ChatView: Store extractModelSelectionOptions result in a local variable instead of calling it twice with identical arguments in selectedModelSelection useMemo - ProviderCommandReactor: Only derive model options from requestedModelSelection (explicit user request), not from thread.modelSelection fallback, to prevent silent injection of persisted options during runtime-mode-triggered session restarts
Unified · Split
| @@ -249,7 +249,10 @@ const make = Effect.gen(function* () { · 248 unmodified lines | |||
| 249 | const desiredModelSelection = requestedModelSelection ?? thread.modelSelection; | 249 | const desiredModelSelection = requestedModelSelection ?? thread.modelSelection; |
| 250 | const desiredModel = desiredModelSelection.model; | 250 | const desiredModel = desiredModelSelection.model; |
| 251 | const desiredModelOptions = | 251 | const desiredModelOptions = |
| 252 | options?.modelOptions ?? toProviderModelOptions(desiredModelSelection); | 252 | options?.modelOptions ?? |
| 253 | (requestedModelSelection !== undefined | ||
| 254 | ? toProviderModelOptions(requestedModelSelection) | ||
| 255 | : undefined); | ||
| 253 | const effectiveCwd = resolveThreadWorkspaceCwd({ | 256 | const effectiveCwd = resolveThreadWorkspaceCwd({ |
| 254 | thread, | 257 | thread, |
| 255 | projects: readModel.projects, | 258 | projects: readModel.projects, |
| @@ -643,21 +643,14 @@ export default function ChatView({ threadId }: ChatViewProps) { · 642 unmodified lines | |||
| 643 | ); | 643 | ); |
| 644 | const selectedPromptEffort = composerProviderState.promptEffort; | 644 | const selectedPromptEffort = composerProviderState.promptEffort; |
| 645 | const selectedModelOptionsForDispatch = composerProviderState.modelOptionsForDispatch; | 645 | const selectedModelOptionsForDispatch = composerProviderState.modelOptionsForDispatch; |
| 646 | const selectedModelSelection = useMemo<ModelSelection>( | 646 | const selectedModelSelection = useMemo<ModelSelection>(() => { |
| 647 | () => ({ | 647 | const options = extractModelSelectionOptions(selectedProvider, selectedModelOptionsForDispatch); |
| 648 | return { | ||
| 648 | provider: selectedProvider, | 649 | provider: selectedProvider, |
| 649 | model: selectedModel, | 650 | model: selectedModel, |
| 650 | ...(extractModelSelectionOptions(selectedProvider, selectedModelOptionsForDispatch) | 651 | ...(options ? { options } : {}), |
| 651 | ? { | 652 | }; |
| 652 | options: extractModelSelectionOptions( | 653 | }, [selectedModel, selectedModelOptionsForDispatch, selectedProvider]); |
| 653 | selectedProvider, | ||
| 654 | selectedModelOptionsForDispatch, | ||
| 655 | ), | ||
| 656 | } | ||
| 657 | : {}), | ||
| 658 | }), | ||
| 659 | [selectedModel, selectedModelOptionsForDispatch, selectedProvider], | ||
| 660 | ); | ||
| 661 | const providerOptionsForDispatch = useMemo(() => getProviderStartOptions(settings), [settings]); | 654 | const providerOptionsForDispatch = useMemo(() => getProviderStartOptions(settings), [settings]); |
| 662 | const selectedModelForPicker = selectedModel; | 655 | const selectedModelForPicker = selectedModel; |
| 663 | const modelOptionsByProvider = useMemo( | 656 | const modelOptionsByProvider = useMemo( |