usage-cli 0.29.32__py3-none-any.whl

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 (109) hide show
  1. adapters/__init__.py +5 -0
  2. adapters/agy.py +68 -0
  3. adapters/claude.py +215 -0
  4. adapters/codex.py +209 -0
  5. adapters/rate_limits.py +76 -0
  6. adapters/registry.py +17 -0
  7. adapters/types.py +139 -0
  8. agy_disk_cache.py +135 -0
  9. agy_loader.py +416 -0
  10. agy_quota_probe.py +748 -0
  11. agy_window_keeper.py +185 -0
  12. analyzer/__init__.py +5 -0
  13. analyzer/aggregator.py +139 -0
  14. analyzer/blocks.py +80 -0
  15. analyzer/diagnoser.py +638 -0
  16. analyzer/insights.py +277 -0
  17. analyzer/persona_loader.py +199 -0
  18. analyzer/reporter.py +989 -0
  19. analyzer/subscription.py +108 -0
  20. burn_rate.py +75 -0
  21. cache_quarantine.py +50 -0
  22. codex_disk_cache.py +227 -0
  23. codex_events.py +136 -0
  24. codex_fork_replay.py +111 -0
  25. codex_loader.py +1426 -0
  26. codex_paths.py +20 -0
  27. critter_frames.py +26 -0
  28. discussion_bridge.py +1196 -0
  29. discussion_cli.py +844 -0
  30. discussion_session.py +622 -0
  31. discussion_usage.py +13 -0
  32. discussion_window.py +955 -0
  33. disk_cache_common.py +132 -0
  34. disk_cache_lifecycle.py +39 -0
  35. doctor.py +452 -0
  36. fsevents_watch.py +207 -0
  37. history_disk_cache.py +110 -0
  38. history_loader.py +416 -0
  39. i18n.py +88 -0
  40. jsonl_limits.py +17 -0
  41. jsonl_utils.py +40 -0
  42. login_item.py +154 -0
  43. main.py +387 -0
  44. menubar.py +1201 -0
  45. menubar_actions.py +204 -0
  46. menubar_agy.py +193 -0
  47. menubar_chrome.py +156 -0
  48. menubar_menu.py +169 -0
  49. menubar_notify.py +102 -0
  50. menubar_popover.py +233 -0
  51. menubar_prefs.py +118 -0
  52. menubar_refresh.py +285 -0
  53. menubar_state.py +1200 -0
  54. menubar_title.py +157 -0
  55. menubar_update.py +123 -0
  56. panel_window.py +78 -0
  57. panel_window_state.py +159 -0
  58. panels/__init__.py +186 -0
  59. panels/base.py +83 -0
  60. panels/dynamic_height.py +140 -0
  61. panels/payload.py +178 -0
  62. panels/web_panel.py +513 -0
  63. panels/window_drag.py +56 -0
  64. prefs.py +44 -0
  65. pricing.py +452 -0
  66. project_resolver.py +112 -0
  67. service_status.py +383 -0
  68. session_hooks.py +1154 -0
  69. setup_app.py +171 -0
  70. setup_hook.py +1011 -0
  71. statusline_settings.py +160 -0
  72. talent_market_bridge.py +243 -0
  73. time_utils.py +24 -0
  74. tui.py +288 -0
  75. tui_sprite.py +206 -0
  76. ui/__init__.py +5 -0
  77. ui/html_report.py +923 -0
  78. ui/report_scripts.py +251 -0
  79. ui/report_styles.py +370 -0
  80. ui/tables.py +888 -0
  81. update_checker.py +156 -0
  82. update_gate.py +66 -0
  83. update_release_notes.py +49 -0
  84. usage_cli-0.29.32.data/data/share/usage/i18n.json +2427 -0
  85. usage_cli-0.29.32.dist-info/METADATA +223 -0
  86. usage_cli-0.29.32.dist-info/RECORD +109 -0
  87. usage_cli-0.29.32.dist-info/WHEEL +5 -0
  88. usage_cli-0.29.32.dist-info/entry_points.txt +3 -0
  89. usage_cli-0.29.32.dist-info/licenses/LICENSE +663 -0
  90. usage_cli-0.29.32.dist-info/top_level.txt +80 -0
  91. usage_cli.py +827 -0
  92. usage_client.py +487 -0
  93. usage_diagnosis_snapshot.py +143 -0
  94. usage_dir_sweeper.py +100 -0
  95. usage_lang.py +79 -0
  96. usage_logging.py +75 -0
  97. usage_notifications.py +96 -0
  98. usage_rate.py +97 -0
  99. usage_session_resume.py +913 -0
  100. usage_statusline.py +810 -0
  101. usage_statusline_agy.py +397 -0
  102. usage_statusline_forwarder.py +88 -0
  103. usage_terse_mode.py +223 -0
  104. usage_terse_reminder.py +151 -0
  105. win_login_item.py +53 -0
  106. window_keeper.py +264 -0
  107. windows_watch.py +443 -0
  108. wintray.py +2014 -0
  109. wintray_menu.py +136 -0
