 9bdcbe0447
			
		
	
	9bdcbe0447
	
	
	
		
			
			Major integrations and fixes: - Added BACKBEAT SDK integration for P2P operation timing - Implemented beat-aware status tracking for distributed operations - Added Docker secrets support for secure license management - Resolved KACHING license validation via HTTPS/TLS - Updated docker-compose configuration for clean stack deployment - Disabled rollback policies to prevent deployment failures - Added license credential storage (CHORUS-DEV-MULTI-001) Technical improvements: - BACKBEAT P2P operation tracking with phase management - Enhanced configuration system with file-based secrets - Improved error handling for license validation - Clean separation of KACHING and CHORUS deployment stacks 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
		
			
				
	
	
		
			41 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			41 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package pubsub
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"fmt"
 | |
| )
 | |
| 
 | |
| // GossipPublisher is a thin wrapper around the CHORUS PubSub system that
 | |
| // satisfies the hmmm.PubSubAdapter interface. It ensures that HMMM messages
 | |
| // are published as raw JSON payloads to dynamic, per-issue topics.
 | |
| type GossipPublisher struct {
 | |
| 	ps *PubSub
 | |
| }
 | |
| 
 | |
| // NewGossipPublisher creates a new HMMM adapter for the CHORUS pubsub system.
 | |
| func NewGossipPublisher(ps *PubSub) *GossipPublisher {
 | |
| 	return &GossipPublisher{ps: ps}
 | |
| }
 | |
| 
 | |
| // Publish ensures the agent is subscribed to the per-issue topic and then
 | |
| // publishes the raw payload. This method is the primary bridge between HMMM's
 | |
| // routing logic and CHORUS's underlying gossipsub network.
 | |
| //
 | |
| // It performs two key actions:
 | |
| // 1. Joins the dynamic topic (e.g., "CHORUS/meta/issue/42") to ensure message delivery.
 | |
| // 2. Publishes the byte payload directly, bypassing the standard CHORUS message envelope.
 | |
| func (g *GossipPublisher) Publish(ctx context.Context, topic string, payload []byte) error {
 | |
| 	// 1. Ensure the node is subscribed to the dynamic topic.
 | |
| 	//    This is idempotent and safe to call multiple times.
 | |
| 	if err := g.ps.JoinDynamicTopic(topic); err != nil {
 | |
| 		return fmt.Errorf("hmmm adapter failed to join dynamic topic %s: %w", topic, err)
 | |
| 	}
 | |
| 
 | |
| 	// 2. Publish the raw message payload to the topic.
 | |
| 	if err := g.ps.PublishRaw(topic, payload); err != nil {
 | |
| 		return fmt.Errorf("hmmm adapter failed to publish raw message to topic %s: %w", topic, err)
 | |
| 	}
 | |
| 
 | |
| 	return nil
 | |
| }
 |