Skip to content

Commit 58d93e4

Browse files
fix: suppress exceptions caused by broken unified diffs from codex
1 parent de91f29 commit 58d93e4

2 files changed

Lines changed: 40 additions & 7 deletions

File tree

src/CodexToolCallMapper.ts

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import type {
2020
ThreadItem,
2121
} from "./app-server/v2";
2222
import type { JsonValue } from "./app-server/serde_json/JsonValue";
23+
import {logger} from "./Logger";
2324

2425
type CodexItemStatus = CommandExecutionStatus | PatchApplyStatus | McpToolCallStatus | DynamicToolCallStatus;
2526
type AcpToolCallStatus = "pending" | "in_progress" | "completed" | "failed";
@@ -257,13 +258,18 @@ function createSearchTitle(query: string | null, path: string | null): string {
257258
}
258259

259260
async function createPatchContent(change: FileUpdateChange): Promise<ToolCallContent | null> {
260-
switch (change.kind.type) {
261-
case "add":
262-
return await createAddFileContent(change);
263-
case "delete":
264-
return await createDeleteFileContent(change);
265-
case "update":
266-
return await createUpdateFileContent(change);
261+
try {
262+
switch (change.kind.type) {
263+
case "add":
264+
return await createAddFileContent(change);
265+
case "delete":
266+
return await createDeleteFileContent(change);
267+
case "update":
268+
return await createUpdateFileContent(change);
269+
}
270+
} catch (error) {
271+
logger.log(`Error processing file update change: ${error}`);
272+
return null;
267273
}
268274
}
269275

src/__tests__/CodexACPAgent/file-change-events.test.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { describe, it, expect, vi, beforeEach } from 'vitest';
22
import type { SessionState } from '../../CodexAcpServer';
33
import type { ServerNotification } from '../../app-server';
4+
import { createFileChangeUpdate } from '../../CodexToolCallMapper';
5+
import type { ThreadItem } from '../../app-server/v2';
46
import { createCodexMockTestFixture, createTestSessionState, setupPromptAndSendNotifications, type CodexMockTestFixture } from '../acp-test-utils';
57
import {AgentMode} from "../../AgentMode";
68

@@ -271,4 +273,29 @@ describe('CodexEventHandler - file change events', () => {
271273
'data/file-change-delete-raw-content.json'
272274
);
273275
});
276+
277+
it('should ignore broken unified diffs in file changes', async () => {
278+
const fileChange: ThreadItem = {
279+
type: 'fileChange',
280+
id: 'file-change-broken-diff',
281+
changes: [
282+
{
283+
path: '/test/project/BrokenFile.kt',
284+
kind: { type: 'add' },
285+
diff:
286+
`--- /dev/null
287+
+++ /test/project/BrokenFile.kt
288+
@@ broken @@
289+
+class BrokenFile
290+
`,
291+
},
292+
],
293+
status: 'completed',
294+
};
295+
296+
const updateEvent = await createFileChangeUpdate(fileChange);
297+
expect(updateEvent).toMatchObject({
298+
content: [],
299+
});
300+
});
274301
});

0 commit comments

Comments
 (0)