Update stuff
Build and Push Spoon Images / quality (push) Successful in 2m28s
Build and Push Spoon Images / build-images (push) Successful in 9m53s

This commit is contained in:
Gabriel Brown
2026-06-23 22:27:23 -04:00
parent 4fee7bf50d
commit 980a2c07e8
10 changed files with 136 additions and 24 deletions
+70
View File
@@ -696,6 +696,17 @@ const runCodexTurn = async (args: {
agentRuntimeMode: 'codex_exec',
codexSessionId: workspace.codexSessionId,
});
const outputFileName = `last-message-${workspace.claim.job._id}.txt`;
const outputFileHostPath = path.join(
workspace.workdir,
'.codex',
outputFileName,
);
const outputFileContainerPath = path.posix.join(
codexContainerWorkspace,
'.codex',
outputFileName,
);
const command = workspace.codexSessionId
? [
'codex',
@@ -704,6 +715,8 @@ const runCodexTurn = async (args: {
'--json',
...codexModelArgs(workspace.claim),
'--dangerously-bypass-approvals-and-sandbox',
'--output-last-message',
outputFileContainerPath,
workspace.codexSessionId,
prompt,
]
@@ -713,6 +726,8 @@ const runCodexTurn = async (args: {
'--json',
...codexModelArgs(workspace.claim),
'--dangerously-bypass-approvals-and-sandbox',
'--output-last-message',
outputFileContainerPath,
'--cd',
codexContainerRepo,
prompt,
@@ -756,9 +771,48 @@ const runCodexTurn = async (args: {
}
},
});
await appendEvent(
workspace.claim.job._id,
'info',
'plan',
`Codex CLI exited with code ${result.exitCode}; captured output length ${result.output.length}; assistant length ${assistantContent.value.length}.`,
);
if (result.exitCode !== 0) {
throw new Error(`codex failed:\n${result.output}`);
}
if (!assistantContent.value.trim()) {
try {
const lastMessage = await readFile(outputFileHostPath, 'utf8');
if (lastMessage.trim()) {
assistantContent.value = truncate(
workspace.redact(lastMessage.trim()),
40_000,
);
await updateMessage({
messageId: assistantMessageId,
content: assistantContent.value,
status: 'streaming',
});
await appendEvent(
workspace.claim.job._id,
'info',
'plan',
`Recovered assistant response from Codex output file ${outputFileName}.`,
);
}
} catch (error) {
const code = error && typeof error === 'object' ? 'code' in error : false;
if (!code || (error as { code?: string }).code !== 'ENOENT') {
throw error;
}
await appendEvent(
workspace.claim.job._id,
'warn',
'plan',
`Codex output file ${outputFileName} was not created.`,
);
}
}
};
const runOpenCodeTurn = async (args: {
@@ -1249,6 +1303,12 @@ const runClaim = async (claim: Claim) => {
'Workspace is ready. You can browse files, edit manually, run commands, or send messages to the agent.',
});
await appendEvent(jobId, 'info', 'plan', 'Interactive workspace is ready.');
await appendEvent(
jobId,
'info',
'plan',
`Worker runtime ${env.workerId} build ${env.buildSha} (${env.buildCreatedAt}).`,
);
await sendWorkspaceMessage(jobId, systemPromptForJob(claim), {
recordUserMessage: false,
@@ -1488,6 +1548,9 @@ export const sendWorkspaceMessage = async (
assistantMessageId,
assistantContent,
});
console.log(
`Codex turn completed for job ${claim.job._id}; response length=${assistantContent.value.length}`,
);
} else if (env.runtime === 'docker') {
await appendEvent(
claim.job._id,
@@ -1526,6 +1589,9 @@ export const sendWorkspaceMessage = async (
}
if (isCodexLoginProfile(claim)) {
if (!assistantContent.value.trim()) {
console.error(
`Codex completed without producing an assistant response for job ${claim.job._id}.`,
);
throw new Error(
'Codex completed without producing an assistant response.',
);
@@ -1570,6 +1636,7 @@ export const sendWorkspaceMessage = async (
workspace.resolveTurn?.();
workspace.resolveTurn = undefined;
const message = error instanceof Error ? error.message : String(error);
console.error(`Agent turn failed for job ${claim.job._id}: ${message}`);
await appendEvent(
claim.job._id,
'error',
@@ -1692,6 +1759,8 @@ export const getWorkerHealth = async () => {
const containerNames = await listWorkspaceContainerNames('spoon-agent-job-');
return {
ok: true,
buildSha: env.buildSha,
buildCreatedAt: env.buildCreatedAt,
workerId: env.workerId,
convexUrl: env.convexUrl,
runtime: env.runtime,
@@ -1699,6 +1768,7 @@ export const getWorkerHealth = async () => {
containerAccess: env.containerAccess,
jobImage: env.jobImage,
workdir: env.workdir,
hostWorkdir: env.hostWorkdir,
network: env.network,
httpPort: env.httpPort,
maxConcurrentJobs: env.maxConcurrentJobs,