refactor(chat): tag local feedback with displayKind and refine logical message matching (#1241)

This commit is contained in:
M57 committed 2026-09-24 02:38:31 +03:00
1 parent c9bbadf5d5
commit 9ae7b6a520
5 files changed
+85 -25

No files matched your search

@@ -581,6 +581,51 @@ class ChatPagingMergeTest {
assertTrue(sameLogicalMessage(canonical.copy(reasoningText = "new trace"), live))
}
@Test
fun assistantReplyBeginningWithSlashStillMatchesCanonicalEcho() {
val live =
ChatMessage(
id = "uuid-answer",
role = MessageRole.ASSISTANT,
content = "/help is the command you're looking for.",
)
val canonical =
live.copy(
id = "rest-session-10",
restId = null,
)
assertTrue(sameLogicalMessage(canonical, live))
}
@Test
fun permanentlyLocalRowsDoNotMatchCanonicalRowsByContent() {
val localFeedback =
ChatMessage(
id = "uuid-feedback",
role = MessageRole.ASSISTANT,
content = "Command completed successfully",
displayKind = "local_feedback",
)
val canonicalAssistant =
ChatMessage(
id = "rest-session-10",
role = MessageRole.ASSISTANT,
content = "Command completed successfully",
)
val clarify =
ChatMessage(
id = "uuid-clarify",
role = MessageRole.USER,
content = "yes",
displayKind = "clarify_response",
)
val canonicalUser = ChatMessage(id = "rest-session-11", role = MessageRole.USER, content = "yes")
assertTrue(!sameLogicalMessage(canonicalAssistant, localFeedback))
assertTrue(!sameLogicalMessage(canonicalUser, clarify))
}
@Test
fun stripGatewaySteerWrapperRemovesEnvelopesSafely() {
val standard =
@@ -809,7 +854,12 @@ class ChatPagingMergeTest {
val answer = ChatMessage(id = "rest-session-1", role = MessageRole.ASSISTANT, content = "I am Hermes.")
val command = ChatMessage(id = "uuid-cmd", role = MessageRole.USER, content = "/reasoning")
val output =
ChatMessage(id = "uuid-output", role = MessageRole.ASSISTANT, content = "reasoning: low · display on")
ChatMessage(
id = "uuid-output",
role = MessageRole.ASSISTANT,
content = "Command completed successfully",
displayKind = "local_feedback",
)
val current = listOf(prompt, answer, command, output)
@@ -103,6 +103,16 @@ class FullBleedTurnsTest {
assertEquals(listOf<ChatTurn>(ChatTurn.User(steer)), result)
}
@Test
fun `local feedback display kind remains assistant prose`() {
val feedback =
msg("a1", MessageRole.ASSISTANT, content = "Command completed successfully")
.copy(displayKind = "local_feedback")
val result = groupIntoTurns(listOf(feedback))
assertEquals(listOf<ChatTurn>(entries(AgentEntry.Prose(feedback))), result)
}
@Test
fun `max-iterations nudge is a SystemEvent not a user bubble`() {
// Backend persists the max-iterations notice as a plain role=user row