wintray_menu.py ADDED
@@ -0,0 +1,136 @@
1
+ # SPDX-License-Identifier: AGPL-3.0-only
2
+ # Copyright (C) 2026 lollapalooza <https://github.com/aqua5230>
3
+
4
+ """Shared menu descriptors for the Windows panel and recovery tray menu."""
5
+
6
+ from __future__ import annotations
7
+
8
+ from dataclasses import dataclass
9
+ from typing import Literal
10
+
11
+ type MenuSurface = Literal["panel", "tray"]
12
+ type CheckKey = Literal[
13
+ "active_panel",
14
+ "hide_claude",
15
+ "hide_codex",
16
+ "hide_agy",
17
+ "launch_at_login",
18
+ "quota_notifications",
19
+ "window_keeper",
20
+ "session_resume",
21
+ "terse_mode",
22
+ ]
23
+
24
+ PANEL: MenuSurface = "panel"
25
+ TRAY: MenuSurface = "tray"
26
+ _PANEL_ONLY = frozenset({PANEL})
27
+ _TRAY_ONLY = frozenset({TRAY})
28
+
29
+
30
+ @dataclass(frozen=True, slots=True)
31
+ class MenuCommand:
32
+ i18n_key: str
33
+ action: str
34
+ surfaces: frozenset[MenuSurface] = _PANEL_ONLY
35
+ checked_by: CheckKey | None = None
36
+ argument_name: str | None = None
37
+ argument_value: str | None = None
38
+ radio: bool = False
39
+
40
+
41
+ @dataclass(frozen=True, slots=True)
42
+ class MenuGroup:
43
+ i18n_key: str
44
+ children: tuple[MenuEntry, ...]
45
+ surfaces: frozenset[MenuSurface] = _PANEL_ONLY
46
+
47
+
48
+ @dataclass(frozen=True, slots=True)
49
+ class MenuSeparator:
50
+ surfaces: frozenset[MenuSurface]
51
+
52
+
53
+ type MenuEntry = MenuCommand | MenuGroup | MenuSeparator
54
+ type Panel = tuple[str, str, str]
55
+
56
+
57
+ def windows_menu_model(panels: tuple[Panel, ...]) -> tuple[MenuEntry, ...]:
58
+ """Describe both Windows menus once; renderers select their own surface."""
59
+ panel_choices: tuple[MenuEntry, ...] = tuple(
60
+ MenuCommand(
61
+ i18n_key,
62
+ "switch_panel",
63
+ checked_by="active_panel",
64
+ argument_name="panelId",
65
+ argument_value=panel_id,
66
+ radio=True,
67
+ )
68
+ for panel_id, i18n_key, _filename in panels
69
+ )
70
+ hidden_sections: tuple[MenuEntry, ...] = (
71
+ MenuCommand(
72
+ "claude_name",
73
+ "toggle_hide_section",
74
+ checked_by="hide_claude",
75
+ argument_name="preferenceKey",
76
+ argument_value="hide_claude_section",
77
+ ),
78
+ MenuCommand(
79
+ "codex_name",
80
+ "toggle_hide_section",
81
+ checked_by="hide_codex",
82
+ argument_name="preferenceKey",
83
+ argument_value="hide_codex_section",
84
+ ),
85
+ MenuCommand(
86
+ "agy_name",
87
+ "toggle_hide_section",
88
+ checked_by="hide_agy",
89
+ argument_name="preferenceKey",
90
+ argument_value="hide_agy_section",
91
+ ),
92
+ )
93
+ return (
94
+ MenuCommand("panel_ai_daily", "open_ai_daily"),
95
+ MenuSeparator(_PANEL_ONLY),
96
+ MenuGroup("switch_panel", panel_choices),
97
+ MenuGroup("hide_sections_menu", hidden_sections),
98
+ MenuSeparator(_PANEL_ONLY),
99
+ MenuCommand("launch_at_login", "toggle_login", checked_by="launch_at_login"),
100
+ MenuCommand(
101
+ "quota_notifications_menu",
102
+ "toggle_quota_notifications",
103
+ checked_by="quota_notifications",
104
+ ),
105
+ MenuCommand("window_keeper_menu", "toggle_window_keeper", checked_by="window_keeper"),
106
+ # Grouped with the plain switches above it — a separate section here just
107
+ # added a divider with no real category difference (matches macOS f74bbe0).
108
+ MenuCommand("project_butler", "toggle_session_resume", checked_by="session_resume"),
109
+ MenuCommand("terse_mode_menu", "toggle_terse_mode", checked_by="terse_mode"),
110
+ MenuSeparator(_PANEL_ONLY),
111
+ MenuCommand("check_update", "check_update"),
112
+ MenuCommand(
113
+ "reset_panel_position",
114
+ "reset_panel_position",
115
+ surfaces=_TRAY_ONLY,
116
+ ),
117
+ MenuSeparator(_TRAY_ONLY),
118
+ MenuCommand("quit", "quit", surfaces=_TRAY_ONLY),
119
+ )
120
+
121
+
122
+ def entries_for_surface(
123
+ entries: tuple[MenuEntry, ...], surface: MenuSurface
124
+ ) -> tuple[MenuEntry, ...]:
125
+ """Select one renderer's entries while keeping separators well formed."""
126
+ selected = [entry for entry in entries if surface in entry.surfaces]
127
+ normalized: list[MenuEntry] = []
128
+ for entry in selected:
129
+ if isinstance(entry, MenuSeparator) and (
130
+ not normalized or isinstance(normalized[-1], MenuSeparator)
131
+ ):
132
+ continue
133
+ normalized.append(entry)
134
+ if normalized and isinstance(normalized[-1], MenuSeparator):
135
+ normalized.pop()
136
+ return tuple(normalized)