feat(hub): add hub integration and rename project to FuzzForge AI

This commit is contained in:
AFredefon
2026-02-25 23:12:42 +01:00
parent 04c8383739
commit f3899279d5
33 changed files with 1904 additions and 73 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
# FuzzForge Runner
Direct execution engine for FuzzForge OSS. Provides simplified module and workflow execution without requiring Temporal or external infrastructure.
Direct execution engine for FuzzForge AI. Provides simplified module and workflow execution without requiring Temporal or external infrastructure.
## Overview
+1 -1
View File
@@ -1,7 +1,7 @@
[project]
name = "fuzzforge-runner"
version = "0.0.1"
description = "FuzzForge Runner - Direct execution engine for FuzzForge OSS."
description = "FuzzForge Runner - Direct execution engine for FuzzForge AI."
authors = []
readme = "README.md"
requires-python = ">=3.14"
@@ -1,4 +1,4 @@
"""FuzzForge Runner - Direct execution engine for FuzzForge OSS."""
"""FuzzForge Runner - Direct execution engine for FuzzForge AI."""
from fuzzforge_runner.runner import Runner
from fuzzforge_runner.settings import Settings
@@ -741,6 +741,27 @@ class ModuleExecutor:
engine = self._get_engine()
return engine.read_file_from_container(container_id, output_file)
def read_module_output_incremental(
self,
container_id: str,
start_line: int = 1,
output_file: str = f"{SANDBOX_OUTPUT_DIRECTORY}/stream.jsonl",
) -> str:
"""Read new lines from an output file inside a running module container.
Uses ``tail -n +{start_line}`` so only lines appended since the last
read are returned. Callers should track the number of lines already
consumed and pass ``start_line = previous_count + 1`` on the next call.
:param container_id: The container identifier.
:param start_line: 1-based line number to start reading from.
:param output_file: Path to output file inside container.
:returns: New file contents from *start_line* onwards (may be empty).
"""
engine = self._get_engine()
return engine.tail_file_from_container(container_id, output_file, start_line=start_line)
def get_module_status(self, container_id: str) -> str:
"""Get the status of a running module container.
@@ -1,6 +1,6 @@
"""FuzzForge Runner - Main runner interface.
This module provides the high-level interface for FuzzForge OSS,
This module provides the high-level interface for FuzzForge AI,
coordinating module execution, workflow orchestration, and storage.
"""
@@ -71,6 +71,29 @@ class RegistrySettings(BaseModel):
password: str | None = None
class HubSettings(BaseModel):
"""MCP Hub configuration for external tool servers.
Controls the hub that bridges FuzzForge with external MCP servers
(e.g., mcp-security-hub). When enabled, AI agents can discover
and execute tools from registered MCP servers.
Configure via environment variables:
``FUZZFORGE_HUB__ENABLED=true``
``FUZZFORGE_HUB__CONFIG_PATH=/path/to/hub-config.json``
``FUZZFORGE_HUB__TIMEOUT=300``
"""
#: Whether the MCP hub is enabled.
enabled: bool = Field(default=True)
#: Path to the hub configuration JSON file.
config_path: Path = Field(default=Path.home() / ".fuzzforge" / "hub-config.json")
#: Default timeout in seconds for hub tool execution.
timeout: int = Field(default=300)
class Settings(BaseSettings):
"""FuzzForge Runner settings.
@@ -102,6 +125,9 @@ class Settings(BaseSettings):
#: Container registry settings.
registry: RegistrySettings = Field(default_factory=RegistrySettings)
#: MCP Hub settings.
hub: HubSettings = Field(default_factory=HubSettings)
#: Path to modules directory (for development/local builds).
modules_path: Path = Field(default=Path.home() / ".fuzzforge" / "modules")
@@ -39,7 +39,7 @@ def get_logger() -> BoundLogger:
class LocalStorage:
"""Local filesystem storage backend for FuzzForge OSS.
"""Local filesystem storage backend for FuzzForge AI.
Provides lightweight storage for execution results while using
direct source mounting (no copying) for input assets.