From 3ed59c336304cbecfcf3072d7b8e87cfbaed0c04 Mon Sep 17 00:00:00 2001 From: Tejas Lokeshrao Date: Tue, 14 Jul 2026 15:56:41 -0400 Subject: [PATCH 1/6] fix: allow chats with invalid parent message id --- src/prerna/engine/impl/model/RoomMessageStore.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/prerna/engine/impl/model/RoomMessageStore.java b/src/prerna/engine/impl/model/RoomMessageStore.java index 2ed76fefa54..379cd1ea07e 100644 --- a/src/prerna/engine/impl/model/RoomMessageStore.java +++ b/src/prerna/engine/impl/model/RoomMessageStore.java @@ -252,8 +252,8 @@ private static void validateForPersistence(Room room, List mess } if (!messageIds.contains(parentMessageId)) { String roomId = room != null ? room.getId() : ""; - throw new IllegalStateException("Room " + roomId + " message parent does not exist: " - + parentMessageId); + classLogger.warn("Room {} message parent does not exist: {}", roomId, parentMessageId); + break; } } } From 63c75feb7b24c5b651c7f2738778ac464bb7b395 Mon Sep 17 00:00:00 2001 From: Tejas Lokeshrao Date: Tue, 14 Jul 2026 16:11:16 -0400 Subject: [PATCH 2/6] fix: capture all invalid message parents --- src/prerna/engine/impl/model/RoomMessageStore.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/prerna/engine/impl/model/RoomMessageStore.java b/src/prerna/engine/impl/model/RoomMessageStore.java index 379cd1ea07e..c48a6490128 100644 --- a/src/prerna/engine/impl/model/RoomMessageStore.java +++ b/src/prerna/engine/impl/model/RoomMessageStore.java @@ -253,7 +253,6 @@ private static void validateForPersistence(Room room, List mess if (!messageIds.contains(parentMessageId)) { String roomId = room != null ? room.getId() : ""; classLogger.warn("Room {} message parent does not exist: {}", roomId, parentMessageId); - break; } } } From bc6d296585bd54a8f304450f9f824f796b0e96e8 Mon Sep 17 00:00:00 2001 From: Tejas Lokeshrao Date: Wed, 15 Jul 2026 14:03:59 -0400 Subject: [PATCH 3/6] fix: catch error instead of having it break chats --- src/prerna/engine/impl/model/RoomMessageStore.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/prerna/engine/impl/model/RoomMessageStore.java b/src/prerna/engine/impl/model/RoomMessageStore.java index c48a6490128..5cb9ef06357 100644 --- a/src/prerna/engine/impl/model/RoomMessageStore.java +++ b/src/prerna/engine/impl/model/RoomMessageStore.java @@ -81,7 +81,12 @@ public static List loadFromPersistedJson(Room room, String mess } List loaded = MessageUtils.fromJsonArrayPreservingToolState(projection, room); List messages = loaded != null ? loaded : new ArrayList<>(); - validateForPersistence(room, messages); + try { + validateForPersistence(room, messages); + } catch (Exception e) { + classLogger.warn("Failed to validate messages for persistence for room={}", room.getId(), e); + } + warmRedisProjection(room, projection); return messages; } @@ -252,7 +257,8 @@ private static void validateForPersistence(Room room, List mess } if (!messageIds.contains(parentMessageId)) { String roomId = room != null ? room.getId() : ""; - classLogger.warn("Room {} message parent does not exist: {}", roomId, parentMessageId); + throw new IllegalStateException("Room " + roomId + " message parent does not exist: " + + parentMessageId); } } } From 5b69e1ea74bf1a02ecf0368f3732c27e3b45440c Mon Sep 17 00:00:00 2001 From: Tejas Lokeshrao Date: Wed, 15 Jul 2026 14:47:18 -0400 Subject: [PATCH 4/6] fix: more try catches --- .../engine/impl/model/RoomMessageStore.java | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/prerna/engine/impl/model/RoomMessageStore.java b/src/prerna/engine/impl/model/RoomMessageStore.java index 5cb9ef06357..14d34979c35 100644 --- a/src/prerna/engine/impl/model/RoomMessageStore.java +++ b/src/prerna/engine/impl/model/RoomMessageStore.java @@ -164,7 +164,11 @@ public static void normalizeForProviderPayload(Room room) { if (sanitized != messages) { room.setMessages(sanitized); } - validateForPersistence(room, room.getMessages()); + try { + validateForPersistence(room, room.getMessages()); + } catch (Exception e) { + classLogger.warn("Failed to validate messages for provider payload for room={}", room.getId(), e); + } } public static boolean persist(Room room, String userId) { @@ -227,7 +231,12 @@ public static RoomMutationLock acquireMutationLock(String roomId) { private static void validateSerializedProjection(Room room, String messageHistory) { List parsed = parseWithoutSanitizing(room, messageHistory); - validateForPersistence(room, parsed); + try { + validateForPersistence(room, parsed); + } catch (Exception e) { + classLogger.warn("Failed to validate serialized projection for room={}", + room != null ? room.getId() : "", e); + } } private static void validateForPersistence(Room room, List messages) { @@ -264,7 +273,12 @@ private static void validateForPersistence(Room room, List mess } private static void validateProviderPayload(Room room, List messages) { - validateForPersistence(room, messages); + try { + validateForPersistence(room, messages); + } catch (Exception e) { + classLogger.warn("Failed to validate messages for provider payload for room={}", + room != null ? room.getId() : "", e); + } Set toolCallIds = new HashSet<>(); Set toolResultIds = new HashSet<>(); From 6eebe5699f3c68b3079354fd23204224c6a70c22 Mon Sep 17 00:00:00 2001 From: Tejas Lokeshrao Date: Wed, 15 Jul 2026 14:55:08 -0400 Subject: [PATCH 5/6] chore: nudge PR sync From 6ebb34954a4119dc6d7160551e04de1a16f47bd0 Mon Sep 17 00:00:00 2001 From: Tejas Lokeshrao Date: Tue, 28 Jul 2026 16:49:58 -0400 Subject: [PATCH 6/6] fix: sanitation only on load --- .../engine/impl/model/RoomMessageStore.java | 27 +++---------------- 1 file changed, 3 insertions(+), 24 deletions(-) diff --git a/src/prerna/engine/impl/model/RoomMessageStore.java b/src/prerna/engine/impl/model/RoomMessageStore.java index e79d49929fc..4e19a8aee36 100644 --- a/src/prerna/engine/impl/model/RoomMessageStore.java +++ b/src/prerna/engine/impl/model/RoomMessageStore.java @@ -81,12 +81,6 @@ public static List loadFromPersistedJson(Room room, String mess } List loaded = MessageUtils.fromJsonArrayPreservingToolState(projection, room); List messages = loaded != null ? loaded : new ArrayList<>(); - try { - validateForPersistence(room, messages); - } catch (Exception e) { - classLogger.warn("Failed to validate messages for persistence for room={}", room.getId(), e); - } - warmRedisProjection(room, projection); return messages; } @@ -131,7 +125,6 @@ public static boolean refreshFromHotProjection(Room room) { } List loaded = MessageUtils.fromJsonArrayPreservingToolState(projection, room); List messages = loaded != null ? loaded : new ArrayList<>(); - validateForPersistence(room, messages); room.setMessages(messages); room.setMessagesJson(projection); return true; @@ -164,11 +157,7 @@ public static void normalizeForProviderPayload(Room room) { if (sanitized != messages) { room.setMessages(sanitized); } - try { - validateForPersistence(room, room.getMessages()); - } catch (Exception e) { - classLogger.warn("Failed to validate messages for provider payload for room={}", room.getId(), e); - } + validateForPersistence(room, room.getMessages()); } public static boolean persist(Room room, String userId) { @@ -231,12 +220,7 @@ public static RoomMutationLock acquireMutationLock(String roomId) { private static void validateSerializedProjection(Room room, String messageHistory) { List parsed = parseWithoutSanitizing(room, messageHistory); - try { - validateForPersistence(room, parsed); - } catch (Exception e) { - classLogger.warn("Failed to validate serialized projection for room={}", - room != null ? room.getId() : "", e); - } + validateForPersistence(room, parsed); } private static void validateForPersistence(Room room, List messages) { @@ -273,12 +257,7 @@ private static void validateForPersistence(Room room, List mess } private static void validateProviderPayload(Room room, List messages) { - try { - validateForPersistence(room, messages); - } catch (Exception e) { - classLogger.warn("Failed to validate messages for provider payload for room={}", - room != null ? room.getId() : "", e); - } + validateForPersistence(room, messages); Set toolCallIds = new HashSet<>(); Set toolResultIds = new HashSet<>();