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>
188 lines
5.1 KiB
Go
188 lines
5.1 KiB
Go
package config
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"time"
|
|
)
|
|
|
|
// DefaultConfigPaths returns the default locations to search for config files
|
|
func DefaultConfigPaths() []string {
|
|
homeDir, _ := os.UserHomeDir()
|
|
|
|
return []string{
|
|
"./bzzz.yaml",
|
|
"./config/bzzz.yaml",
|
|
filepath.Join(homeDir, ".config", "bzzz", "config.yaml"),
|
|
"/etc/bzzz/config.yaml",
|
|
}
|
|
}
|
|
|
|
// GetNodeSpecificDefaults returns configuration defaults based on the node
|
|
func GetNodeSpecificDefaults(nodeID string) *Config {
|
|
config := getDefaultConfig()
|
|
|
|
// Set node-specific agent ID
|
|
config.Agent.ID = nodeID
|
|
|
|
// Set node-specific capabilities and models based on known cluster setup
|
|
switch {
|
|
case nodeID == "walnut" || containsString(nodeID, "walnut"):
|
|
config.Agent.Capabilities = []string{"task-coordination", "meta-discussion", "ollama-reasoning", "code-generation"}
|
|
config.Agent.Models = []string{"starcoder2:15b", "deepseek-coder-v2", "qwen3:14b", "phi3"}
|
|
config.Agent.Specialization = "code_generation"
|
|
|
|
case nodeID == "ironwood" || containsString(nodeID, "ironwood"):
|
|
config.Agent.Capabilities = []string{"task-coordination", "meta-discussion", "ollama-reasoning", "advanced-reasoning"}
|
|
config.Agent.Models = []string{"phi4:14b", "phi4-reasoning:14b", "gemma3:12b", "devstral"}
|
|
config.Agent.Specialization = "advanced_reasoning"
|
|
|
|
case nodeID == "acacia" || containsString(nodeID, "acacia"):
|
|
config.Agent.Capabilities = []string{"task-coordination", "meta-discussion", "ollama-reasoning", "code-analysis"}
|
|
config.Agent.Models = []string{"qwen2.5-coder", "deepseek-r1", "codellama", "llava"}
|
|
config.Agent.Specialization = "code_analysis"
|
|
|
|
default:
|
|
// Generic defaults for unknown nodes
|
|
config.Agent.Capabilities = []string{"task-coordination", "meta-discussion", "general"}
|
|
config.Agent.Models = []string{"phi3", "llama3.1"}
|
|
config.Agent.Specialization = "general_developer"
|
|
}
|
|
|
|
return config
|
|
}
|
|
|
|
// GetEnvironmentSpecificDefaults returns defaults based on environment
|
|
func GetEnvironmentSpecificDefaults(environment string) *Config {
|
|
config := getDefaultConfig()
|
|
|
|
switch environment {
|
|
case "development", "dev":
|
|
config.WHOOSHAPI.BaseURL = "http://localhost:8000"
|
|
config.P2P.EscalationWebhook = "http://localhost:5678/webhook-test/human-escalation"
|
|
config.Logging.Level = "debug"
|
|
config.Agent.PollInterval = 10 * time.Second
|
|
|
|
case "staging":
|
|
config.WHOOSHAPI.BaseURL = "https://hive-staging.home.deepblack.cloud"
|
|
config.P2P.EscalationWebhook = "https://n8n-staging.home.deepblack.cloud/webhook-test/human-escalation"
|
|
config.Logging.Level = "info"
|
|
config.Agent.PollInterval = 20 * time.Second
|
|
|
|
case "production", "prod":
|
|
config.WHOOSHAPI.BaseURL = "https://hive.home.deepblack.cloud"
|
|
config.P2P.EscalationWebhook = "https://n8n.home.deepblack.cloud/webhook-test/human-escalation"
|
|
config.Logging.Level = "warn"
|
|
config.Agent.PollInterval = 30 * time.Second
|
|
|
|
default:
|
|
// Default to production-like settings
|
|
config.Logging.Level = "info"
|
|
}
|
|
|
|
return config
|
|
}
|
|
|
|
// GetCapabilityPresets returns predefined capability sets
|
|
func GetCapabilityPresets() map[string][]string {
|
|
return map[string][]string{
|
|
"senior_developer": {
|
|
"task-coordination",
|
|
"meta-discussion",
|
|
"ollama-reasoning",
|
|
"code-generation",
|
|
"code-review",
|
|
"architecture",
|
|
},
|
|
"code_reviewer": {
|
|
"task-coordination",
|
|
"meta-discussion",
|
|
"ollama-reasoning",
|
|
"code-review",
|
|
"security-analysis",
|
|
"best-practices",
|
|
},
|
|
"debugger_specialist": {
|
|
"task-coordination",
|
|
"meta-discussion",
|
|
"ollama-reasoning",
|
|
"debugging",
|
|
"error-analysis",
|
|
"troubleshooting",
|
|
},
|
|
"devops_engineer": {
|
|
"task-coordination",
|
|
"meta-discussion",
|
|
"deployment",
|
|
"infrastructure",
|
|
"monitoring",
|
|
"automation",
|
|
},
|
|
"test_engineer": {
|
|
"task-coordination",
|
|
"meta-discussion",
|
|
"testing",
|
|
"quality-assurance",
|
|
"test-automation",
|
|
"validation",
|
|
},
|
|
"general_developer": {
|
|
"task-coordination",
|
|
"meta-discussion",
|
|
"ollama-reasoning",
|
|
"general",
|
|
},
|
|
}
|
|
}
|
|
|
|
// ApplyCapabilityPreset applies a predefined capability preset to the config
|
|
func (c *Config) ApplyCapabilityPreset(presetName string) error {
|
|
presets := GetCapabilityPresets()
|
|
|
|
capabilities, exists := presets[presetName]
|
|
if !exists {
|
|
return fmt.Errorf("unknown capability preset: %s", presetName)
|
|
}
|
|
|
|
c.Agent.Capabilities = capabilities
|
|
c.Agent.Specialization = presetName
|
|
|
|
return nil
|
|
}
|
|
|
|
// GetModelPresets returns predefined model sets for different specializations
|
|
func GetModelPresets() map[string][]string {
|
|
return map[string][]string{
|
|
"code_generation": {
|
|
"starcoder2:15b",
|
|
"deepseek-coder-v2",
|
|
"codellama",
|
|
},
|
|
"advanced_reasoning": {
|
|
"phi4:14b",
|
|
"phi4-reasoning:14b",
|
|
"deepseek-r1",
|
|
},
|
|
"code_analysis": {
|
|
"qwen2.5-coder",
|
|
"deepseek-coder-v2",
|
|
"codellama",
|
|
},
|
|
"general_purpose": {
|
|
"phi3",
|
|
"llama3.1:8b",
|
|
"qwen3",
|
|
},
|
|
"vision_tasks": {
|
|
"llava",
|
|
"llava:13b",
|
|
},
|
|
}
|
|
}
|
|
|
|
// containsString checks if a string contains a substring (case-insensitive)
|
|
func containsString(s, substr string) bool {
|
|
return len(s) >= len(substr) &&
|
|
(s[:len(substr)] == substr || s[len(s)-len(substr):] == substr)
|
|
} |