Files
bzzz/examples/slurp_integration_example.go
anthonyrawlins d96c931a29 Resolve import cycles and migrate to chorus.services module path
This comprehensive refactoring addresses critical architectural issues:

IMPORT CYCLE RESOLUTION:
• pkg/crypto ↔ pkg/slurp/roles: Created pkg/security/access_levels.go
• pkg/ucxl → pkg/dht: Created pkg/storage/interfaces.go
• pkg/slurp/leader → pkg/election → pkg/slurp/storage: Moved types to pkg/election/interfaces.go

MODULE PATH MIGRATION:
• Changed from github.com/anthonyrawlins/bzzz to chorus.services/bzzz
• Updated all import statements across 115+ files
• Maintains compatibility while removing personal GitHub account dependency

TYPE SYSTEM IMPROVEMENTS:
• Resolved duplicate type declarations in crypto package
• Added missing type definitions (RoleStatus, TimeRestrictions, KeyStatus, KeyRotationResult)
• Proper interface segregation to prevent future cycles

ARCHITECTURAL BENEFITS:
• Build now progresses past structural issues to normal dependency resolution
• Cleaner separation of concerns between packages
• Eliminates circular dependencies that prevented compilation
• Establishes foundation for scalable codebase growth

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-17 10:04:25 +10:00

342 lines
11 KiB
Go

