(state: SessionState, logger: Logger)
| 118 | } |
| 119 | |
| 120 | export async function buildStatsReport(state: SessionState, logger: Logger) { |
| 121 | const sessionTokens = state.stats.totalPruneTokens |
| 122 | const sessionSummaryTokens = Array.from(state.prune.messages.blocksById.values()).reduce( |
| 123 | (total, block) => (block.active ? total + block.summaryTokens : total), |
| 124 | 0, |
| 125 | ) |
| 126 | const sessionDurationMs = getActiveCompressionTargets(state.prune.messages).reduce( |
| 127 | (total, target) => total + target.durationMs, |
| 128 | 0, |
| 129 | ) |
| 130 | |
| 131 | const prunedToolIds = new Set<string>(state.prune.tools.keys()) |
| 132 | for (const block of state.prune.messages.blocksById.values()) { |
| 133 | if (block.active) { |
| 134 | for (const toolId of block.effectiveToolIds) { |
| 135 | prunedToolIds.add(toolId) |
| 136 | } |
| 137 | } |
| 138 | } |
| 139 | const sessionTools = prunedToolIds.size |
| 140 | |
| 141 | let sessionMessages = 0 |
| 142 | for (const entry of state.prune.messages.byMessageId.values()) { |
| 143 | if (entry.activeBlockIds.length > 0) { |
| 144 | sessionMessages++ |
| 145 | } |
| 146 | } |
| 147 | |
| 148 | // All-time stats from storage files |
| 149 | const allTime = await loadAllSessionStats(logger) |
| 150 | |
| 151 | return { |
| 152 | sessionTokens, |
| 153 | sessionSummaryTokens, |
| 154 | sessionTools, |
| 155 | sessionMessages, |
| 156 | sessionDurationMs, |
| 157 | allTime, |
| 158 | } |
| 159 | } |
no test coverage detected