83 lines
2.7 KiB
Python
83 lines
2.7 KiB
Python
from typing import Any
|
|
|
|
from strix.agents.base_agent import BaseAgent
|
|
from strix.llm.config import LLMConfig
|
|
|
|
|
|
class StrixAgent(BaseAgent):
|
|
max_iterations = 300
|
|
|
|
def __init__(self, config: dict[str, Any]):
|
|
default_modules = []
|
|
|
|
state = config.get("state")
|
|
if state is None or (hasattr(state, "parent_id") and state.parent_id is None):
|
|
default_modules = ["root_agent"]
|
|
|
|
self.default_llm_config = LLMConfig(prompt_modules=default_modules)
|
|
|
|
super().__init__(config)
|
|
|
|
async def execute_scan(self, scan_config: dict[str, Any]) -> dict[str, Any]:
|
|
user_instructions = scan_config.get("user_instructions", "")
|
|
targets = scan_config.get("targets", [])
|
|
|
|
repositories = []
|
|
local_code = []
|
|
urls = []
|
|
|
|
for target in targets:
|
|
target_type = target["type"]
|
|
details = target["details"]
|
|
workspace_subdir = details.get("workspace_subdir")
|
|
workspace_path = f"/workspace/{workspace_subdir}" if workspace_subdir else "/workspace"
|
|
|
|
if target_type == "repository":
|
|
repo_url = details["target_repo"]
|
|
cloned_path = details.get("cloned_repo_path")
|
|
repositories.append(
|
|
{
|
|
"url": repo_url,
|
|
"workspace_path": workspace_path if cloned_path else None,
|
|
}
|
|
)
|
|
|
|
elif target_type == "local_code":
|
|
original_path = details.get("target_path", "unknown")
|
|
local_code.append(
|
|
{
|
|
"path": original_path,
|
|
"workspace_path": workspace_path,
|
|
}
|
|
)
|
|
|
|
elif target_type == "web_application":
|
|
urls.append(details["target_url"])
|
|
|
|
task_parts = []
|
|
|
|
if repositories:
|
|
task_parts.append("\n\nRepositories:")
|
|
for repo in repositories:
|
|
if repo["workspace_path"]:
|
|
task_parts.append(f"- {repo['url']} (available at: {repo['workspace_path']})")
|
|
else:
|
|
task_parts.append(f"- {repo['url']}")
|
|
|
|
if local_code:
|
|
task_parts.append("\n\nLocal Codebases:")
|
|
task_parts.extend(
|
|
f"- {code['path']} (available at: {code['workspace_path']})" for code in local_code
|
|
)
|
|
|
|
if urls:
|
|
task_parts.append("\n\nURLs:")
|
|
task_parts.extend(f"- {url}" for url in urls)
|
|
|
|
task_description = " ".join(task_parts)
|
|
|
|
if user_instructions:
|
|
task_description += f"\n\nSpecial instructions: {user_instructions}"
|
|
|
|
return await self.agent_loop(task=task_description)
|