usage-cli 0.32.6__tar.gz → 0.33.1__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 (261) hide show
  1. {usage_cli-0.32.6 → usage_cli-0.33.1}/PKG-INFO +10 -3
  2. {usage_cli-0.32.6 → usage_cli-0.33.1}/README.md +8 -2
  3. usage_cli-0.33.1/THIRD_PARTY_NOTICES.md +96 -0
  4. {usage_cli-0.32.6 → usage_cli-0.33.1}/adapters/rate_limits.py +23 -2
  5. {usage_cli-0.32.6 → usage_cli-0.33.1}/i18n.json +155 -10
  6. {usage_cli-0.32.6 → usage_cli-0.33.1}/installer/claude_pane.py +72 -33
  7. {usage_cli-0.32.6 → usage_cli-0.33.1}/installer/session_hooks.py +116 -0
  8. usage_cli-0.33.1/loaders/_shared_cache_file.py +67 -0
  9. usage_cli-0.33.1/loaders/chromium_cache.py +215 -0
  10. usage_cli-0.33.1/loaders/claude_desktop.py +160 -0
  11. {usage_cli-0.32.6 → usage_cli-0.33.1}/menubar/actions.py +89 -6
  12. {usage_cli-0.32.6 → usage_cli-0.33.1}/menubar/menu.py +44 -8
  13. {usage_cli-0.32.6 → usage_cli-0.33.1}/menubar/refresh.py +3 -0
  14. {usage_cli-0.32.6 → usage_cli-0.33.1}/menubar/state.py +12 -1
  15. {usage_cli-0.32.6 → usage_cli-0.33.1}/pyproject.toml +4 -1
  16. usage_cli-0.33.1/quota/quota_snapshot.py +32 -0
  17. {usage_cli-0.32.6 → usage_cli-0.33.1}/quota/usage_rate.py +39 -3
  18. {usage_cli-0.32.6 → usage_cli-0.33.1}/setup_app.py +1 -0
  19. usage_cli-0.33.1/tests/test_chromium_cache.py +249 -0
  20. usage_cli-0.33.1/tests/test_claude_desktop.py +166 -0
  21. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_claude_pane.py +76 -0
  22. usage_cli-0.33.1/tests/test_desktop_quota_display.py +232 -0
  23. usage_cli-0.33.1/tests/test_desktop_quota_review.py +269 -0
  24. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_hook_scripts_are_standalone.py +1 -0
  25. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_menubar.py +90 -10
  26. usage_cli-0.33.1/tests/test_quota_aware.py +252 -0
  27. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_quota_label.py +113 -6
  28. usage_cli-0.33.1/tests/test_taskbar_menu.py +189 -0
  29. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_usage_rate.py +72 -1
  30. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_wintray.py +86 -3
  31. {usage_cli-0.32.6 → usage_cli-0.33.1}/tui/app.py +4 -2
  32. {usage_cli-0.32.6 → usage_cli-0.33.1}/usage_cli.egg-info/PKG-INFO +10 -3
  33. {usage_cli-0.32.6 → usage_cli-0.33.1}/usage_cli.egg-info/SOURCES.txt +12 -0
  34. {usage_cli-0.32.6 → usage_cli-0.33.1}/usage_cli.egg-info/requires.txt +1 -0
  35. {usage_cli-0.32.6 → usage_cli-0.33.1}/usage_cli.egg-info/top_level.txt +1 -0
  36. {usage_cli-0.32.6 → usage_cli-0.33.1}/usage_client.py +58 -15
  37. usage_cli-0.33.1/usage_quota_aware.py +150 -0
  38. {usage_cli-0.32.6 → usage_cli-0.33.1}/wintray/app.py +102 -2
  39. {usage_cli-0.32.6 → usage_cli-0.33.1}/wintray/menu.py +16 -1
  40. {usage_cli-0.32.6 → usage_cli-0.33.1}/wintray/quota_label.py +12 -2
  41. usage_cli-0.33.1/wintray/taskbar_menu.py +86 -0
  42. usage_cli-0.32.6/THIRD_PARTY_NOTICES.md +0 -28
  43. {usage_cli-0.32.6 → usage_cli-0.33.1}/LICENSE +0 -0
  44. {usage_cli-0.32.6 → usage_cli-0.33.1}/adapters/__init__.py +0 -0
  45. {usage_cli-0.32.6 → usage_cli-0.33.1}/adapters/agy.py +0 -0
  46. {usage_cli-0.32.6 → usage_cli-0.33.1}/adapters/claude.py +0 -0
  47. {usage_cli-0.32.6 → usage_cli-0.33.1}/adapters/codex.py +0 -0
  48. {usage_cli-0.32.6 → usage_cli-0.33.1}/adapters/grok.py +0 -0
  49. {usage_cli-0.32.6 → usage_cli-0.33.1}/adapters/muse.py +0 -0
  50. {usage_cli-0.32.6 → usage_cli-0.33.1}/adapters/registry.py +0 -0
  51. {usage_cli-0.32.6 → usage_cli-0.33.1}/adapters/types.py +0 -0
  52. {usage_cli-0.32.6 → usage_cli-0.33.1}/analyzer/__init__.py +0 -0
  53. {usage_cli-0.32.6 → usage_cli-0.33.1}/analyzer/aggregator.py +0 -0
  54. {usage_cli-0.32.6 → usage_cli-0.33.1}/analyzer/blocks.py +0 -0
  55. {usage_cli-0.32.6 → usage_cli-0.33.1}/analyzer/diagnoser.py +0 -0
  56. {usage_cli-0.32.6 → usage_cli-0.33.1}/analyzer/dispatch_ledger.py +0 -0
  57. {usage_cli-0.32.6 → usage_cli-0.33.1}/analyzer/insights.py +0 -0
  58. {usage_cli-0.32.6 → usage_cli-0.33.1}/analyzer/persona_loader.py +0 -0
  59. {usage_cli-0.32.6 → usage_cli-0.33.1}/analyzer/reporter.py +0 -0
  60. {usage_cli-0.32.6 → usage_cli-0.33.1}/analyzer/subscription.py +0 -0
  61. {usage_cli-0.32.6 → usage_cli-0.33.1}/analyzer/usage_snapshot.py +0 -0
  62. {usage_cli-0.32.6 → usage_cli-0.33.1}/doctor.py +0 -0
  63. {usage_cli-0.32.6 → usage_cli-0.33.1}/fsevents_watch.py +0 -0
  64. {usage_cli-0.32.6 → usage_cli-0.33.1}/i18n.py +0 -0
  65. {usage_cli-0.32.6 → usage_cli-0.33.1}/installer/__init__.py +0 -0
  66. {usage_cli-0.32.6 → usage_cli-0.33.1}/installer/codex_hook_trust.py +0 -0
  67. {usage_cli-0.32.6 → usage_cli-0.33.1}/installer/login_item.py +0 -0
  68. {usage_cli-0.32.6 → usage_cli-0.33.1}/installer/setup_hook.py +0 -0
  69. {usage_cli-0.32.6 → usage_cli-0.33.1}/installer/statusline_settings.py +0 -0
  70. {usage_cli-0.32.6 → usage_cli-0.33.1}/loaders/__init__.py +0 -0
  71. {usage_cli-0.32.6 → usage_cli-0.33.1}/loaders/agy_disk_cache.py +0 -0
  72. {usage_cli-0.32.6 → usage_cli-0.33.1}/loaders/agy_loader.py +0 -0
  73. {usage_cli-0.32.6 → usage_cli-0.33.1}/loaders/agy_quota_probe.py +0 -0
  74. {usage_cli-0.32.6 → usage_cli-0.33.1}/loaders/cache_quarantine.py +0 -0
  75. {usage_cli-0.32.6 → usage_cli-0.33.1}/loaders/claude_paths.py +0 -0
  76. {usage_cli-0.32.6 → usage_cli-0.33.1}/loaders/codex_disk_cache.py +0 -0
  77. {usage_cli-0.32.6 → usage_cli-0.33.1}/loaders/codex_events.py +0 -0
  78. {usage_cli-0.32.6 → usage_cli-0.33.1}/loaders/codex_fork_replay.py +0 -0
  79. {usage_cli-0.32.6 → usage_cli-0.33.1}/loaders/codex_loader.py +0 -0
  80. {usage_cli-0.32.6 → usage_cli-0.33.1}/loaders/codex_paths.py +0 -0
  81. {usage_cli-0.32.6 → usage_cli-0.33.1}/loaders/disk_cache_common.py +0 -0
  82. {usage_cli-0.32.6 → usage_cli-0.33.1}/loaders/disk_cache_lifecycle.py +0 -0
  83. {usage_cli-0.32.6 → usage_cli-0.33.1}/loaders/grok_loader.py +0 -0
  84. {usage_cli-0.32.6 → usage_cli-0.33.1}/loaders/grok_quota_probe.py +0 -0
  85. {usage_cli-0.32.6 → usage_cli-0.33.1}/loaders/history_disk_cache.py +0 -0
  86. {usage_cli-0.32.6 → usage_cli-0.33.1}/loaders/history_loader.py +0 -0
  87. {usage_cli-0.32.6 → usage_cli-0.33.1}/loaders/jsonl_limits.py +0 -0
  88. {usage_cli-0.32.6 → usage_cli-0.33.1}/loaders/jsonl_utils.py +0 -0
  89. {usage_cli-0.32.6 → usage_cli-0.33.1}/loaders/muse_loader.py +0 -0
  90. {usage_cli-0.32.6 → usage_cli-0.33.1}/main.py +0 -0
  91. {usage_cli-0.32.6 → usage_cli-0.33.1}/menubar/__init__.py +0 -0
  92. {usage_cli-0.32.6 → usage_cli-0.33.1}/menubar/agy.py +0 -0
  93. {usage_cli-0.32.6 → usage_cli-0.33.1}/menubar/app.py +0 -0
  94. {usage_cli-0.32.6 → usage_cli-0.33.1}/menubar/chrome.py +0 -0
  95. {usage_cli-0.32.6 → usage_cli-0.33.1}/menubar/grok.py +0 -0
  96. {usage_cli-0.32.6 → usage_cli-0.33.1}/menubar/manual_refresh.py +0 -0
  97. {usage_cli-0.32.6 → usage_cli-0.33.1}/menubar/new_badge.py +0 -0
  98. {usage_cli-0.32.6 → usage_cli-0.33.1}/menubar/notify.py +0 -0
  99. {usage_cli-0.32.6 → usage_cli-0.33.1}/menubar/popover.py +0 -0
  100. {usage_cli-0.32.6 → usage_cli-0.33.1}/menubar/prefs.py +0 -0
  101. {usage_cli-0.32.6 → usage_cli-0.33.1}/menubar/title.py +0 -0
  102. {usage_cli-0.32.6 → usage_cli-0.33.1}/menubar/update.py +0 -0
  103. {usage_cli-0.32.6 → usage_cli-0.33.1}/menubar/whats_new.py +0 -0
  104. {usage_cli-0.32.6 → usage_cli-0.33.1}/panels/__init__.py +0 -0
  105. {usage_cli-0.32.6 → usage_cli-0.33.1}/panels/base.py +0 -0
  106. {usage_cli-0.32.6 → usage_cli-0.33.1}/panels/dynamic_height.py +0 -0
  107. {usage_cli-0.32.6 → usage_cli-0.33.1}/panels/panel_scale.py +0 -0
  108. {usage_cli-0.32.6 → usage_cli-0.33.1}/panels/panel_window.py +0 -0
  109. {usage_cli-0.32.6 → usage_cli-0.33.1}/panels/panel_window_state.py +0 -0
  110. {usage_cli-0.32.6 → usage_cli-0.33.1}/panels/payload.py +0 -0
  111. {usage_cli-0.32.6 → usage_cli-0.33.1}/panels/web_panel.py +0 -0
  112. {usage_cli-0.32.6 → usage_cli-0.33.1}/panels/window_drag.py +0 -0
  113. {usage_cli-0.32.6 → usage_cli-0.33.1}/prefs.py +0 -0
  114. {usage_cli-0.32.6 → usage_cli-0.33.1}/pricing.py +0 -0
  115. {usage_cli-0.32.6 → usage_cli-0.33.1}/project_resolver.py +0 -0
  116. {usage_cli-0.32.6 → usage_cli-0.33.1}/quota/__init__.py +0 -0
  117. {usage_cli-0.32.6 → usage_cli-0.33.1}/quota/agy_window_keeper.py +0 -0
  118. {usage_cli-0.32.6 → usage_cli-0.33.1}/quota/burn_rate.py +0 -0
  119. {usage_cli-0.32.6 → usage_cli-0.33.1}/quota/codex_window_keeper.py +0 -0
  120. {usage_cli-0.32.6 → usage_cli-0.33.1}/quota/keeper_outcome.py +0 -0
  121. {usage_cli-0.32.6 → usage_cli-0.33.1}/quota/window_keeper.py +0 -0
  122. {usage_cli-0.32.6 → usage_cli-0.33.1}/service_status.py +0 -0
  123. {usage_cli-0.32.6 → usage_cli-0.33.1}/setup.cfg +0 -0
  124. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_adapters_claude.py +0 -0
  125. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_adapters_codex.py +0 -0
  126. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_adapters_rate_limits.py +0 -0
  127. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_aggregator.py +0 -0
  128. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_agy_adapter.py +0 -0
  129. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_agy_disk_cache.py +0 -0
  130. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_agy_loader.py +0 -0
  131. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_agy_quota_probe.py +0 -0
  132. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_agy_window_keeper.py +0 -0
  133. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_analyzer_blocks.py +0 -0
  134. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_analyzer_pipeline.py +0 -0
  135. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_burn_rate.py +0 -0
  136. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_cache_quarantine.py +0 -0
  137. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_check_upstream.py +0 -0
  138. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_claude_paths.py +0 -0
  139. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_codex_consistency.py +0 -0
  140. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_codex_hook_trust.py +0 -0
  141. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_codex_loader.py +0 -0
  142. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_codex_window_keeper.py +0 -0
  143. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_diagnoser.py +0 -0
  144. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_disk_cache_shards.py +0 -0
  145. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_dispatch_ledger.py +0 -0
  146. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_doctor.py +0 -0
  147. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_dynamic_height.py +0 -0
  148. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_fsevents_watch.py +0 -0
  149. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_grok_loader.py +0 -0
  150. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_grok_quota_probe.py +0 -0
  151. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_history_loader.py +0 -0
  152. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_html_report_snapshot.py +0 -0
  153. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_i18n_format_fallback.py +0 -0
  154. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_i18n_key_parity.py +0 -0
  155. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_i18n_packaged_path.py +0 -0
  156. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_insights.py +0 -0
  157. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_jsonl_utils.py +0 -0
  158. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_keeper_menu.py +0 -0
  159. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_keeper_outcome.py +0 -0
  160. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_login_item.py +0 -0
  161. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_main.py +0 -0
  162. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_manual_refresh.py +0 -0
  163. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_menubar_agy.py +0 -0
  164. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_menubar_grok.py +0 -0
  165. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_menubar_notify.py +0 -0
  166. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_menubar_prefs.py +0 -0
  167. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_menubar_state.py +0 -0
  168. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_menubar_update.py +0 -0
  169. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_muse_loader.py +0 -0
  170. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_new_badge.py +0 -0
  171. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_packaged_resources.py +0 -0
  172. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_packaging.py +0 -0
  173. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_panel_footer_layout.py +0 -0
  174. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_panel_scale.py +0 -0
  175. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_panel_window_state.py +0 -0
  176. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_panels.py +0 -0
  177. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_panels_lazy_import.py +0 -0
  178. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_persona_loader.py +0 -0
  179. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_pricing.py +0 -0
  180. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_project_resolver.py +0 -0
  181. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_report_daily_chart.py +0 -0
  182. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_report_filter_js.py +0 -0
  183. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_reporter_build_data.py +0 -0
  184. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_service_status.py +0 -0
  185. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_session_resume.py +0 -0
  186. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_setup_app.py +0 -0
  187. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_setup_hook.py +0 -0
  188. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_setup_hook_coexistence.py +0 -0
  189. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_setup_hook_resume.py +0 -0
  190. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_setup_hook_terse.py +0 -0
  191. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_subprocess_utils.py +0 -0
  192. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_subscription.py +0 -0
  193. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_time_utils.py +0 -0
  194. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_tui.py +0 -0
  195. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_tui_sprite.py +0 -0
  196. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_ui_tables.py +0 -0
  197. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_update_checker.py +0 -0
  198. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_update_gate.py +0 -0
  199. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_update_release_notes.py +0 -0
  200. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_usage_cli.py +0 -0
  201. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_usage_client.py +0 -0
  202. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_usage_diagnosis_snapshot.py +0 -0
  203. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_usage_dir_sweeper.py +0 -0
  204. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_usage_lang.py +0 -0
  205. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_usage_logging.py +0 -0
  206. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_usage_notifications.py +0 -0
  207. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_usage_snapshot.py +0 -0
  208. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_usage_snapshot_replay.py +0 -0
  209. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_usage_statusline.py +0 -0
  210. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_usage_statusline_agy.py +0 -0
  211. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_usage_statusline_forwarder.py +0 -0
  212. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_usage_statusline_grok.py +0 -0
  213. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_usage_terse_mode.py +0 -0
  214. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_usage_terse_reminder.py +0 -0
  215. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_web_panel_payload.py +0 -0
  216. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_whats_new.py +0 -0
  217. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_wheel_packaging.py +0 -0
  218. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_win_login_item.py +0 -0
  219. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_window_keeper.py +0 -0
  220. {usage_cli-0.32.6 → usage_cli-0.33.1}/tests/test_windows_manifest.py +0 -0
  221. {usage_cli-0.32.6 → usage_cli-0.33.1}/tui/__init__.py +0 -0
  222. {usage_cli-0.32.6 → usage_cli-0.33.1}/tui/sprite.py +0 -0
  223. {usage_cli-0.32.6 → usage_cli-0.33.1}/ui/__init__.py +0 -0
  224. {usage_cli-0.32.6 → usage_cli-0.33.1}/ui/html_report.py +0 -0
  225. {usage_cli-0.32.6 → usage_cli-0.33.1}/ui/report_charts.py +0 -0
  226. {usage_cli-0.32.6 → usage_cli-0.33.1}/ui/report_daily_chart.py +0 -0
  227. {usage_cli-0.32.6 → usage_cli-0.33.1}/ui/report_filter.py +0 -0
  228. {usage_cli-0.32.6 → usage_cli-0.33.1}/ui/report_ledger.py +0 -0
  229. {usage_cli-0.32.6 → usage_cli-0.33.1}/ui/report_scripts.py +0 -0
  230. {usage_cli-0.32.6 → usage_cli-0.33.1}/ui/report_styles.py +0 -0
  231. {usage_cli-0.32.6 → usage_cli-0.33.1}/ui/tables.py +0 -0
  232. {usage_cli-0.32.6 → usage_cli-0.33.1}/updates/__init__.py +0 -0
  233. {usage_cli-0.32.6 → usage_cli-0.33.1}/updates/checker.py +0 -0
  234. {usage_cli-0.32.6 → usage_cli-0.33.1}/updates/gate.py +0 -0
  235. {usage_cli-0.32.6 → usage_cli-0.33.1}/updates/release_notes.py +0 -0
  236. {usage_cli-0.32.6 → usage_cli-0.33.1}/updates/whats_new.py +0 -0
  237. {usage_cli-0.32.6 → usage_cli-0.33.1}/usage_cli.egg-info/dependency_links.txt +0 -0
  238. {usage_cli-0.32.6 → usage_cli-0.33.1}/usage_cli.egg-info/entry_points.txt +0 -0
  239. {usage_cli-0.32.6 → usage_cli-0.33.1}/usage_cli.py +0 -0
  240. {usage_cli-0.32.6 → usage_cli-0.33.1}/usage_common/__init__.py +0 -0
  241. {usage_cli-0.32.6 → usage_cli-0.33.1}/usage_common/subprocess_utils.py +0 -0
  242. {usage_cli-0.32.6 → usage_cli-0.33.1}/usage_common/time_utils.py +0 -0
  243. {usage_cli-0.32.6 → usage_cli-0.33.1}/usage_common/usage_dir_sweeper.py +0 -0
  244. {usage_cli-0.32.6 → usage_cli-0.33.1}/usage_common/usage_lang.py +0 -0
  245. {usage_cli-0.32.6 → usage_cli-0.33.1}/usage_common/usage_logging.py +0 -0
  246. {usage_cli-0.32.6 → usage_cli-0.33.1}/usage_diagnosis_snapshot.py +0 -0
  247. {usage_cli-0.32.6 → usage_cli-0.33.1}/usage_notifications.py +0 -0
  248. {usage_cli-0.32.6 → usage_cli-0.33.1}/usage_session_resume.py +0 -0
  249. {usage_cli-0.32.6 → usage_cli-0.33.1}/usage_statusline.py +0 -0
  250. {usage_cli-0.32.6 → usage_cli-0.33.1}/usage_statusline_agy.py +0 -0
  251. {usage_cli-0.32.6 → usage_cli-0.33.1}/usage_statusline_forwarder.py +0 -0
  252. {usage_cli-0.32.6 → usage_cli-0.33.1}/usage_statusline_grok.py +0 -0
  253. {usage_cli-0.32.6 → usage_cli-0.33.1}/usage_terse_mode.py +0 -0
  254. {usage_cli-0.32.6 → usage_cli-0.33.1}/usage_terse_reminder.py +0 -0
  255. {usage_cli-0.32.6 → usage_cli-0.33.1}/wintray/__init__.py +0 -0
  256. {usage_cli-0.32.6 → usage_cli-0.33.1}/wintray/login_item.py +0 -0
  257. {usage_cli-0.32.6 → usage_cli-0.33.1}/wintray/prefs.py +0 -0
  258. {usage_cli-0.32.6 → usage_cli-0.33.1}/wintray/taskbar_obstacles.py +0 -0
  259. {usage_cli-0.32.6 → usage_cli-0.33.1}/wintray/taskbar_overlay.py +0 -0
  260. {usage_cli-0.32.6 → usage_cli-0.33.1}/wintray/watch.py +0 -0
  261. {usage_cli-0.32.6 → usage_cli-0.33.1}/wintray/whats_new.py +0 -0
