Files
openclaw/extensions/acpx/src/process-lease.test.ts
Leo Ge 99a6b1c5a8 fix(acpx): surface Codex ACP diagnostics
Surface redacted Codex wrapper stderr for generic ACP internal failures, preserve safe Codex model/provider routing in isolated CODEX_HOME, and cover the ACP parent stream dispatch order.

Co-authored-by: leoge007 <leoge@users.noreply.github.com>
2026-05-14 22:42:28 +01:00

90 lines
2.8 KiB
TypeScript

import { mkdtemp, rm } from "node:fs/promises";
import { tmpdir } from "node:os";
import path from "node:path";
import { describe, expect, it } from "vitest";
import {
createAcpxProcessLeaseStore,
OPENCLAW_ACPX_LEASE_ID_ARG,
OPENCLAW_ACPX_LEASE_ID_ENV,
OPENCLAW_GATEWAY_INSTANCE_ID_ARG,
OPENCLAW_GATEWAY_INSTANCE_ID_ENV,
withAcpxLeaseEnvironment,
type AcpxProcessLease,
} from "./process-lease.js";
function makeLease(index: number): AcpxProcessLease {
return {
leaseId: `lease-${index}`,
gatewayInstanceId: "gateway-test",
sessionKey: `agent:codex:acp:${index}`,
wrapperRoot: "/tmp/openclaw/acpx",
wrapperPath: "/tmp/openclaw/acpx/codex-acp-wrapper.mjs",
rootPid: 1000 + index,
commandHash: `hash-${index}`,
startedAt: index,
state: "open",
};
}
describe("createAcpxProcessLeaseStore", () => {
it("serializes concurrent lease saves without dropping records", async () => {
const stateDir = await mkdtemp(path.join(tmpdir(), "openclaw-acpx-leases-"));
try {
const store = createAcpxProcessLeaseStore({ stateDir });
await Promise.all(Array.from({ length: 25 }, (_, index) => store.save(makeLease(index))));
const leases = await store.listOpen("gateway-test");
expect(leases.map((lease) => lease.leaseId).toSorted()).toEqual(
Array.from({ length: 25 }, (_, index) => `lease-${index}`).toSorted(),
);
} finally {
await rm(stateDir, { recursive: true, force: true });
}
});
});
describe("withAcpxLeaseEnvironment", () => {
it("adds lease environment and wrapper args on POSIX", () => {
const command = withAcpxLeaseEnvironment({
command: "node /tmp/openclaw/acpx/codex-acp-wrapper.mjs",
leaseId: "lease-test",
gatewayInstanceId: "gateway-test",
platform: "darwin",
});
expect(command).toBe(
[
"env",
`${OPENCLAW_ACPX_LEASE_ID_ENV}=lease-test`,
`${OPENCLAW_GATEWAY_INSTANCE_ID_ENV}=gateway-test`,
"node /tmp/openclaw/acpx/codex-acp-wrapper.mjs",
OPENCLAW_ACPX_LEASE_ID_ARG,
"lease-test",
OPENCLAW_GATEWAY_INSTANCE_ID_ARG,
"gateway-test",
].join(" "),
);
});
it("keeps Windows logs keyed by lease id with wrapper args", () => {
const command = withAcpxLeaseEnvironment({
command: "node C:/openclaw/acpx/codex-acp-wrapper.mjs",
leaseId: "lease-test",
gatewayInstanceId: "gateway-test",
platform: "win32",
});
expect(command).toBe(
[
"node C:/openclaw/acpx/codex-acp-wrapper.mjs",
OPENCLAW_ACPX_LEASE_ID_ARG,
"lease-test",
OPENCLAW_GATEWAY_INSTANCE_ID_ARG,
"gateway-test",
].join(" "),
);
expect(command).not.toContain(`${OPENCLAW_ACPX_LEASE_ID_ENV}=`);
expect(command).not.toContain(`${OPENCLAW_GATEWAY_INSTANCE_ID_ENV}=`);
});
});