From ee76038830adb69b94421d150df22d5477a5c99e Mon Sep 17 00:00:00 2001 From: yangyu0227 Date: Tue, 19 May 2026 18:34:25 +0800 Subject: [PATCH] fix: add null safety to FileDiff getBefore/getAfter Root cause: SseEventListener's Gson instance does not register FileDiffDeserializer, so when the server sends SSE diff events with null 'before'/'after' values, Gson creates FileDiff instances with null fields (bypassing constructor via UnsafeAllocator). Fix: 1. Register FileDiffDeserializer in SseEventListener's Gson builder (prevents null fields at the source) 2. Add null-safe elvis operator in SessionManager.resolveBeforeContent (defense in depth) --- .../kotlin/ai/opencode/ide/jetbrains/api/SseEventListener.kt | 1 + .../kotlin/ai/opencode/ide/jetbrains/session/SessionManager.kt | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/ai/opencode/ide/jetbrains/api/SseEventListener.kt b/src/main/kotlin/ai/opencode/ide/jetbrains/api/SseEventListener.kt index 24d3edd..4941d97 100644 --- a/src/main/kotlin/ai/opencode/ide/jetbrains/api/SseEventListener.kt +++ b/src/main/kotlin/ai/opencode/ide/jetbrains/api/SseEventListener.kt @@ -48,6 +48,7 @@ class SseEventListener( private val gson = GsonBuilder() .registerTypeAdapter(OpenCodeEvent::class.java, OpenCodeEventDeserializer()) + .registerTypeAdapter(FileDiff::class.java, FileDiffDeserializer()) .create() private var call: Call? = null diff --git a/src/main/kotlin/ai/opencode/ide/jetbrains/session/SessionManager.kt b/src/main/kotlin/ai/opencode/ide/jetbrains/session/SessionManager.kt index 130edce..6c086c7 100644 --- a/src/main/kotlin/ai/opencode/ide/jetbrains/session/SessionManager.kt +++ b/src/main/kotlin/ai/opencode/ide/jetbrains/session/SessionManager.kt @@ -690,7 +690,7 @@ open class SessionManager(private val project: Project) : Disposable { */ fun resolveBeforeContent(relativePath: String, diff: FileDiff, snapshot: TurnSnapshot): String { val absPath = PathUtil.resolveProjectPath(project, relativePath) - val serverBefore = diff.before + val serverBefore = diff.before ?: "" // 1. VFS Creation Safety: If we detected a physical creation event, force before to empty. // This takes precedence because we KNOW it's a new file from our perspective.