File size: 2,362 Bytes
10b5888
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
from __future__ import annotations

import argparse
import os
from pathlib import Path
from zoneinfo import ZoneInfo, ZoneInfoNotFoundError

from .core import build_report
from .render import write_reports


def main(argv: list[str] | None = None) -> int:
    parser = _build_parser()
    args = parser.parse_args(argv)

    try:
        ZoneInfo(args.tz)
    except ZoneInfoNotFoundError:
        parser.error(f"unknown timezone: {args.tz}")

    report = build_report(
        state_path=Path(args.state).expanduser(),
        sessions_dir=Path(args.sessions_dir).expanduser(),
        tz_name=args.tz,
        days=args.days,
        top=args.top,
    )
    written = write_reports(report, Path(args.out).expanduser(), args.format)

    for path in written:
        print(f"Wrote {path}")
    print(f"Sessions: {len(report.sessions):,}")
    print(f"Total tokens: {report.total_tokens:,}")
    if report.warnings:
        print(f"Warnings: {len(report.warnings):,}")
    return 0


def _build_parser() -> argparse.ArgumentParser:
    parser = argparse.ArgumentParser(
        prog="codex-usage-profiler",
        description="Summarize local Codex usage from state_5.sqlite and rollout JSONL files.",
    )
    parser.add_argument(
        "--state",
        default="~/.codex/state_5.sqlite",
        help="Path to Codex state_5.sqlite. Default: %(default)s",
    )
    parser.add_argument(
        "--sessions-dir",
        default="~/.codex/sessions",
        help="Root directory containing rollout JSONL files. Default: %(default)s",
    )
    parser.add_argument(
        "--out",
        default="reports",
        help="Output directory. Default: %(default)s",
    )
    parser.add_argument(
        "--format",
        choices=["md", "html", "both"],
        default="both",
        help="Report format to write. Default: %(default)s",
    )
    parser.add_argument(
        "--tz",
        default=os.environ.get("TZ", "Europe/Berlin"),
        help="Timezone for day/week grouping. Default: %(default)s",
    )
    parser.add_argument(
        "--days",
        type=int,
        default=None,
        help="Include the last N local calendar days including today.",
    )
    parser.add_argument(
        "--top",
        type=int,
        default=20,
        help="Number of top sessions to include. Default: %(default)s",
    )
    return parser