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
+30
View File
@@ -316,6 +316,25 @@ type GamePluginPage struct {
BridgeActions []string
}
// PluginFileWorkspace is a bounded, logical catalog for a plugin-owned files
// workbench. Keys are logical identifiers, never host paths.
type PluginFileWorkspace struct {
DefaultDirectoryKey string
Directories []PluginLogicalDirectory
Files []PluginLogicalFile
ConfigFields []PluginConfigField
}
type PluginLogicalDirectory struct{ Key, Label, Scope string }
type PluginLogicalFile struct {
Key, DirectoryKey, Label, Kind, StreamKey string
Editable bool
}
type PluginConfigField struct {
Key, FileKey, ConfigKey, Label, Description, Control, DefaultValue, RestartImpact string
Minimum, Maximum int
}
type GamePluginBridge struct {
Actions []string
}
@@ -595,6 +614,7 @@ type GamePluginManifest struct {
Permissions []string
Actions PluginLifecycleActions
Pages []GamePluginPage
FileWorkspace PluginFileWorkspace
AI GamePluginManifestAI
ProductionLifecycle GamePluginProductionLifecycle
RemoteAccess GamePluginRemoteAccess
@@ -624,6 +644,7 @@ type GamePlugin struct {
LifecycleActions PluginLifecycleActions
BridgeActions []string
Pages []GamePluginPage
FileWorkspace PluginFileWorkspace
Tags []string
AIPurposes []string
ProductionLifecycle GamePluginProductionLifecycle
@@ -1611,6 +1632,7 @@ func CopyGamePlugin(plugin GamePlugin) GamePlugin {
plugin.CreateFields = CopyPluginCreateFields(plugin.CreateFields)
plugin.BridgeActions = CopyStringSlice(plugin.BridgeActions)
plugin.Pages = CopyGamePluginPageSlice(plugin.Pages)
plugin.FileWorkspace = CopyPluginFileWorkspace(plugin.FileWorkspace)
plugin.Tags = CopyStringSlice(plugin.Tags)
plugin.AIPurposes = CopyStringSlice(plugin.AIPurposes)
plugin.ProductionLifecycle = CopyGamePluginProductionLifecycle(plugin.ProductionLifecycle)
@@ -1662,6 +1684,7 @@ func CopyGamePluginManifest(manifest GamePluginManifest) GamePluginManifest {
manifest.Capabilities = CopyStringSlice(manifest.Capabilities)
manifest.Permissions = CopyStringSlice(manifest.Permissions)
manifest.Pages = CopyGamePluginPageSlice(manifest.Pages)
manifest.FileWorkspace = CopyPluginFileWorkspace(manifest.FileWorkspace)
manifest.AI.Purposes = CopyStringSlice(manifest.AI.Purposes)
manifest.ProductionLifecycle = CopyGamePluginProductionLifecycle(manifest.ProductionLifecycle)
manifest.RemoteAccess = CopyGamePluginRemoteAccess(manifest.RemoteAccess)
@@ -1670,6 +1693,13 @@ func CopyGamePluginManifest(manifest GamePluginManifest) GamePluginManifest {
return manifest
}
func CopyPluginFileWorkspace(workspace PluginFileWorkspace) PluginFileWorkspace {
workspace.Directories = append([]PluginLogicalDirectory(nil), workspace.Directories...)
workspace.Files = append([]PluginLogicalFile(nil), workspace.Files...)
workspace.ConfigFields = append([]PluginConfigField(nil), workspace.ConfigFields...)
return workspace
}
func CopyPluginCreateFields(fields []PluginCreateField) []PluginCreateField {
if fields == nil {
return nil