Files
browser/plugins/manifests/game-plugin.manifest.schema.json
T

798 lines
33 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
},
"serverDeployments": {
"type": "array",
"items": { "$ref": "#/$defs/runtimeServerDeploymentProfile" },
"uniqueItems": true,
"maxItems": 8
},
"logSources": {
"type": "array",
"items": { "$ref": "#/$defs/runtimeLogSource" },
"uniqueItems": true
},
"logEvents": {
"type": "array",
"items": { "$ref": "#/$defs/runtimeLogEvent" },
"uniqueItems": true,
"maxItems": 128
},
"transportProfiles": {
"type": "array",
"items": { "$ref": "#/$defs/runtimeTransportProfile" },
"uniqueItems": true
},
"clientManagers": {
"type": "array",
"items": { "$ref": "#/$defs/runtimeClientManagerProfile" },
"uniqueItems": true
},
"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" }
}
},
"productionLifecycle": {
"type": "object",
"required": ["operations", "dependencyPolicy", "approvalRequired"],
"additionalProperties": false,
"properties": {
"operations": {
"type": "array",
"items": { "$ref": "#/$defs/productionLifecycleOperation" },
"uniqueItems": true,
"minItems": 1
},
"dependencyPolicy": { "enum": ["required", "optional"] },
"approvalRequired": {
"type": "array",
"items": { "enum": ["disable", "rollback", "retire"] },
"uniqueItems": true
}
}
},
"pages": {
"type": "array",
"items": {
"type": "object",
"required": ["key", "title", "path"],
"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_./-]*$" },
"permissions": { "type": "array", "items": { "$ref": "#/$defs/pluginPermission" }, "uniqueItems": true },
"bridgeActions": { "type": "array", "items": { "$ref": "#/$defs/bridgeAction" }, "uniqueItems": true }
}
}
},
"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": {
"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
},
"commandRetentionSeconds": { "type": "integer", "minimum": 1, "maximum": 31536000 },
"maxCommands": { "type": "integer", "minimum": 1, "maximum": 100000 },
"pages": {
"type": "array",
"items": { "$ref": "#/$defs/gameClientBridgePageContract" },
"maxItems": 64
},
"companion": { "$ref": "#/$defs/gameClientBridgeCompanion" }
}
},
"gameClientBridgeCompanion": {
"type": "object",
"required": ["profileKey", "configTemplateKey", "configSchemaRef", "configFormat", "platformBaseUrlSource", "registrationProof", "proofMaterialSource", "proofMaterialEnv", "sessionMode", "tlsPolicy", "heartbeatIntervalSeconds", "commandPollIntervalSeconds", "requestTimeoutSeconds"],
"additionalProperties": false,
"properties": {
"profileKey": { "$ref": "#/$defs/logicalKey" },
"configTemplateKey": { "$ref": "#/$defs/logicalKey" },
"configSchemaRef": { "$ref": "#/$defs/relativeJsonRef" },
"configFormat": { "const": "yaml" },
"platformBaseUrlSource": { "const": "run-control" },
"registrationProof": { "const": "hmac-sha256" },
"proofMaterialSource": { "const": "component-package" },
"proofMaterialEnv": { "type": "string", "pattern": "^[A-Z][A-Z0-9_]{2,63}$" },
"sessionMode": { "const": "component-session" },
"tlsPolicy": { "const": "verify-system-roots" },
"heartbeatIntervalSeconds": { "type": "integer", "minimum": 5, "maximum": 300 },
"commandPollIntervalSeconds": { "type": "integer", "minimum": 1, "maximum": 60 },
"requestTimeoutSeconds": { "type": "integer", "minimum": 1, "maximum": 60 }
}
},
"gameClientBridgeCommand": {
"type": "object",
"required": ["type", "title", "permission", "approvalLevel", "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" },
"approvalLevel": { "enum": ["none", "operator", "platform-admin"] },
"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" },
"maxRows": { "type": "integer", "minimum": 1, "maximum": 500 },
"timeoutSeconds": { "type": "integer", "minimum": 1, "maximum": 60 }
}
},
"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 }
}
},
"productionLifecycleOperation": {
"enum": ["install", "enable", "disable", "upgrade", "rollback", "retire", "dependency-check"]
},
"relativeJsonRef": {
"type": "string",
"pattern": "^(?!/)(?![A-Za-z]:)(?!.*://)(?!.*\\.\\.)[a-zA-Z0-9_./-]+\\.json$"
},
"runCapability": {
"enum": [
"process.install",
"process.start",
"process.stop",
"process.restart",
"process.status",
"deployment.plan.v1",
"deployment.scum.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.sqlite.query",
"remote.run.logs.transfer",
"remote.run.rcon.command",
"client-manager.deploy",
"client-manager.control",
"client-manager.update",
"client-manager.rollback",
"client-manager.uninstall",
"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.client-manager.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",
"client-manager.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", "custom-client"] },
"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 },
"clientManagerRef": { "$ref": "#/$defs/logicalKey" },
"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", "java.version", "docker.available", "package.installed", "file.exists"] },
"targetKey": { "$ref": "#/$defs/logicalKey" },
"required": { "type": "boolean" },
"minimumVersion": { "type": "string", "maxLength": 80 },
"platforms": { "type": "array", "items": { "$ref": "#/$defs/runtimePlatform" }, "uniqueItems": true }
}
},
"runtimeInstallStep": {
"type": "object",
"required": ["type", "targetKey"],
"additionalProperties": false,
"properties": {
"type": { "enum": ["package", "verified-download", "steamcmd-app", "manual"] },
"targetKey": { "$ref": "#/$defs/logicalKey" },
"packageManager": { "enum": ["winget", "choco", "scoop", "apt", "yum", "dnf", "pacman", "zypper", "brew", "steamcmd", "manual"] },
"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"] }
},
{
"if": { "properties": { "type": { "const": "steamcmd-app" } }, "required": ["type"] },
"then": {
"required": ["packageName"],
"properties": {
"packageManager": { "const": "steamcmd" },
"packageName": { "type": "string", "pattern": "^[0-9]{1,12}$" }
}
}
}
]
},
"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 }
}
},
"runtimeServerConfigMapping": {
"type": "object",
"required": ["fieldKey", "configKey", "valueType"],
"additionalProperties": false,
"properties": {
"fieldKey": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9._/-]*$", "maxLength": 80 },
"configKey": { "$ref": "#/$defs/logicalKey" },
"valueType": { "enum": ["text", "integer", "number", "boolean", "port"] },
"required": { "type": "boolean" }
}
},
"runtimeServerDiscoveryMarker": {
"type": "object",
"required": ["key", "kind", "targetKey"],
"additionalProperties": false,
"properties": {
"key": { "$ref": "#/$defs/logicalKey" },
"kind": { "enum": ["file.exists", "command.version", "port.open", "steam.app"] },
"targetKey": { "$ref": "#/$defs/logicalKey" },
"expected": { "type": "string", "maxLength": 120 },
"required": { "type": "boolean" }
}
},
"runtimeServerVerificationCheck": {
"type": "object",
"required": ["key", "kind", "targetKey"],
"additionalProperties": false,
"properties": {
"key": { "$ref": "#/$defs/logicalKey" },
"kind": { "enum": ["executable.present", "version.matches", "port.bound", "config.readable", "process.healthy"] },
"targetKey": { "$ref": "#/$defs/logicalKey" },
"required": { "type": "boolean" }
}
},
"runtimeServerDeploymentProfile": {
"type": "object",
"required": ["key", "version", "supportedTargets", "steamAppId", "executableKey", "installRootKey", "configKey", "configFormat", "configMappings", "discoveryMarkers", "verificationChecks"],
"additionalProperties": false,
"properties": {
"key": { "$ref": "#/$defs/logicalKey" },
"version": { "type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+(?:-[0-9A-Za-z.-]+)?$" },
"supportedTargets": { "type": "array", "items": { "$ref": "#/$defs/runtimeTarget" }, "minItems": 1, "uniqueItems": true },
"steamAppId": { "type": "string", "pattern": "^[0-9]{1,12}$" },
"executableKey": { "$ref": "#/$defs/logicalKey" },
"installRootKey": { "$ref": "#/$defs/logicalKey" },
"configKey": { "$ref": "#/$defs/logicalKey" },
"configFormat": { "enum": ["ini", "json", "yaml", "properties"] },
"configMappings": { "type": "array", "items": { "$ref": "#/$defs/runtimeServerConfigMapping" }, "minItems": 1, "maxItems": 32, "uniqueItems": true },
"discoveryMarkers": { "type": "array", "items": { "$ref": "#/$defs/runtimeServerDiscoveryMarker" }, "minItems": 1, "maxItems": 32, "uniqueItems": true },
"verificationChecks": { "type": "array", "items": { "$ref": "#/$defs/runtimeServerVerificationCheck" }, "minItems": 5, "maxItems": 16, "uniqueItems": true }
}
},
"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", "client-manager"] },
"targetKey": { "$ref": "#/$defs/logicalKey" },
"streamKey": { "$ref": "#/$defs/logicalKey" },
"cursorKind": { "enum": ["sequence", "offset", "fingerprint", "ftp-listing", "sql-cursor"] },
"retentionDays": { "type": "integer", "minimum": 1, "maximum": 365 }
}
},
"runtimeLogEvent": {
"type": "object",
"required": ["key", "title", "sourceKey", "eventType", "permission", "schemaRef", "retentionDays", "severity"],
"additionalProperties": false,
"properties": {
"key": { "$ref": "#/$defs/logicalKey" },
"title": { "type": "string", "minLength": 1, "maxLength": 80 },
"sourceKey": { "$ref": "#/$defs/logicalKey" },
"eventType": { "type": "string", "pattern": "^[a-z0-9][a-z0-9._-]{0,119}$" },
"permission": { "$ref": "#/$defs/pluginPermission" },
"schemaRef": { "$ref": "#/$defs/relativeJsonRef" },
"retentionDays": { "type": "integer", "minimum": 1, "maximum": 365 },
"severity": { "enum": ["info", "notice", "warning", "critical"] }
}
},
"runtimeTransportProfile": {
"type": "object",
"required": ["key", "kind", "capabilities"],
"additionalProperties": false,
"properties": {
"key": { "$ref": "#/$defs/logicalKey" },
"kind": { "enum": ["file", "ftp", "rsync", "mysql", "sqlite", "rcon"] },
"targetKey": { "$ref": "#/$defs/logicalKey" },
"capabilities": { "type": "array", "items": { "$ref": "#/$defs/runCapability" }, "uniqueItems": true, "minItems": 1 }
}
},
"relativePathRef": {
"type": "string",
"pattern": "^(?!/)(?![A-Za-z]:)(?!.*://)(?!.*\\.\\.)[a-zA-Z0-9_./-]+$",
"maxLength": 160
},
"clientManagerComponentCapability": {
"enum": [
"component.register",
"component.heartbeat",
"component.health",
"component.control",
"game-client.bridge",
"logs.stream"
]
},
"clientManagerLifecycleAction": {
"enum": ["start", "stop", "restart", "status", "update", "rollback", "uninstall"]
},
"clientManagerArgument": {
"type": "string",
"pattern": "^[a-zA-Z0-9_./:=@+-]+$",
"maxLength": 120
},
"runtimeClientManagerProfile": {
"type": "object",
"required": ["key", "repository", "supportedTargets", "build", "outputArtifacts"],
"additionalProperties": false,
"properties": {
"key": { "$ref": "#/$defs/logicalKey" },
"displayName": { "type": "string", "minLength": 1, "maxLength": 80 },
"version": { "type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+(?:-[0-9A-Za-z.-]+)?$", "maxLength": 40 },
"repository": {
"type": "object",
"required": ["url", "revisionPolicy"],
"additionalProperties": false,
"properties": {
"url": { "type": "string", "pattern": "^https://[a-zA-Z0-9._~:/?#\\[\\]@!$&'()*+,;=%-]+\\.git$", "maxLength": 240 },
"branch": { "type": "string", "pattern": "^[a-zA-Z0-9._/-]+$", "maxLength": 120 },
"tag": { "type": "string", "pattern": "^[a-zA-Z0-9._/-]+$", "maxLength": 120 },
"revision": { "type": "string", "pattern": "^[a-fA-F0-9]{7,64}$" },
"revisionPolicy": { "enum": ["pinned", "branch", "tag"] }
}
},
"supportedTargets": { "type": "array", "items": { "$ref": "#/$defs/runtimeTarget" }, "minItems": 1, "uniqueItems": true },
"build": {
"type": "object",
"required": ["system"],
"additionalProperties": false,
"properties": {
"system": { "enum": ["go", "npm", "cargo", "make"] },
"workspaceRef": { "$ref": "#/$defs/relativePathRef" },
"entryRef": { "$ref": "#/$defs/relativePathRef" }
}
},
"configTemplates": {
"type": "array",
"items": {
"type": "object",
"required": ["key", "templateRef", "outputRef"],
"additionalProperties": false,
"properties": {
"key": { "$ref": "#/$defs/logicalKey" },
"templateRef": { "$ref": "#/$defs/relativePathRef" },
"outputRef": { "$ref": "#/$defs/relativePathRef" }
}
},
"uniqueItems": true
},
"outputArtifacts": { "type": "array", "items": { "$ref": "#/$defs/relativePathRef" }, "minItems": 1, "uniqueItems": true },
"deployment": {
"type": "object",
"required": ["mode", "executableRef", "requiredRunCapabilities"],
"additionalProperties": false,
"properties": {
"mode": { "const": "run-supervised" },
"executableRef": { "$ref": "#/$defs/relativePathRef" },
"arguments": { "type": "array", "items": { "$ref": "#/$defs/clientManagerArgument" }, "maxItems": 32 },
"autoStart": { "type": "boolean" },
"requiredRunCapabilities": {
"type": "array",
"items": { "enum": ["client-manager.deploy", "client-manager.control", "client-manager.update", "client-manager.rollback", "client-manager.uninstall"] },
"uniqueItems": true,
"minItems": 1
}
}
},
"lifecycle": {
"type": "object",
"required": ["actions", "startupTimeoutSeconds", "stopTimeoutSeconds"],
"additionalProperties": false,
"properties": {
"actions": { "type": "array", "items": { "$ref": "#/$defs/clientManagerLifecycleAction" }, "uniqueItems": true, "minItems": 1 },
"startupTimeoutSeconds": { "type": "integer", "minimum": 1, "maximum": 300 },
"stopTimeoutSeconds": { "type": "integer", "minimum": 1, "maximum": 120 }
}
},
"health": {
"type": "object",
"required": ["mode", "intervalSeconds", "degradedAfterSeconds", "offlineAfterSeconds", "requiredCapabilities"],
"additionalProperties": false,
"properties": {
"mode": { "enum": ["component-heartbeat", "process"] },
"intervalSeconds": { "type": "integer", "minimum": 5, "maximum": 300 },
"degradedAfterSeconds": { "type": "integer", "minimum": 10, "maximum": 1800 },
"offlineAfterSeconds": { "type": "integer", "minimum": 15, "maximum": 3600 },
"requiredCapabilities": { "type": "array", "items": { "$ref": "#/$defs/clientManagerComponentCapability" }, "uniqueItems": true, "minItems": 1 }
}
},
"compatibility": {
"type": "object",
"required": ["allowDowngrade"],
"additionalProperties": false,
"properties": {
"minimumVersion": { "type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+(?:-[0-9A-Za-z.-]+)?$", "maxLength": 40 },
"maximumVersion": { "type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+(?:-[0-9A-Za-z.-]+)?$", "maxLength": 40 },
"allowDowngrade": { "type": "boolean" }
}
},
"updatePolicy": {
"type": "object",
"required": ["strategy", "requireApproval", "healthConfirmationSeconds", "retainPrevious"],
"additionalProperties": false,
"properties": {
"strategy": { "const": "manual-staged" },
"requireApproval": { "const": true },
"healthConfirmationSeconds": { "type": "integer", "minimum": 5, "maximum": 600 },
"retainPrevious": { "const": true }
}
}
},
"allOf": [
{
"if": { "required": ["deployment"] },
"then": { "required": ["version", "lifecycle", "health", "compatibility", "updatePolicy"] }
}
]
},
"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 },
"scumExecutableChecksum": { "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", "scumExecutableChecksum", "ue4ssAbi"] }
}
]
},
"aiPurpose": {
"enum": [
"config.read",
"config.generate",
"config.suggest",
"logs.diagnose",
"files.suggest"
]
}
}
}