agenttelemetry-app 2.1.0__tar.gz → 2.2.0__tar.gz

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.
Files changed (71) hide show
  1. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/MANIFEST.in +5 -10
  2. {agenttelemetry_app-2.1.0/agenttelemetry_app.egg-info → agenttelemetry_app-2.2.0}/PKG-INFO +61 -53
  3. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/README.md +60 -52
  4. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/__init__.py +1 -1
  5. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/accounts.py +1 -1
  6. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0/agenttelemetry_app.egg-info}/PKG-INFO +61 -53
  7. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/agenttelemetry_app.egg-info/SOURCES.txt +9 -19
  8. agenttelemetry_app-2.2.0/antigravity.py +1291 -0
  9. agenttelemetry_app-2.2.0/cursor_data.py +966 -0
  10. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/dashboard.py +798 -138
  11. agenttelemetry_app-2.2.0/docs/antigravity.md +79 -0
  12. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/docs/python-package.md +2 -4
  13. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/editor_snapshot.py +135 -5
  14. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/index.html +0 -14
  15. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/native_activity.py +56 -1
  16. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/parser.py +1471 -240
  17. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/pyproject.toml +3 -3
  18. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/session_names.py +19 -2
  19. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/session_timeline.py +358 -3
  20. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/setup.py +2 -7
  21. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/static/app.css +5 -43
  22. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/static/core.js +86 -6
  23. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/static/maintenance.js +8 -1
  24. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/static/timeline.js +52 -9
  25. agenttelemetry_app-2.2.0/static/tool-icons/LICENSE.antigravity.txt +17 -0
  26. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/static/tool-icons/README.md +3 -1
  27. agenttelemetry_app-2.2.0/static/tool-icons/antigravity.svg +3 -0
  28. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/static/views.js +301 -715
  29. agenttelemetry_app-2.1.0/docs/mcp.md +0 -83
  30. agenttelemetry_app-2.1.0/mcp_access.py +0 -338
  31. agenttelemetry_app-2.1.0/mcp_backend.py +0 -549
  32. agenttelemetry_app-2.1.0/mcp_protocol.py +0 -97
  33. agenttelemetry_app-2.1.0/mcp_server.py +0 -678
  34. agenttelemetry_app-2.1.0/mcp_tools.py +0 -234
  35. agenttelemetry_app-2.1.0/static/insights.js +0 -115
  36. agenttelemetry_app-2.1.0/static/mcp.js +0 -281
  37. agenttelemetry_app-2.1.0/telemetry_insights.py +0 -1754
  38. agenttelemetry_app-2.1.0/telemetry_query.py +0 -1359
  39. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/LICENSE +0 -0
  40. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/__main__.py +0 -0
  41. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/agenttelemetry_app.egg-info/dependency_links.txt +0 -0
  42. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/agenttelemetry_app.egg-info/entry_points.txt +0 -0
  43. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/agenttelemetry_app.egg-info/top_level.txt +0 -0
  44. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/chart.umd.min.js +0 -0
  45. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/cli.py +0 -0
  46. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/diagnostics.py +0 -0
  47. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/docs/native-activity.md +0 -0
  48. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/docs/release-notes.md +0 -0
  49. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/ledger_backups.py +0 -0
  50. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/local_servers.py +0 -0
  51. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/local_servers_windows.py +0 -0
  52. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/manifest.json +0 -0
  53. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/native.py +0 -0
  54. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/release_notes.py +0 -0
  55. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/setup.cfg +0 -0
  56. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/static/apple-touch-icon.png +0 -0
  57. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/static/charts.js +0 -0
  58. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/static/icon-192.png +0 -0
  59. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/static/icon-512.png +0 -0
  60. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/static/release-notes.js +0 -0
  61. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/static/tool-icons/LICENSE.hermes.txt +0 -0
  62. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/static/tool-icons/LICENSE.openclaw.txt +0 -0
  63. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/static/tool-icons/LICENSE.simple-icons.txt +0 -0
  64. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/static/tool-icons/claude.svg +0 -0
  65. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/static/tool-icons/copilot.svg +0 -0
  66. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/static/tool-icons/cursor.svg +0 -0
  67. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/static/tool-icons/hermes.svg +0 -0
  68. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/static/tool-icons/openai.svg +0 -0
  69. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/static/tool-icons/openclaw.svg +0 -0
  70. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/static/tool-icons/opencode.svg +0 -0
  71. {agenttelemetry_app-2.1.0 → agenttelemetry_app-2.2.0}/sw.js +0 -0
@@ -14,41 +14,36 @@ include native_activity.py
14
14
  include local_servers.py
15
15
  include local_servers_windows.py
16
16
  include parser.py
17
+ include antigravity.py
18
+ include cursor_data.py
17
19
  include release_notes.py
18
20
  include native.py
19
21
  include accounts.py
20
22
  include session_names.py
21
- include mcp_access.py
22
- include mcp_backend.py
23
- include mcp_protocol.py
24
- include mcp_server.py
25
- include mcp_tools.py
26
- include telemetry_query.py
27
- include telemetry_insights.py
28
23
  include index.html
29
24
  include chart.umd.min.js
30
25
  include manifest.json
31
26
  include sw.js
32
27
  include docs/python-package.md
33
- include docs/mcp.md
34
28
  include docs/release-notes.md
35
29
  include docs/native-activity.md
30
+ include docs/antigravity.md
36
31
  include static/app.css
37
32
  include static/apple-touch-icon.png
38
33
  include static/charts.js
