{"_id":"@awfixerai/stats","name":"@awfixerai/stats","dist-tags":{"latest":"0.0.1-rc.1"},"versions":{"0.0.1-rc.1":{"type":"module","name":"@awfixerai/stats","version":"0.0.1-rc.1","description":"Local observability dashboard for pi AI usage statistics","homepage":"https://agent.awfixer.codes","license":"MIT","repository":{"type":"git","url":"git+https://github.com/awfixers-stuff/awfixer-agent.git","directory":"packages/stats"},"bugs":{"url":"https://github.com/awfixers-stuff/awfixer-agent/issues"},"keywords":["ai","observability","metrics","dashboard","llm","statistics"],"main":"./src/index.ts","types":"./src/index.ts","bin":{"omp-stats":"src/index.ts"},"scripts":{"gen:stats":"bun scripts/generate-client-bundle.ts --generate","gen:stats:reset":"bun scripts/generate-client-bundle.ts --reset","build":"bun run build.ts","dev":"bun run src/index.ts","check":"biome check . && bun run check:types","check:types":"tsgo -p tsconfig.json --noEmit && tsgo -p tsconfig.client.json --noEmit","lint":"biome lint .","fix":"biome check --write --unsafe .","fmt":"biome format --write ."},"dependencies":{"@awfixerai/ai":"0.0.1-rc.1","@awfixerai/catalog":"0.0.1-rc.1","@awfixerai/utils":"0.0.1-rc.1","@tailwindcss/node":"^4.3.0","chart.js":"^4.5.1","date-fns":"^4.4.0","lucide-react":"^1.17.0","react":"19.2.7","react-chartjs-2":"^5.3.1","react-dom":"19.2.7","tailwindcss":"^4.3.0"},"devDependencies":{"@types/bun":"^1.3.14","@types/react":"^19.2.17","@types/react-dom":"^19.2.3","postcss":"^8.5.15"},"engines":{"bun":">=1.3.14"},"exports":{".":{"types":"./src/index.ts","import":"./src/index.ts"},"./*":{"types":"./src/*.ts","import":"./src/*.ts"},"./client":{"types":"./src/client/index.tsx","import":"./src/client/index.tsx"},"./client/*":{"types":"./src/client/*.ts","import":"./src/client/*.ts"},"./client/components/*":{"types":"./src/client/components/*.ts","import":"./src/client/components/*.ts"},"./*.js":"./src/*.ts"},"_id":"@awfixerai/stats@0.0.1-rc.1","_integrity":"sha512-y32c81kv4uHLyqXyUBfx1wd2+CijmnFqmmeV04CtFiUo0FNK62GO4oPxMfmzRrGXNr9GM5aJfvPyvMEqkWzsRQ==","_nodeVersion":"24.3.0","_npmVersion":"10.8.3","shasum":"2622e44472ba02c2e9d6d0cddeb47fa7d5b8604a","dist":{"integrity":"sha512-y32c81kv4uHLyqXyUBfx1wd2+CijmnFqmmeV04CtFiUo0FNK62GO4oPxMfmzRrGXNr9GM5aJfvPyvMEqkWzsRQ==","shasum":"2622e44472ba02c2e9d6d0cddeb47fa7d5b8604a","tarball":"https://registry.npmjs.org/@awfixerai/stats/-/stats-0.0.1-rc.1.tgz","fileCount":61,"unpackedSize":314738,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIHod4OjP+fFfkl8g54NAv9Q89B0tOOYjdtn5uKRnr0VhAiB5UKRZnQSQXAf3tMCCkCzp+tT8lXgnimZ4sskjEEYMFA=="}]},"_npmUser":{"name":"awfixer","email":"wise.jet2897@fastmail.com"},"directories":{},"maintainers":[{"name":"awfixer","email":"wise.jet2897@fastmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/stats_0.0.1-rc.1_1783015036963_0.4579635333034757"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-02T17:57:16.708Z","0.0.1-rc.1":"2026-07-02T17:57:17.152Z","modified":"2026-07-02T17:57:17.434Z"},"maintainers":[{"name":"awfixer","email":"wise.jet2897@fastmail.com"}],"description":"Local observability dashboard for pi AI usage statistics","homepage":"https://agent.awfixer.codes","keywords":["ai","observability","metrics","dashboard","llm","statistics"],"repository":{"type":"git","url":"git+https://github.com/awfixers-stuff/awfixer-agent.git","directory":"packages/stats"},"bugs":{"url":"https://github.com/awfixers-stuff/awfixer-agent/issues"},"license":"MIT","readme":"# @awfixerai/stats\n\nLocal observability dashboard for AI usage statistics.\n\n## Features\n\n- **Session log parsing**: Reads JSONL session logs from `~/.agent/sessions/`\n- **SQLite aggregation**: Efficient stats storage and querying using `bun:sqlite`\n- **Web dashboard**: Real-time metrics visualization with Chart.js\n- **Incremental sync**: Only processes new/modified log entries\n\n## Metrics Tracked\n\n| Metric | Calculation |\n|--------|-------------|\n| Tokens/s | `output_tokens / (duration / 1000)` |\n| Cache Rate | `cache_read / (input + cache_read) * 100` |\n| Error Rate | `count(stopReason=error) / total_calls * 100` |\n| Total Cost | Sum of `usage.cost.total` |\n| Avg Latency | Mean of `duration` |\n| TTFT | Mean of `ttft` (time to first token) |\n\n## Usage\n\n### Via CLI\n\n```bash\n# Start dashboard server (default: http://localhost:3847)\nagent stats\n\n# Custom port\nagent stats --port 8080\n\n# Print summary to console\nagent stats --summary\n\n# Output as JSON (for scripting)\nagent stats --json\n```\n\n### Programmatic\n\n```typescript\nimport { getDashboardStats, syncAllSessions } from \"@awfixerai/stats\";\n\n// Sync session logs to database\nconst { processed, files } = await syncAllSessions();\n\n// Get aggregated stats\nconst stats = await getDashboardStats();\nconsole.log(stats.overall.totalCost);\nconsole.log(stats.byModel[0].avgTokensPerSecond);\n```\n\n## API Endpoints\n\n| Endpoint | Description |\n|----------|-------------|\n| `GET /api/stats` | Overall stats with all breakdowns |\n| `GET /api/stats/models` | Per-model statistics |\n| `GET /api/stats/folders` | Per-folder/project statistics |\n| `GET /api/stats/timeseries` | Hourly time series data |\n| `GET /api/sync` | Trigger sync and return counts |\n\n## Data Storage\n\n- **Session logs**: `~/.agent/sessions/` (JSONL files)\n- **Stats database**: `~/.agent/stats.db` (SQLite)\n\n## Dashboard\n\nThe web dashboard provides:\n\n- Overall metrics cards (requests, cost, cache rate, error rate, duration, tokens/s)\n- Time series chart showing requests and errors over time\n- Per-model breakdown table\n- Per-folder breakdown table\n- Auto-refresh every 30 seconds\n\n## License\n\nMIT\n","readmeFilename":"README.md","_rev":"1-8f63a143f9ea55199748f3b916de490e"}