usage-cli 0.32.1__tar.gz → 0.32.2__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 (229) hide show
  1. {usage_cli-0.32.1 → usage_cli-0.32.2}/PKG-INFO +1 -1
  2. {usage_cli-0.32.1 → usage_cli-0.32.2}/i18n.json +55 -0
  3. {usage_cli-0.32.1 → usage_cli-0.32.2}/pyproject.toml +1 -1
  4. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_usage_cli.py +36 -1
  5. {usage_cli-0.32.1 → usage_cli-0.32.2}/usage_cli.egg-info/PKG-INFO +1 -1
  6. {usage_cli-0.32.1 → usage_cli-0.32.2}/usage_cli.py +11 -6
  7. {usage_cli-0.32.1 → usage_cli-0.32.2}/LICENSE +0 -0
  8. {usage_cli-0.32.1 → usage_cli-0.32.2}/README.md +0 -0
  9. {usage_cli-0.32.1 → usage_cli-0.32.2}/adapters/__init__.py +0 -0
  10. {usage_cli-0.32.1 → usage_cli-0.32.2}/adapters/agy.py +0 -0
  11. {usage_cli-0.32.1 → usage_cli-0.32.2}/adapters/claude.py +0 -0
  12. {usage_cli-0.32.1 → usage_cli-0.32.2}/adapters/codex.py +0 -0
  13. {usage_cli-0.32.1 → usage_cli-0.32.2}/adapters/grok.py +0 -0
  14. {usage_cli-0.32.1 → usage_cli-0.32.2}/adapters/muse.py +0 -0
  15. {usage_cli-0.32.1 → usage_cli-0.32.2}/adapters/rate_limits.py +0 -0
  16. {usage_cli-0.32.1 → usage_cli-0.32.2}/adapters/registry.py +0 -0
  17. {usage_cli-0.32.1 → usage_cli-0.32.2}/adapters/types.py +0 -0
  18. {usage_cli-0.32.1 → usage_cli-0.32.2}/analyzer/__init__.py +0 -0
  19. {usage_cli-0.32.1 → usage_cli-0.32.2}/analyzer/aggregator.py +0 -0
  20. {usage_cli-0.32.1 → usage_cli-0.32.2}/analyzer/blocks.py +0 -0
  21. {usage_cli-0.32.1 → usage_cli-0.32.2}/analyzer/diagnoser.py +0 -0
  22. {usage_cli-0.32.1 → usage_cli-0.32.2}/analyzer/dispatch_ledger.py +0 -0
  23. {usage_cli-0.32.1 → usage_cli-0.32.2}/analyzer/insights.py +0 -0
  24. {usage_cli-0.32.1 → usage_cli-0.32.2}/analyzer/persona_loader.py +0 -0
  25. {usage_cli-0.32.1 → usage_cli-0.32.2}/analyzer/reporter.py +0 -0
  26. {usage_cli-0.32.1 → usage_cli-0.32.2}/analyzer/subscription.py +0 -0
  27. {usage_cli-0.32.1 → usage_cli-0.32.2}/analyzer/usage_snapshot.py +0 -0
  28. {usage_cli-0.32.1 → usage_cli-0.32.2}/doctor.py +0 -0
  29. {usage_cli-0.32.1 → usage_cli-0.32.2}/fsevents_watch.py +0 -0
  30. {usage_cli-0.32.1 → usage_cli-0.32.2}/i18n.py +0 -0
  31. {usage_cli-0.32.1 → usage_cli-0.32.2}/installer/__init__.py +0 -0
  32. {usage_cli-0.32.1 → usage_cli-0.32.2}/installer/claude_pane.py +0 -0
  33. {usage_cli-0.32.1 → usage_cli-0.32.2}/installer/login_item.py +0 -0
  34. {usage_cli-0.32.1 → usage_cli-0.32.2}/installer/session_hooks.py +0 -0
  35. {usage_cli-0.32.1 → usage_cli-0.32.2}/installer/setup_hook.py +0 -0
  36. {usage_cli-0.32.1 → usage_cli-0.32.2}/installer/statusline_settings.py +0 -0
  37. {usage_cli-0.32.1 → usage_cli-0.32.2}/loaders/__init__.py +0 -0
  38. {usage_cli-0.32.1 → usage_cli-0.32.2}/loaders/agy_disk_cache.py +0 -0
  39. {usage_cli-0.32.1 → usage_cli-0.32.2}/loaders/agy_loader.py +0 -0
  40. {usage_cli-0.32.1 → usage_cli-0.32.2}/loaders/agy_quota_probe.py +0 -0
  41. {usage_cli-0.32.1 → usage_cli-0.32.2}/loaders/cache_quarantine.py +0 -0
  42. {usage_cli-0.32.1 → usage_cli-0.32.2}/loaders/claude_paths.py +0 -0
  43. {usage_cli-0.32.1 → usage_cli-0.32.2}/loaders/codex_disk_cache.py +0 -0
  44. {usage_cli-0.32.1 → usage_cli-0.32.2}/loaders/codex_events.py +0 -0
  45. {usage_cli-0.32.1 → usage_cli-0.32.2}/loaders/codex_fork_replay.py +0 -0
  46. {usage_cli-0.32.1 → usage_cli-0.32.2}/loaders/codex_loader.py +0 -0
  47. {usage_cli-0.32.1 → usage_cli-0.32.2}/loaders/codex_paths.py +0 -0
  48. {usage_cli-0.32.1 → usage_cli-0.32.2}/loaders/disk_cache_common.py +0 -0
  49. {usage_cli-0.32.1 → usage_cli-0.32.2}/loaders/disk_cache_lifecycle.py +0 -0
  50. {usage_cli-0.32.1 → usage_cli-0.32.2}/loaders/grok_loader.py +0 -0
  51. {usage_cli-0.32.1 → usage_cli-0.32.2}/loaders/grok_quota_probe.py +0 -0
  52. {usage_cli-0.32.1 → usage_cli-0.32.2}/loaders/history_disk_cache.py +0 -0
  53. {usage_cli-0.32.1 → usage_cli-0.32.2}/loaders/history_loader.py +0 -0
  54. {usage_cli-0.32.1 → usage_cli-0.32.2}/loaders/jsonl_limits.py +0 -0
  55. {usage_cli-0.32.1 → usage_cli-0.32.2}/loaders/jsonl_utils.py +0 -0
  56. {usage_cli-0.32.1 → usage_cli-0.32.2}/loaders/muse_loader.py +0 -0
  57. {usage_cli-0.32.1 → usage_cli-0.32.2}/main.py +0 -0
  58. {usage_cli-0.32.1 → usage_cli-0.32.2}/menubar/__init__.py +0 -0
  59. {usage_cli-0.32.1 → usage_cli-0.32.2}/menubar/actions.py +0 -0
  60. {usage_cli-0.32.1 → usage_cli-0.32.2}/menubar/agy.py +0 -0
  61. {usage_cli-0.32.1 → usage_cli-0.32.2}/menubar/app.py +0 -0
  62. {usage_cli-0.32.1 → usage_cli-0.32.2}/menubar/chrome.py +0 -0
  63. {usage_cli-0.32.1 → usage_cli-0.32.2}/menubar/grok.py +0 -0
  64. {usage_cli-0.32.1 → usage_cli-0.32.2}/menubar/menu.py +0 -0
  65. {usage_cli-0.32.1 → usage_cli-0.32.2}/menubar/new_badge.py +0 -0
  66. {usage_cli-0.32.1 → usage_cli-0.32.2}/menubar/notify.py +0 -0
  67. {usage_cli-0.32.1 → usage_cli-0.32.2}/menubar/popover.py +0 -0
  68. {usage_cli-0.32.1 → usage_cli-0.32.2}/menubar/prefs.py +0 -0
  69. {usage_cli-0.32.1 → usage_cli-0.32.2}/menubar/refresh.py +0 -0
  70. {usage_cli-0.32.1 → usage_cli-0.32.2}/menubar/state.py +0 -0
  71. {usage_cli-0.32.1 → usage_cli-0.32.2}/menubar/title.py +0 -0
  72. {usage_cli-0.32.1 → usage_cli-0.32.2}/menubar/update.py +0 -0
  73. {usage_cli-0.32.1 → usage_cli-0.32.2}/panels/__init__.py +0 -0
  74. {usage_cli-0.32.1 → usage_cli-0.32.2}/panels/base.py +0 -0
  75. {usage_cli-0.32.1 → usage_cli-0.32.2}/panels/dynamic_height.py +0 -0
  76. {usage_cli-0.32.1 → usage_cli-0.32.2}/panels/panel_scale.py +0 -0
  77. {usage_cli-0.32.1 → usage_cli-0.32.2}/panels/panel_window.py +0 -0
  78. {usage_cli-0.32.1 → usage_cli-0.32.2}/panels/panel_window_state.py +0 -0
  79. {usage_cli-0.32.1 → usage_cli-0.32.2}/panels/payload.py +0 -0
  80. {usage_cli-0.32.1 → usage_cli-0.32.2}/panels/web_panel.py +0 -0
  81. {usage_cli-0.32.1 → usage_cli-0.32.2}/panels/window_drag.py +0 -0
  82. {usage_cli-0.32.1 → usage_cli-0.32.2}/prefs.py +0 -0
  83. {usage_cli-0.32.1 → usage_cli-0.32.2}/pricing.py +0 -0
  84. {usage_cli-0.32.1 → usage_cli-0.32.2}/project_resolver.py +0 -0
  85. {usage_cli-0.32.1 → usage_cli-0.32.2}/quota/__init__.py +0 -0
  86. {usage_cli-0.32.1 → usage_cli-0.32.2}/quota/agy_window_keeper.py +0 -0
  87. {usage_cli-0.32.1 → usage_cli-0.32.2}/quota/burn_rate.py +0 -0
  88. {usage_cli-0.32.1 → usage_cli-0.32.2}/quota/codex_window_keeper.py +0 -0
  89. {usage_cli-0.32.1 → usage_cli-0.32.2}/quota/usage_rate.py +0 -0
  90. {usage_cli-0.32.1 → usage_cli-0.32.2}/quota/window_keeper.py +0 -0
  91. {usage_cli-0.32.1 → usage_cli-0.32.2}/service_status.py +0 -0
  92. {usage_cli-0.32.1 → usage_cli-0.32.2}/setup.cfg +0 -0
  93. {usage_cli-0.32.1 → usage_cli-0.32.2}/setup_app.py +0 -0
  94. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_adapters_claude.py +0 -0
  95. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_adapters_codex.py +0 -0
  96. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_adapters_rate_limits.py +0 -0
  97. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_aggregator.py +0 -0
  98. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_agy_adapter.py +0 -0
  99. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_agy_disk_cache.py +0 -0
  100. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_agy_loader.py +0 -0
  101. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_agy_quota_probe.py +0 -0
  102. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_agy_window_keeper.py +0 -0
  103. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_analyzer_blocks.py +0 -0
  104. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_analyzer_pipeline.py +0 -0
  105. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_burn_rate.py +0 -0
  106. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_cache_quarantine.py +0 -0
  107. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_claude_pane.py +0 -0
  108. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_claude_paths.py +0 -0
  109. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_codex_consistency.py +0 -0
  110. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_codex_loader.py +0 -0
  111. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_codex_window_keeper.py +0 -0
  112. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_diagnoser.py +0 -0
  113. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_disk_cache_shards.py +0 -0
  114. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_dispatch_ledger.py +0 -0
  115. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_doctor.py +0 -0
  116. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_dynamic_height.py +0 -0
  117. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_fsevents_watch.py +0 -0
  118. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_grok_loader.py +0 -0
  119. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_grok_quota_probe.py +0 -0
  120. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_history_loader.py +0 -0
  121. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_hook_scripts_are_standalone.py +0 -0
  122. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_html_report_snapshot.py +0 -0
  123. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_i18n_format_fallback.py +0 -0
  124. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_i18n_key_parity.py +0 -0
  125. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_i18n_packaged_path.py +0 -0
  126. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_insights.py +0 -0
  127. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_jsonl_utils.py +0 -0
  128. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_login_item.py +0 -0
  129. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_main.py +0 -0
  130. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_menubar.py +0 -0
  131. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_menubar_agy.py +0 -0
  132. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_menubar_grok.py +0 -0
  133. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_menubar_notify.py +0 -0
  134. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_menubar_prefs.py +0 -0
  135. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_menubar_state.py +0 -0
  136. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_muse_loader.py +0 -0
  137. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_new_badge.py +0 -0
  138. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_packaged_resources.py +0 -0
  139. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_packaging.py +0 -0
  140. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_panel_footer_layout.py +0 -0
  141. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_panel_scale.py +0 -0
  142. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_panel_window_state.py +0 -0
  143. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_panels.py +0 -0
  144. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_panels_lazy_import.py +0 -0
  145. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_persona_loader.py +0 -0
  146. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_pricing.py +0 -0
  147. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_project_resolver.py +0 -0
  148. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_report_daily_chart.py +0 -0
  149. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_report_filter_js.py +0 -0
  150. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_reporter_build_data.py +0 -0
  151. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_service_status.py +0 -0
  152. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_session_resume.py +0 -0
  153. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_setup_app.py +0 -0
  154. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_setup_hook.py +0 -0
  155. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_setup_hook_coexistence.py +0 -0
  156. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_setup_hook_resume.py +0 -0
  157. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_setup_hook_terse.py +0 -0
  158. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_subprocess_utils.py +0 -0
  159. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_subscription.py +0 -0
  160. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_time_utils.py +0 -0
  161. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_tui.py +0 -0
  162. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_tui_sprite.py +0 -0
  163. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_ui_tables.py +0 -0
  164. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_update_checker.py +0 -0
  165. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_update_gate.py +0 -0
  166. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_update_release_notes.py +0 -0
  167. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_usage_client.py +0 -0
  168. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_usage_diagnosis_snapshot.py +0 -0
  169. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_usage_dir_sweeper.py +0 -0
  170. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_usage_lang.py +0 -0
  171. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_usage_logging.py +0 -0
  172. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_usage_notifications.py +0 -0
  173. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_usage_rate.py +0 -0
  174. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_usage_snapshot.py +0 -0
  175. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_usage_snapshot_replay.py +0 -0
  176. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_usage_statusline.py +0 -0
  177. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_usage_statusline_agy.py +0 -0
  178. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_usage_statusline_forwarder.py +0 -0
  179. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_usage_statusline_grok.py +0 -0
  180. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_usage_terse_mode.py +0 -0
  181. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_usage_terse_reminder.py +0 -0
  182. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_web_panel_payload.py +0 -0
  183. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_wheel_packaging.py +0 -0
  184. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_win_login_item.py +0 -0
  185. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_window_keeper.py +0 -0
  186. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_windows_manifest.py +0 -0
  187. {usage_cli-0.32.1 → usage_cli-0.32.2}/tests/test_wintray.py +0 -0
  188. {usage_cli-0.32.1 → usage_cli-0.32.2}/tui/__init__.py +0 -0
  189. {usage_cli-0.32.1 → usage_cli-0.32.2}/tui/app.py +0 -0
  190. {usage_cli-0.32.1 → usage_cli-0.32.2}/tui/sprite.py +0 -0
  191. {usage_cli-0.32.1 → usage_cli-0.32.2}/ui/__init__.py +0 -0
  192. {usage_cli-0.32.1 → usage_cli-0.32.2}/ui/html_report.py +0 -0
  193. {usage_cli-0.32.1 → usage_cli-0.32.2}/ui/report_charts.py +0 -0
  194. {usage_cli-0.32.1 → usage_cli-0.32.2}/ui/report_daily_chart.py +0 -0
  195. {usage_cli-0.32.1 → usage_cli-0.32.2}/ui/report_filter.py +0 -0
  196. {usage_cli-0.32.1 → usage_cli-0.32.2}/ui/report_ledger.py +0 -0
  197. {usage_cli-0.32.1 → usage_cli-0.32.2}/ui/report_scripts.py +0 -0
  198. {usage_cli-0.32.1 → usage_cli-0.32.2}/ui/report_styles.py +0 -0
  199. {usage_cli-0.32.1 → usage_cli-0.32.2}/ui/tables.py +0 -0
  200. {usage_cli-0.32.1 → usage_cli-0.32.2}/updates/__init__.py +0 -0
  201. {usage_cli-0.32.1 → usage_cli-0.32.2}/updates/checker.py +0 -0
  202. {usage_cli-0.32.1 → usage_cli-0.32.2}/updates/gate.py +0 -0
  203. {usage_cli-0.32.1 → usage_cli-0.32.2}/updates/release_notes.py +0 -0
  204. {usage_cli-0.32.1 → usage_cli-0.32.2}/usage_cli.egg-info/SOURCES.txt +0 -0
  205. {usage_cli-0.32.1 → usage_cli-0.32.2}/usage_cli.egg-info/dependency_links.txt +0 -0
  206. {usage_cli-0.32.1 → usage_cli-0.32.2}/usage_cli.egg-info/entry_points.txt +0 -0
  207. {usage_cli-0.32.1 → usage_cli-0.32.2}/usage_cli.egg-info/requires.txt +0 -0
  208. {usage_cli-0.32.1 → usage_cli-0.32.2}/usage_cli.egg-info/top_level.txt +0 -0
  209. {usage_cli-0.32.1 → usage_cli-0.32.2}/usage_client.py +0 -0
  210. {usage_cli-0.32.1 → usage_cli-0.32.2}/usage_common/__init__.py +0 -0
  211. {usage_cli-0.32.1 → usage_cli-0.32.2}/usage_common/subprocess_utils.py +0 -0
  212. {usage_cli-0.32.1 → usage_cli-0.32.2}/usage_common/time_utils.py +0 -0
  213. {usage_cli-0.32.1 → usage_cli-0.32.2}/usage_common/usage_dir_sweeper.py +0 -0
  214. {usage_cli-0.32.1 → usage_cli-0.32.2}/usage_common/usage_lang.py +0 -0
  215. {usage_cli-0.32.1 → usage_cli-0.32.2}/usage_common/usage_logging.py +0 -0
  216. {usage_cli-0.32.1 → usage_cli-0.32.2}/usage_diagnosis_snapshot.py +0 -0
  217. {usage_cli-0.32.1 → usage_cli-0.32.2}/usage_notifications.py +0 -0
  218. {usage_cli-0.32.1 → usage_cli-0.32.2}/usage_session_resume.py +0 -0
  219. {usage_cli-0.32.1 → usage_cli-0.32.2}/usage_statusline.py +0 -0
  220. {usage_cli-0.32.1 → usage_cli-0.32.2}/usage_statusline_agy.py +0 -0
  221. {usage_cli-0.32.1 → usage_cli-0.32.2}/usage_statusline_forwarder.py +0 -0
  222. {usage_cli-0.32.1 → usage_cli-0.32.2}/usage_statusline_grok.py +0 -0
  223. {usage_cli-0.32.1 → usage_cli-0.32.2}/usage_terse_mode.py +0 -0
  224. {usage_cli-0.32.1 → usage_cli-0.32.2}/usage_terse_reminder.py +0 -0
  225. {usage_cli-0.32.1 → usage_cli-0.32.2}/wintray/__init__.py +0 -0
  226. {usage_cli-0.32.1 → usage_cli-0.32.2}/wintray/app.py +0 -0
  227. {usage_cli-0.32.1 → usage_cli-0.32.2}/wintray/login_item.py +0 -0
  228. {usage_cli-0.32.1 → usage_cli-0.32.2}/wintray/menu.py +0 -0
  229. {usage_cli-0.32.1 → usage_cli-0.32.2}/wintray/watch.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: usage-cli
