@@ -75,105 +75,78 @@ export async function sendUnifiedNotification(
7575}
7676
7777function buildMinimalMessage ( data : NotificationData ) : string {
78- const hasAiPruning = data . aiPrunedCount > 0
79- const hasGcActivity = data . gcPending && data . gcPending . toolsDeduped > 0
78+ const { justNowTokens, totalTokens } = calculateStats ( data )
8079
81- if ( hasAiPruning ) {
82- const gcTokens = hasGcActivity ? data . gcPending ! . tokensCollected : 0
83- const totalSaved = formatTokenCount ( data . aiTokensSaved + gcTokens )
84- const toolText = data . aiPrunedCount === 1 ? 'tool' : 'tools'
85-
86- let cycleStats = `${ data . aiPrunedCount } ${ toolText } `
87- if ( hasGcActivity ) {
88- cycleStats += `, ~${ formatTokenCount ( data . gcPending ! . tokensCollected ) } 🗑️`
89- }
80+ return formatStatsHeader ( totalTokens , justNowTokens )
81+ }
9082
91- let message = `🧹 DCP: ~${ totalSaved } saved (${ cycleStats } )`
92- message += buildSessionSuffix ( data . sessionStats , data . aiPrunedCount )
83+ function calculateStats ( data : NotificationData ) : {
84+ justNowTokens : number
85+ totalTokens : number
86+ } {
87+ const justNowTokens = data . aiTokensSaved + ( data . gcPending ?. tokensCollected ?? 0 )
9388
94- return message
95- } else {
96- const tokensCollected = formatTokenCount ( data . gcPending ! . tokensCollected )
89+ const totalTokens = data . sessionStats
90+ ? data . sessionStats . totalTokensSaved + data . sessionStats . totalGCTokens
91+ : justNowTokens
9792
98- let message = `🗑️ DCP: ~ ${ tokensCollected } collected`
99- message += buildSessionSuffix ( data . sessionStats , 0 )
93+ return { justNowTokens , totalTokens }
94+ }
10095
101- return message
102- }
96+ function formatStatsHeader (
97+ totalTokens : number ,
98+ justNowTokens : number
99+ ) : string {
100+ const totalTokensStr = `~${ formatTokenCount ( totalTokens ) } `
101+ const justNowTokensStr = `~${ formatTokenCount ( justNowTokens ) } `
102+
103+ const maxTokenLen = Math . max ( totalTokensStr . length , justNowTokensStr . length )
104+ const totalTokensPadded = totalTokensStr . padStart ( maxTokenLen )
105+ const justNowTokensPadded = justNowTokensStr . padStart ( maxTokenLen )
106+
107+ return [
108+ `▣ DCP Stats` ,
109+ ` Total saved │ ${ totalTokensPadded } ` ,
110+ ` Just now │ ${ justNowTokensPadded } ` ,
111+ ] . join ( '\n' )
103112}
104113
105114function buildDetailedMessage ( data : NotificationData , workingDirectory ?: string ) : string {
106- const hasAiPruning = data . aiPrunedCount > 0
107- const hasGcActivity = data . gcPending && data . gcPending . toolsDeduped > 0
115+ const { justNowTokens, totalTokens } = calculateStats ( data )
108116
109- let message : string
110-
111- if ( hasAiPruning ) {
112- const gcTokens = hasGcActivity ? data . gcPending ! . tokensCollected : 0
113- const totalSaved = formatTokenCount ( data . aiTokensSaved + gcTokens )
114- const toolText = data . aiPrunedCount === 1 ? 'tool' : 'tools'
115-
116- let cycleStats = `${ data . aiPrunedCount } ${ toolText } `
117- if ( hasGcActivity ) {
118- cycleStats += `, ~${ formatTokenCount ( data . gcPending ! . tokensCollected ) } 🗑️`
119- }
117+ let message = formatStatsHeader ( totalTokens , justNowTokens )
120118
121- message = `🧹 DCP: ~${ totalSaved } saved (${ cycleStats } )`
122- message += buildSessionSuffix ( data . sessionStats , data . aiPrunedCount )
123- message += '\n'
119+ if ( data . aiPrunedCount > 0 ) {
120+ message += '\n\n▣ Pruned tools:'
124121
125- message += `\n🤖 LLM analysis (${ data . aiPrunedIds . length } ):\n`
126- const toolsSummary = buildToolsSummary ( data . aiPrunedIds , data . toolMetadata , workingDirectory )
122+ for ( const prunedId of data . aiPrunedIds ) {
123+ const normalizedId = prunedId . toLowerCase ( )
124+ const metadata = data . toolMetadata . get ( normalizedId )
127125
128- for ( const [ toolName , params ] of toolsSummary . entries ( ) ) {
129- if ( params . length > 0 ) {
130- message += ` ${ toolName } (${ params . length } ):\n`
131- for ( const param of params ) {
132- message += ` ${ param } \n`
126+ if ( metadata ) {
127+ const paramKey = extractParameterKey ( metadata )
128+ if ( paramKey ) {
129+ const displayKey = truncate ( shortenPath ( paramKey , workingDirectory ) , 60 )
130+ message += `\n→ ${ metadata . tool } : ${ displayKey } `
131+ } else {
132+ message += `\n→ ${ metadata . tool } `
133133 }
134134 }
135135 }
136136
137- const foundToolNames = new Set ( toolsSummary . keys ( ) )
138- const missingTools = data . aiPrunedIds . filter ( id => {
139- const normalizedId = id . toLowerCase ( )
140- const metadata = data . toolMetadata . get ( normalizedId )
141- return ! metadata || ! foundToolNames . has ( metadata . tool )
142- } )
137+ const knownCount = data . aiPrunedIds . filter ( id =>
138+ data . toolMetadata . has ( id . toLowerCase ( ) )
139+ ) . length
140+ const unknownCount = data . aiPrunedIds . length - knownCount
143141
144- if ( missingTools . length > 0 ) {
145- message += ` (${ missingTools . length } tool${ missingTools . length > 1 ? 's' : '' } with unknown metadata)\n `
142+ if ( unknownCount > 0 ) {
143+ message += `\n→ (${ unknownCount } tool${ unknownCount > 1 ? 's' : '' } with unknown metadata)`
146144 }
147- } else {
148- const tokensCollected = formatTokenCount ( data . gcPending ! . tokensCollected )
149-
150- message = `🗑️ DCP: ~${ tokensCollected } collected`
151- message += buildSessionSuffix ( data . sessionStats , 0 )
152145 }
153146
154147 return message . trim ( )
155148}
156149
157- function buildSessionSuffix ( sessionStats : SessionStats | null , currentAiPruned : number ) : string {
158- if ( ! sessionStats ) {
159- return ''
160- }
161-
162- if ( sessionStats . totalToolsPruned <= currentAiPruned ) {
163- return ''
164- }
165-
166- const totalSaved = sessionStats . totalTokensSaved + sessionStats . totalGCTokens
167- let suffix = ` │ Session: ~${ formatTokenCount ( totalSaved ) } (${ sessionStats . totalToolsPruned } tools`
168-
169- if ( sessionStats . totalGCTokens > 0 ) {
170- suffix += `, ~${ formatTokenCount ( sessionStats . totalGCTokens ) } 🗑️`
171- }
172-
173- suffix += ')'
174- return suffix
175- }
176-
177150export function formatPruningResultForTool (
178151 result : PruningResult ,
179152 workingDirectory ?: string
0 commit comments