feat(scum): gate live data on schema evidence

This commit is contained in:
npc0-hue
2026-08-11 13:28:36 +08:00
parent e5d26e5420
commit a58da47c60
18 changed files with 1265 additions and 3 deletions
+51
View File
@@ -43,6 +43,7 @@ export type RunCapability =
| "remote.run.process.start"
| "remote.run.process.stop"
| "remote.run.db.mysql.query"
| "remote.run.db.sqlite.probe"
| "remote.run.db.sqlite.query"
| "remote.run.logs.transfer"
| "remote.run.rcon.command"
@@ -268,6 +269,55 @@ export interface GameClientBridgeQueryTemplateDeclaration {
export type GameClientBridgeOperationKind = "rcon" | "sqlite-mutation";
export type SCUMLiveDataCapability =
| "schema-probe"
| "players.read"
| "player-details.read"
| "squads.read"
| "squad-members.read"
| "vehicles.read"
| "flags.read"
| "positions.read"
| "profile-xml.write"
| "economy-command.write"
| "gift-command.write";
export type SCUMLiveDataGateState = "disabled" | "enabled";
export type SCUMLiveDataEvidenceStatus = "missing" | "compatible" | "incompatible" | "failed";
export interface SCUMLiveDataCapabilityGateDeclaration {
capability: SCUMLiveDataCapability;
gate: SCUMLiveDataGateState;
adapterVersion: string;
requiredSchemaFingerprint?: string;
requiredAssetDigests?: `sha256:${string}`[];
evidenceStatus: SCUMLiveDataEvidenceStatus;
safeReason: string;
}
export interface SCUMSchemaProbeBoundsDeclaration {
maxObjects: number;
maxColumnsPerObject: number;
maxIndexesPerObject: number;
maxForeignKeys: number;
maxCardinalityReads: number;
maxSampleRows: number;
timeoutMs: number;
maxResultBytes: number;
}
export interface SCUMSchemaProbeDeclaration {
capability: Extract<RunCapability, "remote.run.db.sqlite.probe">;
targetKey: string;
bounds: SCUMSchemaProbeBoundsDeclaration;
}
export interface SCUMLiveDataManifestDeclaration {
schemaVersion: "1";
probe: SCUMSchemaProbeDeclaration;
capabilityGates: SCUMLiveDataCapabilityGateDeclaration[];
}
export interface GameClientBridgeOperationSafety {
requiresApproval?: boolean;
requiresOfflinePlayer?: boolean;
@@ -722,6 +772,7 @@ export interface GamePluginManifest {
remoteAccess?: GamePluginRemoteAccess;
runtimeProfiles?: GamePluginRuntimeProfiles;
gameClientBridge?: GameClientBridgeManifest;
scumLiveData?: SCUMLiveDataManifestDeclaration;
actions?: GamePluginActions;
assetFiles?: PluginAssetFile[];
productionLifecycle: {