项目文件夹

文件
litiantian03 3fe1418d5e feat(team): Multi-agent Team control plane across runtimes (Leader-mediated collaboration)
- Add migrations plus Team/Member/Task/Event APIs; Redis Streams consumer projects inbox/events into DB as source of truth
- Inject Team Secret (Redis URL, team token) via envFrom; shared RWX PVC at /team; sync ConfigMap roster to /team/team.json
- Create member Pods through InstanceService; extend K8s (PVC/Secret/Pod/ConfigMap); stale-task sweep and Team/member deletion with cleanup
- Add /teams, /teams/new, /teams/🆔 creation wizard (roster, presets, shared env/OpenClaw plan), per-member desktops, collaboration timeline, debug dispatch (defaults to Leader when target omitted)
2026-05-18 16:30:26 +08:00

125 行
5.5 KiB
Go

package models
import "time"
const (
TeamStatusCreating = "creating"
TeamStatusRunning = "running"
TeamStatusFailed = "failed"
TeamMemberStatusCreating = "creating"
TeamMemberStatusIdle = "idle"
TeamMemberStatusBusy = "busy"
TeamMemberStatusFailed = "failed"
TeamMemberStatusOffline = "offline"
TeamMemberStatusDeleting = "deleting"
TeamMemberStatusDeleted = "deleted"
TeamMemberAvailabilityUnknown = "unknown"
TeamMemberAvailabilityIdle = "idle"
TeamMemberAvailabilityBusy = "busy"
TeamMemberAvailabilityBlocked = "blocked"
TeamMemberAvailabilityOffline = "offline"
TeamStatusDeleting = "deleting"
TeamStatusDeleted = "deleted"
TeamTaskStatusPending = "pending"
TeamTaskStatusDispatched = "dispatched"
TeamTaskStatusRunning = "running"
TeamTaskStatusSucceeded = "succeeded"
TeamTaskStatusFailed = "failed"
TeamTaskStatusStale = "stale"
)
type Team struct {
ID int `db:"id,primarykey,autoincrement" json:"id"`
UserID int `db:"user_id" json:"user_id"`
Name string `db:"name" json:"name"`
Description *string `db:"description" json:"description,omitempty"`
Status string `db:"status" json:"status"`
CommunicationMode string `db:"communication_mode" json:"communication_mode"`
RedisURLSecretName *string `db:"redis_url_secret_name" json:"-"`
RedisURLSecretKey *string `db:"redis_url_secret_key" json:"-"`
TeamTokenSecretName *string `db:"team_token_secret_name" json:"-"`
TeamTokenSecretKey *string `db:"team_token_secret_key" json:"-"`
RedisEventsLastID string `db:"redis_events_last_id" json:"redis_events_last_id"`
SharedPVCName *string `db:"shared_pvc_name" json:"shared_pvc_name,omitempty"`
SharedPVCNamespace *string `db:"shared_pvc_namespace" json:"shared_pvc_namespace,omitempty"`
SharedMountPath string `db:"shared_mount_path" json:"shared_mount_path"`
StorageClass *string `db:"storage_class" json:"storage_class,omitempty"`
CreatedAt time.Time `db:"created_at" json:"created_at"`
UpdatedAt time.Time `db:"updated_at" json:"updated_at"`
}
func (Team) TableName() string {
return "teams"
}
type TeamMember struct {
ID int `db:"id,primarykey,autoincrement" json:"id"`
TeamID int `db:"team_id" json:"team_id"`
InstanceID *int `db:"instance_id" json:"instance_id,omitempty"`
UserID int `db:"user_id" json:"user_id"`
MemberKey string `db:"member_key" json:"member_key"`
DisplayName string `db:"display_name" json:"display_name"`
Role string `db:"role" json:"role"`
RuntimeType string `db:"runtime_type" json:"runtime_type"`
Description *string `db:"description" json:"description,omitempty"`
Status string `db:"status" json:"status"`
CurrentTaskID *int `db:"current_task_id" json:"current_task_id,omitempty"`
Progress int `db:"progress" json:"progress"`
LastSeenAt *time.Time `db:"last_seen_at" json:"last_seen_at,omitempty"`
Availability string `db:"availability" json:"availability"`
RuntimeStatus *string `db:"runtime_status" json:"runtime_status,omitempty"`
RuntimeTaskID *string `db:"runtime_task_id" json:"runtime_task_id,omitempty"`
RuntimeIntent *string `db:"runtime_intent" json:"runtime_intent,omitempty"`
BlockedReason *string `db:"blocked_reason" json:"blocked_reason,omitempty"`
LastSummary *string `db:"last_summary" json:"last_summary,omitempty"`
CreatedAt time.Time `db:"created_at" json:"created_at"`
UpdatedAt time.Time `db:"updated_at" json:"updated_at"`
}
func (TeamMember) TableName() string {
return "team_members"
}
type TeamTask struct {
ID int `db:"id,primarykey,autoincrement" json:"id"`
TeamID int `db:"team_id" json:"team_id"`
TargetMemberID int `db:"target_member_id" json:"target_member_id"`
CreatedBy *int `db:"created_by" json:"created_by,omitempty"`
MessageID string `db:"message_id" json:"message_id"`
Status string `db:"status" json:"status"`
PayloadJSON string `db:"payload_json" json:"-"`
ResultJSON *string `db:"result_json" json:"-"`
ErrorMessage *string `db:"error_message" json:"error_message,omitempty"`
RedisStreamID *string `db:"redis_stream_id" json:"redis_stream_id,omitempty"`
CreatedAt time.Time `db:"created_at" json:"created_at"`
DispatchedAt *time.Time `db:"dispatched_at" json:"dispatched_at,omitempty"`
StartedAt *time.Time `db:"started_at" json:"started_at,omitempty"`
FinishedAt *time.Time `db:"finished_at" json:"finished_at,omitempty"`
UpdatedAt time.Time `db:"updated_at" json:"updated_at"`
}
func (TeamTask) TableName() string {
return "team_tasks"
}
type TeamEvent struct {
ID int `db:"id,primarykey,autoincrement" json:"id"`
TeamID int `db:"team_id" json:"team_id"`
MemberID *int `db:"member_id" json:"member_id,omitempty"`
TaskID *int `db:"task_id" json:"task_id,omitempty"`
MessageID *string `db:"message_id" json:"message_id,omitempty"`
EventType string `db:"event_type" json:"event_type"`
PayloadJSON *string `db:"payload_json" json:"-"`
RedisStreamID *string `db:"redis_stream_id" json:"redis_stream_id,omitempty"`
OccurredAt *time.Time `db:"occurred_at" json:"occurred_at,omitempty"`
CreatedAt time.Time `db:"created_at" json:"created_at"`
}
func (TeamEvent) TableName() string {
return "team_events"
}