3
- Version: 0.32.1
3
+ Version: 0.32.2
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
@@ -431,8 +431,19 @@
431
431
  "claude_pane_week": "週",
432
432
  "claude_pane_period": "期間",
433
433
  "claude_pane_sessions": "Claude 對話",
434
+ "claude_pane_session_done": "完成:{title}",
435
+ "claude_pane_session_waiting": "在等你:{title}",
434
436
  "claude_pane_busy": "忙",
435
437
  "claude_pane_waiting": "等你",
438
+ "claude_pane_unavailable_not_signed_in": "未登入 · 在它的 CLI 登入一次",
439
+ "claude_pane_unavailable_no_data": "還沒有資料 · 用過一次就會出現",
440
+ "claude_pane_unavailable_error": "讀不到 · 會自動重試",
441
+ "claude_pane_waiting_input": "要你回答",
442
+ "claude_pane_waiting_dialog": "對話框開著",
443
+ "claude_pane_waiting_sandbox": "要允許沙盒",
444
+ "claude_pane_waiting_worker": "子代理請求",
445
+ "claude_pane_waiting_goal": "確認目標",
446
+ "claude_pane_waiting_for": "等你:{reason}",
436
447
  "claude_pane_agent_running": "執行中",
437
448
  "claude_pane_agent_idle": "閒置",
