diff --git a/src/main/services/team/TeamMcpConfigBuilder.ts b/src/main/services/team/TeamMcpConfigBuilder.ts index 2411b3ea..949bed25 100644 --- a/src/main/services/team/TeamMcpConfigBuilder.ts +++ b/src/main/services/team/TeamMcpConfigBuilder.ts @@ -1,9 +1,9 @@ +import { execCli } from '@main/utils/childProcess'; import { getClaudeBasePath, getMcpConfigsBasePath, getMcpServerBasePath, } from '@main/utils/pathDecoder'; -import { execCli } from '@main/utils/childProcess'; import { createLogger } from '@shared/utils/logger'; import { randomUUID } from 'crypto'; import * as fs from 'fs'; diff --git a/src/renderer/components/team/dialogs/CreateTeamDialog.tsx b/src/renderer/components/team/dialogs/CreateTeamDialog.tsx index 4f353e34..3a22a60d 100644 --- a/src/renderer/components/team/dialogs/CreateTeamDialog.tsx +++ b/src/renderer/components/team/dialogs/CreateTeamDialog.tsx @@ -361,6 +361,10 @@ function cancelScheduledIdle(handle: ScheduledIdleHandle | null): void { window.clearTimeout(handle.id); } +function isCurrentPrepareGeneration(ref: { current: number }, generation: number): boolean { + return ref.current === generation; +} + export const CreateTeamDialog = ({ open, canCreate, @@ -445,6 +449,7 @@ export const CreateTeamDialog = ({ const [prepareChecks, setPrepareChecks] = useState([]); const prepareRequestSeqRef = useRef(0); const prepareIdleHandleRef = useRef(null); + const prepareUnmountGenerationRef = useRef(0); const appliedDefaultProjectPathRef = useRef(null); const lastAutoDescriptionRef = useRef(null); const [fieldErrors, setFieldErrors] = useState<{ @@ -692,11 +697,19 @@ export const CreateTeamDialog = ({ }, [open]); useEffect(() => { + const generation = ++prepareUnmountGenerationRef.current; return () => { - cancelScheduledIdle(prepareIdleHandleRef.current); - prepareIdleHandleRef.current = null; - prepareRequestSeqRef.current += 1; - lastPrepareRequestSignatureRef.current = null; + // React StrictMode replays effect cleanup/setup in development; defer + // invalidation so the replay does not cancel the live prepare request. + queueMicrotask(() => { + if (!isCurrentPrepareGeneration(prepareUnmountGenerationRef, generation)) { + return; + } + cancelScheduledIdle(prepareIdleHandleRef.current); + prepareIdleHandleRef.current = null; + prepareRequestSeqRef.current += 1; + lastPrepareRequestSignatureRef.current = null; + }); }; }, []); @@ -1046,6 +1059,7 @@ export const CreateTeamDialog = ({ effectiveMemberDrafts, effectiveAnthropicRuntimeLimitContext, prepareRequestSignature, + prepareRuntimeStatusSignature, runtimeProviderStatusById, selectedModel, selectedProviderId,