feat(rag): final refinements for Phase 4 support and UI visualization

This commit is contained in:
2026-05-04 21:41:10 -04:00
parent bb8d609a71
commit a3d7376535
4 changed files with 89 additions and 8 deletions
+49 -3
View File
@@ -345,6 +345,8 @@ class AppController:
'gcli_path': 'ui_gemini_cli_path',
'output_dir': 'ui_output_dir',
'files_base_dir': 'ui_files_base_dir',
'files': 'files',
'screenshots': 'screenshots',
'ai_status': 'ai_status',
'ai_response': 'ai_response',
'active_discussion': 'active_discussion',
@@ -360,8 +362,11 @@ class AppController:
'rag_enabled': 'rag_enabled',
'rag_source': 'rag_source',
'rag_emb_provider': 'rag_emb_provider',
'rag_mcp_server': 'rag_mcp_server',
'rag_mcp_tool': 'rag_mcp_tool',
'rag_chunk_size': 'rag_chunk_size',
'rag_chunk_overlap': 'rag_chunk_overlap',
'mcp_config_json': 'mcp_config_json',
'mma_active_tier': 'active_tier',
'ui_new_track_name': 'ui_new_track_name',
'ui_new_track_desc': 'ui_new_track_desc',
@@ -508,21 +513,27 @@ class AppController:
return self.rag_config.enabled if self.rag_config else False
@rag_enabled.setter
def rag_enabled(self, value: bool) -> None:
if self.rag_config: self.rag_config.enabled = value
if self.rag_config:
self.rag_config.enabled = value
self.rag_engine = rag_engine.RAGEngine(self.rag_config, self.active_project_root)
@property
def rag_source(self) -> str:
return self.rag_config.vector_store.provider if self.rag_config else 'mock'
@rag_source.setter
def rag_source(self, value: str) -> None:
if self.rag_config: self.rag_config.vector_store.provider = value
if self.rag_config:
self.rag_config.vector_store.provider = value
if self.rag_engine: self.rag_engine = rag_engine.RAGEngine(self.rag_config, self.active_project_root)
@property
def rag_emb_provider(self) -> str:
return self.rag_config.embedding_provider if self.rag_config else 'gemini'
@rag_emb_provider.setter
def rag_emb_provider(self, value: str) -> None:
if self.rag_config: self.rag_config.embedding_provider = value
if self.rag_config:
self.rag_config.embedding_provider = value
if self.rag_engine: self.rag_engine = rag_engine.RAGEngine(self.rag_config, self.active_project_root)
@property
def rag_chunk_size(self) -> int:
@@ -538,6 +549,31 @@ class AppController:
def rag_chunk_overlap(self, value: int) -> None:
if self.rag_config: self.rag_config.chunk_overlap = value
@property
def rag_mcp_server(self) -> str:
return self.rag_config.vector_store.mcp_server or "" if self.rag_config else ""
@rag_mcp_server.setter
def rag_mcp_server(self, value: str) -> None:
if self.rag_config: self.rag_config.vector_store.mcp_server = value
@property
def rag_mcp_tool(self) -> str:
return self.rag_config.vector_store.mcp_tool or "" if self.rag_config else ""
@rag_mcp_tool.setter
def rag_mcp_tool(self, value: str) -> None:
if self.rag_config: self.rag_config.vector_store.mcp_tool = value
@property
def mcp_config_json(self) -> str:
return json.dumps(self.mcp_config.to_dict()) if self.mcp_config else "{}"
@mcp_config_json.setter
def mcp_config_json(self, value: str) -> None:
try:
data = json.loads(value)
self.mcp_config = models.MCPConfiguration.from_dict(data)
except:
pass
@property
def operations_live_indicator(self) -> bool:
return not self.is_viewing_prior_session
@@ -2478,6 +2514,16 @@ class AppController:
self._set_status("sending...")
user_msg = self.ui_ai_input
# RAG Retrieval
if self.rag_engine and self.rag_config and self.rag_config.enabled:
chunks = self.rag_engine.search(user_msg)
if chunks:
context_block = "## Retrieved Context\n\n"
for i, chunk in enumerate(chunks):
path = chunk.get("metadata", {}).get("path", "unknown")
context_block += f"### Chunk {i+1} (Source: {path})\n{chunk.get('document', '')}\n\n"
user_msg = context_block + user_msg
symbols = parse_symbols(user_msg)
file_paths = [f['path'] for f in file_items]
for symbol in symbols: