Files
bzzz/pkg/config/slurp_config.go
anthonyrawlins 065dddf8d5 Prepare for v2 development: Add MCP integration and future development planning
- Add FUTURE_DEVELOPMENT.md with comprehensive v2 protocol specification
- Add MCP integration design and implementation foundation
- Add infrastructure and deployment configurations
- Update system architecture for v2 evolution

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-07 14:38:22 +10:00

222 lines
9.9 KiB
Go

package config
import (
"fmt"
"time"
)
// SlurpConfig holds SLURP event system integration configuration
type SlurpConfig struct {
// Connection settings
Enabled bool `yaml:"enabled" json:"enabled"`
BaseURL string `yaml:"base_url" json:"base_url"`
APIKey string `yaml:"api_key" json:"api_key"`
Timeout time.Duration `yaml:"timeout" json:"timeout"`
RetryCount int `yaml:"retry_count" json:"retry_count"`
RetryDelay time.Duration `yaml:"retry_delay" json:"retry_delay"`
// Event generation settings
EventGeneration EventGenerationConfig `yaml:"event_generation" json:"event_generation"`
// Project-specific event mappings
ProjectMappings map[string]ProjectEventMapping `yaml:"project_mappings" json:"project_mappings"`
// Default event settings
DefaultEventSettings DefaultEventConfig `yaml:"default_event_settings" json:"default_event_settings"`
// Batch processing settings
BatchProcessing BatchConfig `yaml:"batch_processing" json:"batch_processing"`
}
// EventGenerationConfig controls when and how SLURP events are generated
type EventGenerationConfig struct {
// Consensus requirements
MinConsensusStrength float64 `yaml:"min_consensus_strength" json:"min_consensus_strength"`
MinParticipants int `yaml:"min_participants" json:"min_participants"`
RequireUnanimity bool `yaml:"require_unanimity" json:"require_unanimity"`
// Time-based triggers
MaxDiscussionDuration time.Duration `yaml:"max_discussion_duration" json:"max_discussion_duration"`
MinDiscussionDuration time.Duration `yaml:"min_discussion_duration" json:"min_discussion_duration"`
// Event type generation rules
EnabledEventTypes []string `yaml:"enabled_event_types" json:"enabled_event_types"`
DisabledEventTypes []string `yaml:"disabled_event_types" json:"disabled_event_types"`
// Severity calculation
SeverityRules SeverityConfig `yaml:"severity_rules" json:"severity_rules"`
}
// SeverityConfig defines how to calculate event severity from HMMM discussions
type SeverityConfig struct {
// Base severity for each event type (1-10 scale)
BaseSeverity map[string]int `yaml:"base_severity" json:"base_severity"`
// Modifiers based on discussion characteristics
ParticipantMultiplier float64 `yaml:"participant_multiplier" json:"participant_multiplier"`
DurationMultiplier float64 `yaml:"duration_multiplier" json:"duration_multiplier"`
UrgencyKeywords []string `yaml:"urgency_keywords" json:"urgency_keywords"`
UrgencyBoost int `yaml:"urgency_boost" json:"urgency_boost"`
// Severity caps
MinSeverity int `yaml:"min_severity" json:"min_severity"`
MaxSeverity int `yaml:"max_severity" json:"max_severity"`
}
// ProjectEventMapping defines project-specific event mapping rules
type ProjectEventMapping struct {
ProjectPath string `yaml:"project_path" json:"project_path"`
CustomEventTypes map[string]string `yaml:"custom_event_types" json:"custom_event_types"`
SeverityOverrides map[string]int `yaml:"severity_overrides" json:"severity_overrides"`
AdditionalMetadata map[string]interface{} `yaml:"additional_metadata" json:"additional_metadata"`
EventFilters []EventFilter `yaml:"event_filters" json:"event_filters"`
}
// EventFilter defines conditions for filtering or modifying events
type EventFilter struct {
Name string `yaml:"name" json:"name"`
Conditions map[string]string `yaml:"conditions" json:"conditions"`
Action string `yaml:"action" json:"action"` // "allow", "deny", "modify"
Modifications map[string]string `yaml:"modifications" json:"modifications"`
}
// DefaultEventConfig provides default settings for generated events
type DefaultEventConfig struct {
DefaultSeverity int `yaml:"default_severity" json:"default_severity"`
DefaultCreatedBy string `yaml:"default_created_by" json:"default_created_by"`
DefaultTags []string `yaml:"default_tags" json:"default_tags"`
MetadataTemplate map[string]string `yaml:"metadata_template" json:"metadata_template"`
}
// BatchConfig controls batch processing of SLURP events
type BatchConfig struct {
Enabled bool `yaml:"enabled" json:"enabled"`
MaxBatchSize int `yaml:"max_batch_size" json:"max_batch_size"`
MaxBatchWait time.Duration `yaml:"max_batch_wait" json:"max_batch_wait"`
FlushOnShutdown bool `yaml:"flush_on_shutdown" json:"flush_on_shutdown"`
}
// HmmmToSlurpMapping defines the mapping between HMMM discussion outcomes and SLURP event types
type HmmmToSlurpMapping struct {
// Consensus types to SLURP event types
ConsensusApproval string `yaml:"consensus_approval" json:"consensus_approval"` // -> "approval"
RiskIdentified string `yaml:"risk_identified" json:"risk_identified"` // -> "warning"
CriticalBlocker string `yaml:"critical_blocker" json:"critical_blocker"` // -> "blocker"
PriorityChange string `yaml:"priority_change" json:"priority_change"` // -> "priority_change"
AccessRequest string `yaml:"access_request" json:"access_request"` // -> "access_update"
ArchitectureDecision string `yaml:"architecture_decision" json:"architecture_decision"` // -> "structural_change"
InformationShare string `yaml:"information_share" json:"information_share"` // -> "announcement"
// Keywords that trigger specific event types
ApprovalKeywords []string `yaml:"approval_keywords" json:"approval_keywords"`
WarningKeywords []string `yaml:"warning_keywords" json:"warning_keywords"`
BlockerKeywords []string `yaml:"blocker_keywords" json:"blocker_keywords"`
PriorityKeywords []string `yaml:"priority_keywords" json:"priority_keywords"`
AccessKeywords []string `yaml:"access_keywords" json:"access_keywords"`
StructuralKeywords []string `yaml:"structural_keywords" json:"structural_keywords"`
AnnouncementKeywords []string `yaml:"announcement_keywords" json:"announcement_keywords"`
}
// GetDefaultSlurpConfig returns default SLURP configuration
func GetDefaultSlurpConfig() SlurpConfig {
return SlurpConfig{
Enabled: false, // Disabled by default until configured
BaseURL: "http://localhost:8080",
Timeout: 30 * time.Second,
RetryCount: 3,
RetryDelay: 5 * time.Second,
EventGeneration: 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",
},
DisabledEventTypes: []string{},
SeverityRules: SeverityConfig{
BaseSeverity: map[string]int{
"announcement": 3,
"warning": 5,
"blocker": 8,
"approval": 4,
"priority_change": 6,
"access_update": 5,
"structural_change": 7,
},
ParticipantMultiplier: 0.2,
DurationMultiplier: 0.1,
UrgencyKeywords: []string{"urgent", "critical", "blocker", "emergency", "immediate"},
UrgencyBoost: 2,
MinSeverity: 1,
MaxSeverity: 10,
},
},
ProjectMappings: make(map[string]ProjectEventMapping),
DefaultEventSettings: DefaultEventConfig{
DefaultSeverity: 5,
DefaultCreatedBy: "hmmm-consensus",
DefaultTags: []string{"hmmm-generated", "automated"},
MetadataTemplate: map[string]string{
"source": "hmmm-discussion",
"generation_type": "consensus-based",
},
},
BatchProcessing: BatchConfig{
Enabled: true,
MaxBatchSize: 10,
MaxBatchWait: 5 * time.Second,
FlushOnShutdown: true,
},
}
}
// GetHmmmToSlurpMapping returns the default mapping configuration
func GetHmmmToSlurpMapping() HmmmToSlurpMapping {
return HmmmToSlurpMapping{
ConsensusApproval: "approval",
RiskIdentified: "warning",
CriticalBlocker: "blocker",
PriorityChange: "priority_change",
AccessRequest: "access_update",
ArchitectureDecision: "structural_change",
InformationShare: "announcement",
ApprovalKeywords: []string{"approve", "approved", "looks good", "lgtm", "accepted", "agree"},
WarningKeywords: []string{"warning", "caution", "risk", "potential issue", "concern", "careful"},
BlockerKeywords: []string{"blocker", "blocked", "critical", "urgent", "cannot proceed", "show stopper"},
PriorityKeywords: []string{"priority", "urgent", "high priority", "low priority", "reprioritize"},
AccessKeywords: []string{"access", "permission", "auth", "authorization", "credentials", "token"},
StructuralKeywords: []string{"architecture", "structure", "design", "refactor", "framework", "pattern"},
AnnouncementKeywords: []string{"announce", "fyi", "information", "update", "news", "notice"},
}
}
// ValidateSlurpConfig validates SLURP configuration
func ValidateSlurpConfig(config SlurpConfig) error {
if config.Enabled {
if config.BaseURL == "" {
return fmt.Errorf("slurp.base_url is required when SLURP is enabled")
}
if config.EventGeneration.MinConsensusStrength < 0 || config.EventGeneration.MinConsensusStrength > 1 {
return fmt.Errorf("slurp.event_generation.min_consensus_strength must be between 0 and 1")
}
if config.EventGeneration.MinParticipants < 1 {
return fmt.Errorf("slurp.event_generation.min_participants must be at least 1")
}
if config.DefaultEventSettings.DefaultSeverity < 1 || config.DefaultEventSettings.DefaultSeverity > 10 {
return fmt.Errorf("slurp.default_event_settings.default_severity must be between 1 and 10")
}
}
return nil
}