Fix Codex subagent final result preservation (#602)

This commit is contained in:
SmallSpider
2026-05-09 08:58:31 +08:00
committed by GitHub
parent 752a505973
commit 3eac3456b4
4 changed files with 352 additions and 33 deletions
@@ -279,7 +279,10 @@ describe('AppServerEventConverter', () => {
status: 'completed',
receiverThreadIds: ['agent-1'],
agentsStates: {
'agent-1': { status: 'completed', message: '42' }
'agent-1': { status: 'completed', message: '42' },
'agent-2': { status: 'done', message: null },
'agent-3': { status: 'done', result: { text: 'structured result' } },
'agent-4': { status: 'completed', message: '', output: { value: 42 } }
}
}
});
@@ -289,7 +292,10 @@ describe('AppServerEventConverter', () => {
name: 'wait_agent',
output: {
status: {
'agent-1': { completed: '42' }
'agent-1': { completed: '42' },
'agent-2': { status: 'completed', message: null },
'agent-3': { status: 'completed', result: { text: 'structured result' } },
'agent-4': { status: 'completed', message: '', output: { value: 42 } }
},
timed_out: false
},
+15 -4
View File
@@ -295,11 +295,22 @@ function statusObjectFromAgentState(value: unknown): unknown {
const record = asRecord(value);
if (!record) return value;
const message = asString(record.message);
const message = asString(record.message)
?? asString(record.output)
?? asString(record.result)
?? asString(record.finalMessage)
?? asString(record.final_message);
const status = asString(record.status ?? record.state);
if (status === 'completed' && message) return { completed: message };
if ((status === 'failed' || status === 'error') && message) return { failed: message };
if ((status === 'canceled' || status === 'cancelled') && message) return { canceled: message };
const normalizedStatus = status?.trim().toLowerCase().replace(/[\s_-]/g, '');
const completed = normalizedStatus === 'completed'
|| normalizedStatus === 'complete'
|| normalizedStatus === 'done'
|| record.completed === true
|| record.done === true;
if (completed && message) return { completed: message };
if (completed) return { ...record, status: 'completed' };
if ((normalizedStatus === 'failed' || normalizedStatus === 'error') && message) return { failed: message };
if ((normalizedStatus === 'canceled' || normalizedStatus === 'cancelled') && message) return { canceled: message };
return value;
}