fix: resolve race condition in context condensing prompt input (#10876)

This commit is contained in:
Hannes Rudolph 2026-01-21 15:11:39 -07:00 committed by GitHub
parent 9ab279ae42
commit fa92ec4586
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 19 additions and 10 deletions

5
AGENTS.md Normal file
View file

@ -0,0 +1,5 @@
# AGENTS.md
This file provides guidance to agents when working with code in this repository.
- Settings View Pattern: When working on `SettingsView`, inputs must bind to the local `cachedState`, NOT the live `useExtensionState()`. The `cachedState` acts as a buffer for user edits, isolating them from the `ContextProxy` source-of-truth until the user explicitly clicks "Save". Wiring inputs directly to the live state causes race conditions.

View file

@ -23,6 +23,8 @@ import { SearchableSetting } from "./SearchableSetting"
interface PromptsSettingsProps {
customSupportPrompts: Record<string, string | undefined>
setCustomSupportPrompts: (prompts: Record<string, string | undefined>) => void
customCondensingPrompt?: string
setCustomCondensingPrompt?: (value: string) => void
includeTaskHistoryInEnhance?: boolean
setIncludeTaskHistoryInEnhance?: (value: boolean) => void
}
@ -30,6 +32,8 @@ interface PromptsSettingsProps {
const PromptsSettings = ({
customSupportPrompts,
setCustomSupportPrompts,
customCondensingPrompt: propsCustomCondensingPrompt,
setCustomCondensingPrompt: propsSetCustomCondensingPrompt,
includeTaskHistoryInEnhance: propsIncludeTaskHistoryInEnhance,
setIncludeTaskHistoryInEnhance: propsSetIncludeTaskHistoryInEnhance,
}: PromptsSettingsProps) => {
@ -40,12 +44,16 @@ const PromptsSettings = ({
setEnhancementApiConfigId,
condensingApiConfigId,
setCondensingApiConfigId,
customCondensingPrompt,
setCustomCondensingPrompt,
customCondensingPrompt: contextCustomCondensingPrompt,
setCustomCondensingPrompt: contextSetCustomCondensingPrompt,
includeTaskHistoryInEnhance: contextIncludeTaskHistoryInEnhance,
setIncludeTaskHistoryInEnhance: contextSetIncludeTaskHistoryInEnhance,
} = useExtensionState()
// Use props if provided, otherwise fall back to context
const customCondensingPrompt = propsCustomCondensingPrompt ?? contextCustomCondensingPrompt
const setCustomCondensingPrompt = propsSetCustomCondensingPrompt ?? contextSetCustomCondensingPrompt
// Use props if provided, otherwise fall back to context
const includeTaskHistoryInEnhance = propsIncludeTaskHistoryInEnhance ?? contextIncludeTaskHistoryInEnhance ?? true
const setIncludeTaskHistoryInEnhance = propsSetIncludeTaskHistoryInEnhance ?? contextSetIncludeTaskHistoryInEnhance
@ -76,10 +84,6 @@ const PromptsSettings = ({
if (type === "CONDENSE") {
setCustomCondensingPrompt(finalValue ?? supportPrompt.default.CONDENSE)
vscode.postMessage({
type: "updateCondensingPrompt",
text: finalValue ?? supportPrompt.default.CONDENSE,
})
// Also update the customSupportPrompts to trigger change detection
const updatedPrompts = { ...customSupportPrompts }
if (finalValue === undefined) {
@ -102,10 +106,6 @@ const PromptsSettings = ({
const handleSupportReset = (type: SupportPromptType) => {
if (type === "CONDENSE") {
setCustomCondensingPrompt(supportPrompt.default.CONDENSE)
vscode.postMessage({
type: "updateCondensingPrompt",
text: supportPrompt.default.CONDENSE,
})
// Also update the customSupportPrompts to trigger change detection
const updatedPrompts = { ...customSupportPrompts }
delete updatedPrompts[type]

View file

@ -900,6 +900,10 @@ const SettingsView = forwardRef<SettingsViewRef, SettingsViewProps>(({ onDone, t
<PromptsSettings
customSupportPrompts={customSupportPrompts || {}}
setCustomSupportPrompts={setCustomSupportPromptsField}
customCondensingPrompt={customCondensingPrompt}
setCustomCondensingPrompt={(value) =>
setCachedStateField("customCondensingPrompt", value)
}
includeTaskHistoryInEnhance={includeTaskHistoryInEnhance}
setIncludeTaskHistoryInEnhance={(value) =>
setCachedStateField("includeTaskHistoryInEnhance", value)