projmux 0.15.2 → 0.16.0

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.
@@ -1,22 +1,26 @@
1
1
  # Usage tracking
2
2
 
3
3
  `projmux agent usage` and `projmux internal status usage` report authoritative fixed-window
4
- utilisation for Claude/Codex and official named quota buckets for Antigravity.
4
+ utilisation for Claude/Codex.
5
5
  `--model all`, the tmux
6
6
  HUD, and the statusbar usage popup use Settings > AI Settings > Enabled
7
- agents as the source of truth, so disabled Claude/Codex/Antigravity providers are
7
+ agents as the source of truth, so disabled Claude/Codex providers are
8
8
  not refreshed or rendered on ambient/all surfaces. Explicit read-only
9
- requests such as `projmux agent usage --model claude`, `--model codex`, or
10
- `--model antigravity`
9
+ requests such as `projmux agent usage --model claude` or `--model codex`
11
10
  still collect and render that provider even when it is disabled.
12
11
 
13
- Claude and Codex adapters read the upstream's own account view. Antigravity
14
- reads only the official managed statusline payload: `context_window` remains
15
- private conversation-local diagnostic metadata, while each valid `quota` map
16
- entry is a separate account row. Projmux preserves the upstream bucket ID and
17
- never guesses that an undocumented ID means `5h` or `weekly`. It does not infer
18
- quota, cadence, reset timestamps, or account limits from screen scraping,
19
- tokens, history, OAuth/cache files, or binary strings.
12
+ Claude and Codex adapters read the upstream's own account view. projmux does
13
+ not infer quota, cadence, reset timestamps, or account limits from screen
14
+ scraping, tokens, history, OAuth/cache files, or binary strings.
15
+
16
+ Antigravity has no usage adapter: Antigravity offers no official usage event,
17
+ and projmux no longer reads its statusLine. `--model antigravity` is still
18
+ accepted; it prints no rows and the `Antigravity usage unsupported` note (exit
19
+ status 0), and an enabled Antigravity shows the same note on `--model all` and
20
+ in the statusbar popup. Rows an older Antigravity adapter left in
21
+ `snapshots.json` are never printed or projected, and leftover
22
+ `usage/antigravity-*.json` sidecars and Antigravity statusbar visibility files
23
+ are neither read nor deleted.
20
24
 
21
25
  Claude keeps the canonical aggregate `five_hour` and `seven_day` rows and also
22
26
  preserves structurally valid typed `limits[]` rows as named account quotas for
@@ -128,30 +132,6 @@ rollout fallback row records `source=rollout` plus the closed fallback reason.
128
132
  If neither lane produces rows, Manager preserves the previous source/value and
129
133
  adds a closed `stale_reason` to the last-known-good row.
130
134
 
131
- ### Antigravity (`internal/core/usage/adapters/antigravity`)
132
-
133
- Local managed-statusline sidecars. No network or credential reads.
134
-
135
- - `context_window.used_percentage` and its conversation ID remain in the
136
- private context sidecar for hook/notify diagnostics. They do not become
137
- Usage snapshots. The legacy string percentage remains a writer fallback.
138
- - The official `quota` map is sorted by its exact bucket ID. Each valid bucket
139
- becomes `window=quota`, `bucket=<upstream ID>` and renders as
140
- `quota/<upstream ID>` on account-inspection surfaces.
141
- - Used percent is `100 * (1 - remaining_fraction)`. Non-finite or values
142
- outside `[0,1]`, empty IDs, null/disabled entries, and negative relative
143
- resets are ignored safely. Rejected and duplicate buckets are skipped
144
- individually — the healthy buckets in the same map still become rows — and the
145
- skip is reported by sorted row index only, never by bucket ID.
146
- - `reset_time` and optional `reset_in_seconds` are stored independently. An
147
- absent relative reset differs from explicit zero; no value is derived from
148
- the other.
149
- - Context and quota use independent private sidecars. A context-only payload
150
- does not erase the last quota observation. An explicit empty/null quota map
151
- records no buckets; the manager's existing rule still preserves prior model
152
- rows when an adapter returns zero total rows. Context never participates in
153
- that account-row replacement decision.
154
-
155
135
  ## Snapshot store