package main
import (
"context"
"fmt"
"log"
"time"
"chorus.services/bzzz/pkg/config"
"chorus.services/bzzz/pkg/coordination"
"chorus.services/bzzz/pkg/integration"
"chorus.services/bzzz/pubsub"
"github.com/libp2p/go-libp2p"
"github.com/libp2p/go-libp2p/core/host"
)
// This example demonstrates how to integrate SLURP event system with BZZZ HMMM discussions
func main() {
fmt.Println("🚀 SLURP Integration Example")
// Create context
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
// Example 1: Basic SLURP Configuration
basicSlurpIntegrationExample(ctx)
// Example 2: Advanced Configuration with Project Mappings
advancedSlurpConfigurationExample()
// Example 3: Manual HMMM Discussion Processing
manualDiscussionProcesssingExample(ctx)
// Example 4: Real-time Integration Setup
realtimeIntegrationExample(ctx)
fmt.Println("✅ All examples completed successfully")
}
// Example 1: Basic SLURP integration setup
func basicSlurpIntegrationExample(ctx context.Context) {
fmt.Println("\n📋 Example 1: Basic SLURP Integration Setup")
// Create basic SLURP configuration
slurpConfig := config.SlurpConfig{
Enabled: true,
BaseURL: "http://localhost:8080",
APIKey: "your-api-key-here",
Timeout: 30 * time.Second,
RetryCount: 3,
RetryDelay: 5 * time.Second,
EventGeneration: config.EventGenerationConfig{
MinConsensusStrength: 0.7,
MinParticipants: 2,
RequireUnanimity: false,
MaxDiscussionDuration: 30 * time.Minute,
MinDiscussionDuration: 1 * time.Minute,
EnabledEventTypes: []string{
"announcement", "warning", "blocker", "approval",
"priority_change", "access_update", "structural_change",
},
},
DefaultEventSettings: config.DefaultEventConfig{
DefaultSeverity: 5,
DefaultCreatedBy: "hmmm-consensus",
DefaultTags: []string{"hmmm-generated", "automated"},
},
}
fmt.Printf("✅ SLURP config created with %d enabled event types\n",
len(slurpConfig.EventGeneration.EnabledEventTypes))
// Note: In a real application, you would create the integrator here:
// integrator, err := integration.NewSlurpEventIntegrator(ctx, slurpConfig, pubsubInstance)
fmt.Println("📝 Note: Create integrator with actual PubSub instance in real usage")
}
// Example 2: Advanced configuration with project-specific mappings
func advancedSlurpConfigurationExample() {
fmt.Println("\n📋 Example 2: Advanced SLURP Configuration")
// Create advanced configuration with project mappings
slurpConfig := config.GetDefaultSlurpConfig()
slurpConfig.Enabled = true
slurpConfig.BaseURL = "https://slurp.example.com"
// Add project-specific mappings
slurpConfig.ProjectMappings = map[string]config.ProjectEventMapping{
"/projects/frontend": {
ProjectPath: "/projects/frontend",
CustomEventTypes: map[string]string{
"ui_change": "structural_change",
"performance": "warning",
"accessibility": "priority_change",
},
SeverityOverrides: map[string]int{
"blocker": 9, // Higher severity for frontend blockers
"warning": 6, // Higher severity for frontend warnings
},
AdditionalMetadata: map[string]interface{}{
"team": "frontend",
"impact_area": "user_experience",
},
EventFilters: []config.EventFilter{
{
Name: "critical_ui_filter",
Conditions: map[string]string{
"content_contains": "critical",
"event_type": "structural_change",
},
Action: "modify",
Modifications: map[string]string{
"severity": "10",
"tag": "critical-ui",
},
},
},
},
"/projects/backend": {
ProjectPath: "/projects/backend",
CustomEventTypes: map[string]string{
"api_change": "structural_change",
"security": "blocker",
"performance": "warning",
},
SeverityOverrides: map[string]int{
"security": 10, // Maximum severity for security issues
},
AdditionalMetadata: map[string]interface{}{
"team": "backend",
"impact_area": "system_stability",
},
},
}
// Configure severity rules
slurpConfig.EventGeneration.SeverityRules.UrgencyKeywords = append(
slurpConfig.EventGeneration.SeverityRules.UrgencyKeywords,
"security", "vulnerability", "exploit", "breach",
)
slurpConfig.EventGeneration.SeverityRules.UrgencyBoost = 3
fmt.Printf("✅ Advanced config created with %d project mappings\n",
len(slurpConfig.ProjectMappings))
fmt.Printf("✅ Urgency keywords: %v\n",
slurpConfig.EventGeneration.SeverityRules.UrgencyKeywords)
}
// Example 3: Manual HMMM discussion processing
func manualDiscussionProcesssingExample(ctx context.Context) {
fmt.Println("\n📋 Example 3: Manual HMMM Discussion Processing")
// Create a sample HMMM discussion context
discussion := integration.HmmmDiscussionContext{
DiscussionID: "discussion-123",
SessionID: "session-456",
Participants: []string{"agent-frontend-01", "agent-backend-02", "agent-qa-03"},
StartTime: time.Now().Add(-10 * time.Minute),
EndTime: time.Now(),
ConsensusReached: true,
ConsensusStrength: 0.85,
OutcomeType: "Frontend team approves migration to React 18",
ProjectPath: "/projects/frontend",
Messages: []integration.HmmmMessage{
{
From: "agent-frontend-01",
Content: "I propose we migrate to React 18 for better performance",
Type: "proposal",
Timestamp: time.Now().Add(-8 * time.Minute),
},
{
From: "agent-backend-02",
Content: "That sounds good, it should improve our bundle size",
Type: "agreement",
Timestamp: time.Now().Add(-6 * time.Minute),
},
{
From: "agent-qa-03",
Content: "Approved from QA perspective, tests are compatible",
Type: "approval",
Timestamp: time.Now().Add(-3 * time.Minute),
},
},
RelatedTasks: []string{"TASK-123", "TASK-456"},
Metadata: map[string]interface{}{
"migration_type": "framework_upgrade",
"risk_level": "low",
"impact": "high",
},
}
fmt.Printf("✅ Sample discussion created:\n")
fmt.Printf(" - ID: %s\n", discussion.DiscussionID)
fmt.Printf(" - Participants: %d\n", len(discussion.Participants))
fmt.Printf(" - Messages: %d\n", len(discussion.Messages))
fmt.Printf(" - Consensus: %.1f%%\n", discussion.ConsensusStrength*100)
fmt.Printf(" - Outcome: %s\n", discussion.OutcomeType)
// Note: In real usage, you would process this with:
// err := integrator.ProcessHmmmDiscussion(ctx, discussion)
fmt.Println("📝 Note: Process with actual SlurpEventIntegrator in real usage")
}
// Example 4: Real-time integration setup with meta coordinator
func realtimeIntegrationExample(ctx context.Context) {
fmt.Println("\n📋 Example 4: Real-time Integration Setup")
// This example shows how to set up the complete integration
// In a real application, you would use actual network setup
fmt.Println("🔧 Setting up libp2p host...")
// Create a basic libp2p host (simplified for example)
host, err := libp2p.New(
libp2p.ListenAddrStrings("/ip4/127.0.0.1/tcp/0"),
)
if err != nil {
log.Printf("❌ Failed to create host: %v", err)
return
}
defer host.Close()
fmt.Printf("✅ Host created with ID: %s\n", host.ID().ShortString())
// Create PubSub system
fmt.Println("🔧 Setting up PubSub system...")
ps, err := pubsub.NewPubSub(ctx, host, "bzzz/coordination/v1", "hmmm/meta-discussion/v1")
if err != nil {
log.Printf("❌ Failed to create pubsub: %v", err)
return
}
defer ps.Close()
fmt.Println("✅ PubSub system initialized")
// Create SLURP configuration
slurpConfig := config.GetDefaultSlurpConfig()
slurpConfig.Enabled = true
slurpConfig.BaseURL = "http://localhost:8080"
// Note: In real usage, you would create the integrator:
// integrator, err := integration.NewSlurpEventIntegrator(ctx, slurpConfig, ps)
// if err != nil {
// log.Printf("❌ Failed to create SLURP integrator: %v", err)
// return
// }
// defer integrator.Close()
// Create meta coordinator
fmt.Println("🔧 Setting up Meta Coordinator...")
metaCoordinator := coordination.NewMetaCoordinator(ctx, ps)
// Note: In real usage, you would attach the integrator:
// metaCoordinator.SetSlurpIntegrator(integrator)
fmt.Println("✅ Meta Coordinator initialized with SLURP integration")
// Demonstrate event publishing
fmt.Println("🔧 Publishing sample SLURP integration events...")
// Publish a sample SLURP event generation notification
err = ps.PublishSlurpEventGenerated(map[string]interface{}{
"discussion_id": "sample-discussion-123",
"event_type": "approval",
"participants": []string{"agent-01", "agent-02"},
"consensus": 0.9,
"timestamp": time.Now(),
})
if err != nil {
log.Printf("❌ Failed to publish SLURP event: %v", err)
return
}
// Publish a SLURP context update
err = ps.PublishSlurpContextUpdate(map[string]interface{}{
"context_type": "project_update",
"project_path": "/projects/example",
"update_type": "event_generated",
"timestamp": time.Now(),
})
if err != nil {
log.Printf("❌ Failed to publish context update: %v", err)
return
}
fmt.Println("✅ Sample events published successfully")
// Let the system run for a short time to process messages
fmt.Println("⏳ Running system for 5 seconds...")
time.Sleep(5 * time.Second)
fmt.Println("✅ Real-time integration example completed")
}
// Utility function to demonstrate SLURP event mapping
func demonstrateEventMapping() {
fmt.Println("\n📋 Event Mapping Demonstration")
mapping := config.GetHmmmToSlurpMapping()
fmt.Println("🗺️ HMMM to SLURP Event Type Mappings:")
fmt.Printf(" - Consensus Approval → %s\n", mapping.ConsensusApproval)
fmt.Printf(" - Risk Identified → %s\n", mapping.RiskIdentified)
fmt.Printf(" - Critical Blocker → %s\n", mapping.CriticalBlocker)
fmt.Printf(" - Priority Change → %s\n", mapping.PriorityChange)
fmt.Printf(" - Access Request → %s\n", mapping.AccessRequest)
fmt.Printf(" - Architecture Decision → %s\n", mapping.ArchitectureDecision)
fmt.Printf(" - Information Share → %s\n", mapping.InformationShare)
fmt.Println("\n🔤 Keyword Mappings:")
fmt.Printf(" - Approval Keywords: %v\n", mapping.ApprovalKeywords)
fmt.Printf(" - Warning Keywords: %v\n", mapping.WarningKeywords)
fmt.Printf(" - Blocker Keywords: %v\n", mapping.BlockerKeywords)
}
// Utility function to show configuration validation
func demonstrateConfigValidation() {
fmt.Println("\n📋 Configuration Validation")
// Valid configuration
validConfig := config.GetDefaultSlurpConfig()
validConfig.Enabled = true
validConfig.BaseURL = "https://slurp.example.com"
if err := config.ValidateSlurpConfig(validConfig); err != nil {
fmt.Printf("❌ Valid config failed validation: %v\n", err)
} else {
fmt.Println("✅ Valid configuration passed validation")
}
// Invalid configuration
invalidConfig := config.GetDefaultSlurpConfig()
invalidConfig.Enabled = true
invalidConfig.BaseURL = "" // Missing required field
if err := config.ValidateSlurpConfig(invalidConfig); err != nil {
fmt.Printf("✅ Invalid config correctly failed validation: %v\n", err)
} else {
fmt.Println("❌ Invalid config incorrectly passed validation")
}
}