Skip to content

Commit 63bd217

Browse files
bargraph v2
1 parent 7608931 commit 63bd217

3 files changed

Lines changed: 31 additions & 32 deletions

File tree

lib/tools/compress.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,11 @@ export function createCompressTool(ctx: ToolContext): ReturnType<typeof tool> {
362362
}
363363
}
364364

365+
// Cap estimate — countAllMessageTokens can inflate beyond API count
366+
if (totalSessionTokens > 0 && estimatedCompressedTokens > totalSessionTokens) {
367+
estimatedCompressedTokens = Math.round(totalSessionTokens * 0.95)
368+
}
369+
365370
clog.info(C.COMPRESS, `Token Accounting`, {
366371
totalSessionTokens,
367372
estimatedCompressedTokens,
@@ -414,8 +419,7 @@ export function createCompressTool(ctx: ToolContext): ReturnType<typeof tool> {
414419
summaryTokens,
415420
totalSessionTokens,
416421
estimatedCompressedTokens,
417-
rawStartResult,
418-
rawEndResult,
422+
messages.map((m) => m.info.id),
419423
messages.length,
420424
currentParams,
421425
)

lib/ui/notification.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {
44
formatPrunedItemsList,
55
formatStatsHeader,
66
formatTokenCount,
7-
formatCompressBar,
7+
formatSessionMap,
88
} from "./utils"
99
import { ToolParameterEntry } from "../state"
1010
import { PluginConfig } from "../config"
@@ -141,8 +141,7 @@ export async function sendCompressNotification(
141141
summaryTokens: number,
142142
totalSessionTokens: number,
143143
compressedTokens: number,
144-
startResult: any,
145-
endResult: any,
144+
sessionMessageIds: string[],
146145
totalMessages: number,
147146
params: any,
148147
): Promise<boolean> {
@@ -168,10 +167,11 @@ export async function sendCompressNotification(
168167
totalSessionTokens > 0 ? (compressedTokens / totalSessionTokens).toFixed(4) : "N/A",
169168
})
170169

171-
const progressBar = formatCompressBar(totalSessionTokens, compressedTokens, 25)
170+
const progressBar = formatSessionMap(sessionMessageIds, state.prune.messages, 50)
172171
const reduction =
173172
totalSessionTokens > 0 ? Math.round((compressedTokens / totalSessionTokens) * 100) : 0
174-
message += `\n\n▣ Compressing (${pruneTokenCounterStr} removed, ${reduction}% reduction) ${progressBar}`
173+
message += `\n\n▣ Compressing (${pruneTokenCounterStr} removed, ${reduction}% reduction)`
174+
message += `\n${progressBar}`
175175
message += `\n→ Topic: ${topic}`
176176
message += `\n→ Items: ${messageIds.length} messages`
177177
if (toolIds.length > 0) {

lib/ui/utils.ts

Lines changed: 20 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -59,32 +59,27 @@ export function formatProgressBar(
5959
return `│${bar}│`
6060
}
6161

62-
export function formatCompressBar(
63-
sessionContext: number,
64-
compressedAmount: number,
65-
width: number = 20,
62+
export function formatSessionMap(
63+
messageIds: string[],
64+
prunedMessages: Map<string, number>,
65+
width: number = 50,
6666
): string {
67-
if (sessionContext <= 0) return `│${"░".repeat(width)}│ 0%`
68-
69-
// sessionContext already includes compressedAmount (it's the full session total)
70-
const remainingRatio = (sessionContext - compressedAmount) / sessionContext
71-
const remainingWidth = Math.round(remainingRatio * width)
72-
const compressedWidth = width - remainingWidth
73-
const reductionPercent = -Math.round((compressedAmount / sessionContext) * 100)
74-
75-
clog.info(C.COMPRESS, `formatCompressBar`, {
76-
sessionContext,
77-
compressedAmount,
78-
remainingRatio: remainingRatio.toFixed(4),
79-
remainingWidth,
80-
compressedWidth,
81-
reductionPercent,
82-
})
83-
84-
const remainingBar = "█".repeat(Math.max(0, remainingWidth))
85-
const compressedBar = "░".repeat(Math.max(0, compressedWidth))
86-
87-
return `│${remainingBar}${compressedBar}│`
67+
const total = messageIds.length
68+
if (total === 0) return `│${"░".repeat(width)}│`
69+
70+
const bar = new Array(width).fill("█")
71+
72+
for (let m = 0; m < total; m++) {
73+
if (prunedMessages.has(messageIds[m])) {
74+
const start = Math.floor((m / total) * width)
75+
const end = Math.floor(((m + 1) / total) * width)
76+
for (let i = start; i < end; i++) {
77+
bar[i] = "░"
78+
}
79+
}
80+
}
81+
82+
return `│${bar.join("")}│`
8883
}
8984

9085
export function shortenPath(input: string, workingDirectory?: string): string {

0 commit comments

Comments
 (0)