Move SCUM lifecycle ownership to plugin

This commit is contained in:
npc0-hue
2026-08-01 09:36:12 +08:00
parent bca4f935ba
commit d1249fca85
49 changed files with 795 additions and 566 deletions
+2
View File
@@ -224,6 +224,7 @@ type DistributionBuildInputResponse struct {
SecretRef string `json:"secretRef"`
KeyGeneration int `json:"keyGeneration"`
AuthKey string `json:"authKey"`
WorkspaceSeed string `json:"workspaceSeed,omitempty"`
}
type DependencyExecutionInputRequest struct {
@@ -568,6 +569,7 @@ func DistributionBuildInputFromDomain(input domain.DistributionBuildInput) Distr
SecretRef: input.SecretRef,
KeyGeneration: input.KeyGeneration,
AuthKey: input.AuthKey,
WorkspaceSeed: input.WorkspaceSeed,
}
}
+21
View File
@@ -371,6 +371,7 @@ type GamePluginManifestBody struct {
Capabilities []string `json:"capabilities"`
Permissions []string `json:"permissions"`
Actions PluginLifecycleActionsBody `json:"actions"`
AssetFiles []PluginAssetFileBody `json:"assetFiles,omitempty"`
Pages []GamePluginPageBody `json:"pages,omitempty"`
FileWorkspace PluginFileWorkspaceBody `json:"fileWorkspace,omitempty"`
AI GamePluginManifestAIBody `json:"ai,omitempty"`
@@ -384,6 +385,13 @@ type GamePluginManifestBody struct {
type GamePluginManifestRegistrationRequest struct {
ManifestRef string `json:"manifestRef"`
Manifest GamePluginManifestBody `json:"manifest"`
AssetFiles []PluginAssetFileBody `json:"assetFiles,omitempty"`
}
type PluginAssetFileBody struct {
Path string `json:"path"`
Content string `json:"content,omitempty"`
Mode int `json:"mode,omitempty"`
}
type GamePluginCreateRequest struct {
@@ -996,6 +1004,7 @@ func (request AIProviderUpdateRequest) ToDomain(id string, status domain.AIProvi
func (request GamePluginManifestRegistrationRequest) ToDomain() domain.GamePluginManifestRegistration {
return domain.GamePluginManifestRegistration{
ManifestRef: request.ManifestRef,
AssetFiles: pluginAssetFilesToDomain(request.AssetFiles),
Manifest: domain.GamePluginManifest{
ID: request.Manifest.ID,
Name: request.Manifest.Name,
@@ -1008,6 +1017,7 @@ func (request GamePluginManifestRegistrationRequest) ToDomain() domain.GamePlugi
Capabilities: domain.CopyStringSlice(request.Manifest.Capabilities),
Permissions: domain.CopyStringSlice(request.Manifest.Permissions),
Actions: request.Manifest.Actions.ToDomain(),
AssetFiles: pluginAssetFilesToDomain(request.Manifest.AssetFiles),
Pages: pagesToDomain(request.Manifest.Pages),
FileWorkspace: fileWorkspaceToDomain(request.Manifest.FileWorkspace),
AI: request.Manifest.AI.ToDomain(),
@@ -1020,6 +1030,17 @@ func (request GamePluginManifestRegistrationRequest) ToDomain() domain.GamePlugi
}
}
func pluginAssetFilesToDomain(files []PluginAssetFileBody) []domain.PluginAssetFile {
if files == nil {
return nil
}
out := make([]domain.PluginAssetFile, len(files))
for i, file := range files {
out[i] = domain.PluginAssetFile{Path: file.Path, Content: file.Content, Mode: file.Mode}
}
return out
}
func mapTrajectoryDeclarationToDomain(value *GameMapTrajectoryDeclarationBody) *domain.GameMapTrajectoryDeclaration {
if value == nil {
return nil
+9 -1
View File
@@ -77,20 +77,28 @@ func TestGamePluginManifestRegistrationToDomainCopiesSlices(t *testing.T) {
CreateFormSchema: "schemas/create-form.schema.json",
},
Actions: PluginLifecycleActionsBody{Install: "actions/install.json", Start: "actions/start.json", Stop: "actions/stop.json"},
AssetFiles: []PluginAssetFileBody{
{Path: "actions/install.json", Mode: 0o600},
},
Pages: []GamePluginPageBody{
{Key: "logs", Title: "Logs", Path: "/logs", Permissions: []string{"server.logs.read"}},
},
AI: GamePluginManifestAIBody{Purposes: []string{"logs.diagnose"}},
},
AssetFiles: []PluginAssetFileBody{
{Path: "actions/install.json", Content: "{}", Mode: 0o600},
},
}
domainRegistration := request.ToDomain()
domainRegistration.Manifest.Tags[0] = "mutated"
domainRegistration.Manifest.Server.SupportedOS[0] = "darwin"
domainRegistration.Manifest.AssetFiles[0].Path = "actions/mutated.json"
domainRegistration.AssetFiles[0].Content = "mutated"
domainRegistration.Manifest.Pages[0].Permissions[0] = "ai.invoke"
domainRegistration.Manifest.AI.Purposes[0] = "config.suggest"
if request.Manifest.Tags[0] != "example" || request.Manifest.Server.SupportedOS[0] != "linux" || request.Manifest.Pages[0].Permissions[0] != "server.logs.read" || request.Manifest.AI.Purposes[0] != "logs.diagnose" {
if request.Manifest.Tags[0] != "example" || request.Manifest.Server.SupportedOS[0] != "linux" || request.Manifest.AssetFiles[0].Path != "actions/install.json" || request.AssetFiles[0].Content != "{}" || request.Manifest.Pages[0].Permissions[0] != "server.logs.read" || request.Manifest.AI.Purposes[0] != "logs.diagnose" {
t.Fatalf("expected manifest request slices to be copied, got %+v", request)
}
}