438
449
  "claude_pane_agent_pending": "待執行",
@@ -913,8 +924,19 @@
913
924
  "claude_pane_week": "Week",
914
925
  "claude_pane_period": "Period",
915
926
  "claude_pane_sessions": "Claude sessions",
927
+ "claude_pane_session_done": "Done: {title}",
928
+ "claude_pane_session_waiting": "Waiting for you: {title}",
916
929
  "claude_pane_busy": "Busy",
917
930
  "claude_pane_waiting": "waiting for you",
931
+ "claude_pane_unavailable_not_signed_in": "Not signed in · sign in once in its CLI",
932
+ "claude_pane_unavailable_no_data": "No data yet · shows up after first use",
933
+ "claude_pane_unavailable_error": "Couldn't read · retrying automatically",
934
+ "claude_pane_waiting_input": "needs your answer",
935
+ "claude_pane_waiting_dialog": "dialog open",
936
+ "claude_pane_waiting_sandbox": "sandbox permission",
937
+ "claude_pane_waiting_worker": "subagent request",
938
+ "claude_pane_waiting_goal": "confirm the goal",
939
+ "claude_pane_waiting_for": "waiting: {reason}",
918
940
  "claude_pane_agent_running": "running",
919
941
  "claude_pane_agent_idle": "idle",
