feat(scum): add file config workbench

This commit is contained in:
npc0-hue
2026-07-28 14:43:24 +08:00
parent e739dd9c79
commit e4ef4024a8
22 changed files with 397 additions and 109 deletions
+66
View File
@@ -183,6 +183,38 @@ type GamePluginPageBody struct {
BridgeActions []string `json:"bridgeActions,omitempty"`
}
type PluginLogicalDirectoryBody struct {
Key string `json:"key"`
Label string `json:"label"`
Scope string `json:"scope"`
}
type PluginLogicalFileBody struct {
Key string `json:"key"`
DirectoryKey string `json:"directoryKey"`
Label string `json:"label"`
Kind string `json:"kind"`
StreamKey string `json:"streamKey,omitempty"`
Editable bool `json:"editable,omitempty"`
}
type PluginConfigFieldBody struct {
Key string `json:"key"`
FileKey string `json:"fileKey"`
ConfigKey string `json:"configKey"`
Label string `json:"label"`
Description string `json:"description"`
Control string `json:"control"`
Minimum int `json:"minimum,omitempty"`
Maximum int `json:"maximum,omitempty"`
DefaultValue string `json:"defaultValue,omitempty"`
RestartImpact string `json:"restartImpact"`
}
type PluginFileWorkspaceBody struct {
DefaultDirectoryKey string `json:"defaultDirectoryKey"`
Directories []PluginLogicalDirectoryBody `json:"directories"`
Files []PluginLogicalFileBody `json:"files"`
ConfigFields []PluginConfigFieldBody `json:"configFields"`
}
type GamePluginBridgeBody struct {
Actions []string `json:"actions"`
}
@@ -303,6 +335,7 @@ type GamePluginManifestBody struct {
Permissions []string `json:"permissions"`
Actions PluginLifecycleActionsBody `json:"actions"`
Pages []GamePluginPageBody `json:"pages,omitempty"`
FileWorkspace PluginFileWorkspaceBody `json:"fileWorkspace,omitempty"`
AI GamePluginManifestAIBody `json:"ai,omitempty"`
ProductionLifecycle GamePluginProductionLifecycleBody `json:"productionLifecycle"`
RemoteAccess GamePluginRemoteAccessBody `json:"remoteAccess,omitempty"`
@@ -332,6 +365,7 @@ type GamePluginCreateRequest struct {
LifecycleActions PluginLifecycleActionsBody `json:"lifecycleActions,omitempty"`
BridgeActions []string `json:"bridgeActions,omitempty"`
Pages []GamePluginPageBody `json:"pages,omitempty"`
FileWorkspace PluginFileWorkspaceBody `json:"fileWorkspace,omitempty"`
Tags []string `json:"tags,omitempty"`
AIPurposes []string `json:"aiPurposes,omitempty"`
ProductionLifecycle GamePluginProductionLifecycleBody `json:"productionLifecycle,omitempty"`
@@ -358,6 +392,7 @@ type GamePluginResponse struct {
LifecycleActions PluginLifecycleActionsBody `json:"lifecycleActions"`
BridgeActions []string `json:"bridgeActions"`
Pages []GamePluginPageBody `json:"pages"`
FileWorkspace PluginFileWorkspaceBody `json:"fileWorkspace,omitempty"`
Tags []string `json:"tags"`
AIPurposes []string `json:"aiPurposes"`
ProductionLifecycle GamePluginProductionLifecycleBody `json:"productionLifecycle"`
@@ -933,6 +968,7 @@ func (request GamePluginManifestRegistrationRequest) ToDomain() domain.GamePlugi
Permissions: domain.CopyStringSlice(request.Manifest.Permissions),
Actions: request.Manifest.Actions.ToDomain(),
Pages: pagesToDomain(request.Manifest.Pages),
FileWorkspace: fileWorkspaceToDomain(request.Manifest.FileWorkspace),
AI: request.Manifest.AI.ToDomain(),
ProductionLifecycle: request.Manifest.ProductionLifecycle.ToDomain(),
RemoteAccess: request.Manifest.RemoteAccess.ToDomain(),
@@ -942,6 +978,34 @@ func (request GamePluginManifestRegistrationRequest) ToDomain() domain.GamePlugi
}
}
func fileWorkspaceToDomain(body PluginFileWorkspaceBody) domain.PluginFileWorkspace {
workspace := domain.PluginFileWorkspace{DefaultDirectoryKey: body.DefaultDirectoryKey}
for _, item := range body.Directories {
workspace.Directories = append(workspace.Directories, domain.PluginLogicalDirectory{Key: item.Key, Label: item.Label, Scope: item.Scope})
}
for _, item := range body.Files {
workspace.Files = append(workspace.Files, domain.PluginLogicalFile{Key: item.Key, DirectoryKey: item.DirectoryKey, Label: item.Label, Kind: item.Kind, StreamKey: item.StreamKey, Editable: item.Editable})
}
for _, item := range body.ConfigFields {
workspace.ConfigFields = append(workspace.ConfigFields, domain.PluginConfigField{Key: item.Key, FileKey: item.FileKey, ConfigKey: item.ConfigKey, Label: item.Label, Description: item.Description, Control: item.Control, Minimum: item.Minimum, Maximum: item.Maximum, DefaultValue: item.DefaultValue, RestartImpact: item.RestartImpact})
}
return workspace
}
func fileWorkspaceFromDomain(workspace domain.PluginFileWorkspace) PluginFileWorkspaceBody {
workspace = domain.CopyPluginFileWorkspace(workspace)
body := PluginFileWorkspaceBody{DefaultDirectoryKey: workspace.DefaultDirectoryKey}
for _, item := range workspace.Directories {
body.Directories = append(body.Directories, PluginLogicalDirectoryBody{Key: item.Key, Label: item.Label, Scope: item.Scope})
}
for _, item := range workspace.Files {
body.Files = append(body.Files, PluginLogicalFileBody{Key: item.Key, DirectoryKey: item.DirectoryKey, Label: item.Label, Kind: item.Kind, StreamKey: item.StreamKey, Editable: item.Editable})
}
for _, item := range workspace.ConfigFields {
body.ConfigFields = append(body.ConfigFields, PluginConfigFieldBody{Key: item.Key, FileKey: item.FileKey, ConfigKey: item.ConfigKey, Label: item.Label, Description: item.Description, Control: item.Control, Minimum: item.Minimum, Maximum: item.Maximum, DefaultValue: item.DefaultValue, RestartImpact: item.RestartImpact})
}
return body
}
func (bridge GamePluginBridgeBody) ToDomain() domain.GamePluginBridge {
return domain.GamePluginBridge{Actions: domain.CopyStringSlice(bridge.Actions)}
}
@@ -1048,6 +1112,7 @@ func (request GamePluginCreateRequest) ToDomain() domain.GamePlugin {
LifecycleActions: request.LifecycleActions.ToDomain(),
BridgeActions: domain.CopyStringSlice(request.BridgeActions),
Pages: pagesToDomain(request.Pages),
FileWorkspace: fileWorkspaceToDomain(request.FileWorkspace),
Tags: domain.CopyStringSlice(request.Tags),
AIPurposes: domain.CopyStringSlice(request.AIPurposes),
ProductionLifecycle: request.ProductionLifecycle.ToDomain(),
@@ -1295,6 +1360,7 @@ func GamePluginFromDomain(plugin domain.GamePlugin) GamePluginResponse {
LifecycleActions: lifecycleActionsFromDomain(plugin.LifecycleActions),
BridgeActions: plugin.BridgeActions,
Pages: pagesFromDomain(plugin.Pages),
FileWorkspace: fileWorkspaceFromDomain(plugin.FileWorkspace),
Tags: plugin.Tags,
AIPurposes: plugin.AIPurposes,
ProductionLifecycle: productionLifecycleFromDomain(plugin.ProductionLifecycle),