diff --git a/ui/client-app/src/pages/CodingAssistantPage.js b/ui/client-app/src/pages/CodingAssistantPage.js index d098fef..2df60d8 100644 --- a/ui/client-app/src/pages/CodingAssistantPage.js +++ b/ui/client-app/src/pages/CodingAssistantPage.js @@ -50,6 +50,10 @@ const [showConfigModal, setShowConfigModal] = useState(false); const [showNodeSelector, setShowNodeSelector] = useState(false); + const isEditingMeshRef = useRef(false); + useEffect(() => { + isEditingMeshRef.current = showNodeSelector; + }, [showNodeSelector]); const [sidebarRefreshTick, setSidebarRefreshTick] = useState(0); // M3/M6 Node Integration State @@ -90,7 +94,7 @@ }, [syncConfig.source, syncConfig.source_node_id, attachedNodeIds]); const handleInitiateSync = async () => { - if (!sessionId || attachedNodeIds.length === 0) return; + if (!sessionId) return; setIsInitiatingSync(true); try { await attachNodesToSession(sessionId, attachedNodeIds, syncConfig); @@ -124,10 +128,14 @@ }); setSessionNodeStatus(syncStatusMap); - setAttachedNodeIds(sanitizedIds); setWorkspaceId(status.sync_workspace_id || ""); - setActiveSyncConfig(status.sync_config || null); setAccessibleNodes(nodes); + + // Stop auto-poll from wiping out user's active checkbox edits + if (!isEditingMeshRef.current) { + setAttachedNodeIds(sanitizedIds); + setActiveSyncConfig(status.sync_config || null); + } } catch (e) { console.warn("M3: Failed to fetch session node info", e); } @@ -618,7 +626,6 @@ onClick={handleInitiateSync} disabled={ isInitiatingSync || - attachedNodeIds.length === 0 || (syncConfig.source === 'node_local' && (!syncConfig.source_node_id || !syncConfig.path)) } className="bg-indigo-600 text-white px-6 py-2 rounded-xl text-sm font-bold shadow-lg shadow-indigo-600/20 active:scale-95 transition-all disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-2"