usage-cli 0.34.3__tar.gz → 0.34.5__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 (281) hide show
  1. {usage_cli-0.34.3/usage_cli.egg-info → usage_cli-0.34.5}/PKG-INFO +1 -1
  2. {usage_cli-0.34.3 → usage_cli-0.34.5}/loaders/muse_quota_probe.py +30 -2
  3. {usage_cli-0.34.3 → usage_cli-0.34.5}/pyproject.toml +1 -1
  4. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_muse_quota_probe.py +39 -1
  5. {usage_cli-0.34.3 → usage_cli-0.34.5/usage_cli.egg-info}/PKG-INFO +1 -1
  6. {usage_cli-0.34.3 → usage_cli-0.34.5}/LICENSE +0 -0
  7. {usage_cli-0.34.3 → usage_cli-0.34.5}/README.md +0 -0
  8. {usage_cli-0.34.3 → usage_cli-0.34.5}/THIRD_PARTY_NOTICES.md +0 -0
  9. {usage_cli-0.34.3 → usage_cli-0.34.5}/adapters/__init__.py +0 -0
  10. {usage_cli-0.34.3 → usage_cli-0.34.5}/adapters/agy.py +0 -0
  11. {usage_cli-0.34.3 → usage_cli-0.34.5}/adapters/claude.py +0 -0
  12. {usage_cli-0.34.3 → usage_cli-0.34.5}/adapters/codex.py +0 -0
  13. {usage_cli-0.34.3 → usage_cli-0.34.5}/adapters/grok.py +0 -0
  14. {usage_cli-0.34.3 → usage_cli-0.34.5}/adapters/muse.py +0 -0
  15. {usage_cli-0.34.3 → usage_cli-0.34.5}/adapters/rate_limits.py +0 -0
  16. {usage_cli-0.34.3 → usage_cli-0.34.5}/adapters/registry.py +0 -0
  17. {usage_cli-0.34.3 → usage_cli-0.34.5}/adapters/types.py +0 -0
  18. {usage_cli-0.34.3 → usage_cli-0.34.5}/analyzer/__init__.py +0 -0
  19. {usage_cli-0.34.3 → usage_cli-0.34.5}/analyzer/aggregator.py +0 -0
  20. {usage_cli-0.34.3 → usage_cli-0.34.5}/analyzer/blocks.py +0 -0
  21. {usage_cli-0.34.3 → usage_cli-0.34.5}/analyzer/diagnoser.py +0 -0
  22. {usage_cli-0.34.3 → usage_cli-0.34.5}/analyzer/diagnosis_snapshot.py +0 -0
  23. {usage_cli-0.34.3 → usage_cli-0.34.5}/analyzer/dispatch_ledger.py +0 -0
  24. {usage_cli-0.34.3 → usage_cli-0.34.5}/analyzer/history_persist.py +0 -0
  25. {usage_cli-0.34.3 → usage_cli-0.34.5}/analyzer/insights.py +0 -0
  26. {usage_cli-0.34.3 → usage_cli-0.34.5}/analyzer/ledger_backfill.py +0 -0
  27. {usage_cli-0.34.3 → usage_cli-0.34.5}/analyzer/persona_loader.py +0 -0
  28. {usage_cli-0.34.3 → usage_cli-0.34.5}/analyzer/reporter.py +0 -0
  29. {usage_cli-0.34.3 → usage_cli-0.34.5}/analyzer/subscription.py +0 -0
  30. {usage_cli-0.34.3 → usage_cli-0.34.5}/analyzer/usage_snapshot.py +0 -0
  31. {usage_cli-0.34.3 → usage_cli-0.34.5}/i18n.json +0 -0
  32. {usage_cli-0.34.3 → usage_cli-0.34.5}/installer/__init__.py +0 -0
  33. {usage_cli-0.34.3 → usage_cli-0.34.5}/installer/claude_pane.py +0 -0
  34. {usage_cli-0.34.3 → usage_cli-0.34.5}/installer/codex_hook_trust.py +0 -0
  35. {usage_cli-0.34.3 → usage_cli-0.34.5}/installer/login_item.py +0 -0
  36. {usage_cli-0.34.3 → usage_cli-0.34.5}/installer/session_hooks.py +0 -0
  37. {usage_cli-0.34.3 → usage_cli-0.34.5}/installer/setup_hook.py +0 -0
  38. {usage_cli-0.34.3 → usage_cli-0.34.5}/installer/statusline_settings.py +0 -0
  39. {usage_cli-0.34.3 → usage_cli-0.34.5}/loaders/__init__.py +0 -0
  40. {usage_cli-0.34.3 → usage_cli-0.34.5}/loaders/_shared_cache_file.py +0 -0
  41. {usage_cli-0.34.3 → usage_cli-0.34.5}/loaders/agy_disk_cache.py +0 -0
  42. {usage_cli-0.34.3 → usage_cli-0.34.5}/loaders/agy_loader.py +0 -0
  43. {usage_cli-0.34.3 → usage_cli-0.34.5}/loaders/agy_quota_probe.py +0 -0
  44. {usage_cli-0.34.3 → usage_cli-0.34.5}/loaders/cache_quarantine.py +0 -0
  45. {usage_cli-0.34.3 → usage_cli-0.34.5}/loaders/chromium_cache.py +0 -0
  46. {usage_cli-0.34.3 → usage_cli-0.34.5}/loaders/claude_desktop.py +0 -0
  47. {usage_cli-0.34.3 → usage_cli-0.34.5}/loaders/claude_paths.py +0 -0
  48. {usage_cli-0.34.3 → usage_cli-0.34.5}/loaders/claude_usage.py +0 -0
  49. {usage_cli-0.34.3 → usage_cli-0.34.5}/loaders/codex_disk_cache.py +0 -0
  50. {usage_cli-0.34.3 → usage_cli-0.34.5}/loaders/codex_events.py +0 -0
  51. {usage_cli-0.34.3 → usage_cli-0.34.5}/loaders/codex_fork_replay.py +0 -0
  52. {usage_cli-0.34.3 → usage_cli-0.34.5}/loaders/codex_loader.py +0 -0
  53. {usage_cli-0.34.3 → usage_cli-0.34.5}/loaders/codex_paths.py +0 -0
  54. {usage_cli-0.34.3 → usage_cli-0.34.5}/loaders/disk_cache_common.py +0 -0
  55. {usage_cli-0.34.3 → usage_cli-0.34.5}/loaders/disk_cache_lifecycle.py +0 -0
  56. {usage_cli-0.34.3 → usage_cli-0.34.5}/loaders/grok_loader.py +0 -0
  57. {usage_cli-0.34.3 → usage_cli-0.34.5}/loaders/grok_quota_probe.py +0 -0
  58. {usage_cli-0.34.3 → usage_cli-0.34.5}/loaders/history_disk_cache.py +0 -0
  59. {usage_cli-0.34.3 → usage_cli-0.34.5}/loaders/history_loader.py +0 -0
  60. {usage_cli-0.34.3 → usage_cli-0.34.5}/loaders/jsonl_limits.py +0 -0
  61. {usage_cli-0.34.3 → usage_cli-0.34.5}/loaders/jsonl_utils.py +0 -0
  62. {usage_cli-0.34.3 → usage_cli-0.34.5}/loaders/muse_loader.py +0 -0
  63. {usage_cli-0.34.3 → usage_cli-0.34.5}/main.py +0 -0
  64. {usage_cli-0.34.3 → usage_cli-0.34.5}/menubar/__init__.py +0 -0
  65. {usage_cli-0.34.3 → usage_cli-0.34.5}/menubar/actions.py +0 -0
  66. {usage_cli-0.34.3 → usage_cli-0.34.5}/menubar/agy.py +0 -0
  67. {usage_cli-0.34.3 → usage_cli-0.34.5}/menubar/app.py +0 -0
  68. {usage_cli-0.34.3 → usage_cli-0.34.5}/menubar/chrome.py +0 -0
  69. {usage_cli-0.34.3 → usage_cli-0.34.5}/menubar/fsevents_watch.py +0 -0
  70. {usage_cli-0.34.3 → usage_cli-0.34.5}/menubar/grok.py +0 -0
  71. {usage_cli-0.34.3 → usage_cli-0.34.5}/menubar/manual_refresh.py +0 -0
  72. {usage_cli-0.34.3 → usage_cli-0.34.5}/menubar/menu.py +0 -0
  73. {usage_cli-0.34.3 → usage_cli-0.34.5}/menubar/muse.py +0 -0
  74. {usage_cli-0.34.3 → usage_cli-0.34.5}/menubar/new_badge.py +0 -0
  75. {usage_cli-0.34.3 → usage_cli-0.34.5}/menubar/notify.py +0 -0
  76. {usage_cli-0.34.3 → usage_cli-0.34.5}/menubar/popover.py +0 -0
  77. {usage_cli-0.34.3 → usage_cli-0.34.5}/menubar/prefs.py +0 -0
  78. {usage_cli-0.34.3 → usage_cli-0.34.5}/menubar/refresh.py +0 -0
  79. {usage_cli-0.34.3 → usage_cli-0.34.5}/menubar/state.py +0 -0
  80. {usage_cli-0.34.3 → usage_cli-0.34.5}/menubar/title.py +0 -0
  81. {usage_cli-0.34.3 → usage_cli-0.34.5}/menubar/update.py +0 -0
  82. {usage_cli-0.34.3 → usage_cli-0.34.5}/menubar/whats_new.py +0 -0
  83. {usage_cli-0.34.3 → usage_cli-0.34.5}/panels/__init__.py +0 -0
  84. {usage_cli-0.34.3 → usage_cli-0.34.5}/panels/base.py +0 -0
  85. {usage_cli-0.34.3 → usage_cli-0.34.5}/panels/catalog.py +0 -0
  86. {usage_cli-0.34.3 → usage_cli-0.34.5}/panels/dynamic_height.py +0 -0
  87. {usage_cli-0.34.3 → usage_cli-0.34.5}/panels/panel_scale.py +0 -0
  88. {usage_cli-0.34.3 → usage_cli-0.34.5}/panels/panel_window.py +0 -0
  89. {usage_cli-0.34.3 → usage_cli-0.34.5}/panels/panel_window_state.py +0 -0
  90. {usage_cli-0.34.3 → usage_cli-0.34.5}/panels/payload.py +0 -0
  91. {usage_cli-0.34.3 → usage_cli-0.34.5}/panels/web_panel.py +0 -0
  92. {usage_cli-0.34.3 → usage_cli-0.34.5}/panels/window_drag.py +0 -0
  93. {usage_cli-0.34.3 → usage_cli-0.34.5}/quota/__init__.py +0 -0
  94. {usage_cli-0.34.3 → usage_cli-0.34.5}/quota/agy_window_keeper.py +0 -0
  95. {usage_cli-0.34.3 → usage_cli-0.34.5}/quota/burn_rate.py +0 -0
  96. {usage_cli-0.34.3 → usage_cli-0.34.5}/quota/codex_window_keeper.py +0 -0
  97. {usage_cli-0.34.3 → usage_cli-0.34.5}/quota/keeper_outcome.py +0 -0
  98. {usage_cli-0.34.3 → usage_cli-0.34.5}/quota/notifications.py +0 -0
  99. {usage_cli-0.34.3 → usage_cli-0.34.5}/quota/quota_snapshot.py +0 -0
  100. {usage_cli-0.34.3 → usage_cli-0.34.5}/quota/status_payload.py +0 -0
  101. {usage_cli-0.34.3 → usage_cli-0.34.5}/quota/usage_rate.py +0 -0
  102. {usage_cli-0.34.3 → usage_cli-0.34.5}/quota/window_keeper.py +0 -0
  103. {usage_cli-0.34.3 → usage_cli-0.34.5}/setup.cfg +0 -0
  104. {usage_cli-0.34.3 → usage_cli-0.34.5}/setup_app.py +0 -0
  105. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_adapters_claude.py +0 -0
  106. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_adapters_codex.py +0 -0
  107. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_adapters_rate_limits.py +0 -0
  108. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_aggregator.py +0 -0
  109. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_agy_adapter.py +0 -0
  110. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_agy_disk_cache.py +0 -0
  111. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_agy_loader.py +0 -0
  112. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_agy_quota_probe.py +0 -0
  113. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_agy_window_keeper.py +0 -0
  114. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_analyzer_blocks.py +0 -0
  115. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_analyzer_pipeline.py +0 -0
  116. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_app_version.py +0 -0
  117. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_burn_rate.py +0 -0
  118. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_cache_quarantine.py +0 -0
  119. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_check_upstream.py +0 -0
  120. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_chromium_cache.py +0 -0
  121. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_claude_desktop.py +0 -0
  122. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_claude_pane.py +0 -0
  123. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_claude_paths.py +0 -0
  124. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_codex_consistency.py +0 -0
  125. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_codex_hook_trust.py +0 -0
  126. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_codex_loader.py +0 -0
  127. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_codex_window_keeper.py +0 -0
  128. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_compact_cards.py +0 -0
  129. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_desktop_fresh_cache.py +0 -0
  130. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_desktop_quota_display.py +0 -0
  131. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_desktop_quota_review.py +0 -0
  132. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_diagnoser.py +0 -0
  133. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_disk_cache_shards.py +0 -0
  134. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_dispatch_ledger.py +0 -0
  135. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_doctor.py +0 -0
  136. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_dynamic_height.py +0 -0
  137. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_fsevents_watch.py +0 -0
  138. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_grok_loader.py +0 -0
  139. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_grok_quota_probe.py +0 -0
  140. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_history_loader.py +0 -0
  141. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_history_persist.py +0 -0
  142. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_hook_scripts_are_standalone.py +0 -0
  143. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_html_report_snapshot.py +0 -0
  144. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_i18n_format_fallback.py +0 -0
  145. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_i18n_key_parity.py +0 -0
  146. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_i18n_packaged_path.py +0 -0
  147. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_insights.py +0 -0
  148. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_jsonl_utils.py +0 -0
  149. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_keeper_menu.py +0 -0
  150. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_keeper_outcome.py +0 -0
  151. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_ledger_backfill.py +0 -0
  152. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_login_item.py +0 -0
  153. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_main.py +0 -0
  154. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_manual_refresh.py +0 -0
  155. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_menubar.py +0 -0
  156. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_menubar_agy.py +0 -0
  157. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_menubar_grok.py +0 -0
  158. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_menubar_muse.py +0 -0
  159. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_menubar_notify.py +0 -0
  160. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_menubar_prefs.py +0 -0
  161. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_menubar_state.py +0 -0
  162. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_menubar_update.py +0 -0
  163. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_muse_coverage.py +0 -0
  164. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_muse_loader.py +0 -0
  165. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_muse_review_regressions.py +0 -0
  166. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_new_badge.py +0 -0
  167. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_packaged_resources.py +0 -0
  168. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_packaging.py +0 -0
  169. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_panel_footer_layout.py +0 -0
  170. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_panel_scale.py +0 -0
  171. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_panel_window_state.py +0 -0
  172. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_panels.py +0 -0
  173. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_panels_lazy_import.py +0 -0
  174. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_persona_loader.py +0 -0
  175. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_pricing.py +0 -0
  176. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_project_resolver.py +0 -0
  177. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_quota_aware.py +0 -0
  178. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_quota_label.py +0 -0
  179. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_report_cold_read.py +0 -0
  180. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_report_daily_chart.py +0 -0
  181. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_report_filter_js.py +0 -0
  182. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_report_share_mask.py +0 -0
  183. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_reporter_build_data.py +0 -0
  184. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_service_status.py +0 -0
  185. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_session_resume.py +0 -0
  186. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_setup_app.py +0 -0
  187. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_setup_hook.py +0 -0
  188. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_setup_hook_coexistence.py +0 -0
  189. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_setup_hook_resume.py +0 -0
  190. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_setup_hook_terse.py +0 -0
  191. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_subprocess_utils.py +0 -0
  192. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_subscription.py +0 -0
  193. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_taskbar_menu.py +0 -0
  194. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_taskbar_obstacles.py +0 -0
  195. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_time_utils.py +0 -0
  196. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_tui.py +0 -0
  197. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_tui_sprite.py +0 -0
  198. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_ui_tables.py +0 -0
  199. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_update_checker.py +0 -0
  200. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_update_gate.py +0 -0
  201. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_update_release_notes.py +0 -0
  202. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_usage_cli.py +0 -0
  203. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_usage_client.py +0 -0
  204. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_usage_diagnosis_snapshot.py +0 -0
  205. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_usage_dir_sweeper.py +0 -0
  206. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_usage_lang.py +0 -0
  207. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_usage_logging.py +0 -0
  208. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_usage_notifications.py +0 -0
  209. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_usage_rate.py +0 -0
  210. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_usage_snapshot.py +0 -0
  211. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_usage_snapshot_replay.py +0 -0
  212. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_usage_statusline.py +0 -0
  213. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_usage_statusline_agy.py +0 -0
  214. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_usage_statusline_forwarder.py +0 -0
  215. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_usage_statusline_grok.py +0 -0
  216. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_usage_terse_mode.py +0 -0
  217. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_usage_terse_reminder.py +0 -0
  218. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_web_panel_payload.py +0 -0
  219. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_whats_new.py +0 -0
  220. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_wheel_packaging.py +0 -0
  221. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_win_login_item.py +0 -0
  222. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_window_keeper.py +0 -0
  223. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_windows_manifest.py +0 -0
  224. {usage_cli-0.34.3 → usage_cli-0.34.5}/tests/test_wintray.py +0 -0
  225. {usage_cli-0.34.3 → usage_cli-0.34.5}/tui/__init__.py +0 -0
  226. {usage_cli-0.34.3 → usage_cli-0.34.5}/tui/app.py +0 -0
  227. {usage_cli-0.34.3 → usage_cli-0.34.5}/tui/sprite.py +0 -0
  228. {usage_cli-0.34.3 → usage_cli-0.34.5}/ui/__init__.py +0 -0
  229. {usage_cli-0.34.3 → usage_cli-0.34.5}/ui/html_report.py +0 -0
  230. {usage_cli-0.34.3 → usage_cli-0.34.5}/ui/report_charts.py +0 -0
  231. {usage_cli-0.34.3 → usage_cli-0.34.5}/ui/report_daily_chart.py +0 -0
  232. {usage_cli-0.34.3 → usage_cli-0.34.5}/ui/report_filter.py +0 -0
  233. {usage_cli-0.34.3 → usage_cli-0.34.5}/ui/report_ledger.py +0 -0
  234. {usage_cli-0.34.3 → usage_cli-0.34.5}/ui/report_scripts.py +0 -0
  235. {usage_cli-0.34.3 → usage_cli-0.34.5}/ui/report_styles.py +0 -0
  236. {usage_cli-0.34.3 → usage_cli-0.34.5}/ui/tables.py +0 -0
  237. {usage_cli-0.34.3 → usage_cli-0.34.5}/updates/__init__.py +0 -0
  238. {usage_cli-0.34.3 → usage_cli-0.34.5}/updates/checker.py +0 -0
  239. {usage_cli-0.34.3 → usage_cli-0.34.5}/updates/gate.py +0 -0
  240. {usage_cli-0.34.3 → usage_cli-0.34.5}/updates/release_notes.py +0 -0
  241. {usage_cli-0.34.3 → usage_cli-0.34.5}/updates/whats_new.py +0 -0
  242. {usage_cli-0.34.3 → usage_cli-0.34.5}/usage_app/__init__.py +0 -0
  243. {usage_cli-0.34.3 → usage_cli-0.34.5}/usage_app/cli.py +0 -0
  244. {usage_cli-0.34.3 → usage_cli-0.34.5}/usage_app/doctor.py +0 -0
  245. {usage_cli-0.34.3 → usage_cli-0.34.5}/usage_cli.egg-info/SOURCES.txt +0 -0
  246. {usage_cli-0.34.3 → usage_cli-0.34.5}/usage_cli.egg-info/dependency_links.txt +0 -0
  247. {usage_cli-0.34.3 → usage_cli-0.34.5}/usage_cli.egg-info/entry_points.txt +0 -0
  248. {usage_cli-0.34.3 → usage_cli-0.34.5}/usage_cli.egg-info/requires.txt +0 -0
  249. {usage_cli-0.34.3 → usage_cli-0.34.5}/usage_cli.egg-info/top_level.txt +0 -0
  250. {usage_cli-0.34.3 → usage_cli-0.34.5}/usage_common/__init__.py +0 -0
  251. {usage_cli-0.34.3 → usage_cli-0.34.5}/usage_common/app_version.py +0 -0
  252. {usage_cli-0.34.3 → usage_cli-0.34.5}/usage_common/i18n.py +0 -0
  253. {usage_cli-0.34.3 → usage_cli-0.34.5}/usage_common/prefs.py +0 -0
  254. {usage_cli-0.34.3 → usage_cli-0.34.5}/usage_common/pricing.py +0 -0
  255. {usage_cli-0.34.3 → usage_cli-0.34.5}/usage_common/project_resolver.py +0 -0
  256. {usage_cli-0.34.3 → usage_cli-0.34.5}/usage_common/service_status.py +0 -0
  257. {usage_cli-0.34.3 → usage_cli-0.34.5}/usage_common/subprocess_utils.py +0 -0
  258. {usage_cli-0.34.3 → usage_cli-0.34.5}/usage_common/time_utils.py +0 -0
  259. {usage_cli-0.34.3 → usage_cli-0.34.5}/usage_common/usage_dir_sweeper.py +0 -0
  260. {usage_cli-0.34.3 → usage_cli-0.34.5}/usage_common/usage_lang.py +0 -0
  261. {usage_cli-0.34.3 → usage_cli-0.34.5}/usage_common/usage_logging.py +0 -0
  262. {usage_cli-0.34.3 → usage_cli-0.34.5}/usage_hooks/__init__.py +0 -0
  263. {usage_cli-0.34.3 → usage_cli-0.34.5}/usage_hooks/usage_quota_aware.py +0 -0
  264. {usage_cli-0.34.3 → usage_cli-0.34.5}/usage_hooks/usage_session_resume.py +0 -0
  265. {usage_cli-0.34.3 → usage_cli-0.34.5}/usage_hooks/usage_statusline.py +0 -0
  266. {usage_cli-0.34.3 → usage_cli-0.34.5}/usage_hooks/usage_statusline_agy.py +0 -0
  267. {usage_cli-0.34.3 → usage_cli-0.34.5}/usage_hooks/usage_statusline_forwarder.py +0 -0
  268. {usage_cli-0.34.3 → usage_cli-0.34.5}/usage_hooks/usage_statusline_grok.py +0 -0
  269. {usage_cli-0.34.3 → usage_cli-0.34.5}/usage_hooks/usage_terse_mode.py +0 -0
  270. {usage_cli-0.34.3 → usage_cli-0.34.5}/usage_hooks/usage_terse_reminder.py +0 -0
  271. {usage_cli-0.34.3 → usage_cli-0.34.5}/wintray/__init__.py +0 -0
  272. {usage_cli-0.34.3 → usage_cli-0.34.5}/wintray/app.py +0 -0
  273. {usage_cli-0.34.3 → usage_cli-0.34.5}/wintray/login_item.py +0 -0
  274. {usage_cli-0.34.3 → usage_cli-0.34.5}/wintray/menu.py +0 -0
  275. {usage_cli-0.34.3 → usage_cli-0.34.5}/wintray/prefs.py +0 -0
  276. {usage_cli-0.34.3 → usage_cli-0.34.5}/wintray/quota_label.py +0 -0
  277. {usage_cli-0.34.3 → usage_cli-0.34.5}/wintray/taskbar_menu.py +0 -0
  278. {usage_cli-0.34.3 → usage_cli-0.34.5}/wintray/taskbar_obstacles.py +0 -0
  279. {usage_cli-0.34.3 → usage_cli-0.34.5}/wintray/taskbar_overlay.py +0 -0
  280. {usage_cli-0.34.3 → usage_cli-0.34.5}/wintray/watch.py +0 -0
  281. {usage_cli-0.34.3 → usage_cli-0.34.5}/wintray/whats_new.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: usage-cli
