






















1+import { spawnSync } from "node:child_process";
12import { EventEmitter } from "node:events";
2-import { appendFileSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
3+import { appendFileSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
34import { tmpdir } from "node:os";
45import path from "node:path";
56import { afterEach, describe, expect, it } from "vitest";
67import { createJsonlRequestTailer } from "../../scripts/e2e/lib/codex-media-path/jsonl-request-tail.mjs";
8+import { readPositiveIntEnv } from "../../scripts/e2e/lib/codex-media-path/limits.mjs";
79import { waitForWebSocketOpen } from "../../scripts/e2e/lib/codex-media-path/open-websocket.mjs";
810911const tempRoots: string[] = [];
12+const writeConfigPath = path.resolve("scripts/e2e/lib/codex-media-path/write-config.mjs");
10131114function makeTempRoot(): string {
1215const root = mkdtempSync(path.join(tmpdir(), "openclaw-codex-media-path-"));
@@ -18,6 +21,21 @@ function jsonl(value: unknown): string {
1821return `${JSON.stringify(value)}\n`;
1922}
202324+function runWriteConfig(root: string, env: Record<string, string> = {}) {
25+return spawnSync(process.execPath, [writeConfigPath], {
26+encoding: "utf8",
27+env: {
28+ ...process.env,
29+OPENCLAW_CONFIG_PATH: path.join(root, "openclaw.json"),
30+OPENCLAW_GATEWAY_TOKEN: "test-token",
31+OPENCLAW_STATE_DIR: path.join(root, "state"),
32+OPENCLAW_TEST_WORKSPACE_DIR: path.join(root, "workspace"),
33+PORT: "18790",
34+ ...env,
35+},
36+});
37+}
38+2139class FakeWebSocket extends EventEmitter {
2240terminated = false;
2341closed = false;
@@ -41,6 +59,45 @@ afterEach(() => {
4159}
4260});
436162+describe("codex media path limits", () => {
63+it("rejects loose numeric env values instead of parsing prefixes", () => {
64+expect(() =>
65+readPositiveIntEnv("OPENCLAW_CODEX_MEDIA_PATH_TIMEOUT_SECONDS", 180, {
66+OPENCLAW_CODEX_MEDIA_PATH_TIMEOUT_SECONDS: "1e3",
67+}),
68+).toThrow("invalid OPENCLAW_CODEX_MEDIA_PATH_TIMEOUT_SECONDS: 1e3");
69+expect(() =>
70+readPositiveIntEnv("OPENCLAW_CODEX_MEDIA_PATH_LOG_TAIL_MAX_BYTES", 2 * 1024 * 1024, {
71+OPENCLAW_CODEX_MEDIA_PATH_LOG_TAIL_MAX_BYTES: "64bytes",
72+}),
73+).toThrow("invalid OPENCLAW_CODEX_MEDIA_PATH_LOG_TAIL_MAX_BYTES: 64bytes");
74+});
75+76+it("writes strict positive timeout and port values into generated config", () => {
77+const root = makeTempRoot();
78+const result = runWriteConfig(root, {
79+OPENCLAW_CODEX_MEDIA_PATH_TIMEOUT_SECONDS: "240",
80+PORT: "19002",
81+});
82+83+expect(result.status).toBe(0);
84+const config = JSON.parse(readFileSync(path.join(root, "openclaw.json"), "utf8"));
85+expect(config.gateway.port).toBe(19002);
86+expect(config.agents.defaults.timeoutSeconds).toBe(240);
87+expect(config.plugins.entries.codex.config.appServer.requestTimeoutMs).toBe(240_000);
88+});
89+90+it("rejects loose write-config timeout env values", () => {
91+const root = makeTempRoot();
92+const result = runWriteConfig(root, {
93+OPENCLAW_CODEX_MEDIA_PATH_TIMEOUT_SECONDS: "1e3",
94+});
95+96+expect(result.status).not.toBe(0);
97+expect(result.stderr).toContain("invalid OPENCLAW_CODEX_MEDIA_PATH_TIMEOUT_SECONDS: 1e3");
98+});
99+});
100+44101describe("codex media path JSONL tailer", () => {
45102it("keeps parsed app-server requests and reads only appended lines", () => {
46103const logPath = path.join(makeTempRoot(), "app-server.jsonl");
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。