cli-consumption 0.4.3__tar.gz → 0.4.4__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 (64) hide show
  1. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/CHANGELOG.md +9 -1
  2. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/PKG-INFO +1 -1
  3. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/pyproject.toml +1 -1
  4. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/adapters/mistral_vibe.py +18 -10
  5. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/adapters/registry.py +5 -3
  6. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/.gitignore +0 -0
  7. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/LICENSE +0 -0
  8. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/NOTICE +0 -0
  9. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/README.md +0 -0
  10. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/INTER_FONT_LICENSE.txt +0 -0
  11. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/__init__.py +0 -0
  12. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/__main__.py +0 -0
  13. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/adapters/__init__.py +0 -0
  14. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/adapters/_shared.py +0 -0
  15. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/adapters/aider.py +0 -0
  16. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/adapters/amazon_q.py +0 -0
  17. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/adapters/amp.py +0 -0
  18. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/adapters/base.py +0 -0
  19. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/adapters/claude.py +0 -0
  20. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/adapters/cline.py +0 -0
  21. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/adapters/codex.py +0 -0
  22. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/adapters/continue_cli.py +0 -0
  23. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/adapters/copilot.py +0 -0
  24. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/adapters/crush.py +0 -0
  25. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/adapters/cursor.py +0 -0
  26. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/adapters/gemini.py +0 -0
  27. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/adapters/goose.py +0 -0
  28. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/adapters/grok.py +0 -0
  29. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/adapters/kilo.py +0 -0
  30. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/adapters/kimi.py +0 -0
  31. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/adapters/opencode.py +0 -0
  32. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/adapters/openhands.py +0 -0
  33. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/adapters/pi.py +0 -0
  34. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/adapters/plandex.py +0 -0
  35. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/adapters/qwen.py +0 -0
  36. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/api.py +0 -0
  37. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/cli.py +0 -0
  38. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/dashboard.py +0 -0
  39. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/dashboard_layouts.py +0 -0
  40. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/dashboard_react.css +0 -0
  41. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/dashboard_react.js +0 -0
  42. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/exporting.py +0 -0
  43. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/migrations/__init__.py +0 -0
  44. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/migrations/env.py +0 -0
  45. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/migrations/versions/__init__.py +0 -0
  46. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/migrations/versions/v0001_baseline.py +0 -0
  47. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/migrations/versions/v0002_minimize_subagents.py +0 -0
  48. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/migrations/versions/v0003_canonical_timestamps.py +0 -0
  49. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/migrations/versions/v0004_subagent_scope_freshness.py +0 -0
  50. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/migrations/versions/v0005_sync_receipts.py +0 -0
  51. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/migrations/versions/v0006_dashboard_layouts.py +0 -0
  52. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/migrations/versions/v0007_dashboard_layout_revision.py +0 -0
  53. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/models.py +0 -0
  54. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/py.typed +0 -0
  55. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/qualifications.py +0 -0
  56. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/reporting.py +0 -0
  57. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/reporting_api.py +0 -0
  58. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/retention.py +0 -0
  59. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/schema.py +0 -0
  60. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/snapshot_extraction.py +0 -0
  61. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/snapshot_files.py +0 -0
  62. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/storage.py +0 -0
  63. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/sync.py +0 -0
  64. {cli_consumption-0.4.3 → cli_consumption-0.4.4}/src/cli_consumption/timestamps.py +0 -0
@@ -6,6 +6,13 @@ use [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.4.4] - 2026-09-08
10
+
11
+ ### Fixed
12
+
13
+ - Mistral Vibe now counts each persisted assistant message as a model call while
14
+ retaining cumulative session tokens as one unsplit aggregate.
15
+
9
16
  ## [0.4.3] - 2026-09-05
10
17
 
11
18
  ### Added