920
942
  "claude_pane_agent_pending": "pending",
@@ -1395,8 +1417,19 @@
1395
1417
  "claude_pane_week": "周",
1396
1418
  "claude_pane_period": "期间",
1397
1419
  "claude_pane_sessions": "Claude 对话",
1420
+ "claude_pane_session_done": "完成:{title}",
1421
+ "claude_pane_session_waiting": "在等你:{title}",
1398
1422
  "claude_pane_busy": "忙",
1399
1423
  "claude_pane_waiting": "等你",
1424
+ "claude_pane_unavailable_not_signed_in": "未登录 · 在它的 CLI 登录一次",
1425
+ "claude_pane_unavailable_no_data": "还没有数据 · 用过一次就会出现",
1426
+ "claude_pane_unavailable_error": "读不到 · 会自动重试",
1427
+ "claude_pane_waiting_input": "要你回答",
1428
+ "claude_pane_waiting_dialog": "对话框开着",
1429
+ "claude_pane_waiting_sandbox": "要允许沙盒",
1430
+ "claude_pane_waiting_worker": "子代理请求",
1431
+ "claude_pane_waiting_goal": "确认目标",
1432
+ "claude_pane_waiting_for": "等你:{reason}",
1400
1433
  "claude_pane_agent_running": "运行中",
