fix: resolve race conditions in assistant/cockpit session loading

- Always load session data on mount even when urlSessionId matches
  activeChatId, fixing empty state after view toggle between /assistant
  and /cockpit (tasks/messages not showing until sidebar click)
- Add loadingRef for synchronous guards preventing duplicate sends,
  duplicate session creation, and prefill races
- Fix stale evidence_items closure in CockpitPage handlers
- Move setLoading(true) before first await in handlePrefill and
  handleResumeNew

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
chihlasm
2026-04-03 02:49:29 +00:00
parent 3ea669a1e5
commit 4ba32a08ac
3 changed files with 43 additions and 21 deletions

View File

@@ -99,20 +99,26 @@ export default function CockpitPage() {
const handleEvidenceAdd = useCallback(async (text: string, status: EvidenceItem['status']) => {
const newItem: EvidenceItem = { text, status }
const updated = [...triageMeta.evidence_items, newItem]
setTriageMeta(prev => ({ ...prev, evidence_items: updated }))
let updated: EvidenceItem[] = []
setTriageMeta(prev => {
updated = [...prev.evidence_items, newItem]
return { ...prev, evidence_items: updated }
})
if (session.activeChatId) {
try { await aiSessionsApi.updateTriage(session.activeChatId, { evidence_items: updated }) } catch { /* best-effort */ }
}
}, [session.activeChatId, triageMeta.evidence_items])
}, [session.activeChatId])
const handleEvidenceEdit = useCallback(async (index: number, text: string, status: EvidenceItem['status']) => {
const updated = triageMeta.evidence_items.map((item, i) => i === index ? { text, status } : item)
setTriageMeta(prev => ({ ...prev, evidence_items: updated }))
let updated: EvidenceItem[] = []
setTriageMeta(prev => {
updated = prev.evidence_items.map((item, i) => i === index ? { text, status } : item)
return { ...prev, evidence_items: updated }
})
if (session.activeChatId) {
try { await aiSessionsApi.updateTriage(session.activeChatId, { evidence_items: updated }) } catch { /* best-effort */ }
}
}, [session.activeChatId, triageMeta.evidence_items])
}, [session.activeChatId])
const handleStepComplete = useCallback((index: number) => {
setCompletedSteps(prev => {