mirror of
https://github.com/openclaw/openclaw.git
synced 2026-06-09 10:42:56 +00:00
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>
90 lines
2.8 KiB
TypeScript
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}=`);
|
|
});
|
|
});
|