166 lines
7.1 KiB
Go
166 lines
7.1 KiB
Go
|
|
// Package models defines the domain types and API contracts for the
|
||
|
|
// Control Center Go backend. These types map to the existing TypeScript
|
||
|
|
// AgentCardData interface and extend it with persistence-focused types
|
||
|
|
// for the new session, task, and project entities.
|
||
|
|
//
|
||
|
|
// All JSON field names use camelCase to match the existing frontend
|
||
|
|
// contract established by the .NET backend.
|
||
|
|
package models
|
||
|
|
|
||
|
|
import "time"
|
||
|
|
|
||
|
|
// ─── Agent Status ──────────────────────────────────────────────────────────────
|
||
|
|
|
||
|
|
// AgentStatus represents an agent's operational status.
|
||
|
|
// Maps to the frontend status values: active, idle, thinking, error.
|
||
|
|
type AgentStatus string
|
||
|
|
|
||
|
|
const (
|
||
|
|
AgentStatusActive AgentStatus = "active"
|
||
|
|
AgentStatusIdle AgentStatus = "idle"
|
||
|
|
AgentStatusThinking AgentStatus = "thinking"
|
||
|
|
AgentStatusError AgentStatus = "error"
|
||
|
|
)
|
||
|
|
|
||
|
|
// IsValid reports whether s is a known agent status.
|
||
|
|
func (s AgentStatus) IsValid() bool {
|
||
|
|
switch s {
|
||
|
|
case AgentStatusActive, AgentStatusIdle, AgentStatusThinking, AgentStatusError:
|
||
|
|
return true
|
||
|
|
default:
|
||
|
|
return false
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// ─── Agent ─────────────────────────────────────────────────────────────────────
|
||
|
|
|
||
|
|
// AgentCardData is the primary data shape consumed by the Command Hub frontend.
|
||
|
|
// It matches the TypeScript AgentCardData interface exactly.
|
||
|
|
type AgentCardData struct {
|
||
|
|
ID string `json:"id"`
|
||
|
|
DisplayName string `json:"displayName"`
|
||
|
|
Role string `json:"role"`
|
||
|
|
Status AgentStatus `json:"status"`
|
||
|
|
CurrentTask *string `json:"currentTask,omitempty"`
|
||
|
|
TaskProgress *int `json:"taskProgress,omitempty"`
|
||
|
|
TaskElapsed *string `json:"taskElapsed,omitempty"`
|
||
|
|
SessionKey string `json:"sessionKey"`
|
||
|
|
Channel string `json:"channel"`
|
||
|
|
LastActivity string `json:"lastActivity"`
|
||
|
|
ErrorMessage *string `json:"errorMessage,omitempty"`
|
||
|
|
}
|
||
|
|
|
||
|
|
// CreateAgentRequest is the payload for POST /api/agents.
|
||
|
|
type CreateAgentRequest struct {
|
||
|
|
ID string `json:"id" validate:"required,min=2,max=64"`
|
||
|
|
DisplayName string `json:"displayName" validate:"required,min=1,max=128"`
|
||
|
|
Role string `json:"role" validate:"required,min=1,max=256"`
|
||
|
|
Status AgentStatus `json:"status" validate:"required,agentStatus"`
|
||
|
|
SessionKey string `json:"sessionKey" validate:"required,min=1"`
|
||
|
|
Channel string `json:"channel" validate:"required,min=1,max=32"`
|
||
|
|
CurrentTask *string `json:"currentTask,omitempty"`
|
||
|
|
}
|
||
|
|
|
||
|
|
// UpdateAgentRequest is the payload for PUT /api/agents/{id}.
|
||
|
|
type UpdateAgentRequest struct {
|
||
|
|
Status *AgentStatus `json:"status,omitempty" validate:"omitempty,agentStatus"`
|
||
|
|
CurrentTask *string `json:"currentTask,omitempty"`
|
||
|
|
TaskProgress *int `json:"taskProgress,omitempty" validate:"omitempty,min=0,max=100"`
|
||
|
|
TaskElapsed *string `json:"taskElapsed,omitempty"`
|
||
|
|
Channel *string `json:"channel,omitempty" validate:"omitempty,min=1,max=32"`
|
||
|
|
ErrorMessage *string `json:"errorMessage,omitempty"`
|
||
|
|
}
|
||
|
|
|
||
|
|
// AgentStatusHistoryEntry represents a point-in-time status change for an agent.
|
||
|
|
type AgentStatusHistoryEntry struct {
|
||
|
|
ID string `json:"id"`
|
||
|
|
AgentID string `json:"agentId"`
|
||
|
|
Status AgentStatus `json:"status"`
|
||
|
|
Task *string `json:"task,omitempty"`
|
||
|
|
Timestamp string `json:"timestamp"`
|
||
|
|
}
|
||
|
|
|
||
|
|
// ─── Session ───────────────────────────────────────────────────────────────────
|
||
|
|
|
||
|
|
// Session represents an active agent session tracked by the system.
|
||
|
|
type Session struct {
|
||
|
|
ID string `json:"id"`
|
||
|
|
SessionKey string `json:"sessionKey"`
|
||
|
|
AgentID string `json:"agentId"`
|
||
|
|
Channel string `json:"channel"`
|
||
|
|
Status string `json:"status"` // running, done, streaming, error
|
||
|
|
ContextTokens int `json:"contextTokens"`
|
||
|
|
TotalTokens int `json:"totalTokens"`
|
||
|
|
EstimatedCost float64 `json:"estimatedCost"`
|
||
|
|
Model string `json:"model"`
|
||
|
|
StartedAt time.Time `json:"startedAt"`
|
||
|
|
LastActivityAt time.Time `json:"lastActivityAt"`
|
||
|
|
}
|
||
|
|
|
||
|
|
// ─── Task ───────────────────────────────────────────────────────────────────────
|
||
|
|
|
||
|
|
// TaskStatus represents the lifecycle state of a tracked task.
|
||
|
|
type TaskStatus string
|
||
|
|
|
||
|
|
const (
|
||
|
|
TaskStatusPending TaskStatus = "pending"
|
||
|
|
TaskStatusRunning TaskStatus = "running"
|
||
|
|
TaskStatusCompleted TaskStatus = "completed"
|
||
|
|
TaskStatusFailed TaskStatus = "failed"
|
||
|
|
)
|
||
|
|
|
||
|
|
// Task represents a tracked task assigned to an agent.
|
||
|
|
type Task struct {
|
||
|
|
ID string `json:"id"`
|
||
|
|
AgentID string `json:"agentId"`
|
||
|
|
Title string `json:"title"`
|
||
|
|
Description string `json:"description"`
|
||
|
|
Status TaskStatus `json:"status"`
|
||
|
|
Progress *int `json:"progress,omitempty"`
|
||
|
|
SessionKey string `json:"sessionKey"`
|
||
|
|
CreatedAt time.Time `json:"createdAt"`
|
||
|
|
UpdatedAt time.Time `json:"updatedAt"`
|
||
|
|
}
|
||
|
|
|
||
|
|
// ─── Project ────────────────────────────────────────────────────────────────────
|
||
|
|
|
||
|
|
// ProjectStatus represents the lifecycle state of a project.
|
||
|
|
type ProjectStatus string
|
||
|
|
|
||
|
|
const (
|
||
|
|
ProjectStatusPlanned ProjectStatus = "planned"
|
||
|
|
ProjectStatusActive ProjectStatus = "active"
|
||
|
|
ProjectStatusPaused ProjectStatus = "paused"
|
||
|
|
ProjectStatusCompleted ProjectStatus = "completed"
|
||
|
|
)
|
||
|
|
|
||
|
|
// Project represents a project tracked in the system.
|
||
|
|
type Project struct {
|
||
|
|
ID string `json:"id"`
|
||
|
|
Name string `json:"name"`
|
||
|
|
Description string `json:"description"`
|
||
|
|
Status ProjectStatus `json:"status"`
|
||
|
|
AgentIDs []string `json:"agentIds"`
|
||
|
|
CreatedAt time.Time `json:"createdAt"`
|
||
|
|
UpdatedAt time.Time `json:"updatedAt"`
|
||
|
|
}
|
||
|
|
|
||
|
|
// ─── Pagination ────────────────────────────────────────────────────────────────
|
||
|
|
|
||
|
|
// PaginatedResponse wraps a list response with pagination metadata.
|
||
|
|
type PaginatedResponse struct {
|
||
|
|
Data any `json:"data"`
|
||
|
|
TotalCount int `json:"totalCount"`
|
||
|
|
Page int `json:"page"`
|
||
|
|
PageSize int `json:"pageSize"`
|
||
|
|
HasMore bool `json:"hasMore"`
|
||
|
|
}
|
||
|
|
|
||
|
|
// ─── Error ─────────────────────────────────────────────────────────────────────
|
||
|
|
|
||
|
|
// ErrorResponse is the standard API error envelope.
|
||
|
|
type ErrorResponse struct {
|
||
|
|
Error string `json:"error"`
|
||
|
|
Details map[string]string `json:"details,omitempty"`
|
||
|
|
}
|