mirror of
https://github.com/FuzzingLabs/fuzzforge_ai.git
synced 2026-08-27 20:10:27 +02:00
Swap knowledge listing to MCP dataset lookup
This commit is contained in:
@@ -438,105 +438,69 @@ class FuzzForgeExecutor:
|
|||||||
return f"Error searching project knowledge: {e}"
|
return f"Error searching project knowledge: {e}"
|
||||||
|
|
||||||
async def list_project_knowledge() -> str:
|
async def list_project_knowledge() -> str:
|
||||||
"""List available knowledge and datasets in the project's knowledge graph"""
|
"""List available knowledge and datasets in the project's knowledge graph."""
|
||||||
try:
|
try:
|
||||||
import logging
|
project_name = "Unknown"
|
||||||
logger = logging.getLogger(__name__)
|
datasets: List[str] = []
|
||||||
|
preview: List[str] = []
|
||||||
# Use shared cognee service
|
|
||||||
cognee_service = await self._get_cognee_service()
|
if self.project_config:
|
||||||
config = cognee_service.config
|
context = self.project_config.get_project_context()
|
||||||
|
project_name = context.get("project_name", project_name)
|
||||||
project_context = config.get_project_context()
|
|
||||||
result = f"Available knowledge in project {project_context['project_name']}:\n\n"
|
if self.memory_manager and getattr(self.memory_manager, "cognee_tools", None):
|
||||||
|
data = await self.memory_manager.cognee_tools.list_datasets()
|
||||||
# Use direct cognee import like ingest command does
|
if isinstance(data, dict):
|
||||||
try:
|
for entries in data.values():
|
||||||
import cognee
|
if isinstance(entries, list):
|
||||||
from cognee.modules.search.types import SearchType
|
for entry in entries:
|
||||||
|
if isinstance(entry, dict):
|
||||||
# Set up user context like ingest command
|
name = entry.get("name") or entry.get("dataset")
|
||||||
try:
|
if name:
|
||||||
from cognee.modules.users.methods import create_user, get_user
|
datasets.append(name)
|
||||||
|
elif isinstance(data, list):
|
||||||
user_email = f"project_{project_context['project_id']}@fuzzforge.example"
|
for entry in data:
|
||||||
user_tenant = project_context['tenant_id']
|
if isinstance(entry, dict):
|
||||||
|
name = entry.get("name")
|
||||||
try:
|
if name:
|
||||||
user = await get_user(user_email)
|
datasets.append(name)
|
||||||
logger.info(f"Using existing user: {user_email}")
|
|
||||||
except:
|
|
||||||
try:
|
|
||||||
user = await create_user(user_email, user_tenant)
|
|
||||||
logger.info(f"Created new user: {user_email}")
|
|
||||||
except:
|
|
||||||
user = None
|
|
||||||
|
|
||||||
if user:
|
|
||||||
cognee.set_user(user)
|
|
||||||
except Exception as e:
|
|
||||||
logger.warning(f"User context setup failed: {e}")
|
|
||||||
|
|
||||||
# List available datasets
|
|
||||||
datasets = await cognee.datasets.list_datasets()
|
|
||||||
logger.info(f"Found datasets: {datasets}")
|
|
||||||
|
|
||||||
if datasets and len(datasets) > 0:
|
|
||||||
dataset_name = f"{project_context['project_name']}_codebase"
|
|
||||||
|
|
||||||
# Try to search for some basic info to show data exists
|
|
||||||
try:
|
|
||||||
sample_results = await cognee.search(
|
|
||||||
query_type=SearchType.INSIGHTS,
|
|
||||||
query_text="project overview files functions",
|
|
||||||
datasets=[dataset_name]
|
|
||||||
)
|
|
||||||
|
|
||||||
if sample_results:
|
|
||||||
data = [f"Dataset '{dataset_name}' contains {len(sample_results)} insights"] + sample_results[:3]
|
|
||||||
else:
|
|
||||||
data = [f"Dataset '{dataset_name}' exists but no insights found"]
|
|
||||||
except Exception as search_e:
|
|
||||||
logger.info(f"Search failed: {search_e}")
|
|
||||||
data = [f"Dataset '{dataset_name}' exists in: {[str(ds) for ds in datasets]}"]
|
|
||||||
else:
|
|
||||||
data = None
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
data = None
|
|
||||||
logger.warning(f"Error accessing cognee: {e}")
|
|
||||||
|
|
||||||
if not data:
|
|
||||||
result += "No data available in knowledge graph\n"
|
|
||||||
result += "Use 'fuzzforge ingest' to ingest code, documentation, or other project files\n"
|
|
||||||
else:
|
else:
|
||||||
# Extract datasets from data
|
cognee_service = await self._get_cognee_service()
|
||||||
datasets = set()
|
cfg = cognee_service.config
|
||||||
if isinstance(data, list):
|
datasets.append(cfg.get_project_dataset_name())
|
||||||
for item in data:
|
|
||||||
if isinstance(item, dict) and 'dataset_name' in item:
|
if datasets and self.memory_manager and getattr(self.memory_manager, "cognee_tools", None):
|
||||||
datasets.add(item['dataset_name'])
|
dataset = datasets[0]
|
||||||
|
sample = await self.memory_manager.search_knowledge_graph(
|
||||||
if datasets:
|
query="project overview",
|
||||||
result += f"Available Datasets ({len(datasets)}):\n"
|
search_type="INSIGHTS",
|
||||||
for i, dataset in enumerate(sorted(datasets), 1):
|
dataset=dataset,
|
||||||
result += f" {i}. {dataset}\n"
|
)
|
||||||
result += "\n"
|
if isinstance(sample, dict):
|
||||||
|
results = sample.get("results")
|
||||||
result += f"Total data items: {len(data)}\n"
|
if isinstance(results, list):
|
||||||
|
for item in results[:3]:
|
||||||
# Show sample of available data
|
preview.append(json.dumps(item)[:120])
|
||||||
result += "\nSample content:\n"
|
|
||||||
for i, item in enumerate(data[:3], 1):
|
if not datasets:
|
||||||
if isinstance(item, dict):
|
return (
|
||||||
item_str = str(item)[:100] + "..." if len(str(item)) > 100 else str(item)
|
f"Available knowledge in project {project_name}:\n\n"
|
||||||
result += f" {i}. {item_str}\n"
|
"No data available in knowledge graph\n"
|
||||||
else:
|
"Use 'fuzzforge ingest' to ingest code, documentation, or other project files"
|
||||||
item_str = str(item)[:100] + "..." if len(str(item)) > 100 else str(item)
|
)
|
||||||
result += f" {i}. {item_str}\n"
|
|
||||||
|
lines = [f"Available knowledge in project {project_name}:\n\n"]
|
||||||
return result
|
lines.append(f"Available Datasets ({len(datasets)}):")
|
||||||
|
for idx, name in enumerate(sorted(datasets), 1):
|
||||||
|
lines.append(f" {idx}. {name}")
|
||||||
|
|
||||||
|
if preview:
|
||||||
|
lines.append("\nSample content:")
|
||||||
|
for idx, snippet in enumerate(preview, 1):
|
||||||
|
lines.append(f" {idx}. {snippet}")
|
||||||
|
|
||||||
|
return "\n".join(lines)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return f"Error listing knowledge: {e}"
|
return f"Error listing knowledge: {e}"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user