Remove pre-1.0 audit and protected request scaffolding

This commit is contained in:
npc0-hue
2026-08-20 23:42:02 +08:00
parent 40b35b05c7
commit a7e2e4c6c0
130 changed files with 526 additions and 3767 deletions
@@ -4,15 +4,15 @@ import { act } from "react";
import { createRoot, type Root } from "react-dom/client";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import type { GameClientBridgeCommandResponse, LogEntryBody, LogStreamResponse } from "../api/types";
import type { JobResponse, LogEntryBody, LogStreamResponse, SourceRCONCommandResponse } from "../api/types";
import { ServerManagementTerminalDrawer } from "./ServerManagementTerminalDrawer";
const apiMocks = vi.hoisted(() => ({
getGameClientBridgeCommand: vi.fn(),
dispatchSourceRCONCommand: vi.fn(),
getJob: vi.fn(),
listLogStreams: vi.fn(),
openServerLogEvents: vi.fn(),
queryLogStream: vi.fn(),
queueGameClientBridgeCommand: vi.fn()
queryLogStream: vi.fn()
}));
vi.mock("../api/client", () => ({ platformApiClient: apiMocks }));
@@ -85,7 +85,7 @@ describe("ServerManagementTerminalDrawer", () => {
expect(Array.from(container?.querySelectorAll(".terminal-text") ?? []).filter((node) => node.textContent === "generation A current replay")).toHaveLength(1);
expect(apiMocks.openServerLogEvents).toHaveBeenCalledTimes(1);
expect(apiMocks.listLogStreams).not.toHaveBeenCalled();
expect(apiMocks.queueGameClientBridgeCommand).not.toHaveBeenCalled();
expect(apiMocks.dispatchSourceRCONCommand).not.toHaveBeenCalled();
});
it("renders an empty current session without accepting unrelated or sessionless logs", async () => {
@@ -97,7 +97,7 @@ describe("ServerManagementTerminalDrawer", () => {
expect(container?.textContent).toContain("当前没有可跟随的受管进程输出");
expect(container?.textContent).not.toContain("legacy output must stay historical");
expect(apiMocks.queueGameClientBridgeCommand).not.toHaveBeenCalled();
expect(apiMocks.dispatchSourceRCONCommand).not.toHaveBeenCalled();
});
it("clears generation A on a new session and rejects late generation A events", async () => {
@@ -166,18 +166,18 @@ describe("ServerManagementTerminalDrawer", () => {
expect(container?.textContent).not.toContain("selected historical output");
expect(apiMocks.listLogStreams).toHaveBeenCalledWith("server-1");
expect(apiMocks.queryLogStream).toHaveBeenCalledWith({ logStreamId: oldStream.id, afterSeq: 400, limit: 500 });
expect(apiMocks.queueGameClientBridgeCommand).not.toHaveBeenCalled();
expect(apiMocks.dispatchSourceRCONCommand).not.toHaveBeenCalled();
});
it("uses RCON only after an operator submits a command", async () => {
const pending = bridgeCommand("pending");
const succeeded = bridgeCommand("succeeded");
apiMocks.queueGameClientBridgeCommand.mockResolvedValue(pending);
apiMocks.getGameClientBridgeCommand.mockResolvedValue(succeeded);
const pending = sourceRCONDispatch("queued");
const succeeded = jobResponse("succeeded");
apiMocks.dispatchSourceRCONCommand.mockResolvedValue(pending);
apiMocks.getJob.mockResolvedValue(succeeded);
await renderDrawer();
await emitSession("session-current");
await emitLog("stdout-current", "session-current", "process.stdout", logEntry(1, "ordinary live output"));
expect(apiMocks.queueGameClientBridgeCommand).not.toHaveBeenCalled();
expect(apiMocks.dispatchSourceRCONCommand).not.toHaveBeenCalled();
const input = container?.querySelector<HTMLInputElement>('.terminal-command-form input');
const form = container?.querySelector<HTMLFormElement>('.terminal-command-form');
@@ -186,8 +186,9 @@ describe("ServerManagementTerminalDrawer", () => {
await act(async () => form.dispatchEvent(new SubmitEvent("submit", { bubbles: true, cancelable: true })));
await flushPromises();
expect(apiMocks.queueGameClientBridgeCommand).toHaveBeenCalledTimes(1);
expect(apiMocks.getGameClientBridgeCommand).toHaveBeenCalledWith("server-1", pending.id);
expect(apiMocks.dispatchSourceRCONCommand).toHaveBeenCalledTimes(1);
expect(apiMocks.dispatchSourceRCONCommand).toHaveBeenCalledWith("server-1", expect.objectContaining({ kind: "command", command: "#ListPlayers" }));
expect(apiMocks.getJob).toHaveBeenCalledWith(pending.jobId);
expect(container?.textContent).toContain("ordinary live output");
});
});
@@ -246,10 +247,24 @@ function logEntry(seq: number, line: string, timestamp = `2026-08-14T00:00:0${se
return { seq, timestamp, line, redacted: true };
}
function bridgeCommand(state: GameClientBridgeCommandResponse["state"]): GameClientBridgeCommandResponse {
function sourceRCONDispatch(status: SourceRCONCommandResponse["status"]): SourceRCONCommandResponse {
return { jobId: "job-rcon-1", serverInstanceId: "server-1", status, message: "queued" };
}
function jobResponse(state: JobResponse["state"]): JobResponse {
return {
id: "command-1", serverInstanceId: "server-1", pluginId: "game.scum", profileKey: "scum-rcon", commandType: "management.command", priority: 50, state, approvalState: "not_required",
result: state === "succeeded" ? { status: "succeeded", summary: "command completed", completedAt: "2026-08-14T00:00:03Z" } : undefined,
expiresAt: "2026-08-14T00:01:00Z", createdAt: "2026-08-14T00:00:00Z", updatedAt: "2026-08-14T00:00:03Z", completedAt: state === "succeeded" ? "2026-08-14T00:00:03Z" : undefined
id: "job-rcon-1",
serverInstanceId: "server-1",
runEndpointId: "run-1",
capability: "remote.run.rcon.command",
targetKey: "source-rcon/command",
idempotencyKey: "idem-rcon-1",
state,
progress: { percent: state === "succeeded" ? 100 : 50, message: state === "succeeded" ? "command completed" : "running" },
retryPolicy: { maxAttempts: 1, initialBackoffSeconds: 1, maxBackoffSeconds: 1 },
attempt: 1,
reconcileCount: 0,
createdAt: "2026-08-14T00:00:00Z",
updatedAt: "2026-08-14T00:00:03Z"
};
}