feat: 完整游戏运维功能

This commit is contained in:
npc0-hue
2026-07-18 09:04:01 +08:00
parent f3b14b7945
commit 48b8ad8d6c
187 changed files with 16607 additions and 1140 deletions
+237 -146
View File
@@ -93,6 +93,7 @@ type AuthSessionResponse struct {
SessionID string `json:"sessionId,omitempty"`
Status string `json:"status"`
Message string `json:"message,omitempty"`
ExpiresAt time.Time `json:"expiresAt,omitempty"`
}
type AIProviderCreateRequest struct {
@@ -125,17 +126,17 @@ type AIProviderStatusRequest struct {
}
type AIProviderResponse struct {
ID string `json:"id"`
Name string `json:"name"`
Kind domain.AIProviderKind `json:"kind"`
BaseURL string `json:"baseUrl"`
APIKeyRef string `json:"apiKeyRef"`
Models []string `json:"models"`
DefaultModel string `json:"defaultModel,omitempty"`
RelayMode domain.AIRelayMode `json:"relayMode"`
TimeoutMS int `json:"timeoutMs"`
Status domain.AIProviderStatus `json:"status"`
RedactionPolicy string `json:"redactionPolicy"`
ID string `json:"id"`
Name string `json:"name"`
Kind domain.AIProviderKind `json:"kind"`
BaseURL string `json:"baseUrl"`
APIKeyConfigured bool `json:"apiKeyConfigured"`
Models []string `json:"models"`
DefaultModel string `json:"defaultModel,omitempty"`
RelayMode domain.AIRelayMode `json:"relayMode"`
TimeoutMS int `json:"timeoutMs"`
Status domain.AIProviderStatus `json:"status"`
RedactionPolicy string `json:"redactionPolicy"`
}
type AIProviderListResponse struct {
@@ -206,20 +207,21 @@ type GamePluginRemoteAccessBody struct {
}
type GamePluginManifestBody struct {
ID string `json:"id"`
Name string `json:"name"`
Description string `json:"description,omitempty"`
Version string `json:"version"`
Kind string `json:"kind"`
Tags []string `json:"tags,omitempty"`
Server GamePluginManifestServerBody `json:"server"`
Bridge GamePluginBridgeBody `json:"bridge,omitempty"`
Capabilities []string `json:"capabilities"`
Permissions []string `json:"permissions"`
Actions PluginLifecycleActionsBody `json:"actions"`
Pages []GamePluginPageBody `json:"pages,omitempty"`
AI GamePluginManifestAIBody `json:"ai,omitempty"`
RemoteAccess GamePluginRemoteAccessBody `json:"remoteAccess,omitempty"`
ID string `json:"id"`
Name string `json:"name"`
Description string `json:"description,omitempty"`
Version string `json:"version"`
Kind string `json:"kind"`
Tags []string `json:"tags,omitempty"`
Server GamePluginManifestServerBody `json:"server"`
Bridge GamePluginBridgeBody `json:"bridge,omitempty"`
Capabilities []string `json:"capabilities"`
Permissions []string `json:"permissions"`
Actions PluginLifecycleActionsBody `json:"actions"`
Pages []GamePluginPageBody `json:"pages,omitempty"`
AI GamePluginManifestAIBody `json:"ai,omitempty"`
RemoteAccess GamePluginRemoteAccessBody `json:"remoteAccess,omitempty"`
RuntimeProfiles GamePluginRuntimeProfilesBody `json:"runtimeProfiles,omitempty"`
}
type GamePluginManifestRegistrationRequest struct {
@@ -228,48 +230,50 @@ type GamePluginManifestRegistrationRequest struct {
}
type GamePluginCreateRequest struct {
ID string `json:"id"`
Name string `json:"name"`
Description string `json:"description,omitempty"`
Version string `json:"version"`
ServerType string `json:"serverType"`
ServerDisplayName string `json:"serverDisplayName,omitempty"`
SupportedOS []string `json:"supportedOs,omitempty"`
ManifestRef string `json:"manifestRef"`
CreateFormSchemaRef string `json:"createFormSchemaRef"`
RequiredRunCapabilities []string `json:"requiredRunCapabilities"`
DeclaredPermissions []string `json:"declaredPermissions,omitempty"`
Permissions PluginPermissionsResponse `json:"permissions"`
LifecycleActions PluginLifecycleActionsBody `json:"lifecycleActions,omitempty"`
BridgeActions []string `json:"bridgeActions,omitempty"`
Pages []GamePluginPageBody `json:"pages,omitempty"`
Tags []string `json:"tags,omitempty"`
AIPurposes []string `json:"aiPurposes,omitempty"`
RemoteAccess GamePluginRemoteAccessBody `json:"remoteAccess,omitempty"`
ValidationViolations []string `json:"validationViolations,omitempty"`
ID string `json:"id"`
Name string `json:"name"`
Description string `json:"description,omitempty"`
Version string `json:"version"`
ServerType string `json:"serverType"`
ServerDisplayName string `json:"serverDisplayName,omitempty"`
SupportedOS []string `json:"supportedOs,omitempty"`
ManifestRef string `json:"manifestRef"`
CreateFormSchemaRef string `json:"createFormSchemaRef"`
RequiredRunCapabilities []string `json:"requiredRunCapabilities"`
DeclaredPermissions []string `json:"declaredPermissions,omitempty"`
Permissions PluginPermissionsResponse `json:"permissions"`
LifecycleActions PluginLifecycleActionsBody `json:"lifecycleActions,omitempty"`
BridgeActions []string `json:"bridgeActions,omitempty"`
Pages []GamePluginPageBody `json:"pages,omitempty"`
Tags []string `json:"tags,omitempty"`
AIPurposes []string `json:"aiPurposes,omitempty"`
RemoteAccess GamePluginRemoteAccessBody `json:"remoteAccess,omitempty"`
RuntimeProfiles GamePluginRuntimeProfilesBody `json:"runtimeProfiles,omitempty"`
ValidationViolations []string `json:"validationViolations,omitempty"`
}
type GamePluginResponse struct {
ID string `json:"id"`
Name string `json:"name"`
Description string `json:"description,omitempty"`
Version string `json:"version"`
ServerType string `json:"serverType"`
ServerDisplayName string `json:"serverDisplayName,omitempty"`
SupportedOS []string `json:"supportedOs,omitempty"`
ManifestRef string `json:"manifestRef"`
CreateFormSchemaRef string `json:"createFormSchemaRef"`
RequiredRunCapabilities []string `json:"requiredRunCapabilities"`
DeclaredPermissions []string `json:"declaredPermissions"`
Permissions PluginPermissionsResponse `json:"permissions"`
LifecycleActions PluginLifecycleActionsBody `json:"lifecycleActions"`
BridgeActions []string `json:"bridgeActions"`
Pages []GamePluginPageBody `json:"pages"`
Tags []string `json:"tags"`
AIPurposes []string `json:"aiPurposes"`
RemoteAccess GamePluginRemoteAccessBody `json:"remoteAccess,omitempty"`
ValidationViolations []string `json:"validationViolations,omitempty"`
Status domain.GamePluginStatus `json:"status"`
ID string `json:"id"`
Name string `json:"name"`
Description string `json:"description,omitempty"`
Version string `json:"version"`
ServerType string `json:"serverType"`
ServerDisplayName string `json:"serverDisplayName,omitempty"`
SupportedOS []string `json:"supportedOs,omitempty"`
ManifestRef string `json:"manifestRef"`
CreateFormSchemaRef string `json:"createFormSchemaRef"`
RequiredRunCapabilities []string `json:"requiredRunCapabilities"`
DeclaredPermissions []string `json:"declaredPermissions"`
Permissions PluginPermissionsResponse `json:"permissions"`
LifecycleActions PluginLifecycleActionsBody `json:"lifecycleActions"`
BridgeActions []string `json:"bridgeActions"`
Pages []GamePluginPageBody `json:"pages"`
Tags []string `json:"tags"`
AIPurposes []string `json:"aiPurposes"`
RemoteAccess GamePluginRemoteAccessBody `json:"remoteAccess,omitempty"`
RuntimeProfiles GamePluginRuntimeProfilesBody `json:"runtimeProfiles,omitempty"`
ValidationViolations []string `json:"validationViolations,omitempty"`
Status domain.GamePluginStatus `json:"status"`
}
type GamePluginListResponse struct {
@@ -278,27 +282,28 @@ type GamePluginListResponse struct {
}
type MarketplacePluginResponse struct {
ID string `json:"id"`
Name string `json:"name"`
Description string `json:"description,omitempty"`
Version string `json:"version"`
ServerType string `json:"serverType"`
ServerDisplayName string `json:"serverDisplayName,omitempty"`
SupportedOS []string `json:"supportedOs,omitempty"`
ManifestRef string `json:"manifestRef"`
CreateFormSchemaRef string `json:"createFormSchemaRef"`
Capabilities []string `json:"capabilities"`
DeclaredPermissions []string `json:"declaredPermissions"`
Permissions PluginPermissionsResponse `json:"permissions"`
LifecycleActions PluginLifecycleActionsBody `json:"lifecycleActions"`
BridgeActions []string `json:"bridgeActions"`
Pages []GamePluginPageBody `json:"pages"`
Tags []string `json:"tags"`
AIPurposes []string `json:"aiPurposes"`
RemoteAccess GamePluginRemoteAccessBody `json:"remoteAccess,omitempty"`
ValidationViolations []string `json:"validationViolations,omitempty"`
Status domain.GamePluginStatus `json:"status"`
Source string `json:"source"`
ID string `json:"id"`
Name string `json:"name"`
Description string `json:"description,omitempty"`
Version string `json:"version"`
ServerType string `json:"serverType"`
ServerDisplayName string `json:"serverDisplayName,omitempty"`
SupportedOS []string `json:"supportedOs,omitempty"`
ManifestRef string `json:"manifestRef"`
CreateFormSchemaRef string `json:"createFormSchemaRef"`
Capabilities []string `json:"capabilities"`
DeclaredPermissions []string `json:"declaredPermissions"`
Permissions PluginPermissionsResponse `json:"permissions"`
LifecycleActions PluginLifecycleActionsBody `json:"lifecycleActions"`
BridgeActions []string `json:"bridgeActions"`
Pages []GamePluginPageBody `json:"pages"`
Tags []string `json:"tags"`
AIPurposes []string `json:"aiPurposes"`
RemoteAccess GamePluginRemoteAccessBody `json:"remoteAccess,omitempty"`
RuntimeProfiles GamePluginRuntimeProfilesBody `json:"runtimeProfiles,omitempty"`
ValidationViolations []string `json:"validationViolations,omitempty"`
Status domain.GamePluginStatus `json:"status"`
Source string `json:"source"`
}
type MarketplacePluginListResponse struct {
@@ -389,17 +394,20 @@ type ServerMemberListResponse struct {
}
type ServerInstanceResponse struct {
ID string `json:"id"`
PluginID string `json:"pluginId"`
PluginVersion string `json:"pluginVersion"`
RunEndpointID string `json:"runEndpointId"`
Name string `json:"name"`
OwnerUserID string `json:"ownerUserId,omitempty"`
AdminUserIDs []string `json:"adminUserIds"`
State domain.ServerInstanceState `json:"state"`
ConfigVersion int `json:"configVersion"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
ID string `json:"id"`
PluginID string `json:"pluginId"`
PluginVersion string `json:"pluginVersion"`
RunEndpointID string `json:"runEndpointId"`
Name string `json:"name"`
OwnerUserID string `json:"ownerUserId,omitempty"`
AdminUserIDs []string `json:"adminUserIds"`
State domain.ServerInstanceState `json:"state"`
ConfigVersion int `json:"configVersion"`
ConfigKey string `json:"configKey,omitempty"`
ConfigChecksum string `json:"configChecksum,omitempty"`
ConfigUpdatedAt *time.Time `json:"configUpdatedAt,omitempty"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
}
type ServerInstanceListResponse struct {
@@ -440,6 +448,7 @@ type ServerConfigResponse struct {
Format string `json:"format"`
Key string `json:"key,omitempty"`
Content string `json:"content"`
Checksum string `json:"checksum"`
Source string `json:"source,omitempty"`
UpdatedAt time.Time `json:"updatedAt"`
}
@@ -453,6 +462,7 @@ type ConfigDiffLineResponse struct {
type ServerConfigDiffPreviewRequest struct {
ExpectedConfigVersion int `json:"expectedConfigVersion"`
ExpectedChecksum string `json:"expectedChecksum,omitempty"`
Key string `json:"key"`
ProposedContent string `json:"proposedContent,omitempty"`
ProposedContentInputRef string `json:"proposedContentInputRef,omitempty"`
@@ -461,6 +471,7 @@ type ServerConfigDiffPreviewRequest struct {
type ServerConfigDiffPreviewResponse struct {
ServerInstanceID string `json:"serverInstanceId"`
ConfigVersion int `json:"configVersion"`
Checksum string `json:"checksum"`
Key string `json:"key"`
CurrentContent string `json:"currentContent"`
ProposedContent string `json:"proposedContent,omitempty"`
@@ -473,6 +484,7 @@ type ServerConfigDiffPreviewResponse struct {
type ServerConfigWriteApprovalRequest struct {
ExpectedConfigVersion int `json:"expectedConfigVersion"`
ExpectedChecksum string `json:"expectedChecksum,omitempty"`
Key string `json:"key"`
ProposedContent string `json:"proposedContent,omitempty"`
ProposedContentInputRef string `json:"proposedContentInputRef,omitempty"`
@@ -491,7 +503,9 @@ type FileOperationDispatchRequest struct {
Operation domain.FileOperationKind `json:"operation"`
Key string `json:"key"`
InputRef string `json:"inputRef,omitempty"`
Content string `json:"content,omitempty"`
ExpectedConfigVersion int `json:"expectedConfigVersion,omitempty"`
ExpectedChecksum string `json:"expectedChecksum,omitempty"`
IdempotencyKey string `json:"idempotencyKey"`
}
@@ -516,6 +530,8 @@ type RunEndpointCreateRequest struct {
ID string `json:"id"`
DisplayName string `json:"displayName"`
Version string `json:"version"`
Platform string `json:"platform,omitempty"`
Architecture string `json:"architecture,omitempty"`
Status domain.RunEndpointStatus `json:"status"`
Capabilities []string `json:"capabilities"`
Capacity RunCapacityResponse `json:"capacity"`
@@ -526,6 +542,8 @@ type RunEndpointResponse struct {
ID string `json:"id"`
DisplayName string `json:"displayName"`
Version string `json:"version"`
Platform string `json:"platform,omitempty"`
Architecture string `json:"architecture,omitempty"`
Status domain.RunEndpointStatus `json:"status"`
Capabilities []string `json:"capabilities"`
Capacity RunCapacityResponse `json:"capacity"`
@@ -553,19 +571,49 @@ type JobProgressBody struct {
Message string `json:"message,omitempty"`
}
type JobRetryPolicyResponse struct {
MaxAttempts int `json:"maxAttempts"`
InitialBackoffSeconds int `json:"initialBackoffSeconds"`
MaxBackoffSeconds int `json:"maxBackoffSeconds"`
}
type JobResponse struct {
ID string `json:"id"`
ServerInstanceID string `json:"serverInstanceId,omitempty"`
RunEndpointID string `json:"runEndpointId"`
Capability string `json:"capability"`
TargetKey string `json:"targetKey,omitempty"`
InputRef string `json:"inputRef,omitempty"`
IdempotencyKey string `json:"idempotencyKey"`
State domain.JobState `json:"state"`
Progress JobProgressBody `json:"progress"`
ResultRef string `json:"resultRef,omitempty"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
ID string `json:"id"`
ServerInstanceID string `json:"serverInstanceId,omitempty"`
RunEndpointID string `json:"runEndpointId"`
Capability string `json:"capability"`
TargetKey string `json:"targetKey,omitempty"`
InputRef string `json:"inputRef,omitempty"`
IdempotencyKey string `json:"idempotencyKey"`
State domain.JobState `json:"state"`
Progress JobProgressBody `json:"progress"`
ResultRef string `json:"resultRef,omitempty"`
ExecutionResult JobExecutionResultResponse `json:"executionResult,omitempty"`
RetryPolicy JobRetryPolicyResponse `json:"retryPolicy"`
Attempt int `json:"attempt"`
NextAttemptAt *time.Time `json:"nextAttemptAt,omitempty"`
AckDeadlineAt *time.Time `json:"ackDeadlineAt,omitempty"`
LeaseExpiresAt *time.Time `json:"leaseExpiresAt,omitempty"`
CancelReason string `json:"cancelReason,omitempty"`
CancelRequestedAt *time.Time `json:"cancelRequestedAt,omitempty"`
CancelCompletedAt *time.Time `json:"cancelCompletedAt,omitempty"`
TerminalAt *time.Time `json:"terminalAt,omitempty"`
LastReconciledAt *time.Time `json:"lastReconciledAt,omitempty"`
ReconcileCount int `json:"reconcileCount"`
ReconcileOutcome string `json:"reconcileOutcome,omitempty"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
}
type JobExecutionResultResponse struct {
Kind string `json:"kind,omitempty"`
ProcessState string `json:"processState,omitempty"`
ExitClassification string `json:"exitClassification,omitempty"`
ExitCode int `json:"exitCode,omitempty"`
Version int `json:"version,omitempty"`
Checksum string `json:"checksum,omitempty"`
SizeBytes int64 `json:"sizeBytes,omitempty"`
AuditSummary string `json:"auditSummary,omitempty"`
}
type JobListResponse struct {
@@ -768,20 +816,21 @@ func (request GamePluginManifestRegistrationRequest) ToDomain() domain.GamePlugi
return domain.GamePluginManifestRegistration{
ManifestRef: request.ManifestRef,
Manifest: domain.GamePluginManifest{
ID: request.Manifest.ID,
Name: request.Manifest.Name,
Description: request.Manifest.Description,
Version: request.Manifest.Version,
Kind: request.Manifest.Kind,
Tags: domain.CopyStringSlice(request.Manifest.Tags),
Server: request.Manifest.Server.ToDomain(),
Bridge: request.Manifest.Bridge.ToDomain(),
Capabilities: domain.CopyStringSlice(request.Manifest.Capabilities),
Permissions: domain.CopyStringSlice(request.Manifest.Permissions),
Actions: request.Manifest.Actions.ToDomain(),
Pages: pagesToDomain(request.Manifest.Pages),
AI: request.Manifest.AI.ToDomain(),
RemoteAccess: request.Manifest.RemoteAccess.ToDomain(),
ID: request.Manifest.ID,
Name: request.Manifest.Name,
Description: request.Manifest.Description,
Version: request.Manifest.Version,
Kind: request.Manifest.Kind,
Tags: domain.CopyStringSlice(request.Manifest.Tags),
Server: request.Manifest.Server.ToDomain(),
Bridge: request.Manifest.Bridge.ToDomain(),
Capabilities: domain.CopyStringSlice(request.Manifest.Capabilities),
Permissions: domain.CopyStringSlice(request.Manifest.Permissions),
Actions: request.Manifest.Actions.ToDomain(),
Pages: pagesToDomain(request.Manifest.Pages),
AI: request.Manifest.AI.ToDomain(),
RemoteAccess: request.Manifest.RemoteAccess.ToDomain(),
RuntimeProfiles: request.Manifest.RuntimeProfiles.ToDomain(),
},
}
}
@@ -843,6 +892,7 @@ func (request GamePluginCreateRequest) ToDomain() domain.GamePlugin {
Tags: domain.CopyStringSlice(request.Tags),
AIPurposes: domain.CopyStringSlice(request.AIPurposes),
RemoteAccess: request.RemoteAccess.ToDomain(),
RuntimeProfiles: request.RuntimeProfiles.ToDomain(),
ValidationViolations: domain.CopyStringSlice(request.ValidationViolations),
}
}
@@ -867,6 +917,7 @@ func (request ServerConfigDiffPreviewRequest) ToDomain(serverInstanceID string)
return domain.ServerConfigDiffRequest{
ServerInstanceID: serverInstanceID,
ExpectedConfigVersion: request.ExpectedConfigVersion,
ExpectedChecksum: request.ExpectedChecksum,
Key: request.Key,
ProposedContent: request.ProposedContent,
ProposedContentInputRef: request.ProposedContentInputRef,
@@ -877,6 +928,7 @@ func (request ServerConfigWriteApprovalRequest) ToDomain(serverInstanceID string
return domain.ServerConfigWriteApproval{
ServerInstanceID: serverInstanceID,
ExpectedConfigVersion: request.ExpectedConfigVersion,
ExpectedChecksum: request.ExpectedChecksum,
Key: request.Key,
ProposedContent: request.ProposedContent,
ProposedContentInputRef: request.ProposedContentInputRef,
@@ -891,7 +943,9 @@ func (request FileOperationDispatchRequest) ToDomain() domain.FileOperationDispa
Operation: request.Operation,
Key: request.Key,
InputRef: request.InputRef,
Content: request.Content,
ExpectedConfigVersion: request.ExpectedConfigVersion,
ExpectedChecksum: request.ExpectedChecksum,
IdempotencyKey: request.IdempotencyKey,
}
}
@@ -901,6 +955,8 @@ func (request RunEndpointCreateRequest) ToDomain() domain.RunEndpoint {
ID: request.ID,
DisplayName: request.DisplayName,
Version: request.Version,
Platform: request.Platform,
Architecture: request.Architecture,
Status: request.Status,
Capabilities: domain.CopyStringSlice(request.Capabilities),
Capacity: capacityToDomain(request.Capacity),
@@ -988,6 +1044,7 @@ func AuthSessionFromDomain(session domain.AuthSession) AuthSessionResponse {
SessionID: session.SessionID,
Status: session.Status,
Message: session.Message,
ExpiresAt: session.ExpiresAt,
}
}
@@ -1016,17 +1073,17 @@ func UserListFromDomain(users []domain.User) UserListResponse {
func AIProviderFromDomain(provider domain.AIProvider) AIProviderResponse {
provider = domain.CopyAIProvider(provider)
return AIProviderResponse{
ID: provider.ID,
Name: provider.Name,
Kind: provider.Kind,
BaseURL: provider.BaseURL,
APIKeyRef: provider.APIKeyRef,
Models: provider.Models,
DefaultModel: provider.DefaultModel,
RelayMode: provider.RelayMode,
TimeoutMS: provider.TimeoutMS,
Status: provider.Status,
RedactionPolicy: provider.RedactionPolicy,
ID: provider.ID,
Name: provider.Name,
Kind: provider.Kind,
BaseURL: provider.BaseURL,
APIKeyConfigured: provider.APIKeyRef != "",
Models: provider.Models,
DefaultModel: provider.DefaultModel,
RelayMode: provider.RelayMode,
TimeoutMS: provider.TimeoutMS,
Status: provider.Status,
RedactionPolicy: provider.RedactionPolicy,
}
}
@@ -1079,6 +1136,7 @@ func GamePluginFromDomain(plugin domain.GamePlugin) GamePluginResponse {
Tags: plugin.Tags,
AIPurposes: plugin.AIPurposes,
RemoteAccess: remoteAccessFromDomain(plugin.RemoteAccess),
RuntimeProfiles: runtimeProfilesFromDomain(plugin.RuntimeProfiles),
ValidationViolations: plugin.ValidationViolations,
Status: plugin.Status,
}
@@ -1167,6 +1225,7 @@ func MarketplacePluginFromDomain(plugin domain.PluginMarketplacePlugin) Marketpl
Tags: plugin.Tags,
AIPurposes: plugin.AIPurposes,
RemoteAccess: remoteAccessFromDomain(plugin.RemoteAccess),
RuntimeProfiles: runtimeProfilesFromDomain(plugin.RuntimeProfiles),
ValidationViolations: plugin.ValidationViolations,
Status: plugin.Status,
Source: plugin.Source,
@@ -1188,17 +1247,20 @@ func ServerInstanceFromDomain(instance domain.ServerInstance) ServerInstanceResp
adminUserIDs = []string{}
}
return ServerInstanceResponse{
ID: instance.ID,
PluginID: instance.PluginID,
PluginVersion: instance.PluginVersion,
RunEndpointID: instance.RunEndpointID,
Name: instance.Name,
OwnerUserID: instance.OwnerUserID,
AdminUserIDs: adminUserIDs,
State: instance.State,
ConfigVersion: instance.ConfigVersion,
CreatedAt: instance.CreatedAt,
UpdatedAt: instance.UpdatedAt,
ID: instance.ID,
PluginID: instance.PluginID,
PluginVersion: instance.PluginVersion,
RunEndpointID: instance.RunEndpointID,
Name: instance.Name,
OwnerUserID: instance.OwnerUserID,
AdminUserIDs: adminUserIDs,
State: instance.State,
ConfigVersion: instance.ConfigVersion,
ConfigKey: instance.ConfigKey,
ConfigChecksum: instance.ConfigChecksum,
ConfigUpdatedAt: optionalTime(instance.ConfigUpdatedAt),
CreatedAt: instance.CreatedAt,
UpdatedAt: instance.UpdatedAt,
}
}
@@ -1274,6 +1336,7 @@ func ServerConfigFromDomain(config domain.ServerConfig) ServerConfigResponse {
Format: config.Format,
Key: config.Key,
Content: config.Content,
Checksum: config.Checksum,
Source: config.Source,
UpdatedAt: config.UpdatedAt,
}
@@ -1293,6 +1356,7 @@ func ServerConfigDiffPreviewFromDomain(preview domain.ServerConfigDiffPreview) S
return ServerConfigDiffPreviewResponse{
ServerInstanceID: preview.ServerInstanceID,
ConfigVersion: preview.ConfigVersion,
Checksum: preview.Checksum,
Key: preview.Key,
CurrentContent: preview.CurrentContent,
ProposedContent: preview.ProposedContent,
@@ -1332,6 +1396,8 @@ func RunEndpointFromDomain(endpoint domain.RunEndpoint) RunEndpointResponse {
ID: endpoint.ID,
DisplayName: endpoint.DisplayName,
Version: endpoint.Version,
Platform: endpoint.Platform,
Architecture: endpoint.Architecture,
Status: endpoint.Status,
Capabilities: endpoint.Capabilities,
Capacity: capacityFromDomain(endpoint.Capacity),
@@ -1359,11 +1425,36 @@ func JobFromDomain(job domain.Job) JobResponse {
State: job.State,
Progress: progressFromDomain(job.Progress),
ResultRef: job.ResultRef,
CreatedAt: job.CreatedAt,
UpdatedAt: job.UpdatedAt,
ExecutionResult: JobExecutionResultResponse{Kind: job.ExecutionResult.Kind, ProcessState: job.ExecutionResult.ProcessState, ExitClassification: job.ExecutionResult.ExitClassification, ExitCode: job.ExecutionResult.ExitCode, Version: job.ExecutionResult.Version, Checksum: job.ExecutionResult.Checksum, SizeBytes: job.ExecutionResult.SizeBytes, AuditSummary: job.ExecutionResult.AuditSummary},
RetryPolicy: JobRetryPolicyResponse{
MaxAttempts: job.RetryPolicy.MaxAttempts,
InitialBackoffSeconds: job.RetryPolicy.InitialBackoffSeconds,
MaxBackoffSeconds: job.RetryPolicy.MaxBackoffSeconds,
},
Attempt: job.Attempt,
NextAttemptAt: optionalTime(job.NextAttemptAt),
AckDeadlineAt: optionalTime(job.AckDeadlineAt),
LeaseExpiresAt: optionalTime(job.LeaseExpiresAt),
CancelReason: job.CancelReason,
CancelRequestedAt: optionalTime(job.CancelRequestedAt),
CancelCompletedAt: optionalTime(job.CancelCompletedAt),
TerminalAt: optionalTime(job.TerminalAt),
LastReconciledAt: optionalTime(job.LastReconciledAt),
ReconcileCount: job.ReconcileCount,
ReconcileOutcome: job.ReconcileOutcome,
CreatedAt: job.CreatedAt,
UpdatedAt: job.UpdatedAt,
}
}
func optionalTime(value time.Time) *time.Time {
if value.IsZero() {
return nil
}
copy := value
return &copy
}
func JobListFromDomain(jobs []domain.Job) JobListResponse {
items := make([]JobResponse, len(jobs))
for i, job := range jobs {