1401
1434
  "claude_pane_agent_idle": "空闲",
1402
1435
  "claude_pane_agent_pending": "待运行",
@@ -1877,8 +1910,19 @@
1877
1910
  "claude_pane_week": "週",
1878
1911
  "claude_pane_period": "期間",
1879
1912
  "claude_pane_sessions": "Claude セッション",
1913
+ "claude_pane_session_done": "完了:{title}",
1914
+ "claude_pane_session_waiting": "入力待ち:{title}",
1880
1915
  "claude_pane_busy": "実行中",
1881
1916
  "claude_pane_waiting": "入力待ち",
1917
+ "claude_pane_unavailable_not_signed_in": "未ログイン · CLI で一度ログイン",
1918
+ "claude_pane_unavailable_no_data": "まだデータなし · 一度使うと表示",
1919
+ "claude_pane_unavailable_error": "読み取れません · 自動で再試行",
1920
+ "claude_pane_waiting_input": "回答待ち",
1921
+ "claude_pane_waiting_dialog": "ダイアログ表示中",
1922
+ "claude_pane_waiting_sandbox": "サンドボックス許可",
1923
+ "claude_pane_waiting_worker": "サブエージェント要求",
1924
+ "claude_pane_waiting_goal": "目標の確認",
1925
+ "claude_pane_waiting_for": "入力待ち:{reason}",
1882
1926
  "claude_pane_agent_running": "実行中",
