Files
run/protocol/job.go
T
2026-08-26 09:56:43 +08:00

621 lines
27 KiB
Go

package protocol
import "time"
const (
RunCapabilityProcessInstall = "process.install"
RunCapabilityProcessStart = "process.start"
RunCapabilityProcessStop = "process.stop"
RunCapabilityProcessStatus = "process.status"
RunCapabilityLogsRead = "logs.read"
RunCapabilityConfigWrite = "config.write"
RunCapabilityFilesList = "files.list"
RunCapabilityFilesRead = "files.read"
RunCapabilityFilesWrite = "files.write"
RunCapabilityRemoteFTPRead = "remote.ftp.read"
RunCapabilityRemoteFTPWrite = "remote.ftp.write"
RunCapabilityRemoteRsyncRead = "remote.rsync.read"
RunCapabilityRemoteRsyncWrite = "remote.rsync.write"
RunCapabilityRemoteRunFilesRead = "remote.run.files.read"
RunCapabilityRemoteRunFilesWrite = "remote.run.files.write"
RunCapabilityRemoteRunProcessStart = "remote.run.process.start"
RunCapabilityRemoteRunProcessStop = "remote.run.process.stop"
RunCapabilityRemoteRunDBMySQLQuery = "remote.run.db.mysql.query"
RunCapabilityRemoteRunDBSQLiteProbe = "remote.run.db.sqlite.probe"
RunCapabilityRemoteRunDBSQLiteQuery = "remote.run.db.sqlite.query"
RunCapabilityRemoteRunLogsTransfer = "remote.run.logs.transfer"
RunCapabilityRemoteRunRCONCommand = "remote.run.rcon.command"
RunCapabilityRemoteRunProtectedSQL = "remote.run.protected.sql"
RunCapabilityRemoteRunProtectedRCON = "remote.run.protected.rcon"
RunCapabilityRemoteRunProgram = "remote.run.program.command"
RunCapabilityRunSelfUpdate = "run.self-update"
RunCapabilityDistributionBuild = "distribution.build"
RunCapabilityDependenciesCheck = "dependencies.check"
RunCapabilityDependenciesInstall = "dependencies.install"
RunCapabilityLogsBackfill = "logs.backfill"
RunCapabilityDeploymentPlan = "deployment.plan.v1"
)
type RunJobProgressReport struct {
Percent int `json:"percent"`
Message string `json:"message,omitempty"`
}
type RunJobExecutionInput struct {
WorkspaceScope string `json:"workspaceScope,omitempty"`
Content string `json:"content,omitempty"`
ExpectedVersion int `json:"expectedVersion,omitempty"`
ExpectedChecksum string `json:"expectedChecksum,omitempty"`
MaxReadBytes int `json:"maxReadBytes,omitempty"`
RemoteAdapterKey string `json:"remoteAdapterKey,omitempty"`
RemoteAdapterKind string `json:"remoteAdapterKind,omitempty"`
TimeoutSeconds int `json:"timeoutSeconds,omitempty"`
PluginID string `json:"pluginId,omitempty"`
LifecycleOperation string `json:"lifecycleOperation,omitempty"`
TargetVersion string `json:"targetVersion,omitempty"`
Inputs map[string]string `json:"inputs,omitempty"`
LogSource *RuntimeLogSourcePlan `json:"logSource,omitempty"`
LogSources []RuntimeLogSourcePlan `json:"logSources,omitempty"`
DLLExtensions []RuntimeDLLExtensionPlan `json:"dllExtensions,omitempty"`
SourceRCON *RuntimeSourceRCONPlan `json:"sourceRcon,omitempty"`
SQLiteSchemaProbe *SQLiteSchemaProbeRequest `json:"sqliteSchemaProbe,omitempty"`
Deployment *ServerDeploymentExecution `json:"deployment,omitempty"`
ServerDeploymentPlan *ServerDeploymentPlan `json:"serverDeploymentPlan,omitempty"`
}
// SQLiteSchemaProbeBinding identifies the package and current database binding
// that authorized a probe. It contains only logical identities, never a path,
// DSN, socket, or credential.
type SQLiteSchemaProbeBinding struct {
ServerInstanceID string `json:"serverInstanceId"`
RunBindingID string `json:"runBindingId"`
RunEndpointID string `json:"runEndpointId"`
PluginID string `json:"pluginId"`
PluginVersion string `json:"pluginVersion"`
AdapterVersion string `json:"adapterVersion"`
GameVersion string `json:"gameVersion,omitempty"`
DatabaseIdentity string `json:"databaseIdentity"`
}
// SQLiteSchemaProbeLimits cap every independent part of diagnostic output.
// They are applied by Run even when the caller asks for larger values.
type SQLiteSchemaProbeLimits struct {
MaxObjects int `json:"maxObjects"`
MaxColumnsPerObject int `json:"maxColumnsPerObject"`
MaxIndexesPerObject int `json:"maxIndexesPerObject"`
MaxForeignKeys int `json:"maxForeignKeys"`
MaxCardinalityReads int `json:"maxCardinalityReads"`
MaxSampleRows int `json:"maxSampleRows"`
TimeoutMS int `json:"timeoutMs"`
MaxResultBytes int `json:"maxResultBytes"`
}
// SQLiteSchemaProbeRequest requests generic, query-only SQLite metadata for
// assignment.TargetKey. TargetKey is always resolved inside the scoped package
// workspace; this request intentionally has no path or SQL field.
type SQLiteSchemaProbeRequest struct {
RequestID string `json:"requestId"`
Binding SQLiteSchemaProbeBinding `json:"binding"`
Limits SQLiteSchemaProbeLimits `json:"limits"`
}
type SQLiteSchemaProbeColumn struct {
NameFingerprint string `json:"nameFingerprint"`
DeclaredType string `json:"declaredType"`
Nullable *bool `json:"nullable,omitempty"`
PrimaryKey bool `json:"primaryKey"`
Ordinal int `json:"ordinal"`
}
type SQLiteSchemaProbeIndex struct {
NameFingerprint string `json:"nameFingerprint"`
Unique bool `json:"unique"`
ColumnHashes []string `json:"columnHashes"`
}
type SQLiteSchemaProbeForeignKey struct {
FromColumnHash string `json:"fromColumnHash"`
ToObjectHash string `json:"toObjectHash"`
ToColumnHash string `json:"toColumnHash"`
}
type SQLiteSchemaProbeObject struct {
ObjectHash string `json:"objectHash"`
Kind string `json:"kind"`
NameFingerprint string `json:"nameFingerprint"`
DeclaredColumns []SQLiteSchemaProbeColumn `json:"declaredColumns"`
Indexes []SQLiteSchemaProbeIndex `json:"indexes"`
ForeignKeys []SQLiteSchemaProbeForeignKey `json:"foreignKeys"`
ApproximateRows *int64 `json:"approximateRows,omitempty"`
SampleFingerprints []string `json:"sampleFingerprints,omitempty"`
}
type SQLiteSchemaProbeSafeError struct {
Code string `json:"code"`
Retryable bool `json:"retryable"`
}
// SQLiteSchemaProbeResult is a terminal, redacted envelope. Names and sample
// values are represented only by salted-looking SHA-256 fingerprints.
type SQLiteSchemaProbeResult struct {
RequestID string `json:"requestId"`
JobID string `json:"jobId"`
Binding SQLiteSchemaProbeBinding `json:"binding"`
Status string `json:"status"`
ObservedAt time.Time `json:"observedAt"`
SourceFingerprint string `json:"sourceFingerprint,omitempty"`
SchemaFingerprint string `json:"schemaFingerprint,omitempty"`
ResultDigest string `json:"resultDigest,omitempty"`
Objects []SQLiteSchemaProbeObject `json:"objects,omitempty"`
SafeError SQLiteSchemaProbeSafeError `json:"safeError,omitempty"`
Limits SQLiteSchemaProbeLimits `json:"limits"`
}
type ServerDeploymentExecution struct {
SchemaVersion string `json:"schemaVersion"`
Mode string `json:"mode"`
ProfileKey string `json:"profileKey,omitempty"`
CreateInputs map[string]string `json:"createInputs,omitempty"`
ServerRoot string `json:"serverRoot,omitempty"`
WorkingDirectory string `json:"workingDirectory,omitempty"`
StartCommand string `json:"startCommand,omitempty"`
StopCommand string `json:"stopCommand,omitempty"`
StatusCommand string `json:"statusCommand,omitempty"`
Shell string `json:"shell,omitempty"`
Revision int `json:"revision"`
}
// ServerDeploymentPlan is kept only for backward-compatible decoding of
// legacy assignments. Game-specific deployment plans are no longer executed by
// Run; plugins own game lifecycle policy through action assets.
type ServerDeploymentPlan struct {
SchemaVersion string `json:"schemaVersion"`
Operation string `json:"operation"`
PluginID string `json:"pluginId"`
TemplateKey string `json:"templateKey"`
TemplateVersion string `json:"templateVersion"`
SteamAppID string `json:"steamAppId"`
ExecutableKey string `json:"executableKey"`
InstallRootKey string `json:"installRootKey"`
ConfigKey string `json:"configKey"`
ConfigFormat string `json:"configFormat"`
Prerequisites []RuntimeServerPrerequisite `json:"prerequisites,omitempty"`
ConfigMappings []RuntimeServerConfigMapping `json:"configMappings"`
DiscoveryMarkers []RuntimeServerDiscoveryMarker `json:"discoveryMarkers"`
VerificationChecks []RuntimeServerVerificationCheck `json:"verificationChecks"`
}
type RuntimeServerPrerequisite struct {
Key string `json:"key"`
Kind string `json:"kind"`
}
type RuntimeServerConfigMapping struct {
FieldKey string `json:"fieldKey"`
ConfigKey string `json:"configKey"`
ValueType string `json:"valueType"`
Required bool `json:"required"`
}
type RuntimeServerDiscoveryMarker struct {
Key string `json:"key"`
Kind string `json:"kind"`
TargetKey string `json:"targetKey"`
Expected string `json:"expected,omitempty"`
Required bool `json:"required"`
}
type RuntimeServerVerificationCheck struct {
Key string `json:"key"`
Kind string `json:"kind"`
TargetKey string `json:"targetKey"`
Required bool `json:"required"`
}
type ServerDeploymentEvidence struct {
TemplateKey string `json:"templateKey,omitempty"`
TemplateVersion string `json:"templateVersion,omitempty"`
PreflightState string `json:"preflightState,omitempty"`
DiscoveryState string `json:"discoveryState,omitempty"`
MappingState string `json:"mappingState,omitempty"`
VerificationState string `json:"verificationState,omitempty"`
DiscoveredFacts map[string]string `json:"discoveredFacts,omitempty"`
MappingResults map[string]string `json:"mappingResults,omitempty"`
VerificationResults map[string]string `json:"verificationResults,omitempty"`
FailureCode string `json:"failureCode,omitempty"`
}
// RuntimeDLLExtensionPlan is a Platform-frozen UE4SS DLL release. It is only
// accepted as part of a scoped process.start job; Run never fetches a mutable
// plugin declaration on its own.
type RuntimeDLLExtensionPlan struct {
Key string `json:"key"`
Version string `json:"version"`
ReleaseURL string `json:"releaseUrl"`
Checksum string `json:"checksum"`
SizeBytes int64 `json:"sizeBytes"`
TargetKey string `json:"targetKey"`
ModKey string `json:"modKey"`
DLLRef string `json:"dllRef"`
SCUMExecutableChecksum string `json:"scumExecutableChecksum"`
UE4SSABI string `json:"ue4ssAbi"`
RCONPort int `json:"rconPort"`
}
// RuntimeLogSourcePlan is a Platform-frozen, logical file log declaration. It
// carries no host paths; Run resolves TargetKey only inside its scoped
// workspace for the server instance.
type RuntimeLogSourcePlan struct {
Key string `json:"key"`
Kind string `json:"kind"`
TargetKey string `json:"targetKey,omitempty"`
StreamKey string `json:"streamKey"`
CursorKind string `json:"cursorKind,omitempty"`
RetentionDays int `json:"retentionDays,omitempty"`
}
// RuntimeSourceRCONPlan contains only frozen, non-secret metadata. Run reads
// the generated password from the scoped workspace after it consumes the
// one-time command input.
type RuntimeSourceRCONPlan struct {
Protocol string `json:"protocol"`
ExtensionKey string `json:"extensionKey"`
ModKey string `json:"modKey"`
ConfigRef string `json:"configRef"`
DeploymentStateRef string `json:"deploymentStateRef"`
Port int `json:"port"`
}
type RunJobExecutionResult 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"`
Summary string `json:"summary,omitempty"`
Content string `json:"content,omitempty"`
SQLiteSchemaProbe *SQLiteSchemaProbeResult `json:"sqliteSchemaProbe,omitempty"`
DeploymentReceipt *ServerDeploymentExecutionReceipt `json:"deploymentReceipt,omitempty"`
ServerDeploymentEvidence *ServerDeploymentEvidence `json:"serverDeploymentEvidence,omitempty"`
}
type ServerDeploymentExecutionReceipt struct {
SchemaVersion string `json:"schemaVersion"`
Revision int `json:"revision"`
Action string `json:"action"`
Mode string `json:"mode"`
Shell string `json:"shell,omitempty"`
UsedServerRoot bool `json:"usedServerRoot"`
}
type RunJobAssignment struct {
JobID string `json:"jobId"`
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 string `json:"state"`
Progress RunJobProgressReport `json:"progress"`
ResultRef string `json:"resultRef,omitempty"`
ExecutionInput RunJobExecutionInput `json:"executionInput,omitempty"`
LeaseToken string `json:"leaseToken"`
FencingToken uint64 `json:"fencingToken,omitempty"`
Attempt int `json:"attempt"`
LogSessionID string `json:"logSessionId,omitempty"`
SessionStartedAt time.Time `json:"sessionStartedAt,omitempty"`
MaxAttempts int `json:"maxAttempts"`
AckDeadlineAt time.Time `json:"ackDeadlineAt,omitempty"`
LeaseExpiresAt time.Time `json:"leaseExpiresAt,omitempty"`
NextAttemptAt time.Time `json:"nextAttemptAt,omitempty"`
ProgressSequence uint64 `json:"progressSequence,omitempty"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
}
type RunJobClaimRequest struct {
RunEndpointID string `json:"runEndpointId"`
SessionToken string `json:"sessionToken"`
Capabilities []string `json:"capabilities"`
Capacity RunCapacityReport `json:"capacity"`
}
type RunJobClaimResponse struct {
Accepted bool `json:"accepted"`
RunEndpointID string `json:"runEndpointId"`
HasJob bool `json:"hasJob"`
Job *RunJobAssignment `json:"job,omitempty"`
NextPollSeconds int `json:"nextPollSeconds"`
ServerTime time.Time `json:"serverTime"`
}
type RunJobAckRequest struct {
RunEndpointID string `json:"runEndpointId"`
SessionToken string `json:"sessionToken"`
JobID string `json:"jobId"`
LeaseToken string `json:"leaseToken"`
Attempt int `json:"attempt"`
Message string `json:"message,omitempty"`
}
type RunJobAckResponse struct {
Accepted bool `json:"accepted"`
Job RunJobAssignment `json:"job"`
ServerTime time.Time `json:"serverTime"`
}
type RunJobProgressRequest struct {
RunEndpointID string `json:"runEndpointId"`
SessionToken string `json:"sessionToken"`
JobID string `json:"jobId"`
LeaseToken string `json:"leaseToken"`
Attempt int `json:"attempt"`
Progress RunJobProgressReport `json:"progress"`
Sequence uint64 `json:"sequence,omitempty"`
}
type RunJobProgressResponse struct {
Accepted bool `json:"accepted"`
Job RunJobAssignment `json:"job"`
ServerTime time.Time `json:"serverTime"`
}
type RunJobResultRequest struct {
RunEndpointID string `json:"runEndpointId"`
SessionToken string `json:"sessionToken"`
JobID string `json:"jobId"`
LeaseToken string `json:"leaseToken"`
Attempt int `json:"attempt"`
State string `json:"state"`
Progress RunJobProgressReport `json:"progress"`
ResultRef string `json:"resultRef,omitempty"`
Message string `json:"message,omitempty"`
ErrorCode string `json:"errorCode,omitempty"`
Retryable bool `json:"retryable,omitempty"`
ExecutionResult RunJobExecutionResult `json:"executionResult,omitempty"`
}
type RunJobResultResponse struct {
Accepted bool `json:"accepted"`
Job RunJobAssignment `json:"job"`
ServerTime time.Time `json:"serverTime"`
}
type DistributionBuildInputRequest struct {
RunEndpointID string `json:"runEndpointId"`
SessionToken string `json:"sessionToken"`
JobID string `json:"jobId"`
LeaseToken string `json:"leaseToken"`
Attempt int `json:"attempt"`
}
type DistributionBuildInputResponse struct {
JobID string `json:"jobId"`
ComponentKind string `json:"componentKind"`
ServerInstanceID string `json:"serverInstanceId"`
PluginID string `json:"pluginId"`
RunEndpointID string `json:"runEndpointId"`
ProfileKey string `json:"profileKey,omitempty"`
TargetOS string `json:"targetOs"`
TargetArch string `json:"targetArch"`
TargetRelease string `json:"targetRelease"`
PlatformURL string `json:"platformUrl,omitempty"`
PackageFormat string `json:"packageFormat"`
RepositoryURL string `json:"repositoryUrl,omitempty"`
SourceRevision string `json:"sourceRevision,omitempty"`
ArtifactID string `json:"artifactId"`
OutputFilename string `json:"outputFilename"`
SecretRef string `json:"secretRef"`
KeyGeneration int `json:"keyGeneration"`
AuthKey string `json:"authKey"`
WorkspaceSeed string `json:"workspaceSeed,omitempty"`
}
type DependencyExecutionInputRequest struct {
RunEndpointID string `json:"runEndpointId"`
SessionToken string `json:"sessionToken"`
JobID string `json:"jobId"`
LeaseToken string `json:"leaseToken"`
Attempt int `json:"attempt"`
}
type DependencyProbe struct {
Key string `json:"key"`
Kind string `json:"kind"`
TargetKey string `json:"targetKey"`
Required bool `json:"required,omitempty"`
MinimumVersion string `json:"minimumVersion,omitempty"`
Platforms []string `json:"platforms,omitempty"`
}
type DependencyInstallStep struct {
Type string `json:"type"`
TargetKey string `json:"targetKey"`
PackageManager string `json:"packageManager,omitempty"`
PackageName string `json:"packageName,omitempty"`
Version string `json:"version,omitempty"`
DownloadRef string `json:"downloadRef,omitempty"`
Checksum string `json:"checksum,omitempty"`
}
type DependencyInstallPlan struct {
Key string `json:"key"`
Title string `json:"title"`
Platforms []string `json:"platforms,omitempty"`
Steps []DependencyInstallStep `json:"steps,omitempty"`
}
type DependencyExecutionInputResponse struct {
JobID string `json:"jobId"`
ServerInstanceID string `json:"serverInstanceId"`
RunEndpointID string `json:"runEndpointId"`
PluginID string `json:"pluginId"`
PluginVersion string `json:"pluginVersion"`
ProfileKey string `json:"profileKey"`
TargetOS string `json:"targetOs"`
TargetArch string `json:"targetArch"`
PlanDigest string `json:"planDigest"`
Probe DependencyProbe `json:"probe,omitempty"`
Plan DependencyInstallPlan `json:"plan,omitempty"`
Bindings map[string]string `json:"bindings"`
}
type SourceRCONExecutionInputRequest struct {
RunEndpointID string `json:"runEndpointId"`
SessionToken string `json:"sessionToken"`
JobID string `json:"jobId"`
LeaseToken string `json:"leaseToken"`
Attempt int `json:"attempt"`
}
// SourceRCONExecutionInput is deliberately excluded from assignments and
// journals. Command is returned once to the active Run lease only.
type SourceRCONExecutionInputResponse struct {
JobID string `json:"jobId"`
ServerInstanceID string `json:"serverInstanceId"`
RunEndpointID string `json:"runEndpointId"`
Command string `json:"command"`
}
// ProtectedRequestExecutionInput is deliberately excluded from assignments and
// journals. Platform returns the approved text and its logical binding once to
// the active, fenced Run lease; no connection material crosses this channel.
type ProtectedRequestExecutionInputRequest struct {
RunEndpointID string `json:"runEndpointId"`
SessionToken string `json:"sessionToken"`
JobID string `json:"jobId"`
LeaseToken string `json:"leaseToken"`
Attempt int `json:"attempt"`
FencingToken uint64 `json:"fencingToken"`
}
type ProtectedRequestExecutionInputResponse struct {
JobID string `json:"jobId"`
ServerInstanceID string `json:"serverInstanceId"`
RunEndpointID string `json:"runEndpointId"`
FencingToken uint64 `json:"fencingToken"`
Authorized bool `json:"authorized"`
ApprovalState string `json:"approvalState"`
QueueState string `json:"queueState"`
ExpiresAt time.Time `json:"expiresAt"`
Kind string `json:"kind"`
TransportKey string `json:"transportKey"`
TargetKey string `json:"targetKey"`
RequestText string `json:"requestText"`
}
type RunUpdateInputRequest struct {
RunEndpointID string `json:"runEndpointId"`
SessionToken string `json:"sessionToken"`
JobID string `json:"jobId"`
LeaseToken string `json:"leaseToken"`
Attempt int `json:"attempt"`
}
type RunUpdateInputResponse struct {
JobID string `json:"jobId"`
ServerInstanceID string `json:"serverInstanceId"`
RunEndpointID string `json:"runEndpointId"`
ArtifactID string `json:"artifactId"`
Checksum string `json:"checksum"`
SizeBytes int64 `json:"sizeBytes"`
TargetOS string `json:"targetOs"`
TargetArch string `json:"targetArch"`
PackageFormat string `json:"packageFormat"`
ExecutableName string `json:"executableName"`
TargetRelease string `json:"targetRelease"`
ChunkSizeBytes int `json:"chunkSizeBytes"`
}
type RunUpdateChunkRequest struct {
RunEndpointID string `json:"runEndpointId"`
SessionToken string `json:"sessionToken"`
JobID string `json:"jobId"`
LeaseToken string `json:"leaseToken"`
Attempt int `json:"attempt"`
Offset int64 `json:"offset"`
Length int `json:"length"`
}
type RunUpdateChunkResponse struct {
JobID string `json:"jobId"`
ArtifactID string `json:"artifactId"`
Offset int64 `json:"offset"`
TotalBytes int64 `json:"totalBytes"`
Checksum string `json:"checksum"`
Payload []byte `json:"payload"`
Complete bool `json:"complete"`
}
type RunUpdateHealthRequest struct {
RunEndpointID string `json:"runEndpointId"`
SessionToken string `json:"sessionToken"`
JobID string `json:"jobId"`
LeaseToken string `json:"leaseToken"`
Attempt int `json:"attempt"`
Outcome string `json:"outcome"`
Version string `json:"version"`
}
type RunUpdateHealthResponse struct {
Accepted bool `json:"accepted"`
JobID string `json:"jobId"`
Phase string `json:"phase"`
ServerTime time.Time `json:"serverTime"`
}
type DependencyExecutionEvidence struct {
ProbeKey string `json:"probeKey"`
PlanKey string `json:"planKey,omitempty"`
PlanDigest string `json:"planDigest"`
State string `json:"state"`
Evidence string `json:"evidence,omitempty"`
CompletedSteps int `json:"completedSteps,omitempty"`
}
type RunUpdateExecutionEvidence struct {
TargetRelease string `json:"targetRelease"`
Phase string `json:"phase"`
}
type RunJobCancelPollRequest struct {
RunEndpointID string `json:"runEndpointId"`
SessionToken string `json:"sessionToken"`
JobID string `json:"jobId,omitempty"`
LeaseToken string `json:"leaseToken,omitempty"`
Attempt int `json:"attempt"`
}
type RunJobCancelPollResponse struct {
Accepted bool `json:"accepted"`
RunEndpointID string `json:"runEndpointId"`
HasCancel bool `json:"hasCancel"`
JobID string `json:"jobId,omitempty"`
Reason string `json:"reason,omitempty"`
RequestedAt time.Time `json:"requestedAt,omitempty"`
ServerTime time.Time `json:"serverTime"`
}
type RunJobReconcileEntry struct {
JobID string `json:"jobId"`
LeaseToken string `json:"leaseToken"`
Attempt int `json:"attempt"`
}
type RunJobReconcileRequest struct {
RunEndpointID string `json:"runEndpointId"`
SessionToken string `json:"sessionToken"`
ActiveJobs []RunJobReconcileEntry `json:"activeJobs"`
}
type RunJobReconcileResponse struct {
Accepted bool `json:"accepted"`
RunEndpointID string `json:"runEndpointId"`
ConfirmedJobs []RunJobAssignment `json:"confirmedJobs"`
DiscardJobIDs []string `json:"discardJobIds"`
ServerTime time.Time `json:"serverTime"`
}