()
| 259 | |
| 260 | |
| 261 | def cmd_stats(): |
| 262 | conn = require_db() |
| 263 | conn.row_factory = sqlite3.Row |
| 264 | |
| 265 | # Session-level info (count, date range) |
| 266 | session_info = conn.execute(""" |
| 267 | SELECT |
| 268 | COUNT(*) as sessions, |
| 269 | MIN(first_timestamp) as first, |
| 270 | MAX(last_timestamp) as last |
| 271 | FROM sessions |
| 272 | """).fetchone() |
| 273 | |
| 274 | # All-time totals from turns (more accurate — per-turn model attribution) |
| 275 | totals = conn.execute(""" |
| 276 | SELECT |
| 277 | SUM(input_tokens) as inp, |
| 278 | SUM(output_tokens) as out, |
| 279 | SUM(cache_read_tokens) as cr, |
| 280 | SUM(cache_creation_tokens) as cc, |
| 281 | COUNT(*) as turns |
| 282 | FROM turns |
| 283 | """).fetchone() |
| 284 | |
| 285 | # By model from turns (each turn has the actual model used) |
| 286 | by_model = conn.execute(""" |
| 287 | SELECT |
| 288 | COALESCE(model, 'unknown') as model, |
| 289 | SUM(input_tokens) as inp, |
| 290 | SUM(output_tokens) as out, |
| 291 | SUM(cache_read_tokens) as cr, |
| 292 | SUM(cache_creation_tokens) as cc, |
| 293 | COUNT(*) as turns, |
| 294 | COUNT(DISTINCT session_id) as sessions |
| 295 | FROM turns |
| 296 | GROUP BY model |
| 297 | ORDER BY inp + out DESC |
| 298 | """).fetchall() |
| 299 | |
| 300 | # Top 5 projects from turns (join with sessions for project name) |
| 301 | top_projects = conn.execute(""" |
| 302 | SELECT |
| 303 | COALESCE(s.project_name, 'unknown') as project_name, |
| 304 | SUM(t.input_tokens) as inp, |
| 305 | SUM(t.output_tokens) as out, |
| 306 | COUNT(*) as turns, |
| 307 | COUNT(DISTINCT t.session_id) as sessions |
| 308 | FROM turns t |
| 309 | LEFT JOIN sessions s ON t.session_id = s.session_id |
| 310 | GROUP BY s.project_name |
| 311 | ORDER BY inp + out DESC |
| 312 | LIMIT 5 |
| 313 | """).fetchall() |
| 314 | |
| 315 | # Subagent totals (subagent tokens are included in the all-time totals above) |
| 316 | subagent = conn.execute(""" |
| 317 | SELECT |
| 318 | COUNT(*) as turns, |
nothing calls this directly
no test coverage detected