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
setup_app.py ADDED
@@ -0,0 +1,171 @@
1
+ # SPDX-License-Identifier: AGPL-3.0-only
2
+ # Copyright (C) 2026 lollapalooza <https://github.com/aqua5230>
3
+ #
4
+ # Part of "usage". Free software licensed under the GNU Affero General Public
5
+ # License v3.0 only; see the LICENSE file for full terms and the warranty disclaimer.
6
+
7
+ from __future__ import annotations
8
+
9
+ import importlib
10
+ import tomllib
11
+ from pathlib import Path
12
+ from typing import Any, cast
13
+
14
+ from setuptools import setup # type: ignore[import-untyped]
15
+ from setuptools.dist import Distribution # type: ignore[import-untyped]
16
+
17
+ APP = ["main.py"]
18
+
19
+
20
+ def _version() -> str:
21
+ pyproject = Path(__file__).with_name("pyproject.toml")
22
+ with pyproject.open("rb") as file:
23
+ data = tomllib.load(file)
24
+ return str(data["project"]["version"])
25
+
26
+
27
+ class Py2AppDistribution(Distribution): # type: ignore[misc]
28
+ def __init__(self, attrs: dict[str, object] | None = None) -> None:
29
+ super().__init__(attrs)
30
+ self.install_requires: list[str] = []
31
+
32
+ def finalize_options(self) -> None:
33
+ super().finalize_options()
34
+ self.install_requires = []
35
+
36
+
37
+ def _py2app_command() -> type[Any]:
38
+ py2app_module: Any = importlib.import_module("py2app.build_app")
39
+ py2app_base = py2app_module.py2app
40
+
41
+ class Py2AppCommand(py2app_base): # type: ignore[misc, valid-type]
42
+ def finalize_options(self) -> None:
43
+ self.distribution.install_requires = []
44
+ super().finalize_options()
45
+
46
+ return Py2AppCommand
47
+
48
+
49
+ if __name__ == "__main__":
50
+ version = _version()
51
+ OPTIONS = {
52
+ "argv_emulation": False,
53
+ "iconfile": "assets/usage.icns",
54
+ "resources": [
55
+ "assets/claude.webp",
56
+ "assets/claude_color_menubar.png",
57
+ "assets/codex.webp",
58
+ "assets/codex_color_menubar.png",
59
+ "assets/agy_color_menubar.png",
60
+ "assets/critters",
61
+ "assets/panels",
62
+ "assets/windows",
63
+ "i18n.json",
64
+ "pyproject.toml",
65
+ "usage_statusline.py",
66
+ "usage_statusline_agy.py",
67
+ "usage_statusline_forwarder.py",
68
+ "usage_session_resume.py",
69
+ "usage_terse_mode.py",
70
+ "usage_terse_reminder.py",
71
+ ],
72
+ "includes": [
73
+ "AppKit",
74
+ "Foundation",
75
+ "Quartz",
76
+ "WebKit",
77
+ "UserNotifications",
78
+ "objc",
79
+ "menubar",
80
+ "usage_notifications",
81
+ "tui",
82
+ "tui_sprite",
83
+ "usage_client",
84
+ "usage_rate",
85
+ "critter_frames",
86
+ "codex_loader",
87
+ "history_loader",
88
+ "pricing",
89
+ "setup_hook",
90
+ "session_hooks",
91
+ "update_checker",
92
+ "i18n",
93
+ "usage_cli",
94
+ "talent_market_bridge",
95
+ # discussion_window is lazy-imported inside menubar.toggleDiscussion_,
96
+ # so py2app's dependency graph can't reach it (or the three core
97
+ # modules it pulls in) from main.py — list them explicitly.
98
+ "discussion_session",
99
+ "discussion_cli",
100
+ "discussion_bridge",
101
+ "discussion_window",
102
+ "rich",
103
+ "rich.align",
104
+ "rich.console",
105
+ "rich.live",
106
+ "rich.panel",
107
+ "rich.style",
108
+ "rich.table",
109
+ "rich.text",
110
+ ],
111
+ "packages": [
112
+ "WebKit",
113
+ "UserNotifications",
114
+ # Unzipped to Resources/lib/python3.13/ instead of python313.zip so the
115
+ # report pipeline never loads through zipimport — that is where a
116
+ # corrupted local file header surfaces as "bad local file header".
117
+ "adapters",
118
+ "analyzer",
119
+ "ui",
120
+ ],
121
+ "excludes": [
122
+ # Test suites and build tooling that py2app's module graph drags in
123
+ # but the shipped app never runs. Keeping them out shrinks
124
+ # python313.zip (was ~1665 entries: 426 CPython test, 69 _pytest)
125
+ # and cuts the surface for a corrupt zip entry.
126
+ "test",
127
+ "tests",
128
+ "pytest",
129
+ "_pytest",
130
+ "py2app",
131
+ "modulegraph",
132
+ "altgraph",
133
+ "macholib",
134
+ "pip",
135
+ "wheel",
136
+ "mypy",
137
+ "ruff",
138
+ ],
139
+ "plist": {
140
+ "CFBundleIdentifier": "com.lollapalooza.usage",
141
+ "CFBundleName": "usage",
142
+ "CFBundleDisplayName": "usage",
143
+ "CFBundleShortVersionString": version,
144
+ "CFBundleVersion": version,
145
+ "LSUIElement": True,
146
+ "LSMinimumSystemVersion": "12.0",
147
+ "NSHumanReadableCopyright": (
148
+ "Copyright © 2025-2026 lollapalooza. Licensed under AGPL-3.0-only."
149
+ ),
150
+ },
151
+ }
152
+
153
+ # Conditionally bundle the compiled instate-cli (built from the separate
154
+ # ~/Developer/instate project) so the talent-market panel works in the
155
+ # shipped .app. Appended at runtime — not in the literal list above — so the
156
+ # packaged-resources test (which parses the literal) stays clean on machines
157
+ # where vendor/instate-cli does not exist. py2app flattens a single-file
158
+ # resource to Resources/<basename> (Resources/instate-cli), which the bridge
159
+ # finds via NSBundle.pathForResource:ofType:.
160
+ _instate_cli = Path(__file__).with_name("vendor") / "instate-cli"
161
+ if _instate_cli.exists():
162
+ cast(list[Any], OPTIONS["resources"]).append("vendor/instate-cli")
163
+
164
+ setup(
165
+ app=APP,
166
+ cmdclass={"py2app": _py2app_command()},
167
+ distclass=Py2AppDistribution,
168
+ options={"py2app": OPTIONS},
169
+ setup_requires=["py2app"],
170
+ install_requires=[],
171
+ )