- The configured Provider Switch now owns the shared agent URL. A restored Provider Tile with the localhost default cannot redirect the whole monitor away from the real agent. Standalone tiles retain their own URL support.
- Settings replies prefer the SDK
settingsenvelope over an emptyparam, allowing cold-start hydration without opening or focusing the inspector. - Added fresh-process startup tests against the real Node app, bundled SDK, WebSocket host and HTTP agent; no inspector/input event is used.
- Working provider editor. Provider rows now use the Ulanzi PI's required
input + labelcheckbox structure, so selected/unselected state is visible and clickable instead of appearing as a read-only text list. - Selected providers have explicit ↑/↓ controls. Their saved
providerIdsorder is now the actual deck cycle order instead of being discarded in favour of the agent response order. - Providers omitted from an older allow-list remain visible under Available providers. This makes OpenAI recoverable by ticking it; All / reset order restores all returned providers in agent order.
- Added pure editor-model and ordered-cycle regression tests plus a real Chromium Property Inspector interaction check.
- Ollama Cloud usage limits. The agent now reads the authenticated
GET /api/usagesession and weekly fractions and sends them as live gauges. The API supplies no reset timestamps, so the deck deliberately shows no made-up countdown. Profile/renewal metadata remains a non-blockingPOST /api/meread. - OpenCode Go provider. Reads
OPENCODE_GO_API_KEYor OpenCode's local auth JSON and renders the official rolling 5-hour, weekly and monthly usage windows. The new optional Monthly Provider Tile slot shows the third window. - Per-switch provider selection. Provider Switch settings now list the providers returned by the agent as checkboxes; each switch cycles only its selected allow-list. Existing saved switches retain their all-provider behavior.
- Treat Hermes's structured
logged_in:falseNous response as the supported configured-fallback state, not as a malformedno jsonfetch failure. Retry login discovery every 15 minutes and log the fallback notice once per agent process, while keeping real helper failures visible with the exit status.
- OpenAI/Codex usage provider. The agent now reads the live ChatGPT account
usage payload used by the official Codex CLI and exposes its real rate-limit
windows as an
OpenAIprovider. It reads Codex auth but never refreshes, rewrites, or logs it. - Window labels are duration-aware (
5H,DAY,WEEK, etc.). If an account has only the current weekly window, the first tile shows its plan and the second shows the weekly ring gauge; dual-window accounts populate both gauges. - A bounded tail-read of recent Codex rollout JSONL supplies a stale fallback on cold start when the live usage request is temporarily unavailable. The existing per-provider last-good cache handles later transient failures.
- Added Python probe tests and a synthetic D200H-safe OpenAI render test.
- The live preview now treats an upstream provider error as a valid, asserted error-card state while still requiring the new OpenAI provider to be live.
- Fixed
pack.shreturning a false failure after successful zip creation underpipefail(tail | headSIGPIPE); archive listing now reads cleanly to EOF.
Studio-restart resilience (plugin-only; agent unchanged).
Root cause (observed live 2026-07-02): after an Ulanzi Studio restart the Property
Inspector still shows the saved Agent address, but Studio does not re-deliver the
stored key settings to the plugin's Node backend — so the sampler silently fell back
to the 127.0.0.1:9890 default and every key showed "agent off" until the user
re-saved any setting by hand.
- Persist the agent address. Every applied address change is written to
plugin/monitor/.agent-url.json(fail-open); on startup the sampler begins from the persisted address instead of the localhost default. A Studio restart that drops the settings no longer takes the deck down. - Actively pull missing settings. When a key is (re-)added without its stored
params, the plugin now calls
getSettingsand consumes thedidReceiveSettingsreply — at most once per key, so never-configured keys can't loop.
Nous freshness + observability (agent-only; plugin unchanged from 1.1.0).
- Faster live refresh:
INF_NOUS_LIVE_TTLdefault 300s → 60s, so the tile tracks the account API within ~1 min instead of up to 5 min. (Residual gap to the portal dashboard is Nous-side eventual consistency —/api/oauth/accounttrails the portal UI slightly and can't be eliminated programmatically.) - Freeze is now visible, not silent: if the live fetch fails, the agent still
serves the last-good value but now (a) logs
nous live …outcomes to the journal (journalctl -u inf-agent), and (b) flagsstale+live_age_sonce the last successful fetch ages pastNOUS_STALE_AFTER(3×TTL) → the switch tile shows the amber dot. Previously a failing helper froze the value with no indication.
- Live Nous balance & plan (agent). The agent now reads the real portal
subscription + purchased credits (e.g. Plus / $18.93 / $22-mo) by delegating
to hermes's own
get_nous_portal_account_info()run in the hermes venv — the sanctioned path that refreshes + persists the single-use token with hermes's locking (the agent still NEVER calls the refresh endpoint itself). CachedINF_NOUS_LIVE_TTL(default 300s). Precedence: live >INF_NOUS_*env fallback > rate-limits. New env:INF_NOUS_HELPER_PY,INF_NOUS_HELPER_CWD,INF_NOUS_LIVE_TTL. (Plugin unchanged from 1.1.0 — this is an agent-only release; the bundled plugin zip is bumped for version parity.)
Bug-fix release from on-device feedback.
- Ring gauge double segment (fix): the progress arc used
stroke-dasharraywithpathLength="100", but the D200H's SVG renderer ignorespathLength— so the normalised dash was read in real user units and tiled a spurious SECOND arc. Now drawn as an explicit<path … A …>arc (one definite start/end), renderer-agnostic. - Transient "usage HTTP 4xx" on tiles (fix): the agent now keeps a per-provider
last-good cache. When a probe briefly fails — e.g. Claude's OAuth token 401s while
Claude Code rotates it — the tile shows the last good value marked
stale(amber dot on the switch key) instead of an error card. Only a never-succeeded provider shows an error. - Nous showed "Free" (fix): the hermes
nous-portal.jsontoken is the hermes-agent free-tier identity (and was logged out/expired), so the old probe mislabeled the real account as Free. The probe no longer infers "Free" from the stale JWT. Plan & balance now come fromINF_NOUS_PLAN/INF_NOUS_BALANCEoverrides (authoritative) or the liveGET /api/oauth/accountonly when a valid token exists. The agent NEVER calls the Nous refresh endpoint (single-use; only hermes may rotate it — reuse revokes the whole session). The balance tile now shows the plan as its caption.
Initial release — sibling of ulanzi-system-monitor for inference providers.
- inf-agent (stdlib Python): one
GET /providerssnapshot for Claude, OpenRouter, Nous and Ollama Cloud, refreshed every 60s.- Claude: session (5h) + week (7d) utilisation % and resets, via the Anthropic
OAuth
usage/profileendpoints (reads the Claude Code token, never refreshes it). Plan headline (e.g. "Max 20x"). - OpenRouter: balance (
credits) + spend today/week/month (key). - Nous: tier, spend and rate limits decoded locally from the portal JWT (free tier).
- Ollama Cloud: plan + billing-period renewal (no usage API exists → no session/week %).
- Token guard (
INF_AGENT_TOKEN), bind address, poll interval, provider list and credential paths all configurable via env.
- Claude: session (5h) + week (7d) utilisation % and resets, via the Anthropic
OAuth
- Plugin (reuses the System Monitor interface model):
- Provider Switch cycler key — each press selects the next provider.
- Provider Tile — Primary/Secondary slot renders the active provider: session/week ring gauges for limit providers, balance/spend value cards for balance providers, with graceful fallbacks (plan/renewal, rate limits).
- Single
ProviderSamplerwith the no-wedge guaranteed-settle fetch from RemoteSampler; per-key independent rendering keyed by stable actionid. - Dark/Light themes; configurable refresh (5/10/30s).
- Added
robot+swap-horizontalto the MDI icon subset for provider glyphs.