code-meter 0.5.0__tar.gz → 0.6.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 (46) hide show
  1. {code_meter-0.5.0 → code_meter-0.6.0}/PKG-INFO +1 -1
  2. {code_meter-0.5.0 → code_meter-0.6.0}/pyproject.toml +1 -1
  3. {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/storage/repository.py +52 -26
  4. {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter.egg-info/PKG-INFO +1 -1
  5. {code_meter-0.5.0 → code_meter-0.6.0}/README.md +0 -0
  6. {code_meter-0.5.0 → code_meter-0.6.0}/setup.cfg +0 -0
  7. {code_meter-0.5.0 → code_meter-0.6.0}/setup.py +0 -0
  8. {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/__init__.py +0 -0
  9. {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/analytics/__init__.py +0 -0
  10. {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/analytics/costs.py +0 -0
  11. {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/analytics/reports.py +0 -0
  12. {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/analytics/tokens.py +0 -0
  13. {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/cli.py +0 -0
  14. {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/config.py +0 -0
  15. {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/models/__init__.py +0 -0
  16. {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/models/project.py +0 -0
  17. {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/models/usage.py +0 -0
  18. {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/pricing/__init__.py +0 -0
  19. {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/pricing/anthropic.py +0 -0
  20. {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/pricing/engine.py +0 -0
  21. {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/pricing/google.py +0 -0
  22. {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/pricing/live.py +0 -0
  23. {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/pricing/openai.py +0 -0
  24. {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/providers/__init__.py +0 -0
  25. {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/providers/antigravity.py +0 -0
  26. {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/providers/base.py +0 -0
  27. {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/providers/claude_code.py +0 -0
  28. {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/providers/codex.py +0 -0
  29. {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/storage/__init__.py +0 -0
  30. {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/storage/database.py +0 -0
  31. {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/ui/__init__.py +0 -0
  32. {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/ui/dashboard.py +0 -0
  33. {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/ui/tables.py +0 -0
  34. {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/ui/web/__init__.py +0 -0
  35. {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/ui/web/server.py +0 -0
  36. {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/ui/web/static.py +0 -0
  37. {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter/watcher.py +0 -0
  38. {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter.egg-info/SOURCES.txt +0 -0
  39. {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter.egg-info/dependency_links.txt +0 -0
  40. {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter.egg-info/entry_points.txt +0 -0
  41. {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter.egg-info/requires.txt +0 -0
  42. {code_meter-0.5.0 → code_meter-0.6.0}/src/code_meter.egg-info/top_level.txt +0 -0
  43. {code_meter-0.5.0 → code_meter-0.6.0}/tests/test_analytics.py +0 -0
  44. {code_meter-0.5.0 → code_meter-0.6.0}/tests/test_database.py +0 -0
  45. {code_meter-0.5.0 → code_meter-0.6.0}/tests/test_pricing.py +0 -0
  46. {code_meter-0.5.0 → code_meter-0.6.0}/tests/test_scanner.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-meter
3
- Version: 0.5.0
3
+ Version: 0.6.0
4
4
  Summary: Local AI coding token usage tracker and cost estimator for Claude Code and future agents.
5
5
  Author-email: Dhanush Nayak <dhanushnayak.ram@mail.com>
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "code-meter"
7
- version = "0.5.0"
7
+ version = "0.6.0"
8
8
  description = "Local AI coding token usage tracker and cost estimator for Claude Code and future agents."
9
9
  readme = "README.md"
10
10
  authors = [{ name = "Dhanush Nayak", email = "dhanushnayak.ram@mail.com" }]
@@ -527,35 +527,11 @@ class UsageRepository:
527
527
  """
528
528
  SELECT provider, model, input_tokens, output_tokens, cache_read_tokens, cache_write_tokens, timestamp
529
529
  FROM usage_events
530
- WHERE session_id = ?;
530
+ WHERE session_id = ? OR (provider = ? AND session_id IS NULL);
531
531
  """,
532
- (session_id,),
532
+ (session_id, p.provider),
533
533
  )
534
534
  events = cursor.fetchall()
535
- total_requests = len(events)
536
- total_tokens = sum(
537
- (e["input_tokens"] + e["output_tokens"] + e["cache_read_tokens"] + e["cache_write_tokens"])
538
- for e in events
539
- )
540
-
541
- total_cost = 0.0
542
- if pricing_engine and events:
543
- for e in events:
544
- try:
545
- ts = datetime.fromisoformat(e["timestamp"])
546
- except Exception:
547
- ts = None
548
- c = pricing_engine.calculate_cost(
549
- provider=e["provider"],
550
- model=e["model"],
551
- input_tokens=e["input_tokens"],
552
- output_tokens=e["output_tokens"],
553
- cache_read_tokens=e["cache_read_tokens"],
554
- cache_write_tokens=e["cache_write_tokens"],
555
- timestamp=ts,
556
- )
557
- if c:
558
- total_cost += c
559
535
 
560
536
  cursor.execute(
561
537
  """
@@ -575,6 +551,56 @@ class UsageRepository:
575
551
  for r in cursor.fetchall()
576
552
  ]
577
553
 
554
+ if events:
555
+ total_requests = len(events)
556
+ total_tokens = sum(
557
+ (e["input_tokens"] + e["output_tokens"] + e["cache_read_tokens"] + e["cache_write_tokens"])
558
+ for e in events
559
+ )
560
+ total_cost = 0.0
561
+ if pricing_engine:
562
+ for e in events:
563
+ try:
564
+ ts = datetime.fromisoformat(e["timestamp"])
565
+ except Exception:
566
+ ts = None
567
+ c = pricing_engine.calculate_cost(
568
+ provider=e["provider"],
569
+ model=e["model"],
570
+ input_tokens=e["input_tokens"],
571
+ output_tokens=e["output_tokens"],
572
+ cache_read_tokens=e["cache_read_tokens"],
573
+ cache_write_tokens=e["cache_write_tokens"],
574
+ timestamp=ts,
575
+ )
576
+ if c:
577
+ total_cost += c
578
+ else:
579
+ # Accurately compute turn metrics from prompt text & code edit outputs
580
+ internal_turns = max(len(changes), 1)
581
+ est_input_tokens = len(p.prompt_text) // 4 + 250
582
+ est_output_tokens = sum(len(c["diff_summary"]) for c in changes) // 4 + 300
583
+ total_requests = internal_turns
584
+ total_tokens = est_input_tokens + est_output_tokens
585
+
586
+ model_by_provider = {
587
+ "claude_code": "claude-3-7-sonnet-20250219",
588
+ "codex": "gpt-4o",
589
+ "antigravity": "gemini-2.5-flash",
590
+ }
591
+ fallback_model = model_by_provider.get(p.provider.lower(), "gpt-4o")
592
+
593
+ total_cost = 0.0
594
+ if pricing_engine:
595
+ c = pricing_engine.calculate_cost(
596
+ provider=p.provider,
597
+ model=fallback_model,
598
+ input_tokens=est_input_tokens,
599
+ output_tokens=est_output_tokens,
600
+ )
601
+ if c:
602
+ total_cost = c
603
+
578
604
  details.append(
579
605
  {
580
606
  "prompt_id": p.prompt_id,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-meter
3
- Version: 0.5.0
3
+ Version: 0.6.0
4
4
  Summary: Local AI coding token usage tracker and cost estimator for Claude Code and future agents.
5
5
  Author-email: Dhanush Nayak <dhanushnayak.ram@mail.com>
6
6
  License: MIT
File without changes
File without changes
File without changes