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>
This commit is contained in:
156
pubsub/pubsub.go
156
pubsub/pubsub.go
@@ -13,7 +13,7 @@ import (
|
||||
pubsub "github.com/libp2p/go-libp2p-pubsub"
|
||||
)
|
||||
|
||||
// PubSub handles publish/subscribe messaging for Bzzz coordination and Antennae meta-discussion
|
||||
// PubSub handles publish/subscribe messaging for Bzzz coordination and HMMM meta-discussion
|
||||
type PubSub struct {
|
||||
ps *pubsub.PubSub
|
||||
host host.Host
|
||||
@@ -22,12 +22,12 @@ type PubSub struct {
|
||||
|
||||
// Topic subscriptions
|
||||
bzzzTopic *pubsub.Topic
|
||||
antennaeTopic *pubsub.Topic
|
||||
hmmmTopic *pubsub.Topic
|
||||
contextTopic *pubsub.Topic
|
||||
|
||||
// Message subscriptions
|
||||
bzzzSub *pubsub.Subscription
|
||||
antennaeSub *pubsub.Subscription
|
||||
hmmmSub *pubsub.Subscription
|
||||
contextSub *pubsub.Subscription
|
||||
|
||||
// Dynamic topic management
|
||||
@@ -38,11 +38,11 @@ type PubSub struct {
|
||||
|
||||
// Configuration
|
||||
bzzzTopicName string
|
||||
antennaeTopicName string
|
||||
hmmmTopicName string
|
||||
contextTopicName string
|
||||
|
||||
// External message handler for Antennae messages
|
||||
AntennaeMessageHandler func(msg Message, from peer.ID)
|
||||
// External message handler for HMMM messages
|
||||
HmmmMessageHandler func(msg Message, from peer.ID)
|
||||
|
||||
// External message handler for Context Feedback messages
|
||||
ContextFeedbackHandler func(msg Message, from peer.ID)
|
||||
@@ -69,7 +69,7 @@ const (
|
||||
CapabilityBcast MessageType = "capability_broadcast" // Only broadcast when capabilities change
|
||||
AvailabilityBcast MessageType = "availability_broadcast" // Regular availability status
|
||||
|
||||
// Antennae meta-discussion messages
|
||||
// HMMM meta-discussion messages
|
||||
MetaDiscussion MessageType = "meta_discussion" // Generic type for all discussion
|
||||
TaskHelpRequest MessageType = "task_help_request" // Request for assistance
|
||||
TaskHelpResponse MessageType = "task_help_response" // Response to a help request
|
||||
@@ -96,6 +96,11 @@ const (
|
||||
ContextResponse MessageType = "context_response" // Response with context data
|
||||
ContextUsage MessageType = "context_usage" // Report context usage patterns
|
||||
ContextRelevance MessageType = "context_relevance" // Report context relevance scoring
|
||||
|
||||
// SLURP event integration messages
|
||||
SlurpEventGenerated MessageType = "slurp_event_generated" // HMMM consensus generated SLURP event
|
||||
SlurpEventAck MessageType = "slurp_event_ack" // Acknowledgment of SLURP event receipt
|
||||
SlurpContextUpdate MessageType = "slurp_context_update" // Context update from SLURP system
|
||||
)
|
||||
|
||||
// Message represents a Bzzz/Antennae message
|
||||
@@ -115,18 +120,18 @@ type Message struct {
|
||||
ThreadID string `json:"thread_id,omitempty"` // Conversation thread ID
|
||||
}
|
||||
|
||||
// NewPubSub creates a new PubSub instance for Bzzz coordination and Antennae meta-discussion
|
||||
func NewPubSub(ctx context.Context, h host.Host, bzzzTopic, antennaeTopic string) (*PubSub, error) {
|
||||
return NewPubSubWithLogger(ctx, h, bzzzTopic, antennaeTopic, nil)
|
||||
// NewPubSub creates a new PubSub instance for Bzzz coordination and HMMM meta-discussion
|
||||
func NewPubSub(ctx context.Context, h host.Host, bzzzTopic, hmmmTopic string) (*PubSub, error) {
|
||||
return NewPubSubWithLogger(ctx, h, bzzzTopic, hmmmTopic, nil)
|
||||
}
|
||||
|
||||
// NewPubSubWithLogger creates a new PubSub instance with hypercore logging
|
||||
func NewPubSubWithLogger(ctx context.Context, h host.Host, bzzzTopic, antennaeTopic string, logger HypercoreLogger) (*PubSub, error) {
|
||||
func NewPubSubWithLogger(ctx context.Context, h host.Host, bzzzTopic, hmmmTopic string, logger HypercoreLogger) (*PubSub, error) {
|
||||
if bzzzTopic == "" {
|
||||
bzzzTopic = "bzzz/coordination/v1"
|
||||
}
|
||||
if antennaeTopic == "" {
|
||||
antennaeTopic = "antennae/meta-discussion/v1"
|
||||
if hmmmTopic == "" {
|
||||
hmmmTopic = "hmmm/meta-discussion/v1"
|
||||
}
|
||||
contextTopic := "bzzz/context-feedback/v1"
|
||||
|
||||
@@ -149,9 +154,9 @@ func NewPubSubWithLogger(ctx context.Context, h host.Host, bzzzTopic, antennaeTo
|
||||
host: h,
|
||||
ctx: pubsubCtx,
|
||||
cancel: cancel,
|
||||
bzzzTopicName: bzzzTopic,
|
||||
antennaeTopicName: antennaeTopic,
|
||||
contextTopicName: contextTopic,
|
||||
bzzzTopicName: bzzzTopic,
|
||||
hmmmTopicName: hmmmTopic,
|
||||
contextTopicName: contextTopic,
|
||||
dynamicTopics: make(map[string]*pubsub.Topic),
|
||||
dynamicSubs: make(map[string]*pubsub.Subscription),
|
||||
hypercoreLog: logger,
|
||||
@@ -165,16 +170,16 @@ func NewPubSubWithLogger(ctx context.Context, h host.Host, bzzzTopic, antennaeTo
|
||||
|
||||
// Start message handlers
|
||||
go p.handleBzzzMessages()
|
||||
go p.handleAntennaeMessages()
|
||||
go p.handleHmmmMessages()
|
||||
go p.handleContextFeedbackMessages()
|
||||
|
||||
fmt.Printf("📡 PubSub initialized - Bzzz: %s, Antennae: %s, Context: %s\n", bzzzTopic, antennaeTopic, contextTopic)
|
||||
fmt.Printf("📡 PubSub initialized - Bzzz: %s, HMMM: %s, Context: %s\n", bzzzTopic, hmmmTopic, contextTopic)
|
||||
return p, nil
|
||||
}
|
||||
|
||||
// SetAntennaeMessageHandler sets the handler for incoming Antennae messages.
|
||||
func (p *PubSub) SetAntennaeMessageHandler(handler func(msg Message, from peer.ID)) {
|
||||
p.AntennaeMessageHandler = handler
|
||||
// SetHmmmMessageHandler sets the handler for incoming HMMM messages.
|
||||
func (p *PubSub) SetHmmmMessageHandler(handler func(msg Message, from peer.ID)) {
|
||||
p.HmmmMessageHandler = handler
|
||||
}
|
||||
|
||||
// SetContextFeedbackHandler sets the handler for incoming context feedback messages.
|
||||
@@ -182,7 +187,7 @@ func (p *PubSub) SetContextFeedbackHandler(handler func(msg Message, from peer.I
|
||||
p.ContextFeedbackHandler = handler
|
||||
}
|
||||
|
||||
// joinStaticTopics joins the main Bzzz, Antennae, and Context Feedback topics
|
||||
// joinStaticTopics joins the main Bzzz, HMMM, and Context Feedback topics
|
||||
func (p *PubSub) joinStaticTopics() error {
|
||||
// Join Bzzz coordination topic
|
||||
bzzzTopic, err := p.ps.Join(p.bzzzTopicName)
|
||||
@@ -197,18 +202,18 @@ func (p *PubSub) joinStaticTopics() error {
|
||||
}
|
||||
p.bzzzSub = bzzzSub
|
||||
|
||||
// Join Antennae meta-discussion topic
|
||||
antennaeTopic, err := p.ps.Join(p.antennaeTopicName)
|
||||
// Join HMMM meta-discussion topic
|
||||
hmmmTopic, err := p.ps.Join(p.hmmmTopicName)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to join Antennae topic: %w", err)
|
||||
return fmt.Errorf("failed to join HMMM topic: %w", err)
|
||||
}
|
||||
p.antennaeTopic = antennaeTopic
|
||||
p.hmmmTopic = hmmmTopic
|
||||
|
||||
antennaeSub, err := antennaeTopic.Subscribe()
|
||||
hmmmSub, err := hmmmTopic.Subscribe()
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to subscribe to Antennae topic: %w", err)
|
||||
return fmt.Errorf("failed to subscribe to HMMM topic: %w", err)
|
||||
}
|
||||
p.antennaeSub = antennaeSub
|
||||
p.hmmmSub = hmmmSub
|
||||
|
||||
// Join Context Feedback topic
|
||||
contextTopic, err := p.ps.Join(p.contextTopicName)
|
||||
@@ -364,8 +369,8 @@ func (p *PubSub) PublishBzzzMessage(msgType MessageType, data map[string]interfa
|
||||
return p.bzzzTopic.Publish(p.ctx, msgBytes)
|
||||
}
|
||||
|
||||
// PublishAntennaeMessage publishes a message to the Antennae meta-discussion topic
|
||||
func (p *PubSub) PublishAntennaeMessage(msgType MessageType, data map[string]interface{}) error {
|
||||
// PublishHmmmMessage publishes a message to the HMMM meta-discussion topic
|
||||
func (p *PubSub) PublishHmmmMessage(msgType MessageType, data map[string]interface{}) error {
|
||||
msg := Message{
|
||||
Type: msgType,
|
||||
From: p.host.ID().String(),
|
||||
@@ -378,7 +383,19 @@ func (p *PubSub) PublishAntennaeMessage(msgType MessageType, data map[string]int
|
||||
return fmt.Errorf("failed to marshal message: %w", err)
|
||||
}
|
||||
|
||||
return p.antennaeTopic.Publish(p.ctx, msgBytes)
|
||||
return p.hmmmTopic.Publish(p.ctx, msgBytes)
|
||||
}
|
||||
|
||||
// PublishAntennaeMessage is a compatibility alias for PublishHmmmMessage
|
||||
// Deprecated: Use PublishHmmmMessage instead
|
||||
func (p *PubSub) PublishAntennaeMessage(msgType MessageType, data map[string]interface{}) error {
|
||||
return p.PublishHmmmMessage(msgType, data)
|
||||
}
|
||||
|
||||
// SetAntennaeMessageHandler is a compatibility alias for SetHmmmMessageHandler
|
||||
// Deprecated: Use SetHmmmMessageHandler instead
|
||||
func (p *PubSub) SetAntennaeMessageHandler(handler func(msg Message, from peer.ID)) {
|
||||
p.SetHmmmMessageHandler(handler)
|
||||
}
|
||||
|
||||
// PublishContextFeedbackMessage publishes a message to the Context Feedback topic
|
||||
@@ -424,7 +441,7 @@ func (p *PubSub) PublishRoleBasedMessage(msgType MessageType, data map[string]in
|
||||
case RoleAnnouncement, ExpertiseRequest, ExpertiseResponse, StatusUpdate,
|
||||
WorkAllocation, RoleCollaboration, MentorshipRequest, MentorshipResponse,
|
||||
ProjectUpdate, DeliverableReady:
|
||||
topic = p.antennaeTopic // Use Antennae topic for role-based messages
|
||||
topic = p.hmmmTopic // Use HMMM topic for role-based messages
|
||||
default:
|
||||
topic = p.bzzzTopic // Default to Bzzz topic
|
||||
}
|
||||
@@ -432,6 +449,35 @@ func (p *PubSub) PublishRoleBasedMessage(msgType MessageType, data map[string]in
|
||||
return topic.Publish(p.ctx, msgBytes)
|
||||
}
|
||||
|
||||
// PublishSlurpEventGenerated publishes a SLURP event generation notification
|
||||
func (p *PubSub) PublishSlurpEventGenerated(data map[string]interface{}) error {
|
||||
return p.PublishHmmmMessage(SlurpEventGenerated, data)
|
||||
}
|
||||
|
||||
// PublishSlurpEventAck publishes a SLURP event acknowledgment
|
||||
func (p *PubSub) PublishSlurpEventAck(data map[string]interface{}) error {
|
||||
return p.PublishHmmmMessage(SlurpEventAck, data)
|
||||
}
|
||||
|
||||
// PublishSlurpContextUpdate publishes a SLURP context update notification
|
||||
func (p *PubSub) PublishSlurpContextUpdate(data map[string]interface{}) error {
|
||||
return p.PublishHmmmMessage(SlurpContextUpdate, data)
|
||||
}
|
||||
|
||||
// PublishSlurpIntegrationEvent publishes a generic SLURP integration event
|
||||
func (p *PubSub) PublishSlurpIntegrationEvent(eventType string, discussionID string, slurpEvent map[string]interface{}) error {
|
||||
data := map[string]interface{}{
|
||||
"event_type": eventType,
|
||||
"discussion_id": discussionID,
|
||||
"slurp_event": slurpEvent,
|
||||
"timestamp": time.Now(),
|
||||
"source": "hmmm-slurp-integration",
|
||||
"peer_id": p.host.ID().String(),
|
||||
}
|
||||
|
||||
return p.PublishSlurpEventGenerated(data)
|
||||
}
|
||||
|
||||
// GetHypercoreLog returns the hypercore logger for external access
|
||||
func (p *PubSub) GetHypercoreLog() HypercoreLogger {
|
||||
return p.hypercoreLog
|
||||
@@ -473,15 +519,15 @@ func (p *PubSub) handleBzzzMessages() {
|
||||
}
|
||||
}
|
||||
|
||||
// handleAntennaeMessages processes incoming Antennae meta-discussion messages
|
||||
func (p *PubSub) handleAntennaeMessages() {
|
||||
// handleHmmmMessages processes incoming HMMM meta-discussion messages
|
||||
func (p *PubSub) handleHmmmMessages() {
|
||||
for {
|
||||
msg, err := p.antennaeSub.Next(p.ctx)
|
||||
msg, err := p.hmmmSub.Next(p.ctx)
|
||||
if err != nil {
|
||||
if p.ctx.Err() != nil {
|
||||
return // Context cancelled
|
||||
}
|
||||
fmt.Printf("❌ Error receiving Antennae message: %v\n", err)
|
||||
fmt.Printf("❌ Error receiving HMMM message: %v\n", err)
|
||||
continue
|
||||
}
|
||||
|
||||
@@ -489,16 +535,16 @@ func (p *PubSub) handleAntennaeMessages() {
|
||||
continue
|
||||
}
|
||||
|
||||
var antennaeMsg Message
|
||||
if err := json.Unmarshal(msg.Data, &antennaeMsg); err != nil {
|
||||
fmt.Printf("❌ Failed to unmarshal Antennae message: %v\n", err)
|
||||
var hmmmMsg Message
|
||||
if err := json.Unmarshal(msg.Data, &hmmmMsg); err != nil {
|
||||
fmt.Printf("❌ Failed to unmarshal HMMM message: %v\n", err)
|
||||
continue
|
||||
}
|
||||
|
||||
if p.AntennaeMessageHandler != nil {
|
||||
p.AntennaeMessageHandler(antennaeMsg, msg.ReceivedFrom)
|
||||
if p.HmmmMessageHandler != nil {
|
||||
p.HmmmMessageHandler(hmmmMsg, msg.ReceivedFrom)
|
||||
} else {
|
||||
p.processAntennaeMessage(antennaeMsg, msg.ReceivedFrom)
|
||||
p.processHmmmMessage(hmmmMsg, msg.ReceivedFrom)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -555,9 +601,9 @@ func (p *PubSub) handleDynamicMessages(sub *pubsub.Subscription) {
|
||||
continue
|
||||
}
|
||||
|
||||
// Use the main Antennae handler for all dynamic messages
|
||||
if p.AntennaeMessageHandler != nil {
|
||||
p.AntennaeMessageHandler(dynamicMsg, msg.ReceivedFrom)
|
||||
// Use the main HMMM handler for all dynamic messages
|
||||
if p.HmmmMessageHandler != nil {
|
||||
p.HmmmMessageHandler(dynamicMsg, msg.ReceivedFrom)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -602,9 +648,9 @@ func (p *PubSub) processBzzzMessage(msg Message, from peer.ID) {
|
||||
}
|
||||
}
|
||||
|
||||
// processAntennaeMessage provides default handling for Antennae messages if no external handler is set
|
||||
func (p *PubSub) processAntennaeMessage(msg Message, from peer.ID) {
|
||||
fmt.Printf("🎯 Default Antennae Handler [%s] from %s: %v\n",
|
||||
// processHmmmMessage provides default handling for HMMM messages if no external handler is set
|
||||
func (p *PubSub) processHmmmMessage(msg Message, from peer.ID) {
|
||||
fmt.Printf("🎯 Default HMMM Handler [%s] from %s: %v\n",
|
||||
msg.Type, from.ShortString(), msg.Data)
|
||||
|
||||
// Log to hypercore if logger is available
|
||||
@@ -615,7 +661,7 @@ func (p *PubSub) processAntennaeMessage(msg Message, from peer.ID) {
|
||||
"from_short": from.ShortString(),
|
||||
"timestamp": msg.Timestamp,
|
||||
"data": msg.Data,
|
||||
"topic": "antennae",
|
||||
"topic": "hmmm",
|
||||
"from_role": msg.FromRole,
|
||||
"to_roles": msg.ToRoles,
|
||||
"required_expertise": msg.RequiredExpertise,
|
||||
@@ -648,7 +694,7 @@ func (p *PubSub) processAntennaeMessage(msg Message, from peer.ID) {
|
||||
}
|
||||
|
||||
if err := p.hypercoreLog.AppendString(logType, logData); err != nil {
|
||||
fmt.Printf("❌ Failed to log Antennae message to hypercore: %v\n", err)
|
||||
fmt.Printf("❌ Failed to log HMMM message to hypercore: %v\n", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -700,8 +746,8 @@ func (p *PubSub) Close() error {
|
||||
if p.bzzzSub != nil {
|
||||
p.bzzzSub.Cancel()
|
||||
}
|
||||
if p.antennaeSub != nil {
|
||||
p.antennaeSub.Cancel()
|
||||
if p.hmmmSub != nil {
|
||||
p.hmmmSub.Cancel()
|
||||
}
|
||||
if p.contextSub != nil {
|
||||
p.contextSub.Cancel()
|
||||
@@ -710,8 +756,8 @@ func (p *PubSub) Close() error {
|
||||
if p.bzzzTopic != nil {
|
||||
p.bzzzTopic.Close()
|
||||
}
|
||||
if p.antennaeTopic != nil {
|
||||
p.antennaeTopic.Close()
|
||||
if p.hmmmTopic != nil {
|
||||
p.hmmmTopic.Close()
|
||||
}
|
||||
if p.contextTopic != nil {
|
||||
p.contextTopic.Close()
|
||||
|
||||
Reference in New Issue
Block a user