Files
Cyrene_v2/internal/channel/adapter/actor.go
T

72 lines
2.6 KiB
Go

package adapter
// Role is the strongly typed identity role the channel layer assigns to a
// message sender. It is derived from channel-level actor metadata (login state,
// account binding, group membership) by the strategy engine, never from prompt
// text. This is a project red line: identity resolution must not rely on
// natural-language hints.
type Role string
const (
// RoleOwner is the bound owner/primary account.
RoleOwner Role = "owner"
// RoleMember is a non-owner participant (for example a stranger in a group).
RoleMember Role = "member"
// RoleSystem is a system/synthetic sender (platform notice, bot).
RoleSystem Role = "system"
// RoleUnknown is a sender whose identity could not be determined.
RoleUnknown Role = "unknown"
)
// Valid reports whether r is one of the known roles.
func (r Role) Valid() bool {
switch r {
case RoleOwner, RoleMember, RoleSystem, RoleUnknown:
return true
default:
return false
}
}
// Actor is the strongly typed identity metadata attached to a message sender.
// The channel layer derives it from channel telemetry (login session, account
// binding, group membership) rather than from the message's free-text sender
// name. Owner detection and group isolation read this field, not prompt text.
type Actor struct {
// Role is the resolved identity role.
Role Role
// UserID is the stable platform user identifier.
UserID string
// DisplayName is the human-readable sender name, used for display only.
DisplayName string
// IsGroup is true when the actor represents a group/room conversation
// rather than a single user.
IsGroup bool
// GroupID is the group identifier, set when IsGroup is true.
GroupID string
// GroupName is the human-readable group name, used for display only.
GroupName string
}
// IsOwner reports whether the actor is the bound owner account.
func (a Actor) IsOwner() bool { return a.Role == RoleOwner }
// IsGroupChat reports whether the actor represents a group conversation.
func (a Actor) IsGroupChat() bool { return a.IsGroup }
// IsSystem reports whether the actor is a system/synthetic sender.
func (a Actor) IsSystem() bool { return a.Role == RoleSystem }
// IsUnknown reports whether the actor's role could not be determined.
func (a Actor) IsUnknown() bool { return a.Role == RoleUnknown }
// Resolve is a pure helper that infers IsGroup and the group identity from the
// GroupID when the channel layer has not set them explicitly, so adapters can
// populate a minimal Actor and still get correct group flags.
func (a Actor) Resolve() Actor {
if a.GroupID != "" {
a.IsGroup = true
}
return a
}