The same pass the server had, on the Kotlin side: comments restating what the code says are gone, and the ones recording a measurement, a constraint or an incident are kept but cut to a few lines each. 6540 comment lines to 5674, and 920 lines off the app. Two doc comments had drifted onto the item above the one they describe -- `contextAfter`'s onto `sessionWorking` in Events.kt, and `UsageMonitor`'s equivalent on the server was fixed in the previous commit. Each is back on its own item, which is the only non-comment line this diff moves. The comments are reflowed to the column limit at their own indentation: several were written wide, and ktfmt re-wrapped them into lines holding a single orphan word. `/tmp` script, not kept -- ktfmt is idempotent over the result, which is the check. Left alone deliberately: this codebase's remaining comment density is high because the comments carry things the code cannot say -- what a null means, what a number was measured against, which bug a guard exists for. Of the 238 one-line doc comments in the app, five were pure restatement of the name and were removed; the rest each say something the signature does not. ktfmtFormat, compileDebugKotlin, lintDebug and testDebugUnitTest pass; cargo test (127), clippy --all-targets and fmt still clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
63 lines
2.4 KiB
Kotlin
63 lines
2.4 KiB
Kotlin
package com.example.aiapp
|
|
|
|
import androidx.compose.runtime.Composable
|
|
import androidx.compose.ui.Modifier
|
|
|
|
/**
|
|
* The mark a compaction leaves in the transcript.
|
|
*
|
|
* A divider rather than something anybody said: everything above it is out of the session's context
|
|
* now, and that is a fact about the conversation, not a turn in it. Drawn by [TranscriptDivider],
|
|
* which a clear also uses, so the two marks cannot drift apart.
|
|
*
|
|
* Blue is [commandColor]: the session acting on itself rather than working on what was asked of it.
|
|
*/
|
|
@Composable
|
|
fun CompactedRow(item: TranscriptItem.CompactedNote, modifier: Modifier = Modifier) {
|
|
TranscriptDivider(compactionSummary(item), commandColor, modifier)
|
|
}
|
|
|
|
/**
|
|
* What to say about a compaction: the two sizes, and nothing else.
|
|
*
|
|
* The counts are the whole point -- "a million tokens became ten thousand" is the reader's answer
|
|
* to why the wait was worth it. When they were not reported this says only that a compaction
|
|
* happened, rather than filling in a plausible number.
|
|
*/
|
|
fun compactionSummary(item: TranscriptItem.CompactedNote): String {
|
|
val pre = item.preTokens
|
|
val post = item.postTokens
|
|
return if (pre != null && post != null) {
|
|
"Compacted • ${tokens(pre)} → ${tokens(post)} tok"
|
|
} else {
|
|
"Compacted"
|
|
}
|
|
}
|
|
|
|
/**
|
|
* A token count as a reader reads one.
|
|
*
|
|
* Shared with the status row rather than formatted at each: the divider and the row report the same
|
|
* quantity about the same moment, and one grouping its thousands while the other did not read as
|
|
* two different measurements.
|
|
*/
|
|
fun tokens(count: Long): String = "%,d".format(count)
|
|
|
|
/**
|
|
* What the working indicator says while a compaction is running.
|
|
*
|
|
* Elapsed time and nothing else, because elapsed time is all there is: the CLI announces that a
|
|
* compaction has begun and then says nothing until it has finished, so any bar or estimate here
|
|
* would be this screen's guess wearing a measurement's clothes.
|
|
*
|
|
* [seconds] is null when this device did not see the compaction start, which is what opening a
|
|
* session that is already compacting looks like. That case says only "compacting": a number counted
|
|
* from the moment the screen opened would be wrong in the direction that matters.
|
|
*/
|
|
fun compactingLabel(seconds: Long?): String =
|
|
when {
|
|
seconds == null -> "compacting"
|
|
seconds < 60 -> "compacting ${seconds}s"
|
|
else -> "compacting ${seconds / 60}m ${seconds % 60}s"
|
|
}
|