From 2a9c1488aa26efde69cc61243fc996cc09170660 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 7 Nov 2025 01:39:02 +0000 Subject: [PATCH 1/2] Initial plan From f94e64202cdb0d79e4311e73a42d20c0cfc76a03 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 7 Nov 2025 01:49:48 +0000 Subject: [PATCH 2/2] fix: Update import paths to use new subpackage structure and fix syntax error in mcp/server.py Co-authored-by: royisme <350731+royisme@users.noreply.github.com> --- src/codebase_rag/api/memory_routes.py | 3 +- src/codebase_rag/api/neo4j_routes.py | 2 +- src/codebase_rag/api/routes.py | 15 ++-- src/codebase_rag/api/sse_routes.py | 2 +- src/codebase_rag/api/task_routes.py | 3 +- src/codebase_rag/api/websocket_routes.py | 2 +- src/codebase_rag/core/lifespan.py | 7 +- src/codebase_rag/mcp/server.py | 77 +------------------ src/codebase_rag/services/code/__init__.py | 6 +- .../services/knowledge/__init__.py | 3 +- src/codebase_rag/services/memory/__init__.py | 6 +- .../services/memory/memory_extractor.py | 2 +- src/codebase_rag/services/sql/__init__.py | 5 +- src/codebase_rag/services/tasks/__init__.py | 8 +- src/codebase_rag/services/utils/__init__.py | 8 +- 15 files changed, 34 insertions(+), 115 deletions(-) diff --git a/src/codebase_rag/api/memory_routes.py b/src/codebase_rag/api/memory_routes.py index a15d9ed..ae779c4 100644 --- a/src/codebase_rag/api/memory_routes.py +++ b/src/codebase_rag/api/memory_routes.py @@ -11,8 +11,7 @@ from pydantic import BaseModel, Field from typing import Optional, List, Dict, Any, Literal -from codebase_rag.services.memory_store import memory_store -from codebase_rag.services.memory_extractor import memory_extractor +from codebase_rag.services.memory import memory_store, memory_extractor from loguru import logger diff --git a/src/codebase_rag/api/neo4j_routes.py b/src/codebase_rag/api/neo4j_routes.py index f38cf69..326c5d4 100644 --- a/src/codebase_rag/api/neo4j_routes.py +++ b/src/codebase_rag/api/neo4j_routes.py @@ -8,7 +8,7 @@ import tempfile import os -from codebase_rag.services.neo4j_knowledge_service import neo4j_knowledge_service +from codebase_rag.services.knowledge import neo4j_knowledge_service router = APIRouter(prefix="/neo4j-knowledge", tags=["Neo4j Knowledge Graph"]) diff --git a/src/codebase_rag/api/routes.py b/src/codebase_rag/api/routes.py index 9cc23ff..2bdc710 100644 --- a/src/codebase_rag/api/routes.py +++ b/src/codebase_rag/api/routes.py @@ -5,16 +5,11 @@ import uuid from datetime import datetime -from codebase_rag.services.sql_parser import sql_analyzer -from codebase_rag.services.graph_service import graph_service -from codebase_rag.services.neo4j_knowledge_service import Neo4jKnowledgeService -from codebase_rag.services.universal_sql_schema_parser import parse_sql_schema_smart -from codebase_rag.services.task_queue import task_queue -from codebase_rag.services.code_ingestor import get_code_ingestor -from codebase_rag.services.git_utils import git_utils -from codebase_rag.services.ranker import ranker -from codebase_rag.services.pack_builder import pack_builder -from codebase_rag.services.metrics import metrics_service +from codebase_rag.services.sql import sql_analyzer, parse_sql_schema_smart +from codebase_rag.services.code import graph_service, get_code_ingestor, pack_builder +from codebase_rag.services.knowledge import Neo4jKnowledgeService +from codebase_rag.services.tasks import task_queue +from codebase_rag.services.utils import git_utils, ranker, metrics_service from codebase_rag.config import settings from loguru import logger diff --git a/src/codebase_rag/api/sse_routes.py b/src/codebase_rag/api/sse_routes.py index 83e7940..84c1921 100644 --- a/src/codebase_rag/api/sse_routes.py +++ b/src/codebase_rag/api/sse_routes.py @@ -9,7 +9,7 @@ from fastapi.responses import StreamingResponse from loguru import logger -from codebase_rag.services.task_queue import task_queue, TaskStatus +from codebase_rag.services.tasks import task_queue, TaskStatus router = APIRouter(prefix="/sse", tags=["SSE"]) diff --git a/src/codebase_rag/api/task_routes.py b/src/codebase_rag/api/task_routes.py index 21fe8bc..1e86e6a 100644 --- a/src/codebase_rag/api/task_routes.py +++ b/src/codebase_rag/api/task_routes.py @@ -9,8 +9,7 @@ from pydantic import BaseModel from datetime import datetime -from codebase_rag.services.task_queue import task_queue, TaskStatus -from codebase_rag.services.task_storage import TaskType +from codebase_rag.services.tasks import task_queue, TaskStatus, TaskType from loguru import logger from codebase_rag.config import settings diff --git a/src/codebase_rag/api/websocket_routes.py b/src/codebase_rag/api/websocket_routes.py index 40e50c1..94a80bd 100644 --- a/src/codebase_rag/api/websocket_routes.py +++ b/src/codebase_rag/api/websocket_routes.py @@ -9,7 +9,7 @@ import json from loguru import logger -from codebase_rag.services.task_queue import task_queue +from codebase_rag.services.tasks import task_queue router = APIRouter() diff --git a/src/codebase_rag/core/lifespan.py b/src/codebase_rag/core/lifespan.py index d428317..cf81b1d 100644 --- a/src/codebase_rag/core/lifespan.py +++ b/src/codebase_rag/core/lifespan.py @@ -6,10 +6,9 @@ from fastapi import FastAPI from loguru import logger -from codebase_rag.services.neo4j_knowledge_service import neo4j_knowledge_service -from codebase_rag.services.task_queue import task_queue -from codebase_rag.services.task_processors import processor_registry -from codebase_rag.services.memory_store import memory_store +from codebase_rag.services.knowledge import neo4j_knowledge_service +from codebase_rag.services.tasks import task_queue, processor_registry +from codebase_rag.services.memory import memory_store @asynccontextmanager diff --git a/src/codebase_rag/mcp/server.py b/src/codebase_rag/mcp/server.py index 748341c..7f8f6c0 100644 --- a/src/codebase_rag/mcp/server.py +++ b/src/codebase_rag/mcp/server.py @@ -366,84 +366,9 @@ async def main(): notification_options=None, experimental_capabilities={} ) - - if search_results: - ranked = ranker.rank_files( - files=search_results, - query=keyword, - limit=10 - ) - - for file in ranked: - all_nodes.append({ - "type": "file", - "path": file["path"], - "lang": file["lang"], - "score": file["score"], - "ref": ranker.generate_ref_handle(path=file["path"]) - }) - - # Add focus files with high priority - if focus_list: - for focus_path in focus_list: - all_nodes.append({ - "type": "file", - "path": focus_path, - "lang": "unknown", - "score": 10.0, # High priority - "ref": ranker.generate_ref_handle(path=focus_path) - }) - - # Build context pack - if ctx: - await ctx.info(f"Packing {len(all_nodes)} candidate files into context...") - - context_result = pack_builder.build_context_pack( - nodes=all_nodes, - budget=budget, - stage=stage, - repo_id=repo_id, - file_limit=8, - symbol_limit=12, - enable_deduplication=True + ) ) - # Format items - items = [] - for item in context_result.get("items", []): - items.append({ - "kind": item.get("kind", "file"), - "title": item.get("title", "Unknown"), - "summary": item.get("summary", ""), - "ref": item.get("ref", ""), - "extra": { - "lang": item.get("extra", {}).get("lang"), - "score": item.get("extra", {}).get("score", 0.0) - } - }) - - if ctx: - await ctx.info(f"Context pack built: {len(items)} items, {context_result.get('budget_used', 0)} tokens") - - return { - "success": True, - "items": items, - "budget_used": context_result.get("budget_used", 0), - "budget_limit": budget, - "stage": stage, - "repo_id": repo_id, - "category_counts": context_result.get("category_counts", {}) - } - - except Exception as e: - error_msg = f"Context pack generation failed: {str(e)}" - logger.error(error_msg) - if ctx: - await ctx.error(error_msg) - return { - "success": False, - "error": error_msg - } # =================================== # MCP Resources diff --git a/src/codebase_rag/services/code/__init__.py b/src/codebase_rag/services/code/__init__.py index 7c4bd70..ca08fed 100644 --- a/src/codebase_rag/services/code/__init__.py +++ b/src/codebase_rag/services/code/__init__.py @@ -1,7 +1,7 @@ """Code analysis and ingestion services.""" from codebase_rag.services.code.code_ingestor import CodeIngestor, get_code_ingestor -from codebase_rag.services.code.graph_service import Neo4jGraphService -from codebase_rag.services.code.pack_builder import PackBuilder +from codebase_rag.services.code.graph_service import Neo4jGraphService, graph_service +from codebase_rag.services.code.pack_builder import PackBuilder, pack_builder -__all__ = ["CodeIngestor", "get_code_ingestor", "Neo4jGraphService", "PackBuilder"] +__all__ = ["CodeIngestor", "get_code_ingestor", "Neo4jGraphService", "PackBuilder", "graph_service", "pack_builder"] diff --git a/src/codebase_rag/services/knowledge/__init__.py b/src/codebase_rag/services/knowledge/__init__.py index 82877c2..c1a909e 100644 --- a/src/codebase_rag/services/knowledge/__init__.py +++ b/src/codebase_rag/services/knowledge/__init__.py @@ -2,6 +2,7 @@ from codebase_rag.services.knowledge.neo4j_knowledge_service import ( Neo4jKnowledgeService, + neo4j_knowledge_service, ) -__all__ = ["Neo4jKnowledgeService"] +__all__ = ["Neo4jKnowledgeService", "neo4j_knowledge_service"] diff --git a/src/codebase_rag/services/memory/__init__.py b/src/codebase_rag/services/memory/__init__.py index 6caa001..c213027 100644 --- a/src/codebase_rag/services/memory/__init__.py +++ b/src/codebase_rag/services/memory/__init__.py @@ -1,6 +1,6 @@ """Memory services for conversation memory and extraction.""" -from codebase_rag.services.memory.memory_store import MemoryStore -from codebase_rag.services.memory.memory_extractor import MemoryExtractor +from codebase_rag.services.memory.memory_store import MemoryStore, memory_store +from codebase_rag.services.memory.memory_extractor import MemoryExtractor, memory_extractor -__all__ = ["MemoryStore", "MemoryExtractor"] +__all__ = ["MemoryStore", "MemoryExtractor", "memory_store", "memory_extractor"] diff --git a/src/codebase_rag/services/memory/memory_extractor.py b/src/codebase_rag/services/memory/memory_extractor.py index 86d5fba..a3e5efb 100644 --- a/src/codebase_rag/services/memory/memory_extractor.py +++ b/src/codebase_rag/services/memory/memory_extractor.py @@ -20,7 +20,7 @@ from llama_index.core import Settings from loguru import logger -from codebase_rag.services.memory_store import memory_store +from .memory_store import memory_store class MemoryExtractor: diff --git a/src/codebase_rag/services/sql/__init__.py b/src/codebase_rag/services/sql/__init__.py index f933900..5c8171e 100644 --- a/src/codebase_rag/services/sql/__init__.py +++ b/src/codebase_rag/services/sql/__init__.py @@ -1,9 +1,10 @@ """SQL parsing and schema analysis services.""" -from codebase_rag.services.sql.sql_parser import SQLParser +from codebase_rag.services.sql.sql_parser import SQLParser, sql_analyzer from codebase_rag.services.sql.sql_schema_parser import SQLSchemaParser from codebase_rag.services.sql.universal_sql_schema_parser import ( UniversalSQLSchemaParser, + parse_sql_schema_smart, ) -__all__ = ["SQLParser", "SQLSchemaParser", "UniversalSQLSchemaParser"] +__all__ = ["SQLParser", "SQLSchemaParser", "UniversalSQLSchemaParser", "sql_analyzer", "parse_sql_schema_smart"] diff --git a/src/codebase_rag/services/tasks/__init__.py b/src/codebase_rag/services/tasks/__init__.py index 981fd04..c2f8c9e 100644 --- a/src/codebase_rag/services/tasks/__init__.py +++ b/src/codebase_rag/services/tasks/__init__.py @@ -1,7 +1,7 @@ """Task queue and processing services.""" -from codebase_rag.services.tasks.task_queue import TaskQueue -from codebase_rag.services.tasks.task_storage import TaskStorage -from codebase_rag.services.tasks.task_processors import TaskProcessor +from codebase_rag.services.tasks.task_queue import TaskQueue, task_queue, TaskStatus +from codebase_rag.services.tasks.task_storage import TaskStorage, TaskType +from codebase_rag.services.tasks.task_processors import TaskProcessor, processor_registry -__all__ = ["TaskQueue", "TaskStorage", "TaskProcessor"] +__all__ = ["TaskQueue", "TaskStorage", "TaskProcessor", "task_queue", "TaskStatus", "TaskType", "processor_registry"] diff --git a/src/codebase_rag/services/utils/__init__.py b/src/codebase_rag/services/utils/__init__.py index 67799d2..6287d6f 100644 --- a/src/codebase_rag/services/utils/__init__.py +++ b/src/codebase_rag/services/utils/__init__.py @@ -1,7 +1,7 @@ """Utility services for git, ranking, and metrics.""" -from codebase_rag.services.utils.git_utils import GitUtils -from codebase_rag.services.utils.ranker import Ranker -from codebase_rag.services.utils.metrics import MetricsCollector +from codebase_rag.services.utils.git_utils import GitUtils, git_utils +from codebase_rag.services.utils.ranker import Ranker, ranker +from codebase_rag.services.utils.metrics import MetricsCollector, metrics_service -__all__ = ["GitUtils", "Ranker", "MetricsCollector"] +__all__ = ["GitUtils", "Ranker", "MetricsCollector", "git_utils", "ranker", "metrics_service"]