Skip to content

Agents panel: status card renders as an empty box when usageStatusText is set without authHelpText #8445

Closed

Description

@davo42002

What happened

In the agents bar widget, the status card's visibility is gated on
usageStatusText, but the text it draws comes from authHelpText
(shell/plugins/agents/Panel.qml:498 and :512):

BorderSurface {
  visible: !!root.provider && String(root.provider.usageStatusText || "") !== ""
  ...
    Text {
      text: root.provider ? String(root.provider.authHelpText || "") : ""

A record with a non-empty usageStatusText and an empty authHelpText
therefore renders the card as an empty red box — border and urgent tint, no
text.

Why this is reachable

shell/plugins/agents/README.md documents adding an agent as an
out-of-tree concern:

Adding an agent therefore never touches this plugin: ship a collector that
prints the record contract (see the claude and codex collectors in
bin/), and the panel gains a tab.

The two fields are independent in that contract, and the combination is a
natural one: an agent whose provider publishes no quota endpoint has a real
status to report ("limits unavailable") but nothing auth could fix, so it has
no help line to offer. I hit this immediately writing a Gemini CLI collector —
Gemini CLI exposes no usage/quota API, so limits is empty and there is no
sign-in advice to give.

The shipped collectors don't surface it because all three happen to set both
fields together or neither, so the mismatch is invisible in-tree.

(Related but distinct: #6987 notes there is no Gemini collector. This report
is about the renderer, and would apply to any collector — in-tree or not —
that reports a status without an auth remedy.)

Latent in stock code too

bin/omarchy-agent-usage-fireworks:501 builds the pair as:

except FireworksError as error:
  record = base_record(usageStatusText="Fireworks unavailable", authHelpText=str(error))

str(error) is empty for any zero-argument exception. Every current
raise FireworksError(...) passes a message, so this doesn't fire today, but
the empty card is one argument-less raise away.

Steps to reproduce

  1. Write any record to ~/.local/state/omarchy/agents/usage/<id>.json with
    usageStatusText set, authHelpText empty, and enough activity for
    providerHasData() (e.g. totalPrompts: 1):

    jq -n '{schemaVersion:1, id:"demo", name:"Demo", ready:true,
            hasLocalStats:true, totalPrompts:1, totalSessions:1, activeDays:1,
            activeDates:["2026-08-26"], recentDays:[], modelUsage:{},
            limits:[], tierLabel:"",
            usageStatusText:"Demo limits unavailable", authHelpText:""}' \
      > ~/.local/state/omarchy/agents/usage/demo.json
  2. Open the agents panel and switch to the Demo tab.

Expected

No card when there is no text to put in it. The hero subtitle already carries
usageStatusText, so the card adds nothing in this state.

Actual

An empty red box between the subscription switch and TOKENS BY DAY.

Suggested fix

Gate the card on the text it actually renders:

visible: !!root.provider && String(root.provider.usageStatusText || "") !== ""
  && String(root.provider.authHelpText || "") !== ""

Alternatively have the card fall back to usageStatusText when
authHelpText is empty — though that duplicates the subtitle.

System

  • Omarchy 4.0.1-1
  • Hyprland 0.56.2
  • Kernel 7.1.9-arch1-2
  • Intel Core i5-1035G7 / Intel Iris Plus Graphics G7

(No diagnostics log attached: omarchy debug is not a command in 4.0.1 —
omarchy commands --all lists no debug/diagnostics entry.)

Activity

  1. omarchybot commented on Oct 4, 2026

    @omarchybot
    Collaborator

    Fixed on quattro by #14049. The agent status card now falls back to usageStatusText when authHelpText is empty, so the reported combination no longer renders an empty box. This incorporates #8497.

    Closing as completed. If the same failure persists after updating to a build containing the fix, please reopen with the collector output.

    Closure scope checked by GPT-6 in Codex and Codex Medium against the reports and landed source. The second opinion agreed; independence is not guaranteed. No runtime tests were rerun for this reconciliation.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions