diff --git a/backend/scripts/p2-acceptance.mjs b/backend/scripts/p2-acceptance.mjs index 1dd5fd66..1a279a56 100644 --- a/backend/scripts/p2-acceptance.mjs +++ b/backend/scripts/p2-acceptance.mjs @@ -776,6 +776,7 @@ async function writeInstallationFiles(ctx) { }, "workspace-maintenance": { image: ctx.coreImageTag, + environment: { P2_CHILD_DEBUG: "1" }, extra_hosts: ["host.docker.internal:host-gateway"], }, qdrant: { diff --git a/backend/src/workspace-maintenance.ts b/backend/src/workspace-maintenance.ts index e50d1e5e..7a94171d 100644 --- a/backend/src/workspace-maintenance.ts +++ b/backend/src/workspace-maintenance.ts @@ -249,8 +249,15 @@ function createProductionService(): WorkspacePreprocessingService { let stderr = ""; child.stdout?.on("data", (chunk: Buffer) => { stdout += chunk.toString("utf8"); }); child.stderr?.on("data", (chunk: Buffer) => { stderr += chunk.toString("utf8"); }); - child.on("close", (code) => resolve({ exitCode: code ?? 0, stdout, stderr })); - child.on("error", (error) => resolve({ exitCode: 1, stdout, stderr: String(error.message) })); + child.on("close", (code) => { + const capped = { exitCode: code ?? 0, stdout, stderr: stderr.slice(0, 64 * 1024) }; + if (process.env.P2_CHILD_DEBUG === "1" && (code ?? 0) !== 0) { + capped.stdout = stdout.slice(0, 4096); + capped.stderr = stderr.slice(0, 4096); + } + resolve(capped); + }); + child.on("error", (error) => resolve({ exitCode: 1, stdout, stderr: String(error.message).slice(0, 4096) })); }); } finally { closeSync(configFd); diff --git a/backend/src/workspaces/preprocessing-service.ts b/backend/src/workspaces/preprocessing-service.ts index da5d7bc6..2a63e486 100644 --- a/backend/src/workspaces/preprocessing-service.ts +++ b/backend/src/workspaces/preprocessing-service.ts @@ -427,7 +427,13 @@ export class WorkspacePreprocessingService { private async runJsonStage(runtime: ActiveRuntime, argv: string[]): Promise> { const result = await this.deps.runChild({ argv, configPath: runtime.configLease.path }); - if (result.exitCode !== 0) throw new Error("workspace child failed"); + if (result.exitCode !== 0) { + if (process.env.P2_CHILD_DEBUG === "1") { + const detail = `${result.stderr ?? ""}${result.stdout ?? ""}`.replace(/[\r\n]+/g, " ").slice(0, 2048); + throw new Error(`workspace child failed: ${detail}`); + } + throw new Error("workspace child failed"); + } return JSON.parse(result.stdout) as Record; }