156
136
 
157
137
  ```
@@ -180,7 +160,7 @@ across machines (Dropbox, iCloud Drive).
180
160
  ### `projmux agent usage`
181
161
 
182
162
  ```
183
- projmux agent usage [--model codex|claude|antigravity|all] [--window 5h|weekly|context|quota|all]
163
+ projmux agent usage [--model codex|claude|all] [--window 5h|weekly|context|quota|all]
184
164
  [--json] [--force|-f]
185
165
  ```
186
166
 
@@ -192,7 +172,6 @@ Enabled agents, filters by window, and renders the tab-aligned table:
192
172
  MODEL WINDOW PCT RESETS_AT RESET_IN STALE SOURCE REASON
193
173
  codex 5h/codex · General 12% 2026-05-07T14:00:00+09:00 - app-server
194
174
  claude 5h 80% 2026-05-07T14:00:00+09:00 -
195
- antigravity quota/gemini-weekly 6% 2026-07-06T16:50:32+09:00 560580s
196
175
  claude quota/group-redacted · Model Redacted Alpha 38% 2031-02-03T15:05:06+09:00 - *
197
176
  ```
198
177
 
@@ -210,11 +189,9 @@ claude is in backoff, try again in 30m (use --force to bypass)
210
189
 
211
190
  When no AI agents are enabled, all-model table output contains no
212
191
  provider rows and prints a short Settings hint. `--json` returns an
213
- empty array. Explicit `--model claude`, `--model codex` and
214
- `--model antigravity` bypass the enabled-agent filter for read-only
215
- inspection and collect/render only the requested adapter. Antigravity reports
216
- zero or more account `quota/<bucket-id>` rows. Legacy cached `window=context`
217
- rows are suppressed in text and JSON output. `--window quota` selects only
192
+ empty array. Explicit `--model claude` and `--model codex` bypass the
193
+ enabled-agent filter for read-only inspection and collect/render only the
194
+ requested adapter. Legacy cached `window=context` rows are suppressed in text and JSON output. `--window quota` selects only
218
195
  account buckets; `--window weekly` never matches an opaque quota bucket named
219
196
  `weekly`. `--window context` remains an accepted compatibility filter and
220
197
  returns no Usage rows.
@@ -236,11 +213,10 @@ after collection, throttle/backoff, and cache load. If no AI
236
213
  agents are enabled, the status segment emits nothing.
237
214
 
238
215
  The HUD first derives an ambient projection separate from lossless account
239
- snapshots. The explicit HUD capability map admits Claude/Codex `5h` and
240
- `weekly`, while Antigravity's exact `quota/gemini-weekly` identity alone is
241
- projected as `weekly`
242
- without rewriting the cache. Context, `3p-weekly`, and unknown quota buckets
243
- do not participate in status width. Claude `limits[]` named/model rows are also
216
+ snapshots. The explicit HUD capability map admits only Claude/Codex `5h` and
217
+ `weekly`. Context, named quota buckets, and cached rows from providers without
218
+ a capability (such as the removed Antigravity adapter) do not participate in
219
+ status width. Claude `limits[]` named/model rows are also
244
220
  excluded; only its aggregate official `5h` and `weekly` rows reach the HUD.
245
221
  The Settings provider list consumes `aiprovider.UsageSupported()` order, but a
246
222
  window toggle exists only when this same projection seam declares it. A future
@@ -248,11 +224,26 @@ provider or an opaque bucket cannot manufacture a window row.
248
224
  For native Codex multi-bucket rows, the exact `codex` bucket wins the HUD
249
225
  projection, then the legacy empty bucket, then lexical bucket order. The HUD
250
226
  compact identity is derived from that same row: a healthy authoritative
