Files
synapse/types/errors.go
2026-06-27 14:08:30 +08:00

333 lines
8.3 KiB
Go

package types
// =============================================================================
// Synapse Error Codes
// =============================================================================
// SynapseErrorCode defines error code ranges
type SynapseErrorCode int
const (
// System errors (1000-1999)
ErrSystemError SynapseErrorCode = 1000
ErrInternalError SynapseErrorCode = 1001
ErrMaintenance SynapseErrorCode = 1002
// Task errors (2000-2999)
ErrTaskNotFound SynapseErrorCode = 2001
ErrTaskAlreadyCompleted SynapseErrorCode = 2002
ErrTaskCancelled SynapseErrorCode = 2003
ErrTaskTimeout SynapseErrorCode = 2004
ErrTaskInvalidParams SynapseErrorCode = 2005
// Information errors (3000-3999)
ErrRequiredFieldMissing SynapseErrorCode = 3001
ErrInvalidFieldFormat SynapseErrorCode = 3002
ErrInfoNotProvided SynapseErrorCode = 3003
// Capability errors (4000-4999)
ErrUnsupportedTaskType SynapseErrorCode = 4001
ErrCapabilityLacking SynapseErrorCode = 4002
ErrResourceBusy SynapseErrorCode = 4003
ErrQuotaExceeded SynapseErrorCode = 4004
// Security errors (5000-5999)
ErrAuthFailed SynapseErrorCode = 5001
ErrSignatureInvalid SynapseErrorCode = 5002
ErrPermissionDenied SynapseErrorCode = 5003
ErrPolicyViolation SynapseErrorCode = 5004
// Communication errors (6000-6999)
ErrEndpointUnreachable SynapseErrorCode = 6001
ErrCallbackFailed SynapseErrorCode = 6002
ErrMessageFormatInvalid SynapseErrorCode = 6003
ErrTTLExpired SynapseErrorCode = 6004
// Group errors (7000-7999)
ErrGroupNotFound SynapseErrorCode = 7001
ErrGroupNotActive SynapseErrorCode = 7002
ErrMemberNotFound SynapseErrorCode = 7003
ErrNotGroupMember SynapseErrorCode = 7004
ErrConsensusNotReached SynapseErrorCode = 7005
ErrRoleNotFound SynapseErrorCode = 7006
ErrAlreadyMember SynapseErrorCode = 7007
ErrGroupFull SynapseErrorCode = 7008
// HiL errors (8000-8999)
ErrHumanTimeout SynapseErrorCode = 8001
ErrHumanDeclined SynapseErrorCode = 8002
ErrEscalationLevel SynapseErrorCode = 8003
// Validation errors (9000-9999)
ErrInvalidParams SynapseErrorCode = 9001
)
// =============================================================================
// Error Categories
// =============================================================================
// ErrorCategory maps error codes to categories
func (c SynapseErrorCode) Category() string {
switch {
case c >= 1000 && c < 2000:
return "SYSTEM_ERROR"
case c >= 2000 && c < 3000:
return "TASK_ERROR"
case c >= 3000 && c < 4000:
return "INFO_ERROR"
case c >= 4000 && c < 5000:
return "CAPABILITY_ERROR"
case c >= 5000 && c < 6000:
return "SECURITY_ERROR"
case c >= 6000 && c < 7000:
return "COMMUNICATION_ERROR"
case c >= 7000 && c < 8000:
return "GROUP_ERROR"
case c >= 8000 && c < 9000:
return "HIL_ERROR"
case c >= 9000 && c < 10000:
return "VALIDATION_ERROR"
default:
return "UNKNOWN_ERROR"
}
}
// =============================================================================
// Synapse Error
// =============================================================================
// SynapseError represents a structured error response
type SynapseError struct {
Code SynapseErrorCode `json:"code"`
Category string `json:"category"`
Message string `json:"message"`
Details any `json:"details,omitempty"`
RetryAfter *int `json:"retry_after,omitempty"` // seconds
Timestamp Timestamp `json:"timestamp"`
}
// NewSynapseError creates a new Synapse error
func NewSynapseError(code SynapseErrorCode, message string, details any) *SynapseError {
return &SynapseError{
Code: code,
Category: code.Category(),
Message: message,
Details: details,
Timestamp: NowTimestamp(),
}
}
// NewSynapseErrorWithRetry creates a new Synapse error with retry hint
func NewSynapseErrorWithRetry(code SynapseErrorCode, message string, details any, retryAfter int) *SynapseError {
return &SynapseError{
Code: code,
Category: code.Category(),
Message: message,
Details: details,
RetryAfter: &retryAfter,
Timestamp: NowTimestamp(),
}
}
// Error implements the error interface
func (e *SynapseError) Error() string {
return e.Message
}
// ToMap converts error to map for JSON serialization
func (e *SynapseError) ToMap() map[string]any {
m := map[string]any{
"code": e.Code,
"category": e.Category,
"message": e.Message,
"timestamp": e.Timestamp,
}
if e.Details != nil {
m["details"] = e.Details
}
if e.RetryAfter != nil {
m["retry_after"] = *e.RetryAfter
}
return m
}
// =============================================================================
// Predefined Errors
// =============================================================================
var (
ErrTaskNotFoundError = NewSynapseError(
ErrTaskNotFound,
"Task not found",
nil,
)
ErrTaskAlreadyCompletedError = NewSynapseError(
ErrTaskAlreadyCompleted,
"Task has already been completed",
nil,
)
ErrTaskCancelledError = NewSynapseError(
ErrTaskCancelled,
"Task has been cancelled",
nil,
)
ErrTaskTimeoutError = NewSynapseError(
ErrTaskTimeout,
"Task execution timed out",
nil,
)
ErrRequiredFieldMissingError = NewSynapseError(
ErrRequiredFieldMissing,
"Required field is missing",
nil,
)
ErrUnsupportedTaskTypeError = NewSynapseError(
ErrUnsupportedTaskType,
"Task type is not supported by this agent",
nil,
)
ErrCapabilityLackingError = NewSynapseError(
ErrCapabilityLacking,
"Agent lacks the required capability",
nil,
)
ErrResourceBusyError = NewSynapseError(
ErrResourceBusy,
"Agent is currently busy processing other tasks",
nil,
)
ErrAuthFailedError = NewSynapseError(
ErrAuthFailed,
"Authentication failed",
nil,
)
ErrSignatureInvalidError = NewSynapseError(
ErrSignatureInvalid,
"Message signature verification failed",
nil,
)
ErrPermissionDeniedError = NewSynapseError(
ErrPermissionDenied,
"Permission denied",
nil,
)
ErrEndpointUnreachableError = NewSynapseError(
ErrEndpointUnreachable,
"Callback endpoint is unreachable",
nil,
)
ErrMessageFormatInvalidError = NewSynapseError(
ErrMessageFormatInvalid,
"Message format is invalid",
nil,
)
ErrGroupNotFoundError = NewSynapseError(
ErrGroupNotFound,
"Group not found",
nil,
)
ErrNotGroupMemberError = NewSynapseError(
ErrNotGroupMember,
"Agent is not a member of this group",
nil,
)
ErrGroupNotActiveError = NewSynapseError(
ErrGroupNotActive,
"Group is not active",
nil,
)
ErrAlreadyMemberError = NewSynapseError(
ErrAlreadyMember,
"Agent is already a member of this group",
nil,
)
ErrGroupFullError = NewSynapseError(
ErrGroupFull,
"Group has reached maximum capacity",
nil,
)
ErrMemberNotFoundError = NewSynapseError(
ErrMemberNotFound,
"Member not found in group",
nil,
)
ErrInvalidParamsError = NewSynapseError(
ErrInvalidParams,
"Invalid parameters",
nil,
)
ErrHumanTimeoutError = NewSynapseError(
ErrHumanTimeout,
"Human decision timed out",
nil,
)
)
// =============================================================================
// Error Response Builder
// =============================================================================
// ErrorResponse represents a standard error response
type ErrorResponse struct {
Success bool `json:"success"`
Error *SynapseError `json:"error"`
}
// NewErrorResponse creates an error response
func NewErrorResponse(err *SynapseError) *ErrorResponse {
return &ErrorResponse{
Success: false,
Error: err,
}
}
// SuccessResponse represents a standard success response
type SuccessResponse struct {
Success bool `json:"success"`
Message string `json:"message,omitempty"`
Data any `json:"data,omitempty"`
}
// NewSuccessResponse creates a success response
func NewSuccessResponse() *SuccessResponse {
return &SuccessResponse{
Success: true,
}
}
// NewSuccessResponseWithData creates a success response with data
func NewSuccessResponseWithData(data any) *SuccessResponse {
return &SuccessResponse{
Success: true,
Data: data,
}
}
// NewSuccessResponseWithMessage creates a success response with message
func NewSuccessResponseWithMessage(message string) *SuccessResponse {
return &SuccessResponse{
Success: true,
Message: message,
}
}