3
- Version: 0.34.3
3
+ Version: 0.34.5
4
4
  Summary: usage — 在 macOS menu bar 與 Windows 系統匣顯示 Claude Code、Codex、Antigravity 用量的小工具(也提供終端機 TUI)
5
5
  License-Expression: AGPL-3.0-only
6
6
  Requires-Python: >=3.13
@@ -10,12 +10,14 @@ import json
10
10
  import logging
11
11
  import math
12
12
  import os
13
+ import re
13
14
  import shutil
14
15
  import subprocess
15
16
  import tempfile
16
17
  import threading
17
18
  import time
18
19
  from contextlib import suppress
20
+ from datetime import datetime
19
21
  from pathlib import Path
20
22
  from typing import TypedDict, TypeGuard
21
23
 
@@ -27,6 +29,9 @@ CACHE_PATH = Path.home() / ".usage/muse_quota.json"
27
29
  PROBE_DIR = Path.home() / ".usage/muse-probe"
28
30
  MUSE_MODEL = "muse-spark-1.3"
29
31
  STALE_SECONDS = 30 * 60
32
+ _EXHAUSTED = re.compile(
33
+ r"Subscription quota exhausted\. Your usage window resets at (\d{4}-\d\d-\d\dT[\d:.]+Z)"
34
+ )
30
35
  _probe_lock = threading.Lock()
