package domain import "time" // MetricSample is a bounded, platform-owned observation for one server instance. type MetricSample struct { ID string ServerInstanceID string RunEndpointID string Online bool PlayerCount *int MaxPlayers *int TPS *float64 LatencyMS *float64 CPUPercent *float64 MemoryPercent *float64 DiskPercent *float64 Source string CollectedAt time.Time } type MetricSampleFilter struct { ServerInstanceID string After time.Time Before time.Time Limit int } type MetricBatchIngest struct { RunEndpointID string SessionToken string Samples []MetricSample } type MetricBatchIngestResult struct { Accepted bool AcceptedCount int LatestAt time.Time ServerTime time.Time } type BackupState string const ( BackupStatePending BackupState = "pending" BackupStateAvailable BackupState = "available" BackupStateFailed BackupState = "failed" BackupStateExpired BackupState = "expired" ) type BackupRecord struct { ID string ServerInstanceID string ArtifactID string Checksum string SizeBytes int64 State BackupState RecoveryStatus string RetentionUntil time.Time CreatedAt time.Time UpdatedAt time.Time } type BackupFilter struct { ServerInstanceID string State BackupState } type RemoteAdapterKind string const ( RemoteAdapterFTP RemoteAdapterKind = "ftp" RemoteAdapterRsync RemoteAdapterKind = "rsync" RemoteAdapterRunFile RemoteAdapterKind = "run-file" RemoteAdapterRunProcess RemoteAdapterKind = "run-process" RemoteAdapterDatabase RemoteAdapterKind = "database" RemoteAdapterRCON RemoteAdapterKind = "rcon" ) type RemoteAdapterDeclaration struct { Key string Kind RemoteAdapterKind TargetKeys []string Capabilities []string TimeoutSeconds int MaxAttempts int } type RemoteAdapterRequest struct { ServerInstanceID string DeclarationKey string TargetKey string Capability string TimeoutSeconds int MaxAttempts int IdempotencyKey string InputRef string Inputs map[string]string PlatformScheduled bool SQLiteSchemaProbe *SCUMSchemaProbeRequest } type RemoteAdapterResult struct { RequestID string ServerInstanceID string DeclarationKey string TargetKey string Kind RemoteAdapterKind Status string Retryable bool Message string ResultRef string AuditEventID string CompletedAt time.Time } type SourceRCONCommandKind string const ( SourceRCONCommandKindChat SourceRCONCommandKind = "chat" SourceRCONCommandKindCommand SourceRCONCommandKind = "command" ) // SourceRCONCommandRequest is intentionally transient: Command and Message // are consumed by the service broker and are never copied into a durable Job. type SourceRCONCommandRequest struct { ServerInstanceID string Kind SourceRCONCommandKind ChatType int Message string TargetSteamID string Command string IdempotencyKey string } type SourceRCONCommandDispatch struct { JobID string ServerInstanceID string Status string Message string } func CopyMetricSample(sample MetricSample) MetricSample { sample.PlayerCount = copyIntPtr(sample.PlayerCount) sample.MaxPlayers = copyIntPtr(sample.MaxPlayers) sample.TPS = copyFloatPtr(sample.TPS) sample.LatencyMS = copyFloatPtr(sample.LatencyMS) sample.CPUPercent = copyFloatPtr(sample.CPUPercent) sample.MemoryPercent = copyFloatPtr(sample.MemoryPercent) sample.DiskPercent = copyFloatPtr(sample.DiskPercent) return sample } func copyIntPtr(value *int) *int { if value == nil { return nil } copy := *value return © } func copyFloatPtr(value *float64) *float64 { if value == nil { return nil } copy := *value return © } func CopyMetricSamples(samples []MetricSample) []MetricSample { if samples == nil { return nil } out := make([]MetricSample, len(samples)) for i, sample := range samples { out[i] = CopyMetricSample(sample) } return out } func CopyMetricBatchIngest(batch MetricBatchIngest) MetricBatchIngest { batch.Samples = CopyMetricSamples(batch.Samples) return batch } func CopyBackupRecord(record BackupRecord) BackupRecord { return record } func CopyBackupRecords(records []BackupRecord) []BackupRecord { if records == nil { return nil } out := make([]BackupRecord, len(records)) copy(out, records) return out } func CopyRemoteAdapterDeclaration(declaration RemoteAdapterDeclaration) RemoteAdapterDeclaration { declaration.TargetKeys = CopyStringSlice(declaration.TargetKeys) declaration.Capabilities = CopyStringSlice(declaration.Capabilities) return declaration } func CopyRemoteAdapterDeclarations(declarations []RemoteAdapterDeclaration) []RemoteAdapterDeclaration { if declarations == nil { return nil } out := make([]RemoteAdapterDeclaration, len(declarations)) for i, declaration := range declarations { out[i] = CopyRemoteAdapterDeclaration(declaration) } return out } func CopyRemoteAdapterRequest(request RemoteAdapterRequest) RemoteAdapterRequest { request.Inputs = CopyStringMap(request.Inputs) request.SQLiteSchemaProbe = CopySCUMSchemaProbeRequestPtr(request.SQLiteSchemaProbe) return request } func CopyRemoteAdapterResult(result RemoteAdapterResult) RemoteAdapterResult { return result } func CopySourceRCONCommandRequest(request SourceRCONCommandRequest) SourceRCONCommandRequest { return request } func CopySourceRCONCommandDispatch(dispatch SourceRCONCommandDispatch) SourceRCONCommandDispatch { return dispatch }