@@ -1,12 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: usage-cli
3
- Version: 0.32.6
3
+ Version: 0.33.1
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
7
7
  Description-Content-Type: text/markdown
8
8
  License-File: LICENSE
9
9
  License-File: THIRD_PARTY_NOTICES.md
10
+ Requires-Dist: zstandard<1.0.0,>=0.25.0
10
11
  Requires-Dist: pyobjc-framework-Cocoa>=11.0; sys_platform == "darwin"
11
12
  Requires-Dist: pyobjc-framework-Quartz>=11.0; sys_platform == "darwin"
12
13
  Requires-Dist: pyobjc-framework-UserNotifications>=11.0; sys_platform == "darwin"
@@ -78,6 +79,8 @@ It lands in your Applications folder automatically. Open it once; if macOS 15 or
78
79
  - **Progress Concierge:** Open a new Claude Code session and `usage` hands your last progress straight to the AI, including your last request, uncommitted changes, and unfinished todos. No `/resume`, no recap. When you do `/resume` a conversation that sat long enough for its cache to expire, it warns you how many tokens the next message will re-send and suggests `/compact` first. Off by default.
79
80
  - **Token Saver:** A menu-bar toggle asks Claude Code and Codex to answer more tersely and in plainer language, saving output tokens while keeping code and error messages byte-exact. A light reminder keeps long conversations from drifting back to verbose — in an A/B test on real sessions, late replies stayed ~40% shorter instead of drifting 84% longer.