251
- `app-server` row is simply `Codex`, a fresh rollout row is
252
- `Codex [fallback]`, and a retained last-known-good row is `Codex [stale]`.
253
- Blank, malformed, or future non-stale provenance also fails conservatively to
254
- the existing `[fallback]` identity rather than looking native or expanding the
255
- compact vocabulary. The exact raw source and closed fallback/stale reason stay
227
+ `app-server` row is simply `Codex`, a retained last-known-good row is
228
+ `Codex [stale]`, and a fallback row keeps the bare `Codex` text while the HUD
229
+ paints its label with the dedicated `provenance` theme color. Blank, malformed,
230
+ or future non-stale provenance also fails conservatively to that same fallback
231
+ presentation rather than looking native or expanding the compact vocabulary.
232
+
233
+ That label used to spend 11 cells on a ` [fallback]` tag. It now spends none in
234
+ the HUD and one in the text tiers, which is what the user asked for:
235
+ *"이거 간단한 로드맵 거리긴한대 codex[fallback] 하단 status 바대신 주황색의 Codex가나오는게어때"*
236
+ and, once the color-rule options were laid out, *"B로 가자"* — a role color of its
237
+ own rather than a reused threshold color, with `[stale]` left alone. That role
238
+ color is the public `provenance` theme token (`colour208` in the fallback
239
+ theme); see [theme-palette.md](theme-palette.md).
240
+
241
+ Below the bar tiers the segment is colorless, so a fallback row spells
242
+ `Codex^ 5h:17%` there, or `X^ 5h:17%` at the single-letter tier: one ASCII cell
243
+ in place of the tag. A client that cannot paint color, or a theme that sets
244
+ `provenance` to the ordinary label color, therefore shows no fallback signal in
245
+ the HUD at all — the recovery path is the full surface below.
246
+ The exact raw source and closed fallback/stale reason stay
256
247
  in `agent usage --model codex` table/JSON output and in
257
248
  `projmux diagnostics log --component usage`; compact labels never replace
258
249
  those fields.
@@ -329,7 +320,19 @@ When a collection fails, the failure is visible in three places:
329
320
 
330
321
  The row carries the provider and closed source/failure enums and nothing else:
331
322
  `collect-failed` (whole-adapter failure, `level=error`) or `rows-skipped`
332
- (partial failure, `level=info`). Codex rollout fallback records
323
+ (partial failure, `level=info`). A whole Claude failure names its class in
324
+ place of `collect-failed`, also at `level=error`:
325
+ `credentials-unavailable` (no credentials path resolved, or the credentials
326
+ file is missing, unreadable, or unparseable), `credentials-token-empty`,
327
+ `auth-rejected` (a 401 the stored refresh token could not recover from: no
328
+ refresh token, a failed refresh round-trip, or another 401 for the refreshed
329
+ token), `rate-limited` (429), `http-status` (any other non-200 response),
330
+ `network-error` (the request could not be built or sent, or its body could
331
+ not be read), or `response-invalid` (a 200 body that did not parse). The
332
+ class comes from the adapter's typed error, never from its message text. A
333
+ failure without a class stays `collect-failed`, and so does every whole
334
+ Codex failure. Status codes, paths, upstream bodies, and
335
+ credentials never reach the row. Codex rollout fallback records
333
336
  `source=rollout` plus its closed fallback reason; retained data records
334
337
  `source=last-known-good` plus its closed stale reason. A healthy native
335
338
  collection writes no row at all. Identical `(provider, source, failure)`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "projmux",
3
- "version": "0.15.2",
3
+ "version": "0.16.0",
4
4
  "description": "tmux project session manager",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/crevissepartners/projmux#readme",
@@ -28,9 +28,9 @@
28
28
  "package:npm:pack": "scripts/package-npm.sh --pack"
29
29
  },
30
30
  "optionalDependencies": {
31
- "@projmux/linux-x64": "0.15.2",
32
- "@projmux/linux-arm64": "0.15.2",
33
- "@projmux/darwin-x64": "0.15.2",
34
- "@projmux/darwin-arm64": "0.15.2"
31
+ "@projmux/linux-x64": "0.16.0",
32
+ "@projmux/linux-arm64": "0.16.0",
33
+ "@projmux/darwin-x64": "0.16.0",
34
+ "@projmux/darwin-arm64": "0.16.0"
35
35
  }
36
36
  }