修正 Codex Action 重複輸出最後回答 #4
+18
-4
@@ -183,11 +183,13 @@ function readExecutionConfig() {
|
||||
};
|
||||
}
|
||||
|
||||
function codexExecArgs(model, prompt) {
|
||||
function codexExecArgs(model, prompt, lastMessageFile) {
|
||||
return [
|
||||
"exec",
|
||||
"--dangerously-bypass-approvals-and-sandbox",
|
||||
"--skip-git-repo-check",
|
||||
"--output-last-message",
|
||||
lastMessageFile,
|
||||
"--model",
|
||||
model,
|
||||
prompt,
|
||||
@@ -197,7 +199,10 @@ function codexExecArgs(model, prompt) {
|
||||
function runCodex(model, prompt) {
|
||||
return new Promise((resolve) => {
|
||||
const { timeoutMs, outputLimitBytes, workspace } = readExecutionConfig();
|
||||
const args = codexExecArgs(model, prompt);
|
||||
const tempDir = makeTempDir(process.env.CODEX_HOME || "/root/.codex");
|
||||
const lastMessageFile = path.join(tempDir, "last-message.txt");
|
||||
tempFiles.trackFile(lastMessageFile);
|
||||
const args = codexExecArgs(model, prompt, lastMessageFile);
|
||||
|
||||
// This Docker Action runs inside an ephemeral CI container where Codex must be
|
||||
// able to edit the checked-out workspace without interactive approvals.
|
||||
@@ -210,7 +215,6 @@ function runCodex(model, prompt) {
|
||||
output.append(Buffer.from(`Codex execution timed out after ${timeoutMs} ms.\n`));
|
||||
}, timeoutMs);
|
||||
|
||||
child.stdout.pipe(process.stdout);
|
||||
child.stderr.pipe(process.stdout);
|
||||
|
||||
child.stdout.on("data", (chunk) => {
|
||||
@@ -235,7 +239,14 @@ function runCodex(model, prompt) {
|
||||
output.append(Buffer.from(`Codex process terminated by signal ${signal}.\n`));
|
||||
}
|
||||
|
||||
resolve({ status: code ?? 1, output: output.toString() });
|
||||
let lastMessage = "";
|
||||
try {
|
||||
lastMessage = fs.readFileSync(lastMessageFile, "utf8");
|
||||
} catch {
|
||||
lastMessage = "";
|
||||
}
|
||||
|
||||
resolve({ status: code ?? 1, output: lastMessage || output.toString() });
|
||||
});
|
||||
});
|
||||
}
|
||||
@@ -312,6 +323,9 @@ function setupAuth(oauth, codexHome) {
|
||||
async function runCodexAction({ oauth, model, codexHome, prompt }) {
|
||||
const lockHandle = setupAuth(oauth, codexHome);
|
||||
const result = await runCodex(model, prompt);
|
||||
if (result.output) {
|
||||
process.stdout.write(result.output.endsWith("\n") ? result.output : `${result.output}\n`);
|
||||
}
|
||||
appendGithubOutput(result.status === 0 ? "completed" : "failed", result.output);
|
||||
|
||||
if (lockHandle !== undefined) {
|
||||
|
||||
Reference in New Issue
Block a user