codexmeter 1.0.21 → 1.0.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/bin/codexmeter.js +19 -2
- package/dist/assets/index-8ykzgYb0.js +31 -0
- package/dist/index.html +1 -1
- package/package.json +18 -16
- package/server/aggregator.js +34 -41
- package/server/day-key.js +64 -6
- package/server/index.js +1 -0
- package/server/ingest.js +16 -0
- package/server/live-state.js +47 -59
- package/server/rollout-reader.js +45 -30
- package/server/sqlite-reader.js +2 -5
- package/dist/assets/index-BfQCWE9K.js +0 -34
package/README.md
CHANGED
|
@@ -42,7 +42,7 @@ Data is read from `state_5.sqlite`, `logs_1.sqlite`, and rollout JSONL under `.c
|
|
|
42
42
|
|
|
43
43
|
## Requirements
|
|
44
44
|
|
|
45
|
-
- Node.js
|
|
45
|
+
- Node.js 22.13+
|
|
46
46
|
- A `.codex` directory (from Codex CLI usage)
|
|
47
47
|
- Chrome, Chromium, or Edge for video export, or let CodexMeter download a single-use portable browser from the UI
|
|
48
48
|
|
package/bin/codexmeter.js
CHANGED
|
@@ -21,6 +21,18 @@ function parseNumberEnv(name, defaultValue = undefined) {
|
|
|
21
21
|
return Number.isFinite(value) && value > 0 ? value : defaultValue;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
+
function parseIsoDateOption(name, value) {
|
|
25
|
+
if (!value) return null;
|
|
26
|
+
if (!/^\d{4}-\d{2}-\d{2}$/.test(value)) {
|
|
27
|
+
program.error(`${name} must be a valid date in YYYY-MM-DD format`);
|
|
28
|
+
}
|
|
29
|
+
const ms = Date.parse(`${value}T00:00:00Z`);
|
|
30
|
+
if (!Number.isFinite(ms) || new Date(ms).toISOString().slice(0, 10) !== value) {
|
|
31
|
+
program.error(`${name} must be a valid date in YYYY-MM-DD format`);
|
|
32
|
+
}
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
35
|
+
|
|
24
36
|
program
|
|
25
37
|
.name('codexmeter')
|
|
26
38
|
.description('Local telemetry dashboard for Codex CLI usage')
|
|
@@ -34,6 +46,11 @@ program
|
|
|
34
46
|
.parse();
|
|
35
47
|
|
|
36
48
|
const opts = program.opts();
|
|
49
|
+
const from = parseIsoDateOption('--from', opts.from);
|
|
50
|
+
const to = parseIsoDateOption('--to', opts.to);
|
|
51
|
+
if (from && to && from > to) {
|
|
52
|
+
program.error('--from must be earlier than or equal to --to');
|
|
53
|
+
}
|
|
37
54
|
|
|
38
55
|
const ingestToggles = {
|
|
39
56
|
ingestTiming: parseBooleanEnv('CODEXMETER_INGEST_TIMING'),
|
|
@@ -59,8 +76,8 @@ if (activeIngestToggles.length) {
|
|
|
59
76
|
}
|
|
60
77
|
|
|
61
78
|
const app = createServer(opts.codexHome, {
|
|
62
|
-
from
|
|
63
|
-
to
|
|
79
|
+
from,
|
|
80
|
+
to,
|
|
64
81
|
repo: opts.repo,
|
|
65
82
|
agentFamily: opts.agentFamily,
|
|
66
83
|
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
|