File size: 3,754 Bytes
5249394
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
from typing import List
import streamlit as st
from tkinter import Tk, filedialog
from streamlit.components.v1 import html
from autogen import ConversableAgent


from ui.introductory_page import IntroductoryPage
from ui.analysis_page import NavigationPanel, CodePreview, ResultsDisplay


from agents.code_overview_agents import CodeSummarizerAgent, CodeSmellDetectorAgent
from agents.code_structure_agents import DesignPatternDetectorAgent, DesignPatternRecommenderAgent, SOLIDPrinciplesManagerAgent
from agents.code_visualization_agents import MermaideDiagramAgent


from config import DefaultSettings
from utils.utils import load_config, load_css





# Configuration and Agent Initialization
llm_config = load_config(DefaultSettings().default_model_type)
agents = [
    CodeSummarizerAgent().make_agent(llm_config),
    CodeSmellDetectorAgent().make_agent(llm_config),
    DesignPatternDetectorAgent().make_agent(llm_config),
    DesignPatternRecommenderAgent().make_agent(llm_config),
    SOLIDPrinciplesManagerAgent().make_agent(llm_config),
    MermaideDiagramAgent().make_agent(llm_config)
]



class AnalysisManager:
    """Manages and provides access to analysis results."""
    
    def __init__(self, results):
        load_css("./ui/styles.css")
        self.results = results
    
    def get_file_data(self, file_path):
        return self.results.get(file_path, {})
    
    def list_files(self):
        return list(self.results.keys())



class CodeAnalysisApp:
    """Main application orchestrator."""


    def __init__(self, agents: List[ConversableAgent]) -> None:
        self.agents = agents
    
    def run(self):
        """Main application entry point."""
        st.set_page_config(
            layout="wide",
            initial_sidebar_state="expanded",
            page_icon="🔍"
        )
        
        if not self._check_analysis_state():
            IntroductoryPage(self.agents).render()
            return
        
        self._setup_interface()
        self._render_main_view()
        self._add_reset_button()

    def _check_analysis_state(self):
        """Validate analysis completion status."""
        if 'analysis_done' not in st.session_state:
            st.session_state.analysis_done = False
        return st.session_state.get('results') and st.session_state.analysis_done

    def _setup_interface(self):
        """Initialize application components."""
        load_css("./ui/styles.css")
        self.analysis = AnalysisManager(st.session_state.results)
        self.nav = NavigationPanel(self.analysis.list_files())

    def _render_main_view(self):
        """Display main two-column interface."""
        selected_file = self.nav.render()
        file_data = self.analysis.get_file_data(selected_file)
        
        col1, col2 = st.columns([0.5, 0.5])
        with col1:
            CodePreview(
                file_path=selected_file,
                language=file_data['language']
            ).render()
        
        with col2:
            ResultsDisplay(
                file_data['analysis_results']
            ).render()

    def _add_reset_button(self):
        """Add sidebar reset functionality."""
        st.sidebar.button(
            "New Analysis",
            on_click=self._reset_state
        )

    def _reset_state(self):
        """Clear analysis-related session state."""
        state_keys = ['results', 'analysis_done', 'selected_dir', 'prev_dir']
        for key in state_keys:
            if key in st.session_state:
                del st.session_state[key]
        st.rerun()


if __name__ == "__main__":
    CodeAnalysisApp(agents).run()