SCUM 停止/重启/更新以前只有“结束进程”这一条路,插件没有声明任何优雅关闭方式,
平台也没有把停止后重新启动串起来。现在插件声明自己的关闭脚本,run 先执行它,
平台在停止或更新成功后再自动拉起服务。
run:
- lifecycle stop 支持插件声明的 gracefulStop(可执行文件、参数、环境、超时、
fallback=report|terminate);关闭命令超时且声明 report 时任务失败,不再默默杀进程。
- 新增 steam.update 依赖探针:调用 steamcmd +app_info_print 获取公开分支 buildid,
与本地 steamapps/appmanifest_<appid>.acf 的 buildid 比较,输出
installed/latest/update=yes|no|unknown。
platform:
- 新增 POST /api/v1/server-instances/{id}/restart 与 /update。
- restart 派发插件 stop 动作(走优雅关闭),终态成功后入队 start 作业。
- update 派发插件 install 动作;插件在更新前必须先优雅关闭 SCUM,关闭失败直接拒绝
SteamCMD 更新,成功后平台再拉起服务。
- 依赖检查输入带上插件声明的服务器安装根目录,供 steam.update 读取 appmanifest。
plugin (SCUM server plugin 0.1.16):
- bin/scum-stop.cmd:解析已声明的可执行文件路径,定位同路径正在运行的 SCUMServer.exe,
通过本地 RCON 公告并发送关闭命令,等待进程自行退出;不再使用 taskkill。
- bin/scum-rcon.ps1:插件自有的 Source RCON 客户端,从 UE4SS mod config.ini 读取
密码/端口,密钥不离开本机。
- actions/stop.json 声明 gracefulStop;actions/install.json 更新前先执行同一关闭脚本。
platform_web:
- 服务器详情新增“重启”按钮和“SCUM 版本更新”面板;点“检查更新”查询公开分支版本,
只有检测到更新时“更新版本”按钮才会置为可用并高亮,点击后先确认再派发更新任务。
674 lines
31 KiB
JSON
674 lines
31 KiB
JSON
{
|
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
"$id": "https://browser.local/schemas/game-plugin.manifest.schema.json",
|
|
"title": "GamePluginManifest",
|
|
"type": "object",
|
|
"required": ["id", "name", "version", "kind", "server", "capabilities", "permissions", "productionLifecycle"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"$schema": { "type": "string" },
|
|
"id": { "type": "string", "pattern": "^game\\.[a-z0-9][a-z0-9._-]*$" },
|
|
"name": { "type": "string", "minLength": 1, "maxLength": 80 },
|
|
"description": { "type": "string", "minLength": 1, "maxLength": 240 },
|
|
"version": { "type": "string", "minLength": 1, "maxLength": 40 },
|
|
"kind": { "const": "game-plugin" },
|
|
"tags": {
|
|
"type": "array",
|
|
"items": { "type": "string", "pattern": "^[a-z0-9][a-z0-9._-]*$" },
|
|
"uniqueItems": true,
|
|
"maxItems": 8
|
|
},
|
|
"server": {
|
|
"type": "object",
|
|
"required": ["type", "displayName", "createFormSchema"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"type": { "type": "string", "pattern": "^[a-z0-9][a-z0-9._-]*$", "maxLength": 80 },
|
|
"displayName": { "type": "string", "minLength": 1, "maxLength": 80 },
|
|
"supportedOS": { "type": "array", "items": { "enum": ["windows", "linux", "darwin"] } },
|
|
"createFormSchema": { "$ref": "#/$defs/relativeJsonRef" },
|
|
"createFields": {
|
|
"type": "array",
|
|
"maxItems": 32,
|
|
"items": { "$ref": "#/$defs/pluginCreateField" }
|
|
}
|
|
}
|
|
},
|
|
"bridge": {
|
|
"type": "object",
|
|
"required": ["actions"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"actions": {
|
|
"type": "array",
|
|
"items": { "$ref": "#/$defs/bridgeAction" },
|
|
"uniqueItems": true,
|
|
"minItems": 1
|
|
}
|
|
}
|
|
},
|
|
"gameClientBridge": {
|
|
"$ref": "#/$defs/gameClientBridgeManifest"
|
|
},
|
|
"capabilities": {
|
|
"type": "array",
|
|
"items": { "$ref": "#/$defs/runCapability" },
|
|
"uniqueItems": true
|
|
},
|
|
"permissions": {
|
|
"type": "array",
|
|
"items": { "$ref": "#/$defs/pluginPermission" },
|
|
"uniqueItems": true
|
|
},
|
|
"remoteAccess": {
|
|
"type": "object",
|
|
"required": ["methods"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"methods": {
|
|
"type": "array",
|
|
"items": { "$ref": "#/$defs/remoteAccessMethod" },
|
|
"uniqueItems": true,
|
|
"minItems": 1
|
|
},
|
|
"runCapabilities": {
|
|
"type": "array",
|
|
"items": { "$ref": "#/$defs/runCapability" },
|
|
"uniqueItems": true
|
|
},
|
|
"databaseEngines": {
|
|
"type": "array",
|
|
"items": { "$ref": "#/$defs/remoteDatabaseEngine" },
|
|
"uniqueItems": true
|
|
},
|
|
"rcon": { "type": "boolean" },
|
|
"logTransfer": { "type": "boolean" }
|
|
}
|
|
},
|
|
"runtimeProfiles": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"discovery": {
|
|
"type": "array",
|
|
"items": { "$ref": "#/$defs/runtimeDiscoveryProbe" },
|
|
"uniqueItems": true
|
|
},
|
|
"lifecycleProfiles": {
|
|
"type": "array",
|
|
"items": { "$ref": "#/$defs/runtimeLifecycleProfile" },
|
|
"uniqueItems": true
|
|
},
|
|
"dependencyProbes": {
|
|
"type": "array",
|
|
"items": { "$ref": "#/$defs/runtimeDependencyProbe" },
|
|
"uniqueItems": true
|
|
},
|
|
"installPlans": {
|
|
"type": "array",
|
|
"items": { "$ref": "#/$defs/runtimeInstallPlan" },
|
|
"uniqueItems": true
|
|
},
|
|
"logSources": {
|
|
"type": "array",
|
|
"items": { "$ref": "#/$defs/runtimeLogSource" },
|
|
"uniqueItems": true
|
|
},
|
|
"transportProfiles": {
|
|
"type": "array",
|
|
"items": { "$ref": "#/$defs/runtimeTransportProfile" },
|
|
"uniqueItems": true
|
|
},
|
|
"dataTargets": {
|
|
"type": "array",
|
|
"items": { "$ref": "#/$defs/runtimeDataTarget" },
|
|
"uniqueItems": true,
|
|
"maxItems": 16
|
|
},
|
|
"dllExtensions": {
|
|
"type": "array",
|
|
"items": { "$ref": "#/$defs/runtimeDLLExtensionProfile" },
|
|
"uniqueItems": true,
|
|
"maxItems": 16
|
|
}
|
|
}
|
|
},
|
|
"actions": {
|
|
"type": "object",
|
|
"required": ["install", "start", "stop"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"install": { "$ref": "#/$defs/relativeJsonRef" },
|
|
"start": { "$ref": "#/$defs/relativeJsonRef" },
|
|
"stop": { "$ref": "#/$defs/relativeJsonRef" },
|
|
"restart": { "$ref": "#/$defs/relativeJsonRef" },
|
|
"status": { "$ref": "#/$defs/relativeJsonRef" }
|
|
}
|
|
},
|
|
"assetFiles": {
|
|
"type": "array",
|
|
"items": { "$ref": "#/$defs/pluginAssetFile" },
|
|
"uniqueItems": true,
|
|
"maxItems": 64
|
|
},
|
|
"productionLifecycle": {
|
|
"type": "object",
|
|
"required": ["operations", "dependencyPolicy"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"operations": {
|
|
"type": "array",
|
|
"items": { "$ref": "#/$defs/productionLifecycleOperation" },
|
|
"uniqueItems": true,
|
|
"minItems": 1
|
|
},
|
|
"dependencyPolicy": { "enum": ["required", "optional"] }
|
|
}
|
|
},
|
|
"pages": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"required": ["key", "title", "path", "bundleKey", "bundleVersion", "bundleIntegritySha256"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"key": { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]*$" },
|
|
"title": { "type": "string", "minLength": 1, "maxLength": 40 },
|
|
"path": { "type": "string", "pattern": "^/[a-z0-9_./-]*$" },
|
|
"bundleKey": { "type": "string", "pattern": "^[a-z0-9][a-z0-9._-]{0,79}$" },
|
|
"bundleVersion": { "type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{0,79}$" },
|
|
"bundleIntegritySha256": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$" },
|
|
"permissions": { "type": "array", "items": { "$ref": "#/$defs/pluginPermission" }, "uniqueItems": true },
|
|
"bridgeActions": { "type": "array", "items": { "$ref": "#/$defs/bridgeAction" }, "uniqueItems": true },
|
|
"featureKeys": { "type": "array", "items": { "type": "string" }, "uniqueItems": true }
|
|
}
|
|
}
|
|
},
|
|
"fileWorkspace": { "type": "object", "required": ["defaultDirectoryKey", "directories", "files", "configFields"], "additionalProperties": false, "properties": { "defaultDirectoryKey": { "$ref": "#/$defs/logicalKey" }, "directories": { "type": "array", "items": { "$ref": "#/$defs/pluginLogicalDirectory" } }, "files": { "type": "array", "items": { "$ref": "#/$defs/pluginLogicalFile" } }, "configFields": { "type": "array", "items": { "$ref": "#/$defs/pluginConfigField" } } } },
|
|
"ai": {
|
|
"type": "object",
|
|
"required": ["mediation", "configWritePolicy"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"purposes": { "type": "array", "items": { "$ref": "#/$defs/aiPurpose" }, "uniqueItems": true },
|
|
"mediation": { "const": "platform" },
|
|
"configWritePolicy": { "const": "review-required" }
|
|
}
|
|
}
|
|
},
|
|
"$defs": {
|
|
"pluginLogicalDirectory": { "type": "object", "required": ["key", "label", "scope"], "additionalProperties": false, "properties": { "key": { "$ref": "#/$defs/logicalKey" }, "label": { "type": "string", "minLength": 1, "maxLength": 60 }, "scope": { "enum": ["config", "logs"] } } },
|
|
"pluginLogicalFile": { "type": "object", "required": ["key", "directoryKey", "label", "kind"], "additionalProperties": false, "properties": { "key": { "$ref": "#/$defs/logicalKey" }, "directoryKey": { "$ref": "#/$defs/logicalKey" }, "label": { "type": "string", "minLength": 1, "maxLength": 80 }, "kind": { "enum": ["config", "log"] }, "streamKey": { "$ref": "#/$defs/logicalKey" }, "editable": { "type": "boolean" } } },
|
|
"pluginConfigField": { "type": "object", "required": ["key", "fileKey", "configKey", "label", "description", "control", "restartImpact"], "additionalProperties": false, "properties": { "key": { "$ref": "#/$defs/logicalKey" }, "fileKey": { "$ref": "#/$defs/logicalKey" }, "configKey": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9_.-]*$", "maxLength": 120 }, "label": { "type": "string", "minLength": 1, "maxLength": 80 }, "description": { "type": "string", "minLength": 1, "maxLength": 240 }, "control": { "enum": ["text", "number", "boolean", "port"] }, "minimum": { "type": "integer", "minimum": 0, "maximum": 65535 }, "maximum": { "type": "integer", "minimum": 0, "maximum": 65535 }, "defaultValue": { "type": "string", "maxLength": 120 }, "restartImpact": { "enum": ["none", "restart-required"] } } },
|
|
"pluginAssetFile": {
|
|
"type": "object",
|
|
"required": ["path"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"path": { "$ref": "#/$defs/relativePathRef" },
|
|
"mode": { "type": "integer", "enum": [384, 448] }
|
|
}
|
|
},
|
|
"pluginCreateField": {
|
|
"type": "object",
|
|
"required": ["key", "label", "type"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"key": { "type": "string", "pattern": "^[a-zA-Z][a-zA-Z0-9_]*$", "maxLength": 80 },
|
|
"label": { "type": "string", "minLength": 1, "maxLength": 60 },
|
|
"type": { "enum": ["text", "number", "boolean", "select", "port"] },
|
|
"required": { "type": "boolean" },
|
|
"defaultValue": { "type": "string", "maxLength": 256 },
|
|
"options": { "type": "array", "maxItems": 32, "uniqueItems": true, "items": { "type": "string", "minLength": 1, "maxLength": 120 } },
|
|
"configKey": { "type": "string", "pattern": "^[a-zA-Z][a-zA-Z0-9_]*$", "maxLength": 80 }
|
|
}
|
|
},
|
|
"gameClientBridgeManifest": {
|
|
"type": "object",
|
|
"required": ["commands", "snapshots", "commandRetentionSeconds", "maxCommands"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"commands": {
|
|
"type": "array",
|
|
"items": { "$ref": "#/$defs/gameClientBridgeCommand" },
|
|
"maxItems": 128
|
|
},
|
|
"snapshots": {
|
|
"type": "array",
|
|
"items": { "$ref": "#/$defs/gameClientBridgeSnapshot" },
|
|
"maxItems": 128
|
|
},
|
|
"queryTemplates": {
|
|
"type": "array",
|
|
"items": { "$ref": "#/$defs/gameClientBridgeQueryTemplate" },
|
|
"maxItems": 128
|
|
},
|
|
"lifecycleProjections": {
|
|
"type": "array",
|
|
"items": { "$ref": "#/$defs/gameClientBridgeLifecycleProjection" },
|
|
"maxItems": 64
|
|
},
|
|
"dataPacks": {
|
|
"type": "array",
|
|
"items": { "$ref": "#/$defs/gameClientBridgeDataPack" },
|
|
"maxItems": 64
|
|
},
|
|
"commandRetentionSeconds": { "type": "integer", "minimum": 1, "maximum": 31536000 },
|
|
"maxCommands": { "type": "integer", "minimum": 1, "maximum": 100000 },
|
|
"pages": {
|
|
"type": "array",
|
|
"items": { "$ref": "#/$defs/gameClientBridgePageContract" },
|
|
"maxItems": 64
|
|
},
|
|
"features": { "type": "array", "items": { "$ref": "#/$defs/gameClientBridgeFeature" }, "maxItems": 128 }
|
|
}
|
|
},
|
|
"gameClientBridgeCommand": {
|
|
"type": "object",
|
|
"required": ["type", "title", "permission", "payloadSchemaRef", "timeoutSeconds", "maxPayloadBytes"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"type": { "type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,159}$" },
|
|
"title": { "type": "string", "minLength": 1, "maxLength": 80 },
|
|
"permission": { "$ref": "#/$defs/pluginPermission" },
|
|
"payloadSchemaRef": { "$ref": "#/$defs/relativeJsonRef" },
|
|
"resultSchemaRef": { "$ref": "#/$defs/relativeJsonRef" },
|
|
"timeoutSeconds": { "type": "integer", "minimum": 1, "maximum": 3600 },
|
|
"maxPayloadBytes": { "type": "integer", "minimum": 1, "maximum": 65536 }
|
|
}
|
|
},
|
|
"gameClientBridgeSnapshot": {
|
|
"type": "object",
|
|
"required": ["type", "schemaVersion", "schemaRef", "keepForSeconds", "maxRecords"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"type": { "type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,159}$" },
|
|
"schemaVersion": { "type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,159}$" },
|
|
"schemaRef": { "$ref": "#/$defs/relativeJsonRef" },
|
|
"keepForSeconds": { "type": "integer", "minimum": 1, "maximum": 2678400 },
|
|
"maxRecords": { "type": "integer", "minimum": 1, "maximum": 10000 }
|
|
}
|
|
},
|
|
"gameClientBridgeQueryTemplate": {
|
|
"type": "object",
|
|
"required": ["key", "title", "permission", "engine", "transportKey", "targetKey", "parameterSchemaRef", "resultSchemaRef", "maxRows", "timeoutSeconds"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"key": { "type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,159}$" },
|
|
"title": { "type": "string", "minLength": 1, "maxLength": 80 },
|
|
"permission": { "$ref": "#/$defs/pluginPermission" },
|
|
"engine": { "const": "sqlite" },
|
|
"transportKey": { "$ref": "#/$defs/logicalKey" },
|
|
"targetKey": { "$ref": "#/$defs/logicalKey" },
|
|
"parameterSchemaRef": { "$ref": "#/$defs/relativeJsonRef" },
|
|
"resultSchemaRef": { "$ref": "#/$defs/relativeJsonRef" },
|
|
"sqlRef": { "$ref": "#/$defs/relativeSqlRef" },
|
|
"maxRows": { "type": "integer", "minimum": 1, "maximum": 500 },
|
|
"timeoutSeconds": { "type": "integer", "minimum": 1, "maximum": 60 },
|
|
"pollIntervalSeconds": { "type": "integer", "minimum": 0, "maximum": 86400 },
|
|
"projections": { "type": "array", "items": { "$ref": "#/$defs/gameClientBridgeQueryProjection" }, "uniqueItems": true, "maxItems": 4 }
|
|
}
|
|
},
|
|
"gameClientBridgeQueryProjection": {
|
|
"type": "object",
|
|
"required": ["collection", "rowPath", "upsertKeys"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"collection": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,119}$" },
|
|
"rowPath": { "const": "rows" },
|
|
"matchField": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$" },
|
|
"matchValue": { "type": "string", "minLength": 1, "maxLength": 120 },
|
|
"upsertKeys": { "type": "array", "items": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$" }, "uniqueItems": true, "minItems": 1, "maxItems": 8 },
|
|
"fieldMappings": { "type": "object", "maxProperties": 64, "propertyNames": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$" }, "additionalProperties": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$" } },
|
|
"fixedValues": { "type": "object", "maxProperties": 64, "propertyNames": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$" }, "additionalProperties": { "type": "string", "maxLength": 4096 } },
|
|
"observedAtField": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$" },
|
|
"mergeExisting": { "type": "boolean" }
|
|
}
|
|
},
|
|
"gameClientBridgeLifecycleProjection": {
|
|
"type": "object",
|
|
"required": ["key", "capabilities", "target"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"key": { "type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,159}$" },
|
|
"capabilities": { "type": "array", "items": { "$ref": "#/$defs/runCapability" }, "uniqueItems": true, "minItems": 1, "maxItems": 16 },
|
|
"processStates": { "type": "array", "items": { "enum": ["running", "stopped", "not-started", "exited"] }, "uniqueItems": true, "maxItems": 8 },
|
|
"target": { "$ref": "#/$defs/gameClientBridgeBulkProjectionTarget" }
|
|
}
|
|
},
|
|
"gameClientBridgeBulkProjectionTarget": {
|
|
"type": "object",
|
|
"required": ["collection", "matchField", "matchValue", "fixedValues"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"collection": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,119}$" },
|
|
"matchField": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$" },
|
|
"matchValue": { "type": "string", "minLength": 1, "maxLength": 120 },
|
|
"fixedValues": { "type": "object", "minProperties": 1, "maxProperties": 64, "propertyNames": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$" }, "additionalProperties": { "type": "string", "maxLength": 4096 } },
|
|
"observedAtField": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$" },
|
|
"activityTarget": { "$ref": "#/$defs/gameClientBridgeBulkActivityTarget" }
|
|
}
|
|
},
|
|
"gameClientBridgeBulkActivityTarget": {
|
|
"type": "object",
|
|
"required": ["collection", "upsertKeys", "rowMappings"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"collection": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,119}$" },
|
|
"upsertKeys": { "type": "array", "items": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$" }, "uniqueItems": true, "minItems": 1, "maxItems": 8 },
|
|
"rowMappings": { "type": "object", "minProperties": 1, "maxProperties": 64, "propertyNames": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$" }, "additionalProperties": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$" } },
|
|
"fixedValues": { "type": "object", "maxProperties": 64, "propertyNames": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$" }, "additionalProperties": { "type": "string", "maxLength": 4096 } },
|
|
"observedAtField": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9._-]{0,79}$" }
|
|
}
|
|
},
|
|
"gameClientBridgeDataPack": {
|
|
"type": "object",
|
|
"required": ["key", "databaseUserVersion", "configMapRefs"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"key": { "$ref": "#/$defs/logicalKey" },
|
|
"databaseUserVersion": { "type": "integer", "minimum": 1 },
|
|
"configMapRefs": { "type": "array", "items": { "$ref": "#/$defs/relativeJsonRef" }, "uniqueItems": true, "minItems": 1 },
|
|
"dataRefs": { "type": "array", "items": { "$ref": "#/$defs/relativeJsonRef" }, "uniqueItems": true }
|
|
}
|
|
},
|
|
"gameClientBridgePageContract": {
|
|
"type": "object",
|
|
"required": ["pageKey"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"pageKey": { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]*$" },
|
|
"commandTypes": { "type": "array", "items": { "type": "string" }, "uniqueItems": true },
|
|
"snapshotTypes": { "type": "array", "items": { "type": "string" }, "uniqueItems": true },
|
|
"queryTemplateKeys": { "type": "array", "items": { "type": "string" }, "uniqueItems": true },
|
|
"featureKeys": { "type": "array", "items": { "type": "string" }, "uniqueItems": true }
|
|
}
|
|
},
|
|
"gameClientBridgeFeature": {
|
|
"type": "object", "required": ["key", "title", "permission"], "additionalProperties": false,
|
|
"properties": {
|
|
"key": { "type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,159}$" }, "title": { "type": "string", "minLength": 1, "maxLength": 80 }, "permission": { "$ref": "#/$defs/pluginPermission" },
|
|
"requiredHandlers": { "type": "array", "items": { "type": "string" }, "uniqueItems": true, "maxItems": 64 }, "requiredEventProducers": { "type": "array", "items": { "type": "string" }, "uniqueItems": true, "maxItems": 64 }
|
|
}
|
|
},
|
|
"productionLifecycleOperation": {
|
|
"enum": ["install", "enable", "disable", "upgrade", "rollback", "retire", "dependency-check"]
|
|
},
|
|
"relativeJsonRef": {
|
|
"type": "string",
|
|
"pattern": "^(?!/)(?![A-Za-z]:)(?!.*://)(?!.*\\.\\.)[a-zA-Z0-9_./-]+\\.json$"
|
|
},
|
|
"relativeSqlRef": {
|
|
"type": "string",
|
|
"pattern": "^(?!/)(?![A-Za-z]:)(?!.*://)(?!.*\\.\\.)[a-zA-Z0-9_./-]+\\.sql$"
|
|
},
|
|
"runCapability": {
|
|
"enum": [
|
|
"process.install",
|
|
"process.start",
|
|
"process.stop",
|
|
"process.restart",
|
|
"process.status",
|
|
"deployment.plan.v1",
|
|
"config.write",
|
|
"files.list",
|
|
"files.read",
|
|
"files.write",
|
|
"files.patch",
|
|
"logs.read",
|
|
"remote.ftp.read",
|
|
"remote.ftp.write",
|
|
"remote.rsync.read",
|
|
"remote.rsync.write",
|
|
"remote.run.files.read",
|
|
"remote.run.files.write",
|
|
"remote.run.process.start",
|
|
"remote.run.process.stop",
|
|
"remote.run.db.mysql.query",
|
|
"remote.run.db.mysql.execute",
|
|
"remote.run.db.sqlite.query",
|
|
"remote.run.db.sqlite.execute",
|
|
"remote.run.logs.transfer",
|
|
"remote.run.rcon.command",
|
|
"remote.run.program.command",
|
|
"artifacts.read",
|
|
"artifacts.write",
|
|
"ai.invoke"
|
|
]
|
|
},
|
|
"pluginPermission": {
|
|
"enum": [
|
|
"server.create",
|
|
"server.read",
|
|
"server.lifecycle",
|
|
"server.files.read",
|
|
"server.files.write",
|
|
"server.logs.read",
|
|
"server.artifacts.read",
|
|
"server.artifacts.write",
|
|
"server.remote.access",
|
|
"server.run.distribution",
|
|
"server.dependencies.manage",
|
|
"server.game-client.read",
|
|
"server.game-client.command",
|
|
"server.game-client.maintenance",
|
|
"ai.invoke"
|
|
]
|
|
},
|
|
"bridgeAction": {
|
|
"enum": [
|
|
"server.instances.read",
|
|
"jobs.dispatch",
|
|
"logs.query",
|
|
"artifacts.open",
|
|
"files.request",
|
|
"remote.access.request",
|
|
"run.distribution.request",
|
|
"dependencies.request",
|
|
"logs.backfill.request",
|
|
"plugin-lifecycle.request",
|
|
"ai.invoke"
|
|
]
|
|
},
|
|
"remoteAccessMethod": {
|
|
"enum": ["ftp", "rsync", "run"]
|
|
},
|
|
"remoteDatabaseEngine": {
|
|
"enum": ["mysql", "sqlite"]
|
|
},
|
|
"logicalKey": {
|
|
"type": "string",
|
|
"pattern": "^[a-z0-9][a-z0-9._/-]*$",
|
|
"maxLength": 120
|
|
},
|
|
"runtimePlatform": {
|
|
"enum": ["windows", "linux", "darwin"]
|
|
},
|
|
"runtimeArch": {
|
|
"enum": ["amd64", "arm64"]
|
|
},
|
|
"runtimeTarget": {
|
|
"type": "object",
|
|
"required": ["os", "arch"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"os": { "$ref": "#/$defs/runtimePlatform" },
|
|
"arch": { "$ref": "#/$defs/runtimeArch" }
|
|
}
|
|
},
|
|
"runtimeDiscoveryProbe": {
|
|
"type": "object",
|
|
"required": ["key", "kind", "targetKey"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"key": { "$ref": "#/$defs/logicalKey" },
|
|
"kind": { "enum": ["file.exists", "command.version", "service.status", "port.open", "steam.app", "docker.container"] },
|
|
"targetKey": { "$ref": "#/$defs/logicalKey" },
|
|
"required": { "type": "boolean" },
|
|
"expected": { "type": "string", "maxLength": 120 },
|
|
"platforms": { "type": "array", "items": { "$ref": "#/$defs/runtimePlatform" }, "uniqueItems": true }
|
|
}
|
|
},
|
|
"runtimeLifecycleProfile": {
|
|
"type": "object",
|
|
"required": ["key", "mode", "capabilities"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"key": { "$ref": "#/$defs/logicalKey" },
|
|
"mode": { "enum": ["local-process", "hosted-ftp-rcon", "ftp-only"] },
|
|
"capabilities": { "type": "array", "items": { "$ref": "#/$defs/runCapability" }, "uniqueItems": true, "minItems": 1 },
|
|
"actionRefs": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"install": { "$ref": "#/$defs/relativeJsonRef" },
|
|
"start": { "$ref": "#/$defs/relativeJsonRef" },
|
|
"stop": { "$ref": "#/$defs/relativeJsonRef" },
|
|
"restart": { "$ref": "#/$defs/relativeJsonRef" },
|
|
"status": { "$ref": "#/$defs/relativeJsonRef" }
|
|
}
|
|
},
|
|
"transportKeys": { "type": "array", "items": { "$ref": "#/$defs/logicalKey" }, "uniqueItems": true },
|
|
"dllExtensionRefs": { "type": "array", "items": { "$ref": "#/$defs/logicalKey" }, "uniqueItems": true, "maxItems": 16 },
|
|
"platforms": { "type": "array", "items": { "$ref": "#/$defs/runtimePlatform" }, "uniqueItems": true }
|
|
}
|
|
},
|
|
"runtimeDependencyProbe": {
|
|
"type": "object",
|
|
"required": ["key", "kind", "targetKey"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"key": { "$ref": "#/$defs/logicalKey" },
|
|
"kind": { "enum": ["command.version", "service.exists", "port.available", "steam.app", "steam.update", "java.version", "docker.available", "package.installed", "file.exists"] },
|
|
"targetKey": { "$ref": "#/$defs/logicalKey" },
|
|
"required": { "type": "boolean" },
|
|
"minimumVersion": { "type": "string", "maxLength": 80 },
|
|
"steamAppId": { "type": "string", "pattern": "^[0-9]{1,10}$" },
|
|
"platforms": { "type": "array", "items": { "$ref": "#/$defs/runtimePlatform" }, "uniqueItems": true }
|
|
}
|
|
},
|
|
"runtimeInstallStep": {
|
|
"type": "object",
|
|
"required": ["type", "targetKey"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"type": { "enum": ["package", "verified-download", "manual"] },
|
|
"targetKey": { "$ref": "#/$defs/logicalKey" },
|
|
"packageManager": { "enum": ["winget", "choco", "scoop", "apt", "yum", "dnf", "pacman", "zypper", "brew"] },
|
|
"packageName": { "type": "string", "pattern": "^[a-zA-Z0-9_.:+@/-]+$", "maxLength": 120 },
|
|
"version": { "type": "string", "maxLength": 80 },
|
|
"downloadRef": { "type": "string", "pattern": "^https://[a-zA-Z0-9._~:/?#\\[\\]@!$&'()*+,;=%-]+$", "maxLength": 240 },
|
|
"checksum": { "type": "string", "pattern": "^sha256:[a-fA-F0-9]{64}$" }
|
|
},
|
|
"allOf": [
|
|
{
|
|
"if": { "properties": { "type": { "const": "package" } }, "required": ["type"] },
|
|
"then": {
|
|
"required": ["packageManager", "packageName"],
|
|
"properties": { "packageManager": { "enum": ["winget", "choco", "scoop", "apt", "yum", "dnf", "pacman", "zypper", "brew"] } }
|
|
}
|
|
},
|
|
{
|
|
"if": { "properties": { "type": { "const": "verified-download" } }, "required": ["type"] },
|
|
"then": { "required": ["downloadRef", "checksum"] }
|
|
}
|
|
]
|
|
},
|
|
"runtimeInstallPlan": {
|
|
"type": "object",
|
|
"required": ["key", "title", "steps"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"key": { "$ref": "#/$defs/logicalKey" },
|
|
"title": { "type": "string", "minLength": 1, "maxLength": 80 },
|
|
"platforms": { "type": "array", "items": { "$ref": "#/$defs/runtimePlatform" }, "uniqueItems": true },
|
|
"steps": { "type": "array", "items": { "$ref": "#/$defs/runtimeInstallStep" }, "minItems": 1, "maxItems": 64 }
|
|
}
|
|
},
|
|
"runtimeLogSource": {
|
|
"type": "object",
|
|
"required": ["key", "kind", "streamKey"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"key": { "$ref": "#/$defs/logicalKey" },
|
|
"kind": { "enum": ["process.stdout", "process.stderr", "file.tail", "ftp.poll", "sql.query"] },
|
|
"targetKey": { "$ref": "#/$defs/logicalKey" },
|
|
"streamKey": { "$ref": "#/$defs/logicalKey" },
|
|
"cursorKind": { "enum": ["sequence", "offset", "fingerprint", "ftp-listing", "sql-cursor"] },
|
|
"retentionDays": { "type": "integer", "minimum": 1, "maximum": 365 }
|
|
}
|
|
},
|
|
"runtimeTransportProfile": {
|
|
"type": "object",
|
|
"required": ["key", "kind", "capabilities"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"key": { "$ref": "#/$defs/logicalKey" },
|
|
"kind": { "enum": ["file", "ftp", "rsync", "mysql", "sqlite", "rcon", "program"] },
|
|
"targetKey": { "$ref": "#/$defs/logicalKey" },
|
|
"capabilities": { "type": "array", "items": { "$ref": "#/$defs/runCapability" }, "uniqueItems": true, "minItems": 1 }
|
|
}
|
|
},
|
|
"runtimeDataTarget": {
|
|
"type": "object",
|
|
"required": ["key", "kind", "transportKey", "sourceRootKey", "sourcePath", "workspaceKey", "refreshPolicy", "maxBytes"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"key": { "$ref": "#/$defs/logicalKey" },
|
|
"kind": { "const": "sqlite.snapshot" },
|
|
"transportKey": { "$ref": "#/$defs/logicalKey" },
|
|
"sourceRootKey": { "$ref": "#/$defs/logicalKey" },
|
|
"sourcePath": { "$ref": "#/$defs/relativePathRef" },
|
|
"workspaceKey": { "type": "string", "pattern": "^databases/[a-zA-Z0-9._/-]+$", "maxLength": 120 },
|
|
"refreshPolicy": { "const": "on-demand-snapshot" },
|
|
"maxBytes": { "type": "integer", "minimum": 1, "maximum": 1073741824 },
|
|
"platforms": { "type": "array", "items": { "$ref": "#/$defs/runtimePlatform" }, "uniqueItems": true }
|
|
}
|
|
},
|
|
"relativePathRef": {
|
|
"type": "string",
|
|
"pattern": "^(?!/)(?![A-Za-z]:)(?!.*://)(?!.*\\.\\.)[a-zA-Z0-9_./-]+$",
|
|
"maxLength": 160
|
|
},
|
|
"runtimeDLLExtensionProfile": {
|
|
"type": "object",
|
|
"required": ["key", "displayName", "kind", "activation", "version", "releaseState", "targetKey", "modKey", "dllRef", "supportedTargets", "updateOnStart", "rconPort"],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"key": { "$ref": "#/$defs/logicalKey" },
|
|
"displayName": { "type": "string", "minLength": 1, "maxLength": 80 },
|
|
"kind": { "const": "ue4ss-dll" },
|
|
"activation": { "const": "server-start" },
|
|
"version": { "type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+(?:-[0-9A-Za-z.-]+)?$", "maxLength": 40 },
|
|
"releaseState": { "enum": ["unpublished", "ready"] },
|
|
"releaseUrl": { "type": "string", "pattern": "^https://[a-zA-Z0-9._~:/\\[\\]@!$&'()*+,;=%-]+\\.dll$", "maxLength": 240 },
|
|
"checksum": { "type": "string", "pattern": "^sha256:[a-fA-F0-9]{64}$" },
|
|
"sizeBytes": { "type": "integer", "minimum": 1, "maximum": 134217728 },
|
|
"targetKey": { "$ref": "#/$defs/logicalKey" },
|
|
"modKey": { "type": "string", "pattern": "^[a-z0-9][a-z0-9_-]{0,79}$" },
|
|
"dllRef": { "type": "string", "pattern": "^ue4ss/Mods/[a-z0-9][a-z0-9_-]{0,79}/dlls/main\\.dll$", "maxLength": 160 },
|
|
"targetExecutableChecksum": { "type": "string", "pattern": "^sha256:[a-fA-F0-9]{64}$" },
|
|
"ue4ssAbi": { "type": "string", "pattern": "^[A-Za-z0-9._-]{1,80}$" },
|
|
"supportedTargets": { "type": "array", "items": { "$ref": "#/$defs/runtimeTarget" }, "minItems": 1, "maxItems": 1, "uniqueItems": true },
|
|
"updateOnStart": { "const": true },
|
|
"rconPort": { "type": "integer", "minimum": 1024, "maximum": 65535 }
|
|
},
|
|
"allOf": [
|
|
{
|
|
"if": { "properties": { "releaseState": { "const": "ready" } }, "required": ["releaseState"] },
|
|
"then": { "required": ["releaseUrl", "checksum", "sizeBytes", "targetExecutableChecksum", "ue4ssAbi"] }
|
|
}
|
|
]
|
|
},
|
|
"aiPurpose": {
|
|
"enum": [
|
|
"config.read",
|
|
"config.generate",
|
|
"config.suggest",
|
|
"logs.diagnose",
|
|
"files.suggest"
|
|
]
|
|
}
|
|
}
|
|
}
|