39
34
  include static/core.js
40
35
  include static/icon-192.png
41
36
  include static/icon-512.png
42
- include static/insights.js
43
37
  include static/maintenance.js
44
38
  include static/release-notes.js
45
- include static/mcp.js
46
39
  include static/timeline.js
47
40
  include static/tool-icons/LICENSE.hermes.txt
41
+ include static/tool-icons/LICENSE.antigravity.txt
48
42
  include static/tool-icons/LICENSE.openclaw.txt
49
43
  include static/tool-icons/LICENSE.simple-icons.txt
50
44
  include static/tool-icons/README.md
51
45
  include static/tool-icons/claude.svg
46
+ include static/tool-icons/antigravity.svg
52
47
  include static/tool-icons/copilot.svg
53
48
  include static/tool-icons/cursor.svg
54
49
  include static/tool-icons/hermes.svg
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agenttelemetry-app
3
- Version: 2.1.0
3
+ Version: 2.2.0
4
4
  Summary: A private, local dashboard for AI coding agent usage
5
5
  License-Expression: MIT
6
6
  Project-URL: Homepage, https://github.com/uttamdeb/agent-telemetry
@@ -29,26 +29,33 @@ logs your tools already write to your own machine and serves a clean, interactiv
29
29
  dashboard — estimated spend, tokens, active time, cache efficiency, an **Anthropic vs OpenAI
30
30
  vs Google** provider comparison, an activity calendar, and breakdowns by **model, provider,
31
31
  day, hour, weekday, tool, IDE, project and session** — plus how much **disk** all these logs
32
- eat, and suggestions for spending less, drawn from your own numbers.
32
+ eat.
33
33
 
34
34
  By default, log inventory, usage and the cache stay on this machine. Separate actions can