1883
1927
  "claude_pane_agent_idle": "待機中",
1884
1928
  "claude_pane_agent_pending": "実行待ち",
@@ -2359,8 +2403,19 @@
2359
2403
  "claude_pane_week": "주간",
2360
2404
  "claude_pane_period": "기간",
2361
2405
  "claude_pane_sessions": "Claude 대화",
2406
+ "claude_pane_session_done": "완료: {title}",
2407
+ "claude_pane_session_waiting": "입력 대기: {title}",
2362
2408
  "claude_pane_busy": "작업 중",
2363
2409
  "claude_pane_waiting": "입력 대기",
2410
+ "claude_pane_unavailable_not_signed_in": "로그인 안 됨 · CLI에서 한 번 로그인",
2411
+ "claude_pane_unavailable_no_data": "아직 데이터 없음 · 한 번 사용하면 표시",
2412
+ "claude_pane_unavailable_error": "읽을 수 없음 · 자동으로 재시도",
2413
+ "claude_pane_waiting_input": "답변 필요",
2414
+ "claude_pane_waiting_dialog": "대화 상자 열림",
2415
+ "claude_pane_waiting_sandbox": "샌드박스 권한",
2416
+ "claude_pane_waiting_worker": "하위 에이전트 요청",
2417
+ "claude_pane_waiting_goal": "목표 확인",
2418
+ "claude_pane_waiting_for": "입력 대기: {reason}",
2364
2419
  "claude_pane_agent_running": "실행 중",