@@ -194,7 +201,8 @@ use [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
194
201
 
195
202
  - Refreshed the provider guide for the first minor release ([#26]).
196
203
 
197
- [Unreleased]: https://github.com/Guillaume-Lombardo/cli-consumption/compare/v0.4.3...HEAD
204
+ [Unreleased]: https://github.com/Guillaume-Lombardo/cli-consumption/compare/v0.4.4...HEAD
205
+ [0.4.4]: https://github.com/Guillaume-Lombardo/cli-consumption/compare/v0.4.3...v0.4.4
198
206
  [0.4.3]: https://github.com/Guillaume-Lombardo/cli-consumption/compare/v0.4.2...v0.4.3
199
207
  [0.4.2]: https://github.com/Guillaume-Lombardo/cli-consumption/compare/v0.4.1...v0.4.2
200
208
  [0.4.1]: https://github.com/Guillaume-Lombardo/cli-consumption/compare/v0.4.0...v0.4.1
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: cli-consumption
3
- Version: 0.4.3
3
+ Version: 0.4.4
4
4
  Summary: Analyze and consolidate AI coding CLI consumption across machines.
5
5
  Project-URL: Homepage, https://github.com/Guillaume-Lombardo/cli-consumption
6
6
  Project-URL: Documentation, https://github.com/Guillaume-Lombardo/cli-consumption#readme
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "cli-consumption"
7
- version = "0.4.3"
7
+ version = "0.4.4"
8
8
  description = "Analyze and consolidate AI coding CLI consumption across machines."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -84,6 +84,7 @@ class MistralVibeAdapter:
84
84
  started_at = timestamp(source.metadata.get("start_time"))
85
85
  ended_at = timestamp(source.metadata.get("end_time"))
86
86
  active_turn: dict[str, Any] | None = None
87
+ assistant_turn_ids: list[str | None] = []
87
88
  turn_number = 0
88
89
  tool_number = 0
89
90
  compaction_number = 0
@@ -125,6 +126,8 @@ class MistralVibeAdapter:
125
126
  continue
126
127
  if active_turn is not None:
127
128
  active_turn["status"] = "completed"
129
+ active_turn["model_calls"] += 1
130
+ assistant_turn_ids.append(active_turn["id"] if active_turn else None)
128
131
  raw_tool_calls = message.get("tool_calls")
129
132
  if not isinstance(raw_tool_calls, list):
130
133
  continue
@@ -160,20 +163,25 @@ class MistralVibeAdapter:
160
163
  )
161
164
  config = mapping(source.metadata.get("config"))
162
165
  model = label(config.get("active_model"), 255) or "unknown"
163
- model_calls = 0
164
166
  totals = empty_tokens()
165
- if usage["total_tokens"] > 0 or counter(stats.get("steps")) > 0:
166
- model_calls = 1
167
+ if usage["total_tokens"] > 0:
167
168
  add_tokens(totals, usage)
169
+
170
+ for sequence, turn_id in enumerate(assistant_turn_ids, 1):
171
+ call_usage = (
172
+ usage if sequence == len(assistant_turn_ids) else empty_tokens()
173
+ )
168
174
  snapshot.model_calls.append(
169
175
  {
170
- "id": f"{conversation_id}:model:aggregate",
176
+ "id": f"{conversation_id}:model:{sequence}",
171
177
  "conversation_id": conversation_id,
172
- "turn_id": None,
173
- "sequence": 1,
174
- "timestamp": iso(ended_at),
178
+ "turn_id": turn_id,
179
+ "sequence": sequence,
180
+ "timestamp": iso(ended_at)
181
+ if sequence == len(assistant_turn_ids)
182
+ else None,
175
183
  "model": model,
176
- **usage,
184
+ **call_usage,
177
185
  }
178
186
  )
179
187
 
@@ -193,9 +201,9 @@ class MistralVibeAdapter:
193
201
  "ended_at": iso(ended_at),
194
202
  "duration_seconds": _duration(started_at, ended_at),
195
203
  "source": "local-session-json",
196
- "models": [model] if model_calls else [],
204
+ "models": [model] if assistant_turn_ids else [],
197
205
  "iterations": turn_number,
198
- "model_calls": model_calls,
206
+ "model_calls": len(assistant_turn_ids),
199
207
  "tool_calls": tool_number,
200
208
  "compactions": compaction_number,
201
209
  "event_count": source.event_count,
@@ -346,10 +346,12 @@ ADAPTER_SPECS = (
346
346
  token_semantics="conversation-aggregate",
347
347
  qualification=_qualification(
348
348
  "mistral-vibe",
349
- "CLI 2.24.5",
349
+ "CLI 2.25.0",
350
350
  "session meta JSON and messages JSONL",
351
- "https://github.com/mistralai/mistral-vibe/tree/v2.24.5",
352
- "Session aggregates only; no timing or historical model attribution.",
351
+ "https://github.com/mistralai/mistral-vibe/tree/v2.25.0",
352
+ "Assistant-message call counts with session-aggregate tokens; no timing "
353
+ "or historical model attribution.",
354
+ qualified_on="2026-09-08",
353
355
  ),
354
356
  ),
355
357
  AdapterSpec(
File without changes
File without changes