Stabilize paired-room orchestration and Codex app-server flow
This commit is contained in:
83
runners/codex-runner/test/app-server-state.test.ts
Normal file
83
runners/codex-runner/test/app-server-state.test.ts
Normal file
@@ -0,0 +1,83 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
|
||||
import {
|
||||
createInitialAppServerTurnState,
|
||||
getAppServerTurnResult,
|
||||
reduceAppServerTurnState,
|
||||
} from '../src/app-server-state.js';
|
||||
|
||||
describe('codex app-server turn state', () => {
|
||||
it('prefers final_answer over commentary when building final output', () => {
|
||||
let state = createInitialAppServerTurnState();
|
||||
|
||||
state = reduceAppServerTurnState(state, {
|
||||
method: 'item/completed',
|
||||
params: {
|
||||
item: {
|
||||
type: 'agentMessage',
|
||||
phase: 'commentary',
|
||||
text: '중간 설명입니다.',
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
state = reduceAppServerTurnState(state, {
|
||||
method: 'item/completed',
|
||||
params: {
|
||||
item: {
|
||||
type: 'agentMessage',
|
||||
phase: 'final_answer',
|
||||
text: '최종 답변입니다.',
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
expect(getAppServerTurnResult(state)).toBe('최종 답변입니다.');
|
||||
});
|
||||
|
||||
it('does not treat commentary-only messages as a final output', () => {
|
||||
const state = reduceAppServerTurnState(createInitialAppServerTurnState(), {
|
||||
method: 'item/completed',
|
||||
params: {
|
||||
item: {
|
||||
type: 'agentMessage',
|
||||
phase: 'commentary',
|
||||
text: '작업 중 상태입니다.',
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
expect(state.latestAgentMessage).toBe('작업 중 상태입니다.');
|
||||
expect(getAppServerTurnResult(state)).toBeNull();
|
||||
});
|
||||
|
||||
it('records compaction completion from contextCompaction items', () => {
|
||||
const state = reduceAppServerTurnState(createInitialAppServerTurnState(), {
|
||||
method: 'item/completed',
|
||||
params: {
|
||||
item: {
|
||||
type: 'contextCompaction',
|
||||
id: 'ctx_1',
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
expect(state.compactionCompleted).toBe(true);
|
||||
});
|
||||
|
||||
it('captures upstream HTTP status from app-server error events', () => {
|
||||
const state = reduceAppServerTurnState(createInitialAppServerTurnState(), {
|
||||
method: 'error',
|
||||
params: {
|
||||
error: {
|
||||
message: 'Too many requests',
|
||||
codexErrorInfo: {
|
||||
httpStatusCode: 429,
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
expect(state.errorMessage).toBe('Too many requests (HTTP 429)');
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user