@@ -11,10 +11,14 @@ import { join } from "path"
1111import type { SessionState , SessionStats , CompressSummary } from "./types"
1212import type { Logger } from "../logger"
1313
14- /** Prune state as stored on disk (arrays for JSON compatibility) */
14+ /** Prune state as stored on disk */
1515export interface PersistedPrune {
16- toolIds : string [ ]
17- messageIds : string [ ]
16+ // New format: tool/message IDs with token counts
17+ tools ?: Record < string , number >
18+ messages ?: Record < string , number >
19+ // Legacy format: plain ID arrays (backward compatibility)
20+ toolIds ?: string [ ]
21+ messageIds ?: string [ ]
1822}
1923
2024export interface PersistedSessionState {
@@ -58,8 +62,8 @@ export async function saveSessionState(
5862 const state : PersistedSessionState = {
5963 sessionName : sessionName ,
6064 prune : {
61- toolIds : [ ... sessionState . prune . toolIds ] ,
62- messageIds : [ ... sessionState . prune . messageIds ] ,
65+ tools : Object . fromEntries ( sessionState . prune . tools ) ,
66+ messages : Object . fromEntries ( sessionState . prune . messages ) ,
6367 } ,
6468 compressSummaries : sessionState . compressSummaries ,
6569 stats : sessionState . stats ,
@@ -96,7 +100,9 @@ export async function loadSessionState(
96100 const content = await fs . readFile ( filePath , "utf-8" )
97101 const state = JSON . parse ( content ) as PersistedSessionState
98102
99- if ( ! state || ! state . prune || ! Array . isArray ( state . prune . toolIds ) || ! state . stats ) {
103+ const hasNewFormat = state ?. prune ?. tools && typeof state . prune . tools === "object"
104+ const hasLegacyFormat = Array . isArray ( state ?. prune ?. toolIds )
105+ if ( ! state || ! state . prune || ( ! hasNewFormat && ! hasLegacyFormat ) || ! state . stats ) {
100106 logger . warn ( "Invalid session state file, ignoring" , {
101107 sessionId : sessionId ,
102108 } )
@@ -166,10 +172,14 @@ export async function loadAllSessionStats(logger: Logger): Promise<AggregatedSta
166172 const content = await fs . readFile ( filePath , "utf-8" )
167173 const state = JSON . parse ( content ) as PersistedSessionState
168174
169- if ( state ?. stats ?. totalPruneTokens && state ?. prune ?. toolIds ) {
175+ if ( state ?. stats ?. totalPruneTokens && state ?. prune ) {
170176 result . totalTokens += state . stats . totalPruneTokens
171- result . totalTools += state . prune . toolIds . length
172- result . totalMessages += state . prune . messageIds ?. length || 0
177+ result . totalTools += state . prune . tools
178+ ? Object . keys ( state . prune . tools ) . length
179+ : ( state . prune . toolIds ?. length ?? 0 )
180+ result . totalMessages += state . prune . messages
181+ ? Object . keys ( state . prune . messages ) . length
182+ : ( state . prune . messageIds ?. length ?? 0 )
173183 result . sessionCount ++
174184 }
175185 } catch {
0 commit comments