Ship SCUM user SQL management page

This commit is contained in:
npc0-hue
2026-08-24 16:43:00 +08:00
parent 3005e0510c
commit d4e3f68032
19 changed files with 351 additions and 115 deletions
+14 -2
View File
@@ -11,8 +11,8 @@ import {
const plugin: PluginBridgeManifestContract = {
id: "game.example",
declaredPermissions: ["server.read", "server.logs.read", "server.files.read", "server.artifacts.read", "ai.invoke"],
bridgeActions: ["server.instances.read", "logs.query", "files.request", "artifacts.open", "ai.invoke"],
declaredPermissions: ["server.read", "server.logs.read", "server.files.read", "server.artifacts.read", "server.remote.access", "ai.invoke"],
bridgeActions: ["server.instances.read", "logs.query", "files.request", "artifacts.open", "remote.access.request", "ai.invoke"],
pages: [
{
key: "logs",
@@ -20,6 +20,13 @@ const plugin: PluginBridgeManifestContract = {
path: "/logs",
permissions: ["server.logs.read", "server.files.read", "server.artifacts.read", "ai.invoke"],
bridgeActions: ["logs.query", "files.request", "artifacts.open", "ai.invoke"]
},
{
key: "remote",
title: "Remote",
path: "/remote",
permissions: ["server.remote.access"],
bridgeActions: ["remote.access.request"]
}
],
aiPurposes: ["logs.diagnose"]
@@ -110,6 +117,11 @@ describe("plugin bridge host utilities", () => {
expect(client.executePluginBridge).not.toHaveBeenCalled();
});
it("allows mediated remote SQL execute payloads without direct connection material", () => {
const context = createPluginBridgeHostContext({ plugin, routeKey: "remote", serverInstanceId: "server-1", themeTokens: { colorScheme: "dark", accentColor: "#22c55e" } });
expect(validateBridgeExecutionRequest(context, { requestId: "sql-1", action: "remote.access.request", payload: { capability: "remote.run.db.sqlite.execute", declarationKey: "sqlite-db", targetKey: "scum-db", idempotencyKey: "sql-1", "input.sqlText": "UPDATE prisoner SET stamina = 855 WHERE id = 'steam-123';" } })).toBeNull();
});
it("dispatches mediated AI requests without provider configuration", async () => {
const context = createPluginBridgeHostContext({
plugin,
+1 -1
View File
@@ -110,7 +110,7 @@ export function validateBridgeExecutionRequest(context: PluginBridgeHostContext,
return { code: "payload_too_large", message: "bridge payload has too many keys" };
}
const encodedSize = Object.entries(payload).reduce((sum, [key, value]) => sum + key.length + value.length, 0);
if (encodedSize > 4096) {
if (encodedSize > 16 * 1024) {
return { code: "payload_too_large", message: "bridge payload is too large" };
}
for (const [key, value] of Object.entries(payload)) {