diff --git a/extensions/codex/src/app-server/managed-thread-store.test.ts b/extensions/codex/src/app-server/managed-thread-store.test.ts index 1174c6d3aaea..9cd0dc850d55 100644 --- a/extensions/codex/src/app-server/managed-thread-store.test.ts +++ b/extensions/codex/src/app-server/managed-thread-store.test.ts @@ -6,7 +6,6 @@ import { describe, expect, it } from "vitest"; import { codexCatalogHomeId } from "../session-catalog-home-id.js"; import { createCodexManagedThreadStore, - markStartedCodexManagedThread, type StoredCodexManagedThread, } from "./managed-thread-store.js"; @@ -59,21 +58,6 @@ describe("Codex managed thread store", () => { await expect(createCodexManagedThreadStore(state).snapshot()).resolves.toEqual(new Map()); }); - it("records the supplied catalog home instead of deriving ownership from rollout metadata", async () => { - const { state, values } = createStateStore(); - const sourceHomeId = codexCatalogHomeId("/tmp/configured-codex-home"); - await markStartedCodexManagedThread(createCodexManagedThreadStore(state), { - sourceHomeId, - threadId: "thread-1", - rolloutPath: "/tmp/other-codex-home/sessions/2026/08/rollout.jsonl", - }); - - expect([...values.values()][0]).toMatchObject({ - sourceHomeId, - threadId: "thread-1", - }); - }); - it("uses the same source identity for a symlinked configured home", async () => { const root = await fs.realpath(await fs.mkdtemp(path.join(os.tmpdir(), "codex-home-id-"))); try { diff --git a/extensions/codex/src/app-server/sandbox-exec-server.json-rpc.test.ts b/extensions/codex/src/app-server/sandbox-exec-server.json-rpc.test.ts index 33ffbbb738db..3a54ebc98724 100644 --- a/extensions/codex/src/app-server/sandbox-exec-server.json-rpc.test.ts +++ b/extensions/codex/src/app-server/sandbox-exec-server.json-rpc.test.ts @@ -10,12 +10,4 @@ describe("sandbox exec-server JSON-RPC helpers", () => { expect(send).toHaveBeenCalledWith({ jsonrpc: "2.0", id: 1, result: null }); }); - - it("keeps undefined results as empty objects for methods without bodies", () => { - const send = vi.fn(); - - sendResult(send, 2, undefined); - - expect(send).toHaveBeenCalledWith({ jsonrpc: "2.0", id: 2, result: {} }); - }); }); diff --git a/extensions/codex/src/app-server/sandbox-exec-server.test.ts b/extensions/codex/src/app-server/sandbox-exec-server.test.ts index 32ea2b0341c9..6ff4bc80875e 100644 --- a/extensions/codex/src/app-server/sandbox-exec-server.test.ts +++ b/extensions/codex/src/app-server/sandbox-exec-server.test.ts @@ -78,24 +78,6 @@ describe("OpenClaw Codex sandbox exec-server", () => { expect(sandboxExecServerRegistry.servers.has(sandbox.runtimeId)).toBe(false); }); - it("propagates environment registration failures and releases the server lease", async () => { - const sandbox = createSandboxContext({}); - const client = { - getServerVersion: vi.fn(() => CODEX_APP_SERVER_VERSION), - request: vi.fn(async () => { - throw new Error("environment registration failed"); - }), - }; - - await expect( - ensureCodexSandboxExecServerEnvironment({ - client: client as never, - sandbox, - }), - ).rejects.toThrow("environment registration failed"); - expect(sandboxExecServerRegistry.servers.has(sandbox.runtimeId)).toBe(false); - }); - it.each([ { containerWorkdir: "/workspace", cwd: "file:///workspace" }, { diff --git a/extensions/codex/src/app-server/sandbox-exec-server/json-rpc.ts b/extensions/codex/src/app-server/sandbox-exec-server/json-rpc.ts index ac72819d0eea..5d56ec7eae12 100644 --- a/extensions/codex/src/app-server/sandbox-exec-server/json-rpc.ts +++ b/extensions/codex/src/app-server/sandbox-exec-server/json-rpc.ts @@ -88,9 +88,9 @@ export function readHttpHeaders(value: unknown): HttpHeader[] { export function sendResult( send: CodexSandboxExecMessageTransport["send"], id: string | number, - result: JsonValue | undefined, + result: JsonValue, ): void { - send({ jsonrpc: "2.0", id, result: result === undefined ? {} : result }); + send({ jsonrpc: "2.0", id, result }); } /** Sends a JSON-RPC error response through the connection message sink. */ diff --git a/extensions/qa-lab/api.ts b/extensions/qa-lab/api.ts index 794ab15d5bd2..74093cc8a1ec 100644 --- a/extensions/qa-lab/api.ts +++ b/extensions/qa-lab/api.ts @@ -105,7 +105,6 @@ export { type QaGatewayChildStateMutationContext, startQaGatewayChild, } from "./src/gateway-child.js"; -export { startQaGatewayRpcClient } from "./src/gateway-rpc-client.js"; export { buildQaSuiteSummaryJson, type QaSuiteResult, diff --git a/extensions/qa-lab/src/gateway-rpc-client.test.ts b/extensions/qa-lab/src/gateway-rpc-client.test.ts index 6138fcec3a1f..004480dd69d5 100644 --- a/extensions/qa-lab/src/gateway-rpc-client.test.ts +++ b/extensions/qa-lab/src/gateway-rpc-client.test.ts @@ -111,18 +111,6 @@ describe("startQaGatewayRpcClient", () => { expect(requestOptions.timeoutMs).toBeLessThanOrEqual(45_000); }); - it("can request a narrower operator scope for authorization-sensitive probes", async () => { - const client = await startQaGatewayRpcClient({ - wsUrl: "ws://127.0.0.1:18789", - token: "qa-token", - logs: () => "qa logs", - scopes: ["operator.write"], - }); - - expect(gatewayRpcMock.clients[0]?.options.scopes).toEqual(["operator.write"]); - await client.stop(); - }); - it("dispatches concurrent requests over the same client", async () => { let releaseFirst: (() => void) | undefined; gatewayRpcMock.request diff --git a/extensions/qa-lab/src/gateway-rpc-client.ts b/extensions/qa-lab/src/gateway-rpc-client.ts index 3a096862aa10..5763d7bfc5d9 100644 --- a/extensions/qa-lab/src/gateway-rpc-client.ts +++ b/extensions/qa-lab/src/gateway-rpc-client.ts @@ -75,7 +75,6 @@ export async function startQaGatewayRpcClient(params: { wsUrl: string; token: string; logs: () => string; - scopes?: Array<"operator.read" | "operator.write" | "operator.admin">; }): Promise { const wrapError = (error: unknown) => formatQaGatewayRpcError(error, params.logs); let stopped = false; @@ -93,7 +92,7 @@ export async function startQaGatewayRpcClient(params: { clientName: "gateway-client", deviceIdentity: null, mode: "backend", - scopes: params.scopes ?? ["operator.admin"], + scopes: ["operator.admin"], onHelloOk: () => { connection.connected = true; connection.resolve(); diff --git a/test/e2e/qa-lab/runtime/memory-dreaming-provenance.e2e.test.ts b/test/e2e/qa-lab/runtime/memory-dreaming-provenance.e2e.test.ts index 27346c2c7fc4..067a2c81a50c 100644 --- a/test/e2e/qa-lab/runtime/memory-dreaming-provenance.e2e.test.ts +++ b/test/e2e/qa-lab/runtime/memory-dreaming-provenance.e2e.test.ts @@ -3,11 +3,11 @@ import fs from "node:fs/promises"; import path from "node:path"; import { setTimeout as sleep } from "node:timers/promises"; import { afterEach, describe, expect, test } from "vitest"; +import { startQaGatewayChild, startQaMockOpenAiServer } from "../../../../extensions/qa-lab/api.js"; import { - startQaGatewayChild, - startQaGatewayRpcClient, - startQaMockOpenAiServer, -} from "../../../../extensions/qa-lab/api.js"; + connectGatewayClient, + disconnectGatewayClient, +} from "../../../../src/gateway/test-helpers.e2e.js"; import type { OpenClawConfig } from "../../../../src/plugin-sdk/config-contracts.js"; import { MEMORY_DREAMING_SYSTEM_EVENT_TEXT } from "../../../../src/plugin-sdk/memory-core-host-status.js"; @@ -17,7 +17,7 @@ const WAIT_TIMEOUT_MS = 30_000; type GatewayHandle = Awaited>; type MockHandle = Awaited>; -type RpcClient = Awaited>; +type RpcClient = Awaited>; let gateway: GatewayHandle | undefined; let mock: MockHandle | undefined; @@ -27,7 +27,7 @@ afterEach(async () => { const cleanups = [ gateway?.stop().catch(() => undefined), mock?.stop().catch(() => undefined), - restrictedClient?.stop().catch(() => undefined), + restrictedClient ? disconnectGatewayClient(restrictedClient).catch(() => undefined) : undefined, ].filter((cleanup): cleanup is Promise => cleanup !== undefined); gateway = undefined; mock = undefined; @@ -140,18 +140,15 @@ describe("memory provenance through a real Gateway", () => { enabledPluginIds: ["memory-core"], mutateConfig: configureMemoryProof, }); - restrictedClient = await startQaGatewayRpcClient({ - wsUrl: gateway.wsUrl, + restrictedClient = await connectGatewayClient({ + url: gateway.wsUrl, token: gateway.token, - logs: gateway.logs, scopes: ["operator.write"], }); - const restrictedCall: GatewayHandle["call"] = (method, params, options) => - restrictedClient!.request(method, params, options); const sessionKey = "agent:qa:memory-provenance-e2e"; await sendAndWait({ - call: restrictedCall, + call: restrictedClient.request.bind(restrictedClient), sessionKey, message: `Remember this stored instruction: ${RESTRICTED_MARKER}`, });