35
- share selected exports with [paired devices](#your-devices-optional), return requested
36
- analytics to an enabled [local MCP client](docs/mcp.md) (which may forward tool results to
37
- its model provider), contact a provider after a confirmed **Read once** account lookup, or
35
+ share selected exports with [paired devices](#your-devices-optional), contact a provider
36
+ after a confirmed **Read once** account lookup, or
38
37
  fetch GitHub update and release-note metadata after you click **Check for updates** or
39
38
  **Load notes**. Cached release notes can be shown offline after an upgrade. No account or API key is needed
40
39
  for the dashboard; it has no runtime dependencies beyond Python's standard library and a
41
40
  vendored copy of Chart.js.
42
41
 
43
- Covers **Claude Code · Claude Desktop · Codex · GitHub Copilot · Cursor · OpenCode · Hermes Agent · OpenClaw**.
42
+ Covers **Claude Code · Claude Desktop · Codex · GitHub Copilot · Cursor · Antigravity · OpenCode · Hermes Agent · OpenClaw**.
43
+
44
+ **Get AgentTelemetry:** [Desktop apps for macOS and Windows](#download-the-app) ·
45
+ [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=agenttelemetry-team.agenttelemetry) ·
46
+ [Open VSX](https://open-vsx.org/extension/agenttelemetry-team/agenttelemetry) (Cursor and compatible editors) ·
47
+ [Browser dashboard (Python or source)](#quick-start) ·
48
+ [Product page](https://agenttelemetry-app.vercel.app/)
44
49
 
45
50
  ## Download the app
46
51
 
47
- | Platform | Download |
52
+ Choose the installer for your platform from the release's **Assets** section.
53
+
54
+ | Platform | Release downloads |
48
55
  | --- | --- |
49
- | macOS 13+ · Apple Silicon | **[Download DMG](https://github.com/uttamdeb/agent-telemetry/releases/download/v2.1.0/AgentTelemetry-2.1.0-macos-arm64.dmg)** |
50
- | macOS 13+ · Intel | **[Download DMG](https://github.com/uttamdeb/agent-telemetry/releases/download/v2.1.0/AgentTelemetry-2.1.0-macos-x86_64.dmg)** |
51
- | Windows 10/11 · x64 | **[Download EXE installer](https://github.com/uttamdeb/agent-telemetry/releases/download/v2.1.0/AgentTelemetry-2.1.0-windows-x64-setup.exe)** |
56
+ | macOS 13+ · Apple Silicon | **[Find the Apple Silicon DMG](https://github.com/uttamdeb/agent-telemetry/releases/latest)** |
57
+ | macOS 13+ · Intel | **[Find the Intel DMG](https://github.com/uttamdeb/agent-telemetry/releases/latest)** |
58
+ | Windows 10/11 · x64 | **[Find the Windows EXE installer](https://github.com/uttamdeb/agent-telemetry/releases/latest)** |
52
59
 
53
60
  **Python is bundled — no terminal setup needed.** macOS: open the DMG, drag the app to
54
61
  Applications and open it. Windows: run the installer and open AgentTelemetry from Start.
@@ -61,10 +68,11 @@ starting monitoring. On macOS, opening the app manually also lets you import fir
61
68
 
62
69
  These builds are unsigned/unnotarized. macOS may require **System Settings → Privacy &
63
70
  Security → Open Anyway**; Windows SmartScreen may require **More info → Run anyway**.
71
+ [Product and install page](https://agenttelemetry-app.vercel.app/) ·
64
72
  [All releases](https://github.com/uttamdeb/agent-telemetry/releases) ·
65
- [What's new in 2.1.0](docs/releases/v2.1.0.md) ·
66
- [SHA-256 checksums](https://github.com/uttamdeb/agent-telemetry/releases/download/v2.1.0/SHA256SUMS.txt) ·
67
- [PyPI package 2.1.0](https://pypi.org/project/agenttelemetry-app/2.1.0/)
73
+ [What's new in 2.2.0](docs/releases/v2.2.0.md) ·
74
+ [SHA-256 checksums in release assets](https://github.com/uttamdeb/agent-telemetry/releases/latest) ·
75
+ [PyPI package 2.2.0](https://pypi.org/project/agenttelemetry-app/2.2.0/)
68
76
 
69
77
  ---
70
78
 
@@ -166,12 +174,14 @@ estimated from tokens or combined across devices. Session details show recorded
166
174
  creator/account IDs with their attribution limits. Account metadata is private to the
167
175
  source device. See [setup, research and limitations](docs/account-limits.md).
168
176
 
169
- ## Local servers (macOS)
177
+ ## Local servers (macOS and Windows)
170
178
 
171
- The **Local servers** tab and menu bar can list local project listeners, pin them,
172
- and save an explicit launch command for Start and Restart. Process actions ask for
173
- confirmation. They require a ready macOS backend; Windows and Linux show the support
174
- limitation. Commands stay on this machine and are never included in device sharing.
179
+ The **Local servers** dashboard tab can list local project listeners, pin them,
180
+ and save an explicit launch command for Start and Restart. macOS can also show pinned
181
+ controls in the menu bar; the Windows tray opens the dashboard controls. Process actions
182
+ ask for confirmation. Lifecycle controls are supported on macOS and Windows; Linux does
183
+ not yet support this feature. Windows asks for a working folder and uses ownership-checked
184
+ process controls. Commands stay on this machine and are never included in device sharing.
175
185
  Running a saved command gives it your account's file and network access.
176
186
  See [behavior, privacy and limitations](docs/local-servers.md).
177
187
 
@@ -238,25 +248,15 @@ retain one serialized snapshot per display tick, in memory only; the ledger is u
238
248
  as all writes. `POST /api/shutdown` additionally requires the owning Windows client's
239
249
  per-process control token; a normal standalone dashboard cannot be stopped by that route.
240
250
 
241
- ## Local MCP access (optional)
242
-
243
- AgentTelemetry provides eight read-only MCP tools for usage, comparisons, supported insights,
244
- session summaries and timelines, data health, the telemetry catalog and saved subscription
245
- limits. MCP access is off by default. Enable it in Settings and confirm each scope. The local
246
- bridge requires an already-running dashboard and returns data only when the configured MCP
247
- client requests it. A cloud-backed client may send tool results to its provider; review that
248
- client's data-handling settings before enabling access. Project/device names and usage from
249
- connected devices require their own opt-in scopes. The MCP bridge never refreshes accounts,
250
- returns prompt text, or edits client configuration. See [MCP tools, setup and privacy
251
- limits](docs/mcp.md).
252
-
253
- The MCP bridge ships with the **2.1.0** application and Python package. It is not a separate
254
- marketplace listing; install/update AgentTelemetry, then use the [MCP setup guide](docs/mcp.md).
255
-
256
251
  > `--rebuild` deletes the cache, and with it every session whose log has since been deleted
257
252
  > from disk (see [Storage](#storage--what-these-logs-cost-you-in-disk)). Copy
258
253
  > `.usage_cache.json` somewhere safe first if you've cleaned up old logs.
259
254
 
255
+ Deleting a session inside a tool doesn't remove it from your totals either. If OpenCode,
256
+ Hermes or OpenClaw delete a session from their database, the dashboard keeps the usage it
257
+ already counted and marks that session as deleted. The same applies to turns you undo in
258
+ OpenCode and to a Claude or Copilot log that gets shorter.
259
+
260
260
  **Requirements:** Python 3.8+ on **macOS, Linux or Windows**. On Windows run
261
261
  `python dashboard.py` (or `run.cmd`); on macOS/Linux `python3 dashboard.py` (or `./run.sh`).
262
262
 
@@ -280,21 +280,33 @@ instead of cloning, delete `.usage_cache.json` first — that file is your perso
280
280
 
281
281
  ## Data sources
282
282
 
283
+ **AgentTelemetry Pulsar** is the engine that reads these sources. It finds each tool's
284
+ local logs, picks the usage signal out of them and turns every tool's format into the one
285
+ shared usage shape the dashboard shows. It runs on your machine, and its code lives in
286
+ `parser.py`.
287
+
283
288
  | Tool | Where it reads | Tokens |
284
289
  |---|---|---|
285
290
  | **Claude Code** | `~/.claude/projects/**/*.jsonl` | exact (in/out/cache read+write, 5m/1h tiers) |
286
291
  | **Claude Desktop** (agent mode) | `Claude/local-agent-mode-sessions/**` under App Support / `%APPDATA%` / `~/.config` | exact |
287
- | **Codex** | `~/.codex/sessions/**`, `~/.codex/archived_sessions/**` | exact (in/cached/out/reasoning); subagents are identified and labelled |
292
+ | **Codex** | `~/.codex/sessions/**`, `~/.codex/archived_sessions/**` (plain `*.jsonl` and the zstd-compressed `*.jsonl.zst` Codex swaps in for idle threads) | exact (in/cached/out/reasoning); subagents are identified and labelled. Compressed rollouts are read with Python 3.14+ or the `zstd` command; without either they are counted as unread (never dropped) and the sidebar says how many |
288
293
  | **GitHub Copilot** | VS Code-family `chatSessions/*.{json,jsonl}`; SDK/CLI `~/.copilot/session-state/*/events.jsonl`, enriched from VS Code `agentSessionData/*/session.db` | recorded request/turn tokens where available; SDK shutdown totals where safely dated. SDK gaps show a warning tooltip and unavailable/partial usage; older non-SDK chats retain text estimates. Premium multipliers are separate from estimated dollars. |
289
- | **Cursor** (native AI) | `Cursor/User/globalStorage/state.vscdb` under App Support / `%APPDATA%` / `~/.config` | partial — model, mode, timestamps, tool calls and AI-line stats are exact; tokens are on only ~2% of messages |
294
+ | **Cursor** (native AI) | `Cursor/User/globalStorage/state.vscdb` under App Support / `%APPDATA%` / `~/.config` | recorded, partial or unavailable per session/model: explicit message input/output tokens, models, tools and AI-line stats where the local records expose them |
295
+ | **Google Antigravity** | `~/.gemini/antigravity/conversations/*.db`, `~/.gemini/antigravity-ide/conversations/*.db`, `~/.gemini/antigravity-cli/conversations/*.db` | recorded SQLite usage with per-field availability; standalone legacy `.pb` files are unsupported |
290
296
  | **OpenCode** | `~/.local/share/opencode/opencode.db`, `%LOCALAPPDATA%\opencode\opencode.db`, `~/.opencode/opencode.db` (or `$OPENCODE_DATA_DIR`) | V1/V2 SQLite; exact (in/out/reasoning/cache), prompts and tools; cost is read from OpenCode's own per-message value |
291
297
  | **Hermes Agent** | `~/.hermes/state.db` (or `$HERMES_HOME`, `%LOCALAPPDATA%\hermes`) | exact (in/out/cache/reasoning, per model) |
292
298
  | **OpenClaw** | `~/.openclaw/agents/<agent>/agent/openclaw-agent.sqlite` (or `$OPENCLAW_STATE_DIR`; also the older `~/.clawdbot`, `~/.moltbot`) and the older per-session `sessions/*.jsonl` | exact (in/out/cache read/cache write/reasoning, per response); its own logged cost is used only for a model with no verified price. Large events are stored zstd-compressed: read with the `zstd` command or Python 3.14+ |
293
299
 
294
300
  A tool you don't use simply contributes nothing. **Attribution is by tool, not by model** —
295
- a Claude or GPT model used *inside* Copilot/Cursor/OpenCode/Hermes/OpenClaw counts under that tool, and the
301
+ a Claude, Gemini, or GPT model used *inside* Copilot/Cursor/Antigravity/OpenCode/Hermes/OpenClaw counts under that tool, and the
296
302
  Models table lists each `model × tool` row separately.
297
303
 
304
+ Antigravity's supported SQLite schema, duplicate-row handling, recorded checkpoint detail,
305
+ and format limits are documented in [Google Antigravity support](docs/antigravity.md).
306
+
307
+ Cursor's local conversation metadata is documented in [Cursor support](docs/cursor.md),
308
+ including its model/token coverage states, workspace associations, subagents, and limits.
309
+
298
310
  Copilot's newer SDK-based agent sessions use a different store from older Copilot Chat.
299
311
  AgentTelemetry joins their event history to VS Code's saved per-turn usage using native
300
312
  session and event IDs. Custom endpoint models, including Cloudflare GLM 5.3, still count
@@ -386,14 +398,6 @@ a display-name override. See [subagent name behavior](docs/subagent-sessions.md)
386
398
  Tool/provider icons are bundled locally, including the OpenAI mark for Codex; no remote
387
399
  logo requests occur. Their sources and licenses are in `static/tool-icons/README.md`.
388
400
 
389
- **Optimize** — suggestions derived from your own logs, ranked by what they'd save: sessions
390
- re-reading a very large context, thinking share, tool-heavy sessions that never delegated,
391
- cache written but never read, a costly model doing light work, what each **Skill** costs,
392
- edits that needed a retry, oversized **CLAUDE.md / AGENTS.md**, sessions that open heavier
393
- than your leanest ones, wasted file reads, installed skills and agents you never use, and
394
- MCP servers you never call, barely use, or load everywhere but use in one project. Nothing is shown unless
395
- your data supports it, and because the estimates overlap they are never summed.
396
-
397
401
  **Storage** — see below.
398
402
 
399
403
  **Keyboard** — `1`/`7`/`3`/`9`/`a` ranges, `m` month-to-date, `,` / `.` previous / next
@@ -484,17 +488,21 @@ dollars**, so cost is always derived. Rates live in `parser.py → PRICING` as
484
488
  above 100K. The threshold includes cached input and applies to each request.
485
489
  Available Claude logs backfill this pricing detail on a normal restart; token and
486
490
  message counts stay unchanged. Older archives/peers and other tools without that
487
- detail use the short-prompt rate. Optimize model substitutions conservatively use
488
- the higher tier when the target request size is unknown.
491
+ detail use the short-prompt rate.
489
492
  - **Price changes are date-aware.** When a vendor cuts a price (OpenAI's GPT-5.6 cuts of
490
493
  2026-07-30 and 2026-08-21), usage from before the change keeps the rate it had then —
491
494
  see `parser.py → PRICE_HISTORY`.
492
495
  - **These are API-equivalent values.** If you're on a subscription (Claude Max/Pro, Codex,
493
496
  Copilot), you don't pay per token — the $ is "what this would cost at API rates."
494
- - **Cursor** rarely logs token counts, and **older Copilot chats** have none, so their tokens
495
- (and thus $) are rough. Current Copilot builds log real per-request tokens, which are used.
496
- Copilot's honest metric is **request count** and its **premium-request** total (both shown);
497
- Cursor's is **messages, tool calls and AI lines kept** (also shown).
497
+ - **Cursor** exposes explicit input/output token receipts for some messages; missing and
498
+ placeholder values are unavailable, and usage coverage can be partial. Cache and reasoning
499
+ values remain unavailable unless recorded. Overview shows observed Cursor prompts, replies,
500
+ and tool calls separately when they have no token/cost coverage. It does not estimate tokens
501
+ from text or context meters, infer subscription charges, or count metadata as tokens. The
502
+ **Exact tokens only** filter omits Cursor because local token coverage is incomplete. See
503
+ [Cursor support](docs/cursor.md). **Older Copilot chats** may have no token data; current
504
+ Copilot builds log real per-request tokens. Copilot's honest metric is **request count** and
505
+ its **premium-request** total (both shown); Cursor also exposes **AI lines kept**.
498
506
  - **Billing details that change the price are applied**: prompt-cache writes at their own
499
507
  rate (Claude and GPT-5.6/GPT-6), Claude fast mode, US-only inference (1.1x) and web
500
508
  searches ($10/1K). A forked or subagent Codex thread's replay of its parent is skipped,
@@ -539,7 +547,7 @@ and extend this from that file).
539
547
 
540
548
  ## Files
541
549
 
542
- `dashboard.py` (server + cache + cost + `/api/storage`) · `parser.py` (log parsers + pricing) ·
550
+ `dashboard.py` (server + cache + cost + `/api/storage`) · `parser.py` (AgentTelemetry Pulsar: log parsers + pricing) ·
543
551
  `index.html` (shell) · `static/app.css` · `static/core.js` · `static/charts.js` ·
544
552
  `static/views.js` · `chart.umd.min.js` (vendored Chart.js) · `AGENTS.md` · `run.sh`.
545
553
 
@@ -571,8 +579,8 @@ What sharing sends: session titles (often the start of a prompt), project and br
571
579
  log file paths, models, token counts, costs and times. Full prompts, replies and file
572
580
  contents are never sent. Sharing opens one read-only port (7879) that answers only to the
573
581
  pairing code. The dashboard itself stays on `127.0.0.1`. The connection is **not
574
- encrypted**, so share only on a network you trust. The setup checks on the Optimize tab
575
- (instruction files, installed skills, MCP servers) and the Storage tab still describe only
582
+ encrypted**, so share only on a network you trust. The Storage tab and setup inventories
583
+ (instruction files, installed skills, MCP servers) still describe only
576
584
  the computer you're looking at. `.peers.json` and `.peers/` are gitignored.
577
585
 
578
586
  **If it can't connect**, the error says which of these it is:
@@ -5,26 +5,33 @@ logs your tools already write to your own machine and serves a clean, interactiv
5
5
  dashboard — estimated spend, tokens, active time, cache efficiency, an **Anthropic vs OpenAI
6
6
  vs Google** provider comparison, an activity calendar, and breakdowns by **model, provider,
7
7
  day, hour, weekday, tool, IDE, project and session** — plus how much **disk** all these logs
8
- eat, and suggestions for spending less, drawn from your own numbers.
8
+ eat.
9
9
 
10
10
  By default, log inventory, usage and the cache stay on this machine. Separate actions can
11
- share selected exports with [paired devices](#your-devices-optional), return requested
12
- analytics to an enabled [local MCP client](docs/mcp.md) (which may forward tool results to
13
- its model provider), contact a provider after a confirmed **Read once** account lookup, or
11
+ share selected exports with [paired devices](#your-devices-optional), contact a provider
12
+ after a confirmed **Read once** account lookup, or
14
13
  fetch GitHub update and release-note metadata after you click **Check for updates** or
15
14
  **Load notes**. Cached release notes can be shown offline after an upgrade. No account or API key is needed
16
15
  for the dashboard; it has no runtime dependencies beyond Python's standard library and a
17
16
  vendored copy of Chart.js.
18
17
 
19
- Covers **Claude Code · Claude Desktop · Codex · GitHub Copilot · Cursor · OpenCode · Hermes Agent · OpenClaw**.
18
+ Covers **Claude Code · Claude Desktop · Codex · GitHub Copilot · Cursor · Antigravity · OpenCode · Hermes Agent · OpenClaw**.
19
+
20
+ **Get AgentTelemetry:** [Desktop apps for macOS and Windows](#download-the-app) ·
21
+ [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=agenttelemetry-team.agenttelemetry) ·
22
+ [Open VSX](https://open-vsx.org/extension/agenttelemetry-team/agenttelemetry) (Cursor and compatible editors) ·
23
+ [Browser dashboard (Python or source)](#quick-start) ·
24
+ [Product page](https://agenttelemetry-app.vercel.app/)
20
25
 
21
26
  ## Download the app
22
27
 
23
- | Platform | Download |
28
+ Choose the installer for your platform from the release's **Assets** section.
29
+
30
+ | Platform | Release downloads |
24
31
  | --- | --- |
25
- | macOS 13+ · Apple Silicon | **[Download DMG](https://github.com/uttamdeb/agent-telemetry/releases/download/v2.1.0/AgentTelemetry-2.1.0-macos-arm64.dmg)** |
26
- | macOS 13+ · Intel | **[Download DMG](https://github.com/uttamdeb/agent-telemetry/releases/download/v2.1.0/AgentTelemetry-2.1.0-macos-x86_64.dmg)** |
27
- | Windows 10/11 · x64 | **[Download EXE installer](https://github.com/uttamdeb/agent-telemetry/releases/download/v2.1.0/AgentTelemetry-2.1.0-windows-x64-setup.exe)** |
32
+ | macOS 13+ · Apple Silicon | **[Find the Apple Silicon DMG](https://github.com/uttamdeb/agent-telemetry/releases/latest)** |
33
+ | macOS 13+ · Intel | **[Find the Intel DMG](https://github.com/uttamdeb/agent-telemetry/releases/latest)** |
34
+ | Windows 10/11 · x64 | **[Find the Windows EXE installer](https://github.com/uttamdeb/agent-telemetry/releases/latest)** |
28
35
 
29
36
  **Python is bundled — no terminal setup needed.** macOS: open the DMG, drag the app to
30
37
  Applications and open it. Windows: run the installer and open AgentTelemetry from Start.
@@ -37,10 +44,11 @@ starting monitoring. On macOS, opening the app manually also lets you import fir
37
44
 
38
45
  These builds are unsigned/unnotarized. macOS may require **System Settings → Privacy &
39
46
  Security → Open Anyway**; Windows SmartScreen may require **More info → Run anyway**.
47
+ [Product and install page](https://agenttelemetry-app.vercel.app/) ·
40
48
  [All releases](https://github.com/uttamdeb/agent-telemetry/releases) ·
41
- [What's new in 2.1.0](docs/releases/v2.1.0.md) ·
42
- [SHA-256 checksums](https://github.com/uttamdeb/agent-telemetry/releases/download/v2.1.0/SHA256SUMS.txt) ·
43
- [PyPI package 2.1.0](https://pypi.org/project/agenttelemetry-app/2.1.0/)
49
+ [What's new in 2.2.0](docs/releases/v2.2.0.md) ·
50
+ [SHA-256 checksums in release assets](https://github.com/uttamdeb/agent-telemetry/releases/latest) ·
51
+ [PyPI package 2.2.0](https://pypi.org/project/agenttelemetry-app/2.2.0/)
44
52
 
45
53
  ---
46
54
 
@@ -142,12 +150,14 @@ estimated from tokens or combined across devices. Session details show recorded
142
150
  creator/account IDs with their attribution limits. Account metadata is private to the
143
151
  source device. See [setup, research and limitations](docs/account-limits.md).
144
152
 
145
- ## Local servers (macOS)
153
+ ## Local servers (macOS and Windows)
146
154
 
147
- The **Local servers** tab and menu bar can list local project listeners, pin them,
148
- and save an explicit launch command for Start and Restart. Process actions ask for
149
- confirmation. They require a ready macOS backend; Windows and Linux show the support
150
- limitation. Commands stay on this machine and are never included in device sharing.
155
+ The **Local servers** dashboard tab can list local project listeners, pin them,
156
+ and save an explicit launch command for Start and Restart. macOS can also show pinned
157
+ controls in the menu bar; the Windows tray opens the dashboard controls. Process actions
158
+ ask for confirmation. Lifecycle controls are supported on macOS and Windows; Linux does
159
+ not yet support this feature. Windows asks for a working folder and uses ownership-checked
160
+ process controls. Commands stay on this machine and are never included in device sharing.
151
161
  Running a saved command gives it your account's file and network access.
152
162
  See [behavior, privacy and limitations](docs/local-servers.md).
153
163
 
@@ -214,25 +224,15 @@ retain one serialized snapshot per display tick, in memory only; the ledger is u
214
224
  as all writes. `POST /api/shutdown` additionally requires the owning Windows client's
215
225
  per-process control token; a normal standalone dashboard cannot be stopped by that route.
216
226
 
217
- ## Local MCP access (optional)
218
-
219
- AgentTelemetry provides eight read-only MCP tools for usage, comparisons, supported insights,
220
- session summaries and timelines, data health, the telemetry catalog and saved subscription
221
- limits. MCP access is off by default. Enable it in Settings and confirm each scope. The local
222
- bridge requires an already-running dashboard and returns data only when the configured MCP
223
- client requests it. A cloud-backed client may send tool results to its provider; review that
224
- client's data-handling settings before enabling access. Project/device names and usage from
225
- connected devices require their own opt-in scopes. The MCP bridge never refreshes accounts,
226
- returns prompt text, or edits client configuration. See [MCP tools, setup and privacy
227
- limits](docs/mcp.md).
228
-
229
- The MCP bridge ships with the **2.1.0** application and Python package. It is not a separate
230
- marketplace listing; install/update AgentTelemetry, then use the [MCP setup guide](docs/mcp.md).
231
-
232
227
  > `--rebuild` deletes the cache, and with it every session whose log has since been deleted
233
228
  > from disk (see [Storage](#storage--what-these-logs-cost-you-in-disk)). Copy
234
229
  > `.usage_cache.json` somewhere safe first if you've cleaned up old logs.
235
230
 
231
+ Deleting a session inside a tool doesn't remove it from your totals either. If OpenCode,
232
+ Hermes or OpenClaw delete a session from their database, the dashboard keeps the usage it
233
+ already counted and marks that session as deleted. The same applies to turns you undo in
234
+ OpenCode and to a Claude or Copilot log that gets shorter.
235
+
236
236
  **Requirements:** Python 3.8+ on **macOS, Linux or Windows**. On Windows run
237
237
  `python dashboard.py` (or `run.cmd`); on macOS/Linux `python3 dashboard.py` (or `./run.sh`).
238
238
 
@@ -256,21 +256,33 @@ instead of cloning, delete `.usage_cache.json` first — that file is your perso
256
256
 
257
257
  ## Data sources
258
258
 
259
+ **AgentTelemetry Pulsar** is the engine that reads these sources. It finds each tool's
260
+ local logs, picks the usage signal out of them and turns every tool's format into the one
261
+ shared usage shape the dashboard shows. It runs on your machine, and its code lives in
262
+ `parser.py`.
263
+
259
264
  | Tool | Where it reads | Tokens |
260
265
  |---|---|---|
261
266
  | **Claude Code** | `~/.claude/projects/**/*.jsonl` | exact (in/out/cache read+write, 5m/1h tiers) |
262
267
  | **Claude Desktop** (agent mode) | `Claude/local-agent-mode-sessions/**` under App Support / `%APPDATA%` / `~/.config` | exact |
263
- | **Codex** | `~/.codex/sessions/**`, `~/.codex/archived_sessions/**` | exact (in/cached/out/reasoning); subagents are identified and labelled |
268
+ | **Codex** | `~/.codex/sessions/**`, `~/.codex/archived_sessions/**` (plain `*.jsonl` and the zstd-compressed `*.jsonl.zst` Codex swaps in for idle threads) | exact (in/cached/out/reasoning); subagents are identified and labelled. Compressed rollouts are read with Python 3.14+ or the `zstd` command; without either they are counted as unread (never dropped) and the sidebar says how many |
264
269
  | **GitHub Copilot** | VS Code-family `chatSessions/*.{json,jsonl}`; SDK/CLI `~/.copilot/session-state/*/events.jsonl`, enriched from VS Code `agentSessionData/*/session.db` | recorded request/turn tokens where available; SDK shutdown totals where safely dated. SDK gaps show a warning tooltip and unavailable/partial usage; older non-SDK chats retain text estimates. Premium multipliers are separate from estimated dollars. |
265
- | **Cursor** (native AI) | `Cursor/User/globalStorage/state.vscdb` under App Support / `%APPDATA%` / `~/.config` | partial — model, mode, timestamps, tool calls and AI-line stats are exact; tokens are on only ~2% of messages |
270
+ | **Cursor** (native AI) | `Cursor/User/globalStorage/state.vscdb` under App Support / `%APPDATA%` / `~/.config` | recorded, partial or unavailable per session/model: explicit message input/output tokens, models, tools and AI-line stats where the local records expose them |
271
+ | **Google Antigravity** | `~/.gemini/antigravity/conversations/*.db`, `~/.gemini/antigravity-ide/conversations/*.db`, `~/.gemini/antigravity-cli/conversations/*.db` | recorded SQLite usage with per-field availability; standalone legacy `.pb` files are unsupported |
266
272
  | **OpenCode** | `~/.local/share/opencode/opencode.db`, `%LOCALAPPDATA%\opencode\opencode.db`, `~/.opencode/opencode.db` (or `$OPENCODE_DATA_DIR`) | V1/V2 SQLite; exact (in/out/reasoning/cache), prompts and tools; cost is read from OpenCode's own per-message value |
267
273
  | **Hermes Agent** | `~/.hermes/state.db` (or `$HERMES_HOME`, `%LOCALAPPDATA%\hermes`) | exact (in/out/cache/reasoning, per model) |
268
274
  | **OpenClaw** | `~/.openclaw/agents/<agent>/agent/openclaw-agent.sqlite` (or `$OPENCLAW_STATE_DIR`; also the older `~/.clawdbot`, `~/.moltbot`) and the older per-session `sessions/*.jsonl` | exact (in/out/cache read/cache write/reasoning, per response); its own logged cost is used only for a model with no verified price. Large events are stored zstd-compressed: read with the `zstd` command or Python 3.14+ |
269
275
 
270
276
  A tool you don't use simply contributes nothing. **Attribution is by tool, not by model** —
271
- a Claude or GPT model used *inside* Copilot/Cursor/OpenCode/Hermes/OpenClaw counts under that tool, and the
277
+ a Claude, Gemini, or GPT model used *inside* Copilot/Cursor/Antigravity/OpenCode/Hermes/OpenClaw counts under that tool, and the
272
278
  Models table lists each `model × tool` row separately.
273
279
 
280
+ Antigravity's supported SQLite schema, duplicate-row handling, recorded checkpoint detail,
281
+ and format limits are documented in [Google Antigravity support](docs/antigravity.md).
282
+
283
+ Cursor's local conversation metadata is documented in [Cursor support](docs/cursor.md),
284
+ including its model/token coverage states, workspace associations, subagents, and limits.
285
+
274
286
  Copilot's newer SDK-based agent sessions use a different store from older Copilot Chat.
275
287
  AgentTelemetry joins their event history to VS Code's saved per-turn usage using native
276
288
  session and event IDs. Custom endpoint models, including Cloudflare GLM 5.3, still count
@@ -362,14 +374,6 @@ a display-name override. See [subagent name behavior](docs/subagent-sessions.md)
362
374
  Tool/provider icons are bundled locally, including the OpenAI mark for Codex; no remote
363
375
  logo requests occur. Their sources and licenses are in `static/tool-icons/README.md`.
364
376
 
365
- **Optimize** — suggestions derived from your own logs, ranked by what they'd save: sessions
366
- re-reading a very large context, thinking share, tool-heavy sessions that never delegated,
367
- cache written but never read, a costly model doing light work, what each **Skill** costs,
368
- edits that needed a retry, oversized **CLAUDE.md / AGENTS.md**, sessions that open heavier
369
- than your leanest ones, wasted file reads, installed skills and agents you never use, and
370
- MCP servers you never call, barely use, or load everywhere but use in one project. Nothing is shown unless
371
- your data supports it, and because the estimates overlap they are never summed.
372
-
373
377
  **Storage** — see below.
374
378
 
375
379
  **Keyboard** — `1`/`7`/`3`/`9`/`a` ranges, `m` month-to-date, `,` / `.` previous / next
@@ -460,17 +464,21 @@ dollars**, so cost is always derived. Rates live in `parser.py → PRICING` as
460
464
  above 100K. The threshold includes cached input and applies to each request.
461
465
  Available Claude logs backfill this pricing detail on a normal restart; token and
462
466
  message counts stay unchanged. Older archives/peers and other tools without that
463
- detail use the short-prompt rate. Optimize model substitutions conservatively use
464
- the higher tier when the target request size is unknown.
467
+ detail use the short-prompt rate.
465
468
  - **Price changes are date-aware.** When a vendor cuts a price (OpenAI's GPT-5.6 cuts of
466
469
  2026-07-30 and 2026-08-21), usage from before the change keeps the rate it had then —
467
470
  see `parser.py → PRICE_HISTORY`.
468
471
  - **These are API-equivalent values.** If you're on a subscription (Claude Max/Pro, Codex,
469
472
  Copilot), you don't pay per token — the $ is "what this would cost at API rates."
470
- - **Cursor** rarely logs token counts, and **older Copilot chats** have none, so their tokens
471
- (and thus $) are rough. Current Copilot builds log real per-request tokens, which are used.
472
- Copilot's honest metric is **request count** and its **premium-request** total (both shown);
473
- Cursor's is **messages, tool calls and AI lines kept** (also shown).
473
+ - **Cursor** exposes explicit input/output token receipts for some messages; missing and
474
+ placeholder values are unavailable, and usage coverage can be partial. Cache and reasoning
475
+ values remain unavailable unless recorded. Overview shows observed Cursor prompts, replies,
476
+ and tool calls separately when they have no token/cost coverage. It does not estimate tokens
477
+ from text or context meters, infer subscription charges, or count metadata as tokens. The
478
+ **Exact tokens only** filter omits Cursor because local token coverage is incomplete. See
479
+ [Cursor support](docs/cursor.md). **Older Copilot chats** may have no token data; current
480
+ Copilot builds log real per-request tokens. Copilot's honest metric is **request count** and
481
+ its **premium-request** total (both shown); Cursor also exposes **AI lines kept**.
474
482
  - **Billing details that change the price are applied**: prompt-cache writes at their own
475
483
  rate (Claude and GPT-5.6/GPT-6), Claude fast mode, US-only inference (1.1x) and web
476
484
  searches ($10/1K). A forked or subagent Codex thread's replay of its parent is skipped,
@@ -515,7 +523,7 @@ and extend this from that file).
515
523
 
516
524
  ## Files
517
525
 
518
- `dashboard.py` (server + cache + cost + `/api/storage`) · `parser.py` (log parsers + pricing) ·
526
+ `dashboard.py` (server + cache + cost + `/api/storage`) · `parser.py` (AgentTelemetry Pulsar: log parsers + pricing) ·
519
527
  `index.html` (shell) · `static/app.css` · `static/core.js` · `static/charts.js` ·
520
528
  `static/views.js` · `chart.umd.min.js` (vendored Chart.js) · `AGENTS.md` · `run.sh`.
521
529
 
@@ -547,8 +555,8 @@ What sharing sends: session titles (often the start of a prompt), project and br
547
555
  log file paths, models, token counts, costs and times. Full prompts, replies and file
548
556
  contents are never sent. Sharing opens one read-only port (7879) that answers only to the
549
557
  pairing code. The dashboard itself stays on `127.0.0.1`. The connection is **not
550
- encrypted**, so share only on a network you trust. The setup checks on the Optimize tab
551
- (instruction files, installed skills, MCP servers) and the Storage tab still describe only
558
+ encrypted**, so share only on a network you trust. The Storage tab and setup inventories
559
+ (instruction files, installed skills, MCP servers) still describe only
552
560
  the computer you're looking at. `.peers.json` and `.peers/` are gitignored.
553
561
 
554
562
  **If it can't connect**, the error says which of these it is:
@@ -1,3 +1,3 @@
1
1
  """AgentTelemetry's local dashboard package."""
2
2
 
3
- __version__ = "2.1.0"
3
+ __version__ = "2.2.0"
@@ -183,7 +183,7 @@ def _codex_read():
183
183
  if not isinstance(result, dict): raise ValueError("Codex returned an unsupported account response.")
184
184
  return result
185
185
  try:
186
- request(1, "initialize", {"clientInfo": {"name": "agent_telemetry", "title": "AgentTelemetry", "version": "2.1.0"}})
186
+ request(1, "initialize", {"clientInfo": {"name": "agent_telemetry", "title": "AgentTelemetry", "version": "2.2.0"}})
187
187
  process.stdin.write('{"method":"initialized","params":{}}\n'); process.stdin.flush()
188
188
  before = request(2, "account/read", {"refreshToken": False}).get("account")
189
189
  limits = request(3, "account/rateLimits/read", {}) if isinstance(before, dict) and before.get("type") == "chatgpt" else {}