Files
synapse/pkg/types/types.go
2026-06-28 03:24:26 +08:00

625 lines
22 KiB
Go

package types
import (
"encoding/json"
"fmt"
"time"
)
// =============================================================================
// Message ID and Task ID generators
// =============================================================================
// GenerateMessageID generates a unique message ID
func GenerateMessageID() string {
return fmt.Sprintf("msg-%d-%d", time.Now().UnixNano(), time.Now().UnixMilli()%1000)
}
// GenerateTaskID generates a unique task ID
func GenerateTaskID() string {
return fmt.Sprintf("task-%d-%d", time.Now().UnixNano(), time.Now().UnixMilli()%1000)
}
// =============================================================================
// P2P Message Types
// =============================================================================
// P2PMessageType defines all point-to-point message types
type P2PMessageType string
const (
// Task lifecycle
P2PTaskRequest P2PMessageType = "p2p:task_request"
P2PTaskConfirm P2PMessageType = "p2p:task_confirm"
P2PTaskReject P2PMessageType = "p2p:task_reject"
P2PTaskNeedInfo P2PMessageType = "p2p:task_need_info"
P2PTaskInfoProvided P2PMessageType = "p2p:task_info_provided"
P2PTaskStatusUpdate P2PMessageType = "p2p:task_status_update"
P2PTaskComplete P2PMessageType = "p2p:task_complete"
P2PTaskFailed P2PMessageType = "p2p:task_failed"
P2PTaskCancel P2PMessageType = "p2p:task_cancel"
P2PTaskAck P2PMessageType = "p2p:task_ack"
// Communication
P2PAck P2PMessageType = "p2p:ack"
P2PNack P2PMessageType = "p2p:nack"
P2PHeartbeat P2PMessageType = "p2p:heartbeat"
P2PCapabilityQuery P2PMessageType = "p2p:capability_query"
P2PCapabilityResponse P2PMessageType = "p2p:capability_response"
// Human-in-the-Loop
P2PTaskNeedHuman P2PMessageType = "p2p:task_need_human"
P2PHumanDecision P2PMessageType = "p2p:human_decision"
)
// =============================================================================
// Group Message Types
// =============================================================================
// GroupMessageType defines all group message types
type GroupMessageType string
const (
// Group management
GroupCreate GroupMessageType = "group:create"
GroupDisband GroupMessageType = "group:disband"
GroupJoin GroupMessageType = "group:join"
GroupLeave GroupMessageType = "group:leave"
GroupInvite GroupMessageType = "group:invite"
GroupAcceptInvite GroupMessageType = "group:accept_invite"
GroupRejectInvite GroupMessageType = "group:reject_invite"
GroupMemberUpdate GroupMessageType = "group:member_update"
GroupRoleChange GroupMessageType = "group:role_change"
// Group communication
GroupBroadcast GroupMessageType = "group:broadcast"
GroupMulticast GroupMessageType = "group:multicast"
GroupDirect GroupMessageType = "group:direct"
GroupRelay GroupMessageType = "group:relay"
// Task collaboration
GroupTaskSplit GroupMessageType = "group:task_split"
GroupTaskAssign GroupMessageType = "group:task_assign"
GroupTaskMerge GroupMessageType = "group:task_merge"
GroupTaskProgress GroupMessageType = "group:task_progress"
// Consensus
GroupVote GroupMessageType = "group:vote"
GroupVoteSubmit GroupMessageType = "group:vote_submit"
GroupConsensus GroupMessageType = "group:consensus"
// Human-in-the-Loop
GroupConsensusEscalate GroupMessageType = "group:consensus_escalate"
GroupSubtaskEscalate GroupMessageType = "group:subtask_escalate"
GroupHumanDecision GroupMessageType = "group:human_decision"
InterGroupEscalate GroupMessageType = "inter_group:escalate"
)
// =============================================================================
// Agent Endpoint
// =============================================================================
// AgentEndpoint represents an agent's network endpoint
type AgentEndpoint struct {
AgentID string `json:"agent_id"`
AgentName string `json:"agent_name,omitempty"`
SystemID string `json:"system_id"`
SystemName string `json:"system_name,omitempty"`
Endpoint string `json:"endpoint"`
Version string `json:"version,omitempty"`
}
// =============================================================================
// P2P Task Status
// =============================================================================
// P2PTaskStatus defines task status for P2P operations
type P2PTaskStatus string
const (
// Basic states
P2PStatusIdle P2PTaskStatus = "idle"
P2PStatusPending P2PTaskStatus = "pending"
P2PStatusConfirmed P2PTaskStatus = "confirmed"
P2PStatusExecuting P2PTaskStatus = "executing"
// Information exchange
P2PStatusInfoNeeded P2PTaskStatus = "info_needed"
P2PStatusInfoProvided P2PTaskStatus = "info_provided"
// Human-in-the-Loop
P2PStatusNeedHuman P2PTaskStatus = "need_human"
P2PStatusHumanDeciding P2PTaskStatus = "human_deciding"
P2PStatusHumanApproved P2PTaskStatus = "human_approved"
P2PStatusHumanRejected P2PTaskStatus = "human_rejected"
// Terminal states
P2PStatusCompleted P2PTaskStatus = "completed"
P2PStatusFailed P2PTaskStatus = "failed"
P2PStatusCancelled P2PTaskStatus = "cancelled"
P2PStatusRejected P2PTaskStatus = "rejected"
)
// =============================================================================
// Group Status
// =============================================================================
// GroupStatus defines group state
type GroupStatus string
const (
GroupStatusNone GroupStatus = "none"
GroupStatusCreating GroupStatus = "creating"
GroupStatusActive GroupStatus = "active"
GroupStatusFrozen GroupStatus = "frozen"
GroupStatusDisbanded GroupStatus = "disbanded"
)
// GroupMemberStatus defines member state within a group
type GroupMemberStatus string
const (
GroupMemberActive GroupMemberStatus = "active"
GroupMemberAway GroupMemberStatus = "away"
GroupMemberBusy GroupMemberStatus = "busy"
)
// =============================================================================
// Signature Algorithm
// =============================================================================
// SignatureAlgorithm defines supported signature algorithms
type SignatureAlgorithm string
const (
AlgHMACSHA256 SignatureAlgorithm = "HMAC-SHA256" // 默认
AlgHMACSHA512 SignatureAlgorithm = "HMAC-SHA512"
)
// =============================================================================
// Priority
// =============================================================================
// Priority defines message priority
type Priority string
const (
PriorityHigh Priority = "high"
PriorityNormal Priority = "normal"
PriorityLow Priority = "low"
PriorityUrgent Priority = "urgent"
)
// =============================================================================
// Unified Synapse Message
// =============================================================================
// UnifiedSynapseMessage is the base message format for all Synapse communications
type UnifiedSynapseMessage struct {
// Message identification
ID string `json:"id"`
Version string `json:"version"`
Type string `json:"type"`
// Sender
Sender AgentEndpoint `json:"sender"`
// Receiver (for P2P)
Receiver *AgentEndpoint `json:"receiver,omitempty"`
// Group context (for Group)
GroupID string `json:"group_id,omitempty"`
TargetType string `json:"target_type,omitempty"` // "all", "role", "specific"
TargetIDs []string `json:"target_ids,omitempty"`
// Protocol control
CorrelationID string `json:"correlation_id,omitempty"`
ReplyTo string `json:"reply_to,omitempty"`
ConversationID string `json:"conversation_id,omitempty"`
// Payload
Payload json.RawMessage `json:"payload"`
// Transport control
TTL int `json:"ttl,omitempty"`
Priority Priority `json:"priority,omitempty"`
Broadcast bool `json:"broadcast,omitempty"`
// Security
Signature string `json:"signature,omitempty"`
SignatureAlgorithm string `json:"signature_algorithm,omitempty"`
Encrypt bool `json:"encrypt,omitempty"`
// Timestamps
Timestamp Timestamp `json:"timestamp"`
ExpiresAt Timestamp `json:"expires_at,omitempty"`
}
// Timestamp is an ISO 8601 formatted timestamp
type Timestamp string
func (t Timestamp) Time() (time.Time, error) {
return time.Parse(time.RFC3339, string(t))
}
func NowTimestamp() Timestamp {
return Timestamp(time.Now().UTC().Format(time.RFC3339))
}
// =============================================================================
// P2P Payloads
// =============================================================================
// TaskRequestPayload is the payload for TASK_REQUEST
type TaskRequestPayload struct {
Task struct {
ID string `json:"id"`
Type string `json:"type"`
Priority Priority `json:"priority"`
Deadline *Timestamp `json:"deadline,omitempty"`
Payload map[string]interface{} `json:"payload"`
} `json:"task"`
Context *struct {
SessionID string `json:"session_id,omitempty"`
ParentTaskID string `json:"parent_task_id,omitempty"`
CorrelationID string `json:"correlation_id,omitempty"`
Metadata map[string]interface{} `json:"metadata,omitempty"`
} `json:"context,omitempty"`
}
// TaskConfirmPayload is the payload for TASK_CONFIRM
type TaskConfirmPayload struct {
TaskID string `json:"task_id"`
Confirmed bool `json:"confirmed"`
EstimatedDuration int `json:"estimated_duration"` // seconds
ExpectedCompletion Timestamp `json:"expected_completion"`
CapabilitiesUsed []string `json:"capabilities_used"`
Constraints *struct {
MaxRetries int `json:"max_retries"`
FallbackEnabled bool `json:"fallback_enabled"`
} `json:"constraints,omitempty"`
}
// TaskRejectPayload is the payload for TASK_REJECT
type TaskRejectPayload struct {
TaskID string `json:"task_id"`
Reason struct {
Code string `json:"code"`
Message string `json:"message"`
Details any `json:"details,omitempty"`
} `json:"reason"`
Alternatives *struct {
SuggestedAgentID string `json:"suggested_agent_id,omitempty"`
RetryAfter int `json:"retry_after,omitempty"`
PartialSupport bool `json:"partial_support,omitempty"`
} `json:"alternatives,omitempty"`
}
// MissingField describes a missing information field
type MissingField struct {
Field string `json:"field"`
Reason string `json:"reason"`
SuggestedValue any `json:"suggested_value,omitempty"`
Alternatives []any `json:"alternatives,omitempty"`
}
// TaskNeedInfoPayload is the payload for TASK_NEED_INFO
type TaskNeedInfoPayload struct {
TaskID string `json:"task_id"`
MissingFields []MissingField `json:"missing_fields"`
Question string `json:"question,omitempty"`
RequiredBy *Timestamp `json:"required_by,omitempty"`
}
// TaskInfoProvidedPayload is the payload for TASK_INFO_PROVIDED
type TaskInfoProvidedPayload struct {
TaskID string `json:"task_id"`
ReplyTo string `json:"reply_to"`
ProvidedInfo map[string]interface{} `json:"provided_info"`
AdditionalContext string `json:"additional_context,omitempty"`
}
// TaskStatusUpdatePayload is the payload for TASK_STATUS_UPDATE
type TaskStatusUpdatePayload struct {
TaskID string `json:"task_id"`
Status string `json:"status"`
Progress int `json:"progress"` // 0-100
Message string `json:"message,omitempty"`
IntermediateResult any `json:"intermediate_result,omitempty"`
}
// TaskCompletePayload is the payload for TASK_COMPLETE
type TaskCompletePayload struct {
TaskID string `json:"task_id"`
Result struct {
OutputType string `json:"output_type"`
Output any `json:"output"`
Metadata map[string]interface{} `json:"metadata,omitempty"`
} `json:"result"`
Summary string `json:"summary,omitempty"`
}
// TaskFailedPayload is the payload for TASK_FAILED
type TaskFailedPayload struct {
TaskID string `json:"task_id"`
Error struct {
Code string `json:"code"`
Message string `json:"message"`
Recoverable bool `json:"recoverable"`
Details any `json:"details,omitempty"`
} `json:"error"`
PartialResult any `json:"partial_result,omitempty"`
}
// TaskCancelPayload is the payload for TASK_CANCEL
type TaskCancelPayload struct {
TaskID string `json:"task_id"`
Reason string `json:"reason"`
CancelledBy string `json:"cancelled_by,omitempty"`
}
// TaskNeedHumanPayload is the payload for TASK_NEED_HUMAN
type TaskNeedHumanPayload struct {
TaskID string `json:"task_id"`
Reason struct {
Code string `json:"code"`
Message string `json:"message"`
} `json:"reason"`
Context struct {
TaskSummary string `json:"task_summary"`
CurrentProgress int `json:"current_progress"`
BlockedReason string `json:"blocked_reason"`
RelevantHistory []any `json:"relevant_history,omitempty"`
} `json:"context"`
Options []struct {
Field string `json:"field"`
Value any `json:"value"`
ProsCons string `json:"pros_cons,omitempty"`
Confidence int `json:"confidence,omitempty"`
} `json:"options,omitempty"`
SuggestedValue any `json:"suggested_value,omitempty"`
EscalationLevel int `json:"escalation_level"`
Deadline *Timestamp `json:"deadline,omitempty"`
}
// HumanDecisionPayload is the payload for HUMAN_DECISION
type HumanDecisionPayload struct {
TaskID string `json:"task_id"`
DecisionID string `json:"decision_id"`
ReplyTo string `json:"reply_to"`
DecidedBy struct {
UserID string `json:"user_id"`
UserName string `json:"user_name"`
Role string `json:"role"`
} `json:"decided_by"`
Decision struct {
Action string `json:"action"` // approve, reject, modify, select
ApprovedFields map[string]interface{} `json:"approved_fields,omitempty"`
ModifiedFields map[string]interface{} `json:"modified_fields,omitempty"`
SelectedOption any `json:"selected_option,omitempty"`
RejectionReason string `json:"rejection_reason,omitempty"`
} `json:"decision"`
Notes string `json:"notes,omitempty"`
Timestamp Timestamp `json:"timestamp"`
}
// =============================================================================
// Group Payloads
// =============================================================================
// GroupTopology defines group topology types
type GroupTopology string
const (
GroupTopologyStar GroupTopology = "star"
GroupTopologyMesh GroupTopology = "mesh"
GroupTopologyChain GroupTopology = "chain"
GroupTopologyHierarchical GroupTopology = "hierarchical"
GroupTopologyFullMesh GroupTopology = "fullmesh"
)
// GroupRole defines a group role
type GroupRole struct {
ID string `json:"id"`
Name string `json:"name"`
Permissions []string `json:"permissions"`
MaxTasks int `json:"max_tasks"`
}
// GroupMember represents a member in a group
type GroupMember struct {
AgentID string `json:"agent_id"`
AgentName string `json:"agent_name"`
Role string `json:"role"`
JoinedAt Timestamp `json:"joined_at"`
Status GroupMemberStatus `json:"status"`
Capabilities []string `json:"capabilities"`
LoadFactor float64 `json:"load_factor"` // 0-1, for task assignment
}
// AgentGroup represents a group of agents
type AgentGroup struct {
ID string `json:"id"`
Name string `json:"name"`
Topology GroupTopology `json:"topology"`
CreatedBy string `json:"created_by"`
CreatedAt Timestamp `json:"created_at"`
Config GroupConfig `json:"config"`
Members []GroupMember `json:"members"`
Roles []GroupRole `json:"roles"`
Status GroupStatus `json:"status"`
}
// GroupConfig defines group configuration
type GroupConfig struct {
AllowSelfLeave bool `json:"allow_self_leave"`
RequiresApproval bool `json:"requires_approval"`
ConsensusRequired bool `json:"consensus_required"`
ConsensusThreshold float64 `json:"consensus_threshold"` // 0-1
BroadcastMode string `json:"broadcast_mode"` // "all" or "smart"
}
// GroupCreatePayload is the payload for GROUP_CREATE
type GroupCreatePayload struct {
Group struct {
ID string `json:"id,omitempty"`
Name string `json:"name"`
Topology GroupTopology `json:"topology"`
Config GroupConfig `json:"config"`
InitialMembers []AgentEndpoint `json:"initial_members,omitempty"`
Roles []GroupRole `json:"roles,omitempty"`
} `json:"group"`
}
// GroupInvitePayload is the payload for GROUP_INVITE
type GroupInvitePayload struct {
GroupID string `json:"group_id"`
Invitee AgentEndpoint `json:"invitee"`
Inviter AgentEndpoint `json:"inviter"`
Message string `json:"message,omitempty"`
RequiresApproval bool `json:"requires_approval"`
}
// Subtask describes a subtask in task splitting
type Subtask struct {
ID string `json:"id"`
Description string `json:"description"`
AssignedTo string `json:"assigned_to"`
Dependencies []string `json:"dependencies"`
EstimatedDuration int `json:"estimated_duration"` // seconds
Priority int `json:"priority"`
}
// MergeStrategy defines how subtask results are merged
type MergeStrategy string
const (
MergeAllSuccess MergeStrategy = "all_success"
MergeMajority MergeStrategy = "majority"
MergeAnyComplete MergeStrategy = "any_complete"
MergePriority MergeStrategy = "priority"
)
// GroupTaskSplitPayload is the payload for GROUP_TASK_SPLIT
type GroupTaskSplitPayload struct {
OriginalTask struct {
ID string `json:"id"`
Type string `json:"type"`
Requirements map[string]interface{} `json:"requirements"`
Deadline *Timestamp `json:"deadline,omitempty"`
} `json:"original_task"`
Subtasks []Subtask `json:"subtasks"`
MergeStrategy MergeStrategy `json:"merge_strategy"`
}
// SubtaskResult describes a single subtask result
type SubtaskResult struct {
SubtaskID string `json:"subtask_id"`
AssignedTo string `json:"assigned_to"`
Status string `json:"status"` // success, failed, partial
Result any `json:"result,omitempty"`
Error string `json:"error,omitempty"`
CompletedAt *Timestamp `json:"completed_at,omitempty"`
}
// GroupTaskMergePayload is the payload for GROUP_TASK_MERGE
type GroupTaskMergePayload struct {
OriginalTaskID string `json:"original_task_id"`
SubtaskResults []SubtaskResult `json:"subtask_results"`
MergeStrategyUsed string `json:"merge_strategy_used"`
MergedResult any `json:"merged_result"`
ConsensusAchieved bool `json:"consensus_achieved"`
}
// GroupVoteOption describes a vote option
type GroupVoteOption struct {
VoterID string `json:"voter_id"`
Option string `json:"option"`
Reason string `json:"reason,omitempty"`
Timestamp Timestamp `json:"timestamp"`
}
// GroupVotePayload is the payload for GROUP_VOTE
type GroupVotePayload struct {
VoteID string `json:"vote_id"`
Question string `json:"question"`
Options []string `json:"options"`
Voters []string `json:"voters"`
Deadline Timestamp `json:"deadline"`
Threshold float64 `json:"threshold"` // 0-1
Status string `json:"status"` // open, closed
Votes []GroupVoteOption `json:"votes,omitempty"`
}
// GroupConsensusEscalatePayload is the payload for GROUP_CONSENSUS_ESCALATE
type GroupConsensusEscalatePayload struct {
VoteID string `json:"vote_id"`
EscalationID string `json:"escalation_id"`
Question string `json:"question"`
Votes []struct {
VoterID string `json:"voter_id"`
VoterRole string `json:"voter_role"`
Option string `json:"option"`
Reason string `json:"reason,omitempty"`
} `json:"votes"`
ConsensusStatus struct {
RequiredThreshold float64 `json:"required_threshold"`
ActualThreshold float64 `json:"actual_threshold"`
LeadingOption string `json:"leading_option,omitempty"`
OptionsTied bool `json:"options_tied"`
} `json:"consensus_status"`
EscalateReason struct {
Code string `json:"code"`
Message string `json:"message"`
} `json:"escalate_reason"`
EscalationLevel int `json:"escalation_level"`
DecisionOptions []struct {
Option string `json:"option"`
SupportCount int `json:"support_count"`
SupportAgents []string `json:"support_agents"`
} `json:"decision_options"`
Deadline Timestamp `json:"deadline"`
Context struct {
TaskID string `json:"task_id"`
OriginalTaskRequirements map[string]interface{} `json:"original_task_requirements"`
AgentRecommendations []struct {
AgentID string `json:"agent_id"`
SuggestedOption string `json:"suggested_option"`
} `json:"agent_recommendations"`
} `json:"context"`
}
// GroupSubtaskEscalatePayload is the payload for GROUP_SUBTASK_ESCALATE
type GroupSubtaskEscalatePayload struct {
OriginalTask struct {
ID string `json:"id"`
Type string `json:"type"`
Description string `json:"description"`
} `json:"original_task"`
Subtask struct {
ID string `json:"id"`
Description string `json:"description"`
AssignedTo string `json:"assigned_to"`
BlockedAt string `json:"blocked_at"`
BlockedReason struct {
Code string `json:"code"`
Message string `json:"message"`
} `json:"blocked_reason"`
AttemptedSolutions []string `json:"attempted_solutions"`
} `json:"subtask"`
RequiredDecision struct {
FieldsNeeded []struct {
Field string `json:"field"`
CurrentValue any `json:"current_value,omitempty"`
SuggestedValue any `json:"suggested_value,omitempty"`
Alternatives []any `json:"alternatives,omitempty"`
ValidationRules string `json:"validation_rules,omitempty"`
} `json:"fields_needed"`
DecisionType string `json:"decision_type"` // approve, select, provide_info
AffectsOtherSubtasks bool `json:"affects_other_subtasks"`
RollbackPossible bool `json:"rollback_possible"`
} `json:"required_decision"`
EscalationLevel int `json:"escalation_level"`
Deadline *Timestamp `json:"deadline,omitempty"`
}