80
81
  - **Claude Code side pane (macOS and Windows):** Quotas, conversations, and background jobs inside Claude Code. [See the side pane](#claude-code-side-pane).
82
+ - **Beginner Mode (macOS):** Off by default. After Claude Code answers, up to three technical terms from that answer appear above the prompt, each with a one-line plain explanation in your UI language. Press 9 to mark them understood; terms you skip come back after 1, 3, then 7 days. Understood terms return as a one-question multiple-choice quiz 7, 21, then 60 days later, at most one a day; a wrong answer puts the term back in the hints. `/terms` opens your term history. Picking terms asks Claude Haiku through your Claude Code, so it uses a little Claude quota, and it pauses while your 5-hour quota is at 90% or more.
83
+ - **Quota-Aware Mode (macOS):** Off by default. When a 5-hour quota passes 80%, 90%, or 95%, or a weekly quota passes 95%, Claude Code gets one line with what is left and when it resets. Before a big task, Claude then tells you and lets you pick a smaller part or wait for the reset. It covers Claude Code, Codex, and Antigravity quota, says each level once per conversation, and makes no extra model calls.
81
84
  - **Auto-start 5-hour Session:** Off by default. Turn it on and, right after a 5-hour quota resets, `usage` sends one tiny message to each tool (Claude with Haiku, Antigravity with Gemini 3.5 Flash Low, Codex with its cheapest model) so the next 5-hour window starts counting right away. Those messages do use a little quota, but the amount is negligible. Checking your quota never sends a message; only this switch does.
82
85
  - **Terminal Integration:** `usage status --json` hands your Claude Code, Codex, Antigravity, and Grok quota to any tool that can run a command — Starship, tmux, or your own scripts. Reads the same local files as the menu bar. [Ready-made snippets](docs/DEVELOPMENT.md#quota-status-for-other-tools-usage-status).
83
86
  - **Token-waste Health Check:** A daily background diagnosis scans your logs for waste, including repeated file reads, polluter directories, and noisy Bash output. If it finds issues, a one-line heads-up appears; say "show me" and the AI walks you through fixes.
@@ -99,14 +102,17 @@ It lands in your Applications folder automatically. Open it once; if macOS 15 or
99
102
 
100
103
  ## Privacy & Data Sources
101
104
 
105
+ Claude Desktop chat quota is also supported without installing the standalone Claude Code CLI or configuring a status line. Keep Claude Desktop open: when Claude Code quota files are unavailable, usage reads its local `plan-usage-history.json` (including Microsoft Store installations on Windows). When a recent response in its local Chromium block-file HTTP cache matches the organization, usage also reads the exact session and weekly reset times. Newer cached observations take precedence over throttled history samples; older cache must match the percentages. Missing, unsupported, expired, or inconsistent cache data leaves the countdown unknown; times are never estimated. Desktop samples normally update every 5–15 minutes. The panel shows the observation age, marks it stale after 30 minutes, and stops displaying it after two hours. The most recent organization sample is used; custom desktop profiles are not discovered. No cookies, login tokens, or API calls are needed. These quota caches contain no per-project token counts. Desktop sessions that also write compatible Claude Code logs under `~/.claude/projects/` are counted by the existing project/token reports.
106
+
102
107
  - Claude Code and Codex numbers are read from local log files on your machine.
103
108
  - Antigravity quota requires network access, and only if you use it: quota is fetched from Google's official quota endpoint using the OAuth credential the Antigravity CLI already stored after sign-in — read from macOS Keychain, Windows Credential Manager, or a local token file depending on CLI version. `usage` reads that credential without writing it back and keeps any refreshed access token in memory only; the call itself reads quota metadata.
104
109
  - Background network activity: the Antigravity quota/token endpoints above, public Claude and Codex status pages to flag outages, a public model-pricing table to estimate cost (falls back to built-in prices offline), and occasionally checking GitHub for a new version. Claude Code and Codex log contents are never uploaded.
110
+ - Beginner Mode, only if you turn it on, sends Claude Code's latest answer to Claude Haiku through your own Claude Code sign-in to pick terms. Your term list stays in `~/.usage/glossary.json`.
105
111
 
106
112
  ## Requirements
107
113
 
108
114
  - macOS 12 (Monterey) or newer, or Windows 10/11
109
- - Claude Code, Codex, Antigravity, or Grok CLI has been used at least once (so local usage data exists).
115
+ - Local usage data from Claude Code, Codex, Antigravity, or Grok CLI, or a running Claude Desktop app with plan-usage history.
110
116
  - (Source runs only) Python 3.13.
111
117
 
112
118
  ## Install
@@ -162,7 +168,7 @@ See your quota, other conversations, and background jobs without leaving Claude
162
168
 
163
169
  **How to enable**
164
170
 
165
- 1. In the usage menu bar menu (macOS) or the system-tray panel menu (Windows), check **Claude Code side pane**.
171
+ 1. In the usage menu bar menu (macOS) or the system-tray panel menu (Windows), check **Claude Code side pane**. On macOS it sits under the **Claude Code** submenu as **Side pane**.
166
172
  2. Open a new conversation or run `/reload-plugins`.
167
173
  3. At terminal widths ≥144 columns, the pane opens on the right automatically. In narrower terminals, enter `/usage-dash`.
168
174
 
@@ -251,6 +257,7 @@ If the menu bar shows `--`, it's usually not broken — there's just no local da
251
257
  | AI Update Daily | ✅ | — | — |
252
258
  | Progress Concierge & Token Saver | ✅ | — | — |
253
259
  | Token-waste Health Check | ✅ | — | — |
260
+ | Claude Code Beginner Mode & Quota-Aware Mode | ✅ | — | — |
254
261
  | Open-source license | AGPL-3.0 | MIT | — |
255
262
 
256
263
  ## When usage Isn't the Right Fit
@@ -57,6 +57,8 @@ It lands in your Applications folder automatically. Open it once; if macOS 15 or
57
57
  - **Progress Concierge:** Open a new Claude Code session and `usage` hands your last progress straight to the AI, including your last request, uncommitted changes, and unfinished todos. No `/resume`, no recap. When you do `/resume` a conversation that sat long enough for its cache to expire, it warns you how many tokens the next message will re-send and suggests `/compact` first. Off by default.
58
58
  - **Token Saver:** A menu-bar toggle asks Claude Code and Codex to answer more tersely and in plainer language, saving output tokens while keeping code and error messages byte-exact. A light reminder keeps long conversations from drifting back to verbose — in an A/B test on real sessions, late replies stayed ~40% shorter instead of drifting 84% longer.
59
59
  - **Claude Code side pane (macOS and Windows):** Quotas, conversations, and background jobs inside Claude Code. [See the side pane](#claude-code-side-pane).
60
+ - **Beginner Mode (macOS):** Off by default. After Claude Code answers, up to three technical terms from that answer appear above the prompt, each with a one-line plain explanation in your UI language. Press 9 to mark them understood; terms you skip come back after 1, 3, then 7 days. Understood terms return as a one-question multiple-choice quiz 7, 21, then 60 days later, at most one a day; a wrong answer puts the term back in the hints. `/terms` opens your term history. Picking terms asks Claude Haiku through your Claude Code, so it uses a little Claude quota, and it pauses while your 5-hour quota is at 90% or more.
61
+ - **Quota-Aware Mode (macOS):** Off by default. When a 5-hour quota passes 80%, 90%, or 95%, or a weekly quota passes 95%, Claude Code gets one line with what is left and when it resets. Before a big task, Claude then tells you and lets you pick a smaller part or wait for the reset. It covers Claude Code, Codex, and Antigravity quota, says each level once per conversation, and makes no extra model calls.
60
62
  - **Auto-start 5-hour Session:** Off by default. Turn it on and, right after a 5-hour quota resets, `usage` sends one tiny message to each tool (Claude with Haiku, Antigravity with Gemini 3.5 Flash Low, Codex with its cheapest model) so the next 5-hour window starts counting right away. Those messages do use a little quota, but the amount is negligible. Checking your quota never sends a message; only this switch does.
61
63
  - **Terminal Integration:** `usage status --json` hands your Claude Code, Codex, Antigravity, and Grok quota to any tool that can run a command — Starship, tmux, or your own scripts. Reads the same local files as the menu bar. [Ready-made snippets](docs/DEVELOPMENT.md#quota-status-for-other-tools-usage-status).
62
64
  - **Token-waste Health Check:** A daily background diagnosis scans your logs for waste, including repeated file reads, polluter directories, and noisy Bash output. If it finds issues, a one-line heads-up appears; say "show me" and the AI walks you through fixes.
@@ -78,14 +80,17 @@ It lands in your Applications folder automatically. Open it once; if macOS 15 or
78
80
 
79
81
  ## Privacy & Data Sources
80
82
 
83
+ Claude Desktop chat quota is also supported without installing the standalone Claude Code CLI or configuring a status line. Keep Claude Desktop open: when Claude Code quota files are unavailable, usage reads its local `plan-usage-history.json` (including Microsoft Store installations on Windows). When a recent response in its local Chromium block-file HTTP cache matches the organization, usage also reads the exact session and weekly reset times. Newer cached observations take precedence over throttled history samples; older cache must match the percentages. Missing, unsupported, expired, or inconsistent cache data leaves the countdown unknown; times are never estimated. Desktop samples normally update every 5–15 minutes. The panel shows the observation age, marks it stale after 30 minutes, and stops displaying it after two hours. The most recent organization sample is used; custom desktop profiles are not discovered. No cookies, login tokens, or API calls are needed. These quota caches contain no per-project token counts. Desktop sessions that also write compatible Claude Code logs under `~/.claude/projects/` are counted by the existing project/token reports.
84
+
81
85
  - Claude Code and Codex numbers are read from local log files on your machine.
82
86
  - Antigravity quota requires network access, and only if you use it: quota is fetched from Google's official quota endpoint using the OAuth credential the Antigravity CLI already stored after sign-in — read from macOS Keychain, Windows Credential Manager, or a local token file depending on CLI version. `usage` reads that credential without writing it back and keeps any refreshed access token in memory only; the call itself reads quota metadata.
83
87
  - Background network activity: the Antigravity quota/token endpoints above, public Claude and Codex status pages to flag outages, a public model-pricing table to estimate cost (falls back to built-in prices offline), and occasionally checking GitHub for a new version. Claude Code and Codex log contents are never uploaded.
88
+ - Beginner Mode, only if you turn it on, sends Claude Code's latest answer to Claude Haiku through your own Claude Code sign-in to pick terms. Your term list stays in `~/.usage/glossary.json`.
84
89
 
85
90
  ## Requirements
86
91
 
87
92
  - macOS 12 (Monterey) or newer, or Windows 10/11
88
- - Claude Code, Codex, Antigravity, or Grok CLI has been used at least once (so local usage data exists).
93
+ - Local usage data from Claude Code, Codex, Antigravity, or Grok CLI, or a running Claude Desktop app with plan-usage history.
89
94
  - (Source runs only) Python 3.13.
90
95
 
91
96
  ## Install
@@ -141,7 +146,7 @@ See your quota, other conversations, and background jobs without leaving Claude
141
146
 
142
147
  **How to enable**
143
148
 
144
- 1. In the usage menu bar menu (macOS) or the system-tray panel menu (Windows), check **Claude Code side pane**.
149
+ 1. In the usage menu bar menu (macOS) or the system-tray panel menu (Windows), check **Claude Code side pane**. On macOS it sits under the **Claude Code** submenu as **Side pane**.
145
150
  2. Open a new conversation or run `/reload-plugins`.
146
151
  3. At terminal widths ≥144 columns, the pane opens on the right automatically. In narrower terminals, enter `/usage-dash`.
147
152
 
@@ -230,6 +235,7 @@ If the menu bar shows `--`, it's usually not broken — there's just no local da
230
235
  | AI Update Daily | ✅ | — | — |
231
236
  | Progress Concierge & Token Saver | ✅ | — | — |
232
237
  | Token-waste Health Check | ✅ | — | — |
238
+ | Claude Code Beginner Mode & Quota-Aware Mode | ✅ | — | — |
233
239
  | Open-source license | AGPL-3.0 | MIT | — |
234
240
 
235
241
  ## When usage Isn't the Right Fit
@@ -0,0 +1,96 @@
1
+ # Third-party notices
2
+
3
+ The Windows taskbar label anchoring in `wintray/taskbar_overlay.py` is adapted
4
+ from [Codex Usage Widget](https://github.com/ognjeeen/codex-usage-widget),
5
+ commit `940d722d4044242bbe73f8056014449c2ef827a7`, particularly
6
+ `Infrastructure/Windows/TaskbarWindowInterop.cs`.
7
+
8
+ MIT License
9
+
10
+ Copyright (c) 2026 Ognjen Marinković
11
+
12
+ Permission is hereby granted, free of charge, to any person obtaining a copy
13
+ of this software and associated documentation files (the "Software"), to deal
14
+ in the Software without restriction, including without limitation the rights
15
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
16
+ copies of the Software, and to permit persons to whom the Software is
17
+ furnished to do so, subject to the following conditions:
18
+
19
+ The above copyright notice and this permission notice shall be included in all
20
+ copies or substantial portions of the Software.
21
+
22
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
25
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28
+ SOFTWARE.
29
+
30
+
31
+ ## Python Zstandard
32
+
33
+ The local Claude HTTP cache reader uses python-zstandard, including its bundled
34
+ Zstandard library, under their BSD licenses.
35
+
36
+ Copyright (c) 2016, Gregory Szorc
37
+ All rights reserved.
38
+
39
+ Redistribution and use in source and binary forms, with or without modification,
40
+ are permitted provided that the following conditions are met:
41
+
42
+ 1. Redistributions of source code must retain the above copyright notice, this
43
+ list of conditions and the following disclaimer.
44
+
45
+ 2. Redistributions in binary form must reproduce the above copyright notice,
46
+ this list of conditions and the following disclaimer in the documentation
47
+ and/or other materials provided with the distribution.
48
+
49
+ 3. Neither the name of the copyright holder nor the names of its contributors
50
+ may be used to endorse or promote products derived from this software without
51
+ specific prior written permission.
52
+
53
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
54
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
55
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
56
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
57
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
58
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
59
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
60
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
61
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
62
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
63
+
64
+
65
+ ## Zstandard
66
+
67
+ BSD License
68
+
69
+ For Zstandard software
70
+
71
+ Copyright (c) Meta Platforms, Inc. and affiliates. All rights reserved.
72
+
73
+ Redistribution and use in source and binary forms, with or without modification,
74
+ are permitted provided that the following conditions are met:
75
+
76
+ * Redistributions of source code must retain the above copyright notice, this
77
+ list of conditions and the following disclaimer.
78
+
79
+ * Redistributions in binary form must reproduce the above copyright notice,
80
+ this list of conditions and the following disclaimer in the documentation
81
+ and/or other materials provided with the distribution.
82
+
83
+ * Neither the name Facebook, nor Meta, nor the names of its contributors may
84
+ be used to endorse or promote products derived from this software without
85
+ specific prior written permission.
86
+
87
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
88
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
89
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
90
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
91
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
92
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
93
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
94
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
95
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
96
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -10,6 +10,8 @@ import os
10
10
  from datetime import datetime, timezone
11
11
  from typing import Any
12
12
 
13
+ import usage_client
14
+
13
15
  from .types import RateLimits
14
16
 
15
17
  STATUS_FILE = os.path.expanduser("~/.claude/usage-status.json")
@@ -42,8 +44,12 @@ def _read_status() -> dict[str, Any] | None:
42
44
 
43
45
  def load_rate_limits() -> RateLimits | None:
44
46
  data = _read_status()
45
- if data is None:
46
- return None
47
+ if data is None or not usage_client._has_complete_rate_limits(data):
48
+ snapshot = usage_client.read_quota_fallback()
49
+ if snapshot is not None:
50
+ return _snapshot_rate_limits(snapshot)
51
+ if data is None:
52
+ return None
47
53
 
48
54
  rl = data.get("rate_limits") or {}
49
55
  five = rl.get("five_hour") or {}
@@ -74,3 +80,18 @@ def load_rate_limits() -> RateLimits | None:
74
80
  model=model_name,
75
81
  updated_at=data.get("_received_at", ""),
76
82
  )
83
+
84
+
85
+ def _snapshot_rate_limits(quota: usage_client.UsageSnapshot) -> RateLimits:
86
+ return RateLimits(
87
+ five_hour_pct=quota.current_percent,
88
+ seven_day_pct=quota.weekly_percent,
89
+ five_hour_resets_at=int(quota.current_reset_at)
90
+ if quota.current_reset_at is not None
91
+ else None,
92
+ seven_day_resets_at=int(quota.weekly_reset_at)
93
+ if quota.weekly_reset_at is not None
94
+ else None,
95
+ model="",
96
+ updated_at=datetime.fromtimestamp(quota.polled_at, timezone.utc).isoformat(),
97
+ )
@@ -69,7 +69,7 @@
69
69
  "awaiting_rate_limits": "請對 Claude Code 發送一句訊息以同步配額",
70
70
  "hook_broken_not_installed": "⚠ 狀態列沒在更新,請按「設定狀態列」重新安裝",
71
71
  "hook_broken_restart": "⚠ 狀態列沒在運作,請重開一次 Claude Code",
72
- "usage_status_missing": "⚠ 找不到狀態檔,請按「設定狀態列」,再打開一次 Claude Code",
72
+ "usage_status_missing": "尚無額度資料。請保持 Claude 桌面版開啟,或設定狀態列後啟動終端機的 Claude Code。",
73
73
  "usage_status_missing_active": "⚠ 配額資料只能靠終端機的狀態列同步,桌面版/背景工作階段不會觸發,請開一次終端機的 Claude Code 來同步",
74
74
  "usage_status_no_quota": "⚠ 狀態檔尚無配額資料,等 Claude Code 再刷新一次 statusLine",
75
75
  "status_error": "錯誤 ({message})",
@@ -490,6 +490,8 @@
490
490
  "claude_pane_sidecar_error": "面板設定讀取失敗:{error}",
491
491
  "menu_badge_new": "新",
492
492
  "claude_pane_menu": "Claude Code 側邊面板",
493
+ "claude_code_section": "Claude Code",
494
+ "claude_pane_section_menu": "側邊面板",
493
495
  "claude_pane_tooltip": "在 Claude Code 顯示額度、對話與背景工作",
494
496
  "claude_pane_enabled_msg": "已開啟側邊面板。開新的 Claude Code 對話(或在對話裡打 /reload-plugins)後生效;終端機寬度不夠時打 /usage-dash 叫出面板。",
495
497
  "claude_pane_fullscreen_enabled_note": "已一併開啟 Claude Code 的全螢幕介面,讓面板顯示在右側。取消勾選側邊面板時會改回。",
@@ -515,7 +517,34 @@
515
517
  "keeper_failed_line": "上次失敗 {time}:{tool}({reason})",
516
518
  "terse_codex_hook_untrusted": "Codex 還沒批准 usage 的精簡模式 hook,Codex 那邊不會生效。在 Codex 裡打 /hooks 批准它。",
517
519
  "terse_codex_hook_disabled": "你在 Codex 停用了 usage 的精簡模式 hook。在 Codex 裡打 /hooks 重新啟用。",
518
- "claude_pane_stopped": "已停止"
520
+ "claude_pane_stopped": "已停止",
521
+ "claude_beginner_menu": "新手模式",
522
+ "claude_beginner_tooltip": "幫你看懂 Claude 的回答:回答完,在輸入框上方用白話提示最多 3 個專有名詞。按 9 標成「懂了」就不再提示,之後開新對話時會出選擇題小考。會用到少量 Claude 額度。",
523
+ "claude_beginner_title": "名詞提示",
524
+ "claude_beginner_history_title": "名詞提示紀錄",
525
+ "claude_beginner_description": "開啟名詞提示紀錄",
526
+ "claude_beginner_all_known": "都懂了",
527
+ "claude_beginner_dismiss": "收起",
528
+ "claude_beginner_known": "懂了",
529
+ "claude_beginner_unknown": "還不懂",
530
+ "claude_beginner_empty": "還沒有名詞紀錄。",
531
+ "claude_beginner_opened": "已開啟名詞提示紀錄。",
532
+ "claude_beginner_quiz_title": "小考",
533
+ "claude_beginner_quiz_question": "{term} 是什麼意思?",
534
+ "claude_beginner_quiz_right": "答對了!{days} 天後再考一次。",
535
+ "claude_beginner_quiz_done": "答對了!這個詞你已經學會了。",
536
+ "claude_beginner_quiz_wrong": "答錯了。正確答案:{answer}。這個詞之後會再出現在名詞提示裡。",
537
+ "claude_beginner_enabled_msg": "已開啟新手模式。重開 Claude Code 後生效。",
538
+ "claude_beginner_disabled_msg": "已關閉新手模式。重開 Claude Code 後生效。",
539
+ "claude_beginner_action_failed": "無法切換新手模式",
540
+ "quota_aware_menu": "額度感知模式",
541
+ "quota_aware_tooltip": "額度快用完時,Claude 開大任務前會先告訴你剩多少、幾點重置,讓你選先做小的還是等重置。",
542
+ "quota_aware_enabled_msg": "已開啟額度感知模式。請重啟 Claude Code 套用。",
543
+ "quota_aware_disabled_msg": "已關閉額度感知模式。請重啟 Claude Code 套用。",
544
+ "quota_aware_action_failed": "無法切換額度感知模式。",
545
+ "claude_beginner_error": "新手模式:{error}",
546
+ "claude_desktop_updated": "Claude 桌面版 · {minutes} 分鐘前更新",
547
+ "claude_desktop_stale": "Claude 桌面版 · 資料過期 · {minutes} 分鐘前更新"
519
548
  },
520
549
  "en": {
521
550
  "panel_default_name": "Default",
@@ -587,7 +616,7 @@
587
616
  "awaiting_rate_limits": "Send a message in Claude Code to sync your quota",
588
617
  "hook_broken_not_installed": "⚠ Status line is not updating. Click \"Set Up Status Line\" to reinstall it.",
589
618
  "hook_broken_restart": "⚠ Status line hook is not running. Restart Claude Code once.",
590
- "usage_status_missing": "⚠ Status file not found. Click \"Set Up Status Line\", then open Claude Code once.",
619
+ "usage_status_missing": "No quota data yet. Keep Claude Desktop open, or set up the status line and start Claude Code in a terminal.",
591
620
  "usage_status_missing_active": "⚠ Quota data only syncs via the terminal status line — the desktop app and headless sessions don't trigger it. Open Claude Code in a terminal once to sync.",
592
621
  "usage_status_no_quota": "⚠ Status file has no quota data yet. Wait for Claude Code to refresh statusLine once.",
593
622
  "status_error": "Error ({message})",
@@ -1008,6 +1037,8 @@
1008
1037
  "claude_pane_sidecar_error": "Cannot read pane settings: {error}",
1009
1038
  "menu_badge_new": "New",
1010
1039
  "claude_pane_menu": "Claude Code side pane",
1040
+ "claude_code_section": "Claude Code",
1041
+ "claude_pane_section_menu": "Side pane",
1011
1042
  "claude_pane_tooltip": "Show quotas, Claude sessions and background jobs in Claude Code",
1012
1043
  "claude_pane_enabled_msg": "Pane enabled. Open a new Claude Code conversation (or run /reload-plugins in a conversation). If the terminal is too narrow, run /usage-dash to open the pane.",
1013
1044
  "claude_pane_fullscreen_enabled_note": "Claude Code's fullscreen layout is now on so the pane can sit on the right. Turning the side pane off switches it back.",
@@ -1033,7 +1064,34 @@
1033
1064
  "keeper_failed_line": "Last failure {time}: {tool} ({reason})",
1034
1065
  "terse_codex_hook_untrusted": "Codex has not approved usage’s terse mode hook, so terse mode will not work in Codex. Run /hooks in Codex to approve it.",
1035
1066
  "terse_codex_hook_disabled": "You disabled usage’s terse mode hook in Codex. Run /hooks in Codex to enable it again.",
1036
- "claude_pane_stopped": "stopped"
1067
+ "claude_pane_stopped": "stopped",
1068
+ "claude_beginner_menu": "Beginner Mode",
1069
+ "claude_beginner_tooltip": "Understand Claude’s answers: after each answer, see up to 3 technical terms explained above the prompt. Press 9 to mark them as understood so they stop appearing; a new conversation will later quiz you on them with a multiple-choice question. Uses a small amount of Claude quota.",
1070
+ "claude_beginner_title": "Terms",
1071
+ "claude_beginner_history_title": "Term history",
1072
+ "claude_beginner_description": "Open your term history",
1073
+ "claude_beginner_all_known": "All understood",
1074
+ "claude_beginner_dismiss": "Dismiss",
1075
+ "claude_beginner_known": "Understood",
1076
+ "claude_beginner_unknown": "Not yet understood",
1077
+ "claude_beginner_empty": "No terms yet.",
1078
+ "claude_beginner_opened": "Term history opened.",
1079
+ "claude_beginner_quiz_title": "Quick quiz",
1080
+ "claude_beginner_quiz_question": "What does {term} mean?",
1081
+ "claude_beginner_quiz_right": "Correct! Next quiz in {days} days.",
1082
+ "claude_beginner_quiz_done": "Correct! You have learned this term.",
1083
+ "claude_beginner_quiz_wrong": "Not quite. The answer is: {answer}. This term will show up in the hints again.",
1084
+ "claude_beginner_enabled_msg": "Beginner Mode enabled. Restart Claude Code to apply.",
1085
+ "claude_beginner_disabled_msg": "Beginner Mode disabled. Restart Claude Code to apply.",
1086
+ "claude_beginner_action_failed": "Could not change Beginner Mode",
1087
+ "quota_aware_menu": "Quota-Aware Mode",
1088
+ "quota_aware_tooltip": "When quota is running low, Claude tells you how much remains and when it resets before starting a large task, so you can choose a smaller part now or wait for the reset.",
1089
+ "quota_aware_enabled_msg": "Quota-Aware Mode enabled. Restart Claude Code to apply.",
1090
+ "quota_aware_disabled_msg": "Quota-Aware Mode disabled. Restart Claude Code to apply.",
1091
+ "quota_aware_action_failed": "Could not change Quota-Aware Mode.",
1092
+ "claude_beginner_error": "Beginner Mode: {error}",
1093
+ "claude_desktop_updated": "Claude Desktop · updated {minutes}m ago",
1094
+ "claude_desktop_stale": "Claude Desktop · stale · updated {minutes}m ago"
1037
1095
  },
1038
1096
  "zh-CN": {
1039
1097
  "panel_default_name": "默认",
@@ -1105,7 +1163,7 @@
1105
1163
  "awaiting_rate_limits": "请对 Claude Code 发送一句消息以同步配额",
1106
1164
  "hook_broken_not_installed": "⚠ 状态栏没有更新,请点「设置状态栏」重新安装",
1107
1165
  "hook_broken_restart": "⚠ 状态栏没有运行,请重开一次 Claude Code",
1108
- "usage_status_missing": "⚠ 找不到状态文件,请点「设置状态栏」,再打开一次 Claude Code",
1166
+ "usage_status_missing": "尚无额度数据。请保持 Claude 桌面版打开,或设置状态栏后启动终端中的 Claude Code。",
1109
1167
  "usage_status_missing_active": "⚠ 配额数据只能靠终端的状态栏同步,桌面版/后台会话不会触发,请打开一次终端的 Claude Code 来同步",
1110
1168
  "usage_status_no_quota": "⚠ 状态文件还没有配额数据,等 Claude Code 再刷新一次 statusLine",
1111
1169
  "status_error": "错误 ({message})",
@@ -1526,6 +1584,8 @@
1526
1584
  "claude_pane_sidecar_error": "面板设置读取失败:{error}",
1527
1585
  "menu_badge_new": "新",
1528
1586
  "claude_pane_menu": "Claude Code 侧边面板",
1587
+ "claude_code_section": "Claude Code",
1588
+ "claude_pane_section_menu": "侧边面板",
1529
1589
  "claude_pane_tooltip": "在 Claude Code 显示额度、对话与后台任务",
1530
1590
  "claude_pane_enabled_msg": "已开启侧边面板。打开新的 Claude Code 对话(或在对话里输入 /reload-plugins)后生效;终端宽度不够时输入 /usage-dash 打开面板。",
1531
1591
  "claude_pane_fullscreen_enabled_note": "已一并开启 Claude Code 的全屏界面,让面板显示在右侧。取消勾选侧边面板时会改回。",
@@ -1551,7 +1611,34 @@
1551
1611
  "keeper_failed_line": "上次失败 {time}:{tool}({reason})",
1552
1612
  "terse_codex_hook_untrusted": "Codex 还没批准 usage 的精简模式 hook,Codex 那边不会生效。在 Codex 里输入 /hooks 批准它。",
1553
1613
  "terse_codex_hook_disabled": "你在 Codex 停用了 usage 的精简模式 hook。在 Codex 里输入 /hooks 重新启用。",
1554
- "claude_pane_stopped": "已停止"
1614
+ "claude_pane_stopped": "已停止",
1615
+ "claude_beginner_menu": "新手模式",
1616
+ "claude_beginner_tooltip": "帮你看懂 Claude 的回答:回答完,在输入框上方用白话提示最多 3 个专业术语。按 9 标成“懂了”就不再提示,之后开新对话时会出选择题小测验。会用到少量 Claude 额度。",
1617
+ "claude_beginner_title": "术语提示",
1618
+ "claude_beginner_history_title": "术语提示记录",
1619
+ "claude_beginner_description": "打开术语提示记录",
1620
+ "claude_beginner_all_known": "都懂了",
1621
+ "claude_beginner_dismiss": "收起",
1622
+ "claude_beginner_known": "懂了",
1623
+ "claude_beginner_unknown": "还不懂",
1624
+ "claude_beginner_empty": "还没有术语记录。",
1625
+ "claude_beginner_opened": "已打开术语提示记录。",
1626
+ "claude_beginner_quiz_title": "小测验",
1627
+ "claude_beginner_quiz_question": "{term} 是什么意思?",
1628
+ "claude_beginner_quiz_right": "答对了!{days} 天后再考一次。",
1629
+ "claude_beginner_quiz_done": "答对了!这个词你已经学会了。",
1630
+ "claude_beginner_quiz_wrong": "答错了。正确答案:{answer}。这个词之后会再出现在术语提示里。",
1631
+ "claude_beginner_enabled_msg": "已开启新手模式。重启 Claude Code 后生效。",
1632
+ "claude_beginner_disabled_msg": "已关闭新手模式。重启 Claude Code 后生效。",
1633
+ "claude_beginner_action_failed": "无法切换新手模式",
1634
+ "quota_aware_menu": "额度感知模式",
1635
+ "quota_aware_tooltip": "额度快用完时,Claude 开大任务前会先告诉你还剩多少、几点重置,让你选先做小的还是等重置。",
1636
+ "quota_aware_enabled_msg": "已开启额度感知模式。请重启 Claude Code 应用。",
1637
+ "quota_aware_disabled_msg": "已关闭额度感知模式。请重启 Claude Code 应用。",
1638
+ "quota_aware_action_failed": "无法切换额度感知模式。",
1639
+ "claude_beginner_error": "新手模式:{error}",
1640
+ "claude_desktop_updated": "Claude 桌面版 · {minutes} 分钟前更新",
1641
+ "claude_desktop_stale": "Claude 桌面版 · 数据过期 · {minutes} 分钟前更新"
1555
1642
  },
1556
1643
  "ja": {
1557
1644
  "panel_default_name": "デフォルト",
@@ -1623,7 +1710,7 @@
1623
1710
  "awaiting_rate_limits": "Claude Code にメッセージを送信してクォータを同期してください",
1624
1711
  "hook_broken_not_installed": "⚠ ステータスラインが更新されていません。「ステータスラインを設定」を押して再インストールしてください。",
1625
1712
  "hook_broken_restart": "⚠ ステータスライン hook が動作していません。Claude Code を一度再起動してください。",
1626
- "usage_status_missing": "⚠ ステータスファイルが見つかりません。「ステータスラインを設定」を押してから、Claude Code を一度起動してください。",
1713
+ "usage_status_missing": "利用枠データがありません。Claude デスクトップを開いたままにするか、ステータスラインを設定してターミナルの Claude Code を起動してください。",
1627
1714
  "usage_status_missing_active": "⚠ クォータ情報はターミナルのステータスラインでのみ同期されます。デスクトップアプリやヘッドレスセッションでは同期されません。ターミナルで Claude Code を一度開いてください。",
1628
1715
  "usage_status_no_quota": "⚠ ステータスファイルにクォータデータがまだありません。Claude Code が statusLine をもう一度更新するまでお待ちください。",
1629
1716
  "status_error": "エラー ({message})",
@@ -2044,6 +2131,8 @@
2044
2131
  "claude_pane_sidecar_error": "パネル設定を読み込めません: {error}",
2045
2132
  "menu_badge_new": "新規",
2046
2133
  "claude_pane_menu": "Claude Code サイドパネル",
2134
+ "claude_code_section": "Claude Code",
2135
+ "claude_pane_section_menu": "サイドペイン",
2047
2136
  "claude_pane_tooltip": "Claude Code に使用量、セッション、バックグラウンド作業を表示",
2048
2137
  "claude_pane_enabled_msg": "サイドパネルを有効にしました。新しい Claude Code セッションを開くか、会話で /reload-plugins を実行してください。ターミナルの幅が足りない場合は /usage-dash で開けます。",
2049
2138
  "claude_pane_fullscreen_enabled_note": "Claude Code のフルスクリーンレイアウトを有効にし、パネルを右側に表示できるようにしました。サイドパネルをオフにすると元に戻ります。",
@@ -2069,7 +2158,34 @@
2069
2158
  "keeper_failed_line": "前回の失敗 {time}:{tool}({reason})",
2070
2159
  "terse_codex_hook_untrusted": "Codex が usage の簡潔モード hook をまだ承認していないため、Codex では機能しません。Codex で /hooks を入力して承認してください。",
2071
2160
  "terse_codex_hook_disabled": "Codex で usage の簡潔モード hook が無効になっています。Codex で /hooks を入力して再び有効にしてください。",
2072
- "claude_pane_stopped": "停止済み"
2161
+ "claude_pane_stopped": "停止済み",
2162
+ "claude_beginner_menu": "初心者モード",
2163
+ "claude_beginner_tooltip": "Claude の回答をわかりやすく:回答後、入力欄の上に最大3つの専門用語をやさしく説明します。9を押すと「理解した」と記録して表示しなくなり、後日、新しい会話で選択式のミニテストが出ます。Claude の使用枠を少量使います。",
2164
+ "claude_beginner_title": "用語のヒント",
2165
+ "claude_beginner_history_title": "用語の履歴",
2166
+ "claude_beginner_description": "用語の履歴を開く",
2167
+ "claude_beginner_all_known": "すべて理解した",
2168
+ "claude_beginner_dismiss": "閉じる",
2169
+ "claude_beginner_known": "理解した",
2170
+ "claude_beginner_unknown": "まだわからない",
2171
+ "claude_beginner_empty": "用語の記録はまだありません。",
2172
+ "claude_beginner_opened": "用語の履歴を開きました。",
2173
+ "claude_beginner_quiz_title": "ミニテスト",
2174
+ "claude_beginner_quiz_question": "{term} の意味は?",
2175
+ "claude_beginner_quiz_right": "正解!{days} 日後にもう一度出題します。",
2176
+ "claude_beginner_quiz_done": "正解!この用語は覚えました。",
2177
+ "claude_beginner_quiz_wrong": "不正解。正解は「{answer}」です。この用語はまた用語ヒントに表示されます。",
2178
+ "claude_beginner_enabled_msg": "初心者モードを有効にしました。Claude Code を再起動してください。",
2179
+ "claude_beginner_disabled_msg": "初心者モードを無効にしました。Claude Code を再起動してください。",
2180
+ "claude_beginner_action_failed": "初心者モードを切り替えられません",
2181
+ "quota_aware_menu": "クォータ認識モード",
2182
+ "quota_aware_tooltip": "クォータが少なくなると、大きなタスクを始める前に Claude が残量とリセット時刻を伝えます。小さな部分を先に進めるか、リセットを待つか選べます。",
2183
+ "quota_aware_enabled_msg": "クォータ認識モードを有効にしました。Claude Code を再起動してください。",
2184
+ "quota_aware_disabled_msg": "クォータ認識モードを無効にしました。Claude Code を再起動してください。",
2185
+ "quota_aware_action_failed": "クォータ認識モードを切り替えられませんでした。",
2186
+ "claude_beginner_error": "初心者モード:{error}",
2187
+ "claude_desktop_updated": "Claude デスクトップ · {minutes}分前に更新",
2188
+ "claude_desktop_stale": "Claude デスクトップ · 古いデータ · {minutes}分前に更新"
2073
2189
  },
2074
2190
  "ko": {
2075
2191
  "panel_default_name": "기본",
@@ -2141,7 +2257,7 @@
2141
2257
  "awaiting_rate_limits": "Claude Code에 메시지를 보내 할당량을 동기화하세요",
2142
2258
  "hook_broken_not_installed": "⚠ 상태 표시줄이 업데이트되지 않습니다. \"상태 표시줄 설정\"을 눌러 다시 설치하세요.",
2143
2259
  "hook_broken_restart": "⚠ 상태 표시줄 hook이 작동하지 않습니다. Claude Code를 한 번 다시 시작하세요.",
2144
- "usage_status_missing": "⚠ 상태 파일을 찾을 수 없습니다. \"상태 표시줄 설정\"을 누른 뒤 Claude Code를 한 번 여세요.",
2260
+ "usage_status_missing": "사용 한도 데이터가 없습니다. Claude 데스크톱을 열어 두거나 상태 표시줄을 설정한 뒤 터미널에서 Claude Code를 실행하세요.",
2145
2261
  "usage_status_missing_active": "⚠ 할당량 데이터는 터미널 상태 표시줄로만 동기화됩니다. 데스크톱 앱이나 헤드리스 세션에서는 동기화되지 않습니다. 터미널에서 Claude Code를 한 번 열어주세요.",
2146
2262
  "usage_status_no_quota": "⚠ 상태 파일에 아직 할당량 데이터가 없습니다. Claude Code가 statusLine을 한 번 더 새로 고칠 때까지 기다리세요.",
2147
2263
  "status_error": "오류 ({message})",
@@ -2562,6 +2678,8 @@
2562
2678
  "claude_pane_sidecar_error": "패널 설정을 읽을 수 없습니다: {error}",
2563
2679
  "menu_badge_new": "신규",
2564
2680
  "claude_pane_menu": "Claude Code 사이드 패널",
2681
+ "claude_code_section": "Claude Code",
2682
+ "claude_pane_section_menu": "사이드 패널",
2565
2683
  "claude_pane_tooltip": "Claude Code에 사용량, 대화 및 백그라운드 작업 표시",
2566
2684
  "claude_pane_enabled_msg": "사이드 패널을 켰습니다. 새 Claude Code 대화를 열거나 대화에서 /reload-plugins를 실행하세요. 터미널이 좁으면 /usage-dash로 패널을 여세요.",
2567
2685
  "claude_pane_fullscreen_enabled_note": "Claude Code의 전체 화면 레이아웃도 켜서 패널이 오른쪽에 표시됩니다. 사이드 패널을 끄면 원래대로 돌아갑니다.",
@@ -2587,6 +2705,33 @@
2587
2705
  "keeper_failed_line": "마지막 실패 {time}: {tool} ({reason})",
2588
2706
  "terse_codex_hook_untrusted": "Codex가 usage의 간결 모드 hook을 아직 승인하지 않아 Codex에서 작동하지 않습니다. Codex에서 /hooks를 입력해 승인하세요.",
2589
2707
  "terse_codex_hook_disabled": "Codex에서 usage의 간결 모드 hook을 비활성화했습니다. Codex에서 /hooks를 입력해 다시 활성화하세요.",
2590
- "claude_pane_stopped": "중지됨"
2708
+ "claude_pane_stopped": "중지됨",
2709
+ "claude_beginner_menu": "초보자 모드",
2710
+ "claude_beginner_tooltip": "Claude의 답변을 쉽게 이해하세요. 답변 후 입력창 위에 전문 용어를 최대 3개까지 쉽게 설명합니다. 9를 누르면 이해한 것으로 기록하여 더 이상 표시하지 않고, 나중에 새 대화에서 객관식 퀴즈를 냅니다. Claude 사용량을 조금 씁니다.",
2711
+ "claude_beginner_title": "용어 안내",
2712
+ "claude_beginner_history_title": "용어 안내 기록",
2713
+ "claude_beginner_description": "용어 안내 기록 열기",
2714
+ "claude_beginner_all_known": "모두 이해했어요",
2715
+ "claude_beginner_dismiss": "닫기",
2716
+ "claude_beginner_known": "이해했어요",
2717
+ "claude_beginner_unknown": "아직 모르겠어요",
2718
+ "claude_beginner_empty": "아직 용어 기록이 없습니다.",
2719
+ "claude_beginner_opened": "용어 안내 기록을 열었습니다.",
2720
+ "claude_beginner_quiz_title": "퀴즈",
2721
+ "claude_beginner_quiz_question": "{term}의 뜻은?",
2722
+ "claude_beginner_quiz_right": "정답! {days}일 후에 다시 출제합니다.",
2723
+ "claude_beginner_quiz_done": "정답! 이 용어를 익혔어요.",
2724
+ "claude_beginner_quiz_wrong": "오답이에요. 정답: {answer}. 이 용어는 용어 힌트에 다시 나타납니다.",
2725
+ "claude_beginner_enabled_msg": "초보자 모드를 켰습니다. Claude Code를 다시 시작하세요.",
2726
+ "claude_beginner_disabled_msg": "초보자 모드를 껐습니다. Claude Code를 다시 시작하세요.",
2727
+ "claude_beginner_action_failed": "초보자 모드를 전환할 수 없습니다",
2728
+ "quota_aware_menu": "할당량 인식 모드",
2729
+ "quota_aware_tooltip": "할당량이 부족해지면 Claude가 큰 작업을 시작하기 전에 남은 양과 초기화 시간을 알려 줍니다. 작은 부분을 먼저 진행하거나 초기화를 기다릴 수 있습니다.",
2730
+ "quota_aware_enabled_msg": "할당량 인식 모드를 켰습니다. Claude Code를 다시 시작해 주세요.",
2731
+ "quota_aware_disabled_msg": "할당량 인식 모드를 껐습니다. Claude Code를 다시 시작해 주세요.",
2732
+ "quota_aware_action_failed": "할당량 인식 모드를 변경할 수 없습니다.",
2733
+ "claude_beginner_error": "초보자 모드: {error}",
2734
+ "claude_desktop_updated": "Claude 데스크톱 · {minutes}분 전 업데이트",
2735
+ "claude_desktop_stale": "Claude 데스크톱 · 오래된 데이터 · {minutes}분 전 업데이트"
2591
2736
  }
2592
2737
  }