@@ -685,6 +685,10 @@ class ChatController(
|
685 | 685 | totalTokens = obj["totalTokens"].asLongOrNull(), |
686 | 686 | totalTokensFresh = obj["totalTokensFresh"].asBooleanOrNull(), |
687 | 687 | contextTokens = obj["contextTokens"].asLongOrNull(), |
| 688 | + hasContextUsageMetadata = |
| 689 | +"totalTokens" in obj || |
| 690 | +"totalTokensFresh" in obj || |
| 691 | +"contextTokens" in obj, |
688 | 692 | ) |
689 | 693 | } |
690 | 694 | |
@@ -698,7 +702,7 @@ class ChatController(
|
698 | 702 | val index = current.indexOfFirst { it.key == entry.key } |
699 | 703 | _sessions.value = |
700 | 704 | if (index >= 0) { |
701 | | - current.toMutableList().also { it[index] = mergeSessionEntry(it[index], entry) } |
| 705 | + current.toMutableList().also { it[index] = mergeChatSessionEntry(it[index], entry) } |
702 | 706 | } else { |
703 | 707 | listOf(entry) + current |
704 | 708 | } |
@@ -709,18 +713,6 @@ class ChatController(
|
709 | 713 | _sessions.value = _sessions.value.filterNot { it.key == key } |
710 | 714 | } |
711 | 715 | |
712 | | -private fun mergeSessionEntry( |
713 | | -existing: ChatSessionEntry, |
714 | | -next: ChatSessionEntry, |
715 | | - ): ChatSessionEntry = |
716 | | - existing.copy( |
717 | | - updatedAtMs = next.updatedAtMs ?: existing.updatedAtMs, |
718 | | - displayName = next.displayName ?: existing.displayName, |
719 | | - totalTokens = next.totalTokens ?: existing.totalTokens, |
720 | | - totalTokensFresh = next.totalTokensFresh ?: existing.totalTokensFresh, |
721 | | - contextTokens = next.contextTokens ?: existing.contextTokens, |
722 | | - ) |
723 | | - |
724 | 716 | private fun parseRunId(resJson: String): String? = |
725 | 717 | try { |
726 | 718 | json |
@@ -946,3 +938,16 @@ private fun JsonElement?.asBooleanOrNull(): Boolean? =
|
946 | 938 | is JsonPrimitive -> content.toBooleanStrictOrNull() |
947 | 939 | else -> null |
948 | 940 | } |
| 941 | + |
| 942 | +internal fun mergeChatSessionEntry( |
| 943 | +existing: ChatSessionEntry, |
| 944 | +next: ChatSessionEntry, |
| 945 | +): ChatSessionEntry = |
| 946 | + existing.copy( |
| 947 | + updatedAtMs = next.updatedAtMs ?: existing.updatedAtMs, |
| 948 | + displayName = next.displayName ?: existing.displayName, |
| 949 | + totalTokens = if (next.hasContextUsageMetadata) next.totalTokens else null, |
| 950 | + totalTokensFresh = if (next.hasContextUsageMetadata) next.totalTokensFresh else null, |
| 951 | + contextTokens = if (next.hasContextUsageMetadata) next.contextTokens else null, |
| 952 | + hasContextUsageMetadata = next.hasContextUsageMetadata, |
| 953 | + ) |