


























@@ -124,6 +124,17 @@ function shellQuote(value: string): string {
124124return `'${value.replace(/'/gu, `'\\''`)}'`;
125125}
126126127+function cleanupSmokeLogTailHelpers(): string {
128+const script = readFileSync(CLEANUP_SMOKE_RUN_PATH, "utf8");
129+const match = script.match(
130+/(read_positive_int_env\(\) \{[\s\S]*?\n\}\n\nprint_log_tail\(\) \{[\s\S]*?\n\})\n\nread_positive_int_env/u,
131+);
132+if (!match) {
133+throw new Error("cleanup smoke log helpers were not found");
134+}
135+return match[1];
136+}
137+127138function runCleanupDefaultPlatform(env: Record<string, string>, hostArch: string): string {
128139const script = readFileSync(CLEANUP_DOCKER_SMOKE_PATH, "utf8");
129140const match = script.match(/(resolve_default_cleanup_platform\(\) \{[\s\S]*?\n\})\n\nPLATFORM=/u);
@@ -228,10 +239,67 @@ docker_build_transient_failure "$LOG_PATH"
228239const cleanupRun = readFileSync(CLEANUP_SMOKE_RUN_PATH, "utf8");
229240230241expect(cleanupRun).toContain("OPENCLAW_CLEANUP_SMOKE_LOG_PRINT_BYTES");
242+expect(cleanupRun).toContain(
243+"read_positive_int_env OPENCLAW_CLEANUP_SMOKE_LOG_PRINT_BYTES 65536 >/dev/null",
244+);
231245expect(cleanupRun.match(/print_log_tail \/tmp\/openclaw-cleanup-/g)).toHaveLength(3);
232246expect(cleanupRun).not.toContain("cat /tmp/openclaw-cleanup-");
233247});
234248249+it("rejects invalid cleanup-smoke log byte limits", () => {
250+const workDir = mkdtempSync(join(tmpdir(), "openclaw-cleanup-smoke-log-invalid-"));
251+252+try {
253+const logPath = join(workDir, "cleanup.log");
254+writeFileSync(logPath, "cleanup output\n");
255+const script = `
256+set -euo pipefail
257+LOG_PATH=${shellQuote(logPath)}
258+export OPENCLAW_CLEANUP_SMOKE_LOG_PRINT_BYTES=64kb
259+260+${cleanupSmokeLogTailHelpers()}
261+262+print_log_tail "$LOG_PATH"
263+`;
264+265+const result = spawnSync("bash", ["-lc", script], { encoding: "utf8" });
266+267+expect(result.status).toBe(2);
268+expect(result.stderr).toContain("invalid OPENCLAW_CLEANUP_SMOKE_LOG_PRINT_BYTES: 64kb");
269+expect(result.stdout).toBe("");
270+} finally {
271+rmSync(workDir, { recursive: true, force: true });
272+}
273+});
274+275+it("normalizes zero-padded cleanup-smoke log byte limits", () => {
276+const workDir = mkdtempSync(join(tmpdir(), "openclaw-cleanup-smoke-log-tail-"));
277+278+try {
279+const logPath = join(workDir, "cleanup.log");
280+writeFileSync(logPath, "old-cleanup-output-recent\n");
281+const script = `
282+set -euo pipefail
283+LOG_PATH=${shellQuote(logPath)}
284+export OPENCLAW_CLEANUP_SMOKE_LOG_PRINT_BYTES=0008
285+286+${cleanupSmokeLogTailHelpers()}
287+288+print_log_tail "$LOG_PATH"
289+`;
290+291+const result = spawnSync("bash", ["-lc", script], { encoding: "utf8" });
292+293+expect(result.status).toBe(0);
294+expect(result.stdout).toContain("truncated: showing last 8");
295+expect(result.stdout).toContain("-recent\n");
296+expect(result.stdout).not.toContain("old-cleanup-output");
297+expect(result.stderr).toBe("");
298+} finally {
299+rmSync(workDir, { recursive: true, force: true });
300+}
301+});
302+235303it("prints Docker MCP client logs through the bounded helper", () => {
236304for (const scriptPath of BOUNDED_CLIENT_LOG_DOCKER_E2E_SCRIPTS) {
237305const script = readFileSync(scriptPath, "utf8");
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。