Add mock API testing infrastructure and monitoring dashboard

- Add mock Hive API server providing fake projects/tasks for real bzzz coordination
- Add comprehensive test suite with task simulator and coordination scenarios
- Add real-time monitoring dashboard (btop/nvtop style) for coordination activity
- Add antennae monitoring and logging infrastructure
- Add systemd configuration scripts and deployment tools
- Update pubsub message types for coordination requests and completion
- Add Docker support and cluster deployment scripts

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
anthonyrawlins
2025-07-14 11:30:34 +10:00
parent 87819b3c50
commit 605fb92ee7
25 changed files with 4562 additions and 1 deletions

409
test/task_simulator.go Normal file
View File

@@ -0,0 +1,409 @@
package test
import (
"context"
"encoding/json"
"fmt"
"math/rand"
"time"
"github.com/deepblackcloud/bzzz/pubsub"
)
// TaskSimulator generates realistic task scenarios for testing antennae coordination
type TaskSimulator struct {
pubsub *pubsub.PubSub
ctx context.Context
isRunning bool
repositories []MockRepository
scenarios []CoordinationScenario
}
// MockRepository represents a simulated repository with tasks
type MockRepository struct {
Owner string `json:"owner"`
Name string `json:"name"`
URL string `json:"url"`
Tasks []MockTask `json:"tasks"`
Dependencies []string `json:"dependencies"` // Other repos this depends on
}
// MockTask represents a simulated GitHub issue/task
type MockTask struct {
Number int `json:"number"`
Title string `json:"title"`
Description string `json:"description"`
Labels []string `json:"labels"`
Difficulty string `json:"difficulty"` // easy, medium, hard
TaskType string `json:"task_type"` // feature, bug, refactor, etc.
Dependencies []TaskDependency `json:"dependencies"`
EstimatedHours int `json:"estimated_hours"`
RequiredSkills []string `json:"required_skills"`
}
// TaskDependency represents a cross-repository task dependency
type TaskDependency struct {
Repository string `json:"repository"`
TaskNumber int `json:"task_number"`
DependencyType string `json:"dependency_type"` // api_contract, database_schema, config, security
}
// CoordinationScenario represents a test scenario for antennae coordination
type CoordinationScenario struct {
Name string `json:"name"`
Description string `json:"description"`
Repositories []string `json:"repositories"`
Tasks []ScenarioTask `json:"tasks"`
ExpectedCoordination []string `json:"expected_coordination"`
}
// ScenarioTask links tasks across repositories for coordination testing
type ScenarioTask struct {
Repository string `json:"repository"`
TaskNumber int `json:"task_number"`
Priority int `json:"priority"`
BlockedBy []ScenarioTask `json:"blocked_by"`
}
// NewTaskSimulator creates a new task simulator
func NewTaskSimulator(ps *pubsub.PubSub, ctx context.Context) *TaskSimulator {
sim := &TaskSimulator{
pubsub: ps,
ctx: ctx,
repositories: generateMockRepositories(),
scenarios: generateCoordinationScenarios(),
}
return sim
}
// Start begins the task simulation
func (ts *TaskSimulator) Start() {
if ts.isRunning {
return
}
ts.isRunning = true
fmt.Println("🎭 Starting Task Simulator for Antennae Testing")
// Start different simulation routines
go ts.simulateTaskAnnouncements()
go ts.simulateCoordinationScenarios()
go ts.simulateAgentResponses()
}
// Stop stops the task simulation
func (ts *TaskSimulator) Stop() {
ts.isRunning = false
fmt.Println("🛑 Task Simulator stopped")
}
// simulateTaskAnnouncements periodically announces available tasks
func (ts *TaskSimulator) simulateTaskAnnouncements() {
ticker := time.NewTicker(45 * time.Second)
defer ticker.Stop()
for ts.isRunning {
select {
case <-ts.ctx.Done():
return
case <-ticker.C:
ts.announceRandomTask()
}
}
}
// announceRandomTask announces a random task from the mock repositories
func (ts *TaskSimulator) announceRandomTask() {
if len(ts.repositories) == 0 {
return
}
repo := ts.repositories[rand.Intn(len(ts.repositories))]
if len(repo.Tasks) == 0 {
return
}
task := repo.Tasks[rand.Intn(len(repo.Tasks))]
announcement := map[string]interface{}{
"type": "task_available",
"repository": map[string]interface{}{
"owner": repo.Owner,
"name": repo.Name,
"url": repo.URL,
},
"task": task,
"announced_at": time.Now().Unix(),
"announced_by": "task_simulator",
}
fmt.Printf("📢 Announcing task: %s/#%d - %s\n", repo.Name, task.Number, task.Title)
if err := ts.pubsub.PublishBzzzMessage(pubsub.TaskAnnouncement, announcement); err != nil {
fmt.Printf("❌ Failed to announce task: %v\n", err)
}
}
// simulateCoordinationScenarios runs coordination test scenarios
func (ts *TaskSimulator) simulateCoordinationScenarios() {
ticker := time.NewTicker(2 * time.Minute)
defer ticker.Stop()
scenarioIndex := 0
for ts.isRunning {
select {
case <-ts.ctx.Done():
return
case <-ticker.C:
if len(ts.scenarios) > 0 {
scenario := ts.scenarios[scenarioIndex%len(ts.scenarios)]
ts.runCoordinationScenario(scenario)
scenarioIndex++
}
}
}
}
// runCoordinationScenario executes a specific coordination test scenario
func (ts *TaskSimulator) runCoordinationScenario(scenario CoordinationScenario) {
fmt.Printf("🎯 Running coordination scenario: %s\n", scenario.Name)
fmt.Printf(" Description: %s\n", scenario.Description)
// Announce the scenario start
scenarioStart := map[string]interface{}{
"type": "coordination_scenario_start",
"scenario": scenario,
"started_at": time.Now().Unix(),
}
if err := ts.pubsub.PublishAntennaeMessage(pubsub.CoordinationRequest, scenarioStart); err != nil {
fmt.Printf("❌ Failed to announce scenario start: %v\n", err)
return
}
// Announce each task in the scenario with dependencies
for _, task := range scenario.Tasks {
taskAnnouncement := map[string]interface{}{
"type": "scenario_task",
"scenario_name": scenario.Name,
"repository": task.Repository,
"task_number": task.TaskNumber,
"priority": task.Priority,
"blocked_by": task.BlockedBy,
"announced_at": time.Now().Unix(),
}
fmt.Printf(" 📋 Task: %s/#%d (Priority: %d)\n", task.Repository, task.TaskNumber, task.Priority)
if err := ts.pubsub.PublishBzzzMessage(pubsub.TaskAnnouncement, taskAnnouncement); err != nil {
fmt.Printf("❌ Failed to announce scenario task: %v\n", err)
}
time.Sleep(2 * time.Second) // Stagger announcements
}
}
// simulateAgentResponses simulates agent responses to create coordination activity
func (ts *TaskSimulator) simulateAgentResponses() {
ticker := time.NewTicker(30 * time.Second)
defer ticker.Stop()
responses := []string{
"I can handle this frontend task",
"This requires database schema changes first",
"Need to coordinate with API team",
"This conflicts with my current work",
"I have the required Python skills",
"This should be done after the security review",
"I can start this immediately",
"This needs clarification on requirements",
}
for ts.isRunning {
select {
case <-ts.ctx.Done():
return
case <-ticker.C:
if rand.Float32() < 0.7 { // 70% chance of response
response := responses[rand.Intn(len(responses))]
ts.simulateAgentResponse(response)
}
}
}
}
// simulateAgentResponse simulates an agent response for coordination
func (ts *TaskSimulator) simulateAgentResponse(response string) {
agentResponse := map[string]interface{}{
"type": "agent_response",
"agent_id": fmt.Sprintf("sim-agent-%d", rand.Intn(3)+1),
"message": response,
"timestamp": time.Now().Unix(),
"confidence": rand.Float32()*0.4 + 0.6, // 0.6-1.0 confidence
}
fmt.Printf("🤖 Simulated agent response: %s\n", response)
if err := ts.pubsub.PublishAntennaeMessage(pubsub.MetaDiscussion, agentResponse); err != nil {
fmt.Printf("❌ Failed to publish agent response: %v\n", err)
}
}
// generateMockRepositories creates realistic mock repositories for testing
func generateMockRepositories() []MockRepository {
return []MockRepository{
{
Owner: "deepblackcloud",
Name: "hive",
URL: "https://github.com/deepblackcloud/hive",
Dependencies: []string{"bzzz", "distributed-ai-dev"},
Tasks: []MockTask{
{
Number: 15,
Title: "Add WebSocket support for real-time coordination",
Description: "Implement WebSocket endpoints for real-time agent coordination",
Labels: []string{"bzzz-task", "feature", "realtime"},
Difficulty: "medium",
TaskType: "feature",
EstimatedHours: 8,
RequiredSkills: []string{"websockets", "python", "fastapi"},
Dependencies: []TaskDependency{
{Repository: "bzzz", TaskNumber: 23, DependencyType: "api_contract"},
},
},
{
Number: 16,
Title: "Implement agent authentication system",
Description: "Add secure authentication for bzzz agents",
Labels: []string{"bzzz-task", "security", "auth"},
Difficulty: "hard",
TaskType: "security",
EstimatedHours: 12,
RequiredSkills: []string{"security", "jwt", "python"},
},
},
},
{
Owner: "deepblackcloud",
Name: "bzzz",
URL: "https://github.com/deepblackcloud/bzzz",
Dependencies: []string{"hive"},
Tasks: []MockTask{
{
Number: 23,
Title: "Define coordination API contract",
Description: "Standardize API contract for cross-repository coordination",
Labels: []string{"bzzz-task", "api", "coordination"},
Difficulty: "medium",
TaskType: "api_design",
EstimatedHours: 6,
RequiredSkills: []string{"api_design", "go", "documentation"},
},
{
Number: 24,
Title: "Implement dependency detection algorithm",
Description: "Auto-detect task dependencies across repositories",
Labels: []string{"bzzz-task", "algorithm", "coordination"},
Difficulty: "hard",
TaskType: "feature",
EstimatedHours: 16,
RequiredSkills: []string{"algorithms", "go", "graph_theory"},
},
},
},
{
Owner: "deepblackcloud",
Name: "distributed-ai-dev",
URL: "https://github.com/deepblackcloud/distributed-ai-dev",
Dependencies: []string{},
Tasks: []MockTask{
{
Number: 8,
Title: "Add support for bzzz coordination",
Description: "Integrate with bzzz P2P coordination system",
Labels: []string{"bzzz-task", "integration", "p2p"},
Difficulty: "medium",
TaskType: "integration",
EstimatedHours: 10,
RequiredSkills: []string{"p2p", "python", "integration"},
Dependencies: []TaskDependency{
{Repository: "bzzz", TaskNumber: 23, DependencyType: "api_contract"},
{Repository: "hive", TaskNumber: 16, DependencyType: "security"},
},
},
},
},
}
}
// generateCoordinationScenarios creates test scenarios for coordination
func generateCoordinationScenarios() []CoordinationScenario {
return []CoordinationScenario{
{
Name: "Cross-Repository API Integration",
Description: "Testing coordination when multiple repos need to implement a shared API",
Repositories: []string{"hive", "bzzz", "distributed-ai-dev"},
Tasks: []ScenarioTask{
{Repository: "bzzz", TaskNumber: 23, Priority: 1, BlockedBy: []ScenarioTask{}},
{Repository: "hive", TaskNumber: 15, Priority: 2, BlockedBy: []ScenarioTask{{Repository: "bzzz", TaskNumber: 23}}},
{Repository: "distributed-ai-dev", TaskNumber: 8, Priority: 3, BlockedBy: []ScenarioTask{{Repository: "bzzz", TaskNumber: 23}, {Repository: "hive", TaskNumber: 16}}},
},
ExpectedCoordination: []string{
"API contract should be defined first",
"Authentication system blocks integration work",
"WebSocket implementation depends on API contract",
},
},
{
Name: "Security-First Development",
Description: "Testing coordination when security requirements block other work",
Repositories: []string{"hive", "distributed-ai-dev"},
Tasks: []ScenarioTask{
{Repository: "hive", TaskNumber: 16, Priority: 1, BlockedBy: []ScenarioTask{}},
{Repository: "distributed-ai-dev", TaskNumber: 8, Priority: 2, BlockedBy: []ScenarioTask{{Repository: "hive", TaskNumber: 16}}},
},
ExpectedCoordination: []string{
"Security authentication must be completed first",
"Integration work blocked until auth system ready",
},
},
{
Name: "Parallel Development Conflict",
Description: "Testing coordination when agents might work on conflicting tasks",
Repositories: []string{"hive", "bzzz"},
Tasks: []ScenarioTask{
{Repository: "hive", TaskNumber: 15, Priority: 1, BlockedBy: []ScenarioTask{}},
{Repository: "bzzz", TaskNumber: 24, Priority: 1, BlockedBy: []ScenarioTask{}},
},
ExpectedCoordination: []string{
"Both tasks modify coordination logic",
"Need to coordinate implementation approach",
},
},
}
}
// GetMockRepositories returns the mock repositories for external use
func (ts *TaskSimulator) GetMockRepositories() []MockRepository {
return ts.repositories
}
// GetScenarios returns the coordination scenarios for external use
func (ts *TaskSimulator) GetScenarios() []CoordinationScenario {
return ts.scenarios
}
// PrintStatus prints the current simulation status
func (ts *TaskSimulator) PrintStatus() {
fmt.Printf("🎭 Task Simulator Status:\n")
fmt.Printf(" Running: %v\n", ts.isRunning)
fmt.Printf(" Mock Repositories: %d\n", len(ts.repositories))
fmt.Printf(" Coordination Scenarios: %d\n", len(ts.scenarios))
totalTasks := 0
for _, repo := range ts.repositories {
totalTasks += len(repo.Tasks)
}
fmt.Printf(" Total Mock Tasks: %d\n", totalTasks)
}