31
36
  _probe_running = False
32
37
  _retry_after = 0.0
@@ -76,7 +81,8 @@ def validate_muse_cache(payload: object) -> MuseQuotaResult | None:
76
81
  if not isinstance(window, dict):
77
82
  return None
78
83
  used, reset = window.get("used_percent"), window.get("resets_at")
79
- if not _number(used) or not _number(reset) or not 0 <= used <= 100:
84
+ # An exhausted window reports past 100 (e.g. 104); the row clamps it for display.
85
+ if not _number(used) or not _number(reset) or used < 0:
80
86
  return None
81
87
  windows.append(MuseQuotaWindow(used_percent=float(used), resets_at=float(reset)))
82
88
  return MuseQuotaResult(
@@ -108,6 +114,25 @@ def parse_muse_allowance(stdout: str, checked_at: float) -> MuseQuotaResult | No
108
114
  return None
109
115
 
110
116
 
117
+ def parse_exhausted_window(stdout: str, cached: MuseQuotaResult | None) -> MuseQuotaResult | None:
118
+ """Read the 429 Muse returns once the 5-hour window is used up; it carries no allowance.
119
+
120
+ Only the window's reset time is known, so the weekly reading and its age stay from ``cached``.
121
+ """
122
+ match = _EXHAUSTED.search(stdout)
123
+ if cached is None or match is None:
124
+ return None
125
+ try:
126
+ reset = datetime.fromisoformat(match[1]).timestamp()
127
+ except ValueError:
128
+ return None
129
+ return MuseQuotaResult(
130
+ checked_at=cached["checked_at"],
131
+ window=MuseQuotaWindow(used_percent=100.0, resets_at=reset),
132
+ weekly=cached["weekly"],
133
+ )
134
+
135
+
111
136
  def read_cache() -> MuseQuotaResult | None:
112
137
  """Ignore invalid shared snapshots without deleting or quarantining them."""
113
138
  try:
@@ -213,7 +238,10 @@ def _probe_worker(executable: str) -> None:
213
238
  process.kill()
214
239
  process.communicate()
215
240
  raise
216
- result = parse_muse_allowance(stdout, time.time()) if process.returncode == 0 else None
241
+ if process.returncode == 0:
242
+ result = parse_muse_allowance(stdout, time.time())
243
+ else:
244
+ result = parse_exhausted_window(stdout, read_cache())
217
245
  if result is not None:
218
246
  _write_cache(result)
219
247
  succeeded = True
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "usage-cli"
3
- version = "0.34.3"
3
+ version = "0.34.5"
4
4
  description = "usage — 在 macOS menu bar 與 Windows 系統匣顯示 Claude Code、Codex、Antigravity 用量的小工具(也提供終端機 TUI)"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.13"
@@ -60,13 +60,51 @@ def test_read_missing_corrupt_and_good_cache() -> None:
60
60
  assert probe.read_cache() == quota()
61
61
 
62
62
 
63
- @pytest.mark.parametrize("value", [True, None, "25", -1, 101, float("nan"), float("inf"), 10**400])
63
+ @pytest.mark.parametrize("value", [True, None, "25", -1, float("nan"), float("inf"), 10**400])
64
64
  def test_invalid_percent_rejected(value: object) -> None:
65
65
  raw = event()
66
66
  raw["payload"]["allowance"]["window"]["used_percent"] = value
67
67
  assert probe.parse_muse_allowance(json.dumps(raw), 1000) is None
68
68
 
69
69
 
70
+ @pytest.mark.parametrize("value", [100, 104, 105, 250])
71
+ def test_exhausted_window_past_100_is_kept(value: int) -> None:
72
+ raw = event()
73
+ raw["payload"]["allowance"]["window"]["used_percent"] = value
74
+ result = probe.parse_muse_allowance(json.dumps(raw), 1000)
75
+ assert result is not None and result["window"]["used_percent"] == value
76
+
77
+
78
+ # Captured from Muse Code 1.4.11 on 2026-10-21 while the 5-hour window was used up.
79
+ EXHAUSTED = json.dumps(
80
+ {
81
+ "payload_type": "run.terminal.failed",
82
+ "payload": {
83
+ "reason": "API error 429 [request_id=x]: Subscription quota exhausted. "
84
+ "Your usage window resets at 2026-10-21T08:28:56Z. (rate_limit_error)"
85
+ },
86
+ }
87
+ )
88
+ EXHAUSTED_QUOTA = {**quota(), "window": {"used_percent": 100.0, "resets_at": 1792571336.0}}
89
+
90
+
91
+ def test_exhausted_429_keeps_weekly_and_snapshot_age() -> None:
92
+ assert probe.parse_exhausted_window(EXHAUSTED, quota()) == EXHAUSTED_QUOTA
93
+ assert probe.parse_exhausted_window(EXHAUSTED, None) is None
94
+ assert probe.parse_exhausted_window(json.dumps(event()), quota()) is None
95
+
96
+
97
+ def test_exhausted_probe_updates_session_window(monkeypatch: pytest.MonkeyPatch) -> None:
98
+ probe.CACHE_PATH.write_text(json.dumps(quota()))
99
+ process = Mock(returncode=1)
100
+ process.poll.return_value = 1
101
+ process.communicate.return_value = (EXHAUSTED, "")
102
+ monkeypatch.setattr(subprocess, "Popen", Mock(return_value=process))
103
+ probe._probe_worker("/fake/muse")
104
+ assert probe.read_cache() == EXHAUSTED_QUOTA
105
+ assert probe._retry_after == 0.0
106
+
107
+
70
108
  def test_missing_weekly_is_rejected() -> None:
71
109
  raw = event()
72
110
  del raw["payload"]["allowance"]["weekly"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: usage-cli
3
- Version: 0.34.3
3
+ Version: 0.34.5
4
4
  Summary: usage — 在 macOS menu bar 與 Windows 系統匣顯示 Claude Code、Codex、Antigravity 用量的小工具(也提供終端機 TUI)
5
5
  License-Expression: AGPL-3.0-only
6
6
  Requires-Python: >=3.13
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes