feat: auto-dismiss reply notifications when read in chat (#1195)

This commit is contained in:
M57 authored and GitHub committed 2026-09-19 22:58:43 +03:00
1 parent 03ce822119
commit dc77b306b6
30 files changed
+4070 -15

No files matched your search

@@ -46,4 +46,6 @@ data class ChatMessageEntity(
val tokenCount: Int? = null,
@ColumnInfo(name = "tps")
val tps: Double? = null,
@ColumnInfo(name = "completion_id")
val completionId: String? = null,
)
@@ -37,6 +37,7 @@ fun ChatMessageEntity.toUiModel(): ChatMessage =
displayKind = displayKind,
tokenCount = tokenCount,
tps = tps,
completionId = completionId,
)
fun ChatMessage.toEntity(sessionId: String): ChatMessageEntity =
@@ -54,4 +55,5 @@ fun ChatMessage.toEntity(sessionId: String): ChatMessageEntity =
displayKind = displayKind,
tokenCount = tokenCount,
tps = tps,
completionId = completionId,
)
@@ -14,7 +14,7 @@ import java.io.File
@Database(
entities = [ChatMessageEntity::class],
version = 7,
version = 8,
exportSchema = true,
)
abstract class HermesDatabase : RoomDatabase() {
@@ -81,6 +81,15 @@ abstract class HermesDatabase : RoomDatabase() {
}
}
val MIGRATION_7_8: Migration =
object : Migration(7, 8) {
override suspend fun migrate(connection: SQLiteConnection) {
connection.execSQL(
"ALTER TABLE `chat_messages` ADD COLUMN `completion_id` TEXT",
)
}
}
suspend fun get(context: Context): HermesDatabase =
withContext(Dispatchers.IO) {
instance?.let { return@withContext it }
@@ -116,6 +125,7 @@ abstract class HermesDatabase : RoomDatabase() {
MIGRATION_4_5,
MIGRATION_5_6,
MIGRATION_6_7,
MIGRATION_7_8,
).fallbackToDestructiveMigration(false)
.build()
.also { instance = it }
@@ -110,7 +110,18 @@ object EventParser {
"message.complete" -> {
val text = payload?.get("text") as? String ?: ""
val reasoning = payload?.get("reasoning") as? String
WsEvent.MessageComplete(text, sessionId, reasoning, rawPayload = payload)
val completionId =
payload?.get("completion_id") as? String
?: java.util.UUID
.randomUUID()
.toString()
WsEvent.MessageComplete(
text,
sessionId,
reasoning,
rawPayload = payload,
completionId = completionId,
)
}
"message.done" -> {
@@ -63,6 +63,11 @@ sealed class WsEvent {
val storedSessionId: String? = null,
/** Full raw payload map (including usage/avg_tps) emitted with message.complete. */
val rawPayload: Map<String, Any?>? = null,
/** Stable completion identity for notification and read-tracking correlation. */
val completionId: String =
java.util.UUID
.randomUUID()
.toString(),
) : WsEvent()
data class MessageDone(