2365
2420
  "claude_pane_agent_idle": "유휴",
2366
2421
  "claude_pane_agent_pending": "실행 대기",
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "usage-cli"
3
- version = "0.32.1"
3
+ version = "0.32.2"
4
4
  description = "usage — 在 macOS menu bar 與 Windows 系統匣顯示 Claude Code、Codex、Antigravity 用量的小工具(也提供終端機 TUI)"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.13"
@@ -28,6 +28,8 @@ usage_cli: Any = import_module("usage_cli")
28
28
  @pytest.fixture(autouse=True)
29
29
  def _isolate_status_quotas(monkeypatch: pytest.MonkeyPatch, tmp_path: Path) -> None:
30
30
  monkeypatch.setattr(agy_quota_probe, "CACHE_PATH", tmp_path / "agy_quota_cache.json")
31
+ monkeypatch.setattr(agy_quota_probe, "_TOKEN_PATH", tmp_path / "agy-token")
32
+ agy_quota_probe._TOKEN_PATH.touch()
31
33
  monkeypatch.setattr(grok_quota_probe, "load_quota", lambda: None)
32
34
 
33
35
 
@@ -363,6 +365,7 @@ def test_main_status_json_marks_none_loader_unavailable(
363
365
  payload = json.loads(capsys.readouterr().out)
364
366
  assert payload["agents"]["claude-code"] == {
365
367
  "available": False,
368
+ "reason": "no_data",
366
369
  "five_hour": {"used_percent": None, "resets_at": None, "resets_in_seconds": None},
367
370
  "seven_day": {"used_percent": None, "resets_at": None, "resets_in_seconds": None},
368
371
  "model": None,
@@ -1041,6 +1044,7 @@ def test_dashboard_sort_cycle_shape_and_order() -> None:
1041
1044
  def test_status_payload_antigravity_cache(monkeypatch: pytest.MonkeyPatch, age: int) -> None:
1042
1045
  now = datetime(2026, 10, 4, 14, tzinfo=UTC)
1043
1046
  fetched_at = datetime.fromtimestamp(now.timestamp() - age + 0.319588, UTC).isoformat()
1047
+ agy_quota_probe._TOKEN_PATH.unlink()
1044
1048
  cache = {
1045
1049
  "fetched_at": fetched_at,
1046
1050
  "groups": [
@@ -1090,7 +1094,9 @@ def test_status_payload_antigravity_cache(monkeypatch: pytest.MonkeyPatch, age:
1090
1094
  def test_status_antigravity_unreadable_cache(content: str | None) -> None:
1091
1095
  if content is not None:
1092
1096
  agy_quota_probe.CACHE_PATH.write_bytes(content.encode("latin-1"))
1093
- assert usage_cli._status_antigravity(1_000_000) == usage_cli._status_agent(None, 1_000_000)
1097
+ assert usage_cli._status_antigravity(1_000_000) == usage_cli._status_agent(
1098
+ None, 1_000_000, "error" if content == "\xff" else "no_data"
1099
+ )
1094
1100
 
1095
1101
 
1096
1102
  @pytest.mark.parametrize("tier", ["XPremium", None])
@@ -1127,3 +1133,32 @@ def test_status_payload_grok(
1127
1133
 
1128
1134
  def test_status_grok_none() -> None:
1129
1135
  assert usage_cli._status_grok(1_000_000) == usage_cli._status_agent(None, 1_000_000)
1136
+
1137
+
1138
+ @pytest.mark.parametrize("signed_in", [False, True])
1139
+ def test_status_antigravity_missing_quota_reason(signed_in: bool) -> None:
1140
+ if not signed_in:
1141
+ agy_quota_probe._TOKEN_PATH.unlink()
1142
+ assert usage_cli._status_antigravity(0)["reason"] == (
1143
+ "no_data" if signed_in else "not_signed_in"
1144
+ )
1145
+
1146
+
1147
+ @pytest.mark.parametrize("agent_id", ["claude-code", "codex", "antigravity", "grok"])
1148
+ def test_status_loader_exception_reason(monkeypatch: pytest.MonkeyPatch, agent_id: str) -> None:
1149
+ def fail() -> None:
1150
+ raise OSError("quota read failed")
1151
+
1152
+ monkeypatch.setattr(
1153
+ usage_cli, "RATE_LIMIT_LOADERS", {"claude-code": lambda: None, "codex": lambda: None}
1154
+ )
1155
+ if agent_id == "antigravity":
1156
+ agy_quota_probe._TOKEN_PATH.unlink()
1157
+ monkeypatch.setattr(agy_quota_probe, "_read_cache", fail)
1158
+ elif agent_id == "grok":
1159
+ monkeypatch.setattr(grok_quota_probe, "load_quota", fail)
1160
+ else:
1161
+ monkeypatch.setitem(usage_cli.RATE_LIMIT_LOADERS, agent_id, fail)
1162
+ payload = usage_cli._status_payload()
1163
+ assert payload["schema_version"] == 1
1164
+ assert payload["agents"][agent_id]["reason"] == "error"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: usage-cli
3
- Version: 0.32.1
3
+ Version: 0.32.2
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
@@ -358,10 +358,13 @@ def _age_seconds(updated_at: str | None, now: int) -> int | None:
358
358
  return None if parsed is None else max(0, now - int(parsed.timestamp()))
359
359
 
360
360
 
361
- def _status_agent(rate_limits: RateLimits | None, now: int) -> dict[str, Any]:
361
+ def _status_agent(
362
+ rate_limits: RateLimits | None, now: int, reason: str = "no_data"
363
+ ) -> dict[str, Any]:
362
364
  if rate_limits is None:
363
365
  return {
364
366
  "available": False,
367
+ "reason": reason,
365
368
  "five_hour": _status_window(None, None, now),
366
369
  "seven_day": _status_window(None, None, now),
367
370
  "model": None,
@@ -386,9 +389,10 @@ def _status_antigravity(now: int) -> dict[str, Any]:
386
389
  try:
387
390
  quota = agy_quota_probe._read_cache()
388
391
  except (OSError, UnicodeError, ValueError):
389
- quota = None
392
+ return _status_agent(None, now, "error")
390
393
  if quota is None:
391
- return _status_agent(None, now)
394
+ reason = "no_data" if agy_quota_probe._TOKEN_PATH.exists() else "not_signed_in"
395
+ return _status_agent(None, now, reason)
392
396
  fetched_at = parse_optional_iso8601_utc(quota.fetched_at)
393
397
  if fetched_at is None:
394
398
  return _status_agent(None, now)
@@ -426,7 +430,7 @@ def _status_grok(now: int) -> dict[str, Any]:
426
430
  period_end = None if quota is None else parse_optional_iso8601_utc(quota.period_end)
427
431
  resets_at = None if period_end is None else int(period_end.timestamp())
428
432
  except (OSError, ValueError, OverflowError):
429
- return _status_agent(None, now)
433
+ return _status_agent(None, now, "error")
430
434
  if quota is None or resets_at is None:
431
435
  return _status_agent(None, now)
432
436
  return {
@@ -446,8 +450,9 @@ def _status_payload(*, include_extra_agents: bool = True) -> dict[str, Any]:
446
450
  try:
447
451
  rate_limits = RATE_LIMIT_LOADERS[agent_id]()
448
452
  except Exception:
449
- rate_limits = None
450
- agents[agent_id] = _status_agent(rate_limits, now)
453
+ agents[agent_id] = _status_agent(None, now, "error")
454
+ else:
455
+ agents[agent_id] = _status_agent(rate_limits, now)
451
456
  if include_extra_agents:
452
457
  agents["antigravity"] = _status_antigravity(now)
453
458
  agents["grok"] = _status_grok(now)
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
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