Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
06088bb
release: start 0.1.1-beta.15.4 and admit the beta.15.3 tag and merge …
HANCORE-linux Sep 26, 2026
ea7713d
fix: render Hearthstone picker card titles sharply while cards are tr…
HANCORE-linux Sep 26, 2026
16850c8
fix: keep the Health route visible when the compact Control Center sh…
HANCORE-linux Sep 26, 2026
970e445
feat: show every AI usage window with reset countdown, pace and daily…
HANCORE-linux Sep 26, 2026
09a9e40
docs: clarify the restrictive-umask recovery in the beta.15.3 release…
HANCORE-linux Sep 26, 2026
ee02f2b
test: keep two fixtures independent of the caller's umask
HANCORE-linux Sep 26, 2026
2c67976
feat: count Live and Recent notifications without opening the panel
HANCORE-linux Sep 26, 2026
af9fc2a
feat: group notifications by app with sanitized bodies and relative t…
HANCORE-linux Sep 26, 2026
c30058d
fix: dispatch Live notification clicks only to the exact current row
HANCORE-linux Sep 26, 2026
9e8bf50
feat: focus the source app when a Recent notification is clicked
HANCORE-linux Sep 26, 2026
3e80b96
feat: show CPU history and equal-weight GPU usage in the CPU panel
HANCORE-linux Sep 26, 2026
1ba8a9f
feat: show memory as a ring with GiB values in the Memory panel
HANCORE-linux Sep 26, 2026
6890b41
feat: restyle the media panel with a spinning vinyl and player metadata
HANCORE-linux Sep 26, 2026
abee838
feat: adopt the Omarchy agents panel layout for AI usage
HANCORE-linux Sep 26, 2026
efa3435
feat: restyle the CPU panel as system monitor cards with load average
HANCORE-linux Sep 26, 2026
ff8650b
feat: add shuffle, repeat and seek controls to the media panel
HANCORE-linux Sep 26, 2026
b4b07d3
feat: restyle the AI usage panel with a compact token chart and limit…
HANCORE-linux Sep 26, 2026
6ce494a
feat: restyle the CPU panel with a history chart and sticky GPU row
HANCORE-linux Sep 26, 2026
1aa8e1d
feat: restyle the Memory panel with a symbol ring and metric grid
HANCORE-linux Sep 26, 2026
89108bd
feat: show media controls as rounded buttons in one row
HANCORE-linux Sep 26, 2026
5e20398
fix: use one font size per text role in the AI usage panel
HANCORE-linux Sep 26, 2026
9bb53d7
feat: show CPU and memory load as water-filled rings
HANCORE-linux Sep 26, 2026
fafc7cd
fix: read the CPU model and load average when the CPU panel opens
HANCORE-linux Sep 27, 2026
cf4c262
feat: remove the history chart from the CPU panel
HANCORE-linux Sep 27, 2026
03da9fe
feat: name the GPU in the CPU panel title only when its row is shown
HANCORE-linux Sep 27, 2026
ec7bfe3
feat: show the RAM type and speed in the Memory panel
HANCORE-linux Sep 27, 2026
862a92f
fix: count and focus Recent notifications without Live access
HANCORE-linux Sep 27, 2026
cbe65fe
fix: omit the unavailable Live count from the notification tooltip
HANCORE-linux Sep 27, 2026
99b30c5
build: align the production boundary with the approved beta.15.4 payload
HANCORE-linux Sep 27, 2026
a9ebae9
release: pin beta.15.4 and cover beta.15.3 checkout updates
HANCORE-linux Sep 27, 2026
0340578
build: remove the Local AI attribution from four panels
HANCORE-linux Sep 27, 2026
f4469ae
fix: keep fresh AI usage visible after a failed provider refresh
HANCORE-linux Sep 27, 2026
ca7148e
docs: add the beta.15.4 release notes and changelog
HANCORE-linux Sep 27, 2026
93df25c
test: allow the approved MPRIS control exception in the media owner g…
HANCORE-linux Sep 27, 2026
595fc6f
test: align contract guards with the approved beta.15.4 panels
HANCORE-linux Sep 27, 2026
97007a5
build: update beta.15.4 release archive checksum
HANCORE-linux Sep 27, 2026
8bb3293
fix: format AI token counts compactly like Omarchy
HANCORE-linux Sep 27, 2026
4b7098d
feat: animate the water rings in the CPU and memory panels
HANCORE-linux Sep 27, 2026
b4e4f51
docs: note the compact AI token units and animated water rings
HANCORE-linux Sep 28, 2026
6594b98
build: update beta.15.4 release archive checksum
HANCORE-linux Sep 28, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 9 additions & 4 deletions .github/release-notes/v0.1.1-beta.15.3.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,15 @@ git checkout v0.1.1-beta.15.3
- Beta.15.1 was tagged but not published as a GitHub release.
- Source checkouts cloned with a restrictive `umask` such as 077 now keep a
stable payload identity. If an earlier release was installed from such a
checkout and `update` is refused, run
`./scripts/shibumi-suite uninstall --keep-settings --yes` from that checkout,
then check out `v0.1.1-beta.15.3` and run
`./scripts/shibumi-suite install --yes`.
checkout and `update` is refused, uninstall with the release you had
installed while keeping your settings, then install Beta.15.3:

```bash
git checkout v0.1.1-beta.15.2 # the tag you had installed
./scripts/shibumi-suite uninstall --keep-settings --yes
git checkout v0.1.1-beta.15.3
./scripts/shibumi-suite install --yes
```
- No visible interface changes are included.
- The notes of 0.1.1-beta.15 remain valid.
- AUR publication remains deferred.
59 changes: 59 additions & 0 deletions .github/release-notes/v0.1.1-beta.15.4.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# 0.1.1-beta.15.4

Beta.15.4 refreshes Shibumi's AI, CPU, Memory, and media panels and improves
notification history, picker text, and the Control Center.

## Highlights

- The compact AI panel shows a seven-day token chart, reported limit windows
with reset countdowns and pace, and the plan name when available. Text uses
consistent sizes for labels, content, and values.
The AI widget keeps its value when a provider refresh times out.
- The CPU panel now follows the Memory panel's layout, with a water-filled
load ring, CPU model, and load averages. A GPU row appears after reported
activity; the title follows its visibility as "CPU" or "CPU · GPU".
- The Memory panel combines a water-filled load ring with GiB values and,
when available, RAM type and speed in MT/s.
- The water rings in the CPU and Memory panels move gently while a panel is
open.
- The media panel has five rounded buttons in one row: Shuffle, Previous,
Play/Pause, Next, and Repeat. Shuffle, Repeat, and seeking are available
where the player supports them.
- Notifications are counted without opening the panel, grouped by app, and
shown with relative times. Clicking a Recent entry focuses an existing
window of its app.
- Hearthstone picker card titles stay sharp while the cards are transformed.
- The compact Control Center no longer clips the Health page.
- Buttons in the redesigned panels follow the panel's corner radius.

## Compatibility

Beta.15.4 targets the repository's pinned Omarchy 4.0.4 package and source
baselines with Quickshell 0.3.1. It does not update Omarchy.

Update a Beta.15 through Beta.15.3 source installation from its existing checkout:

```bash
git fetch --tags
git checkout v0.1.1-beta.15.4
./scripts/shibumi-suite update --yes
```

## Notes

- On the pinned Omarchy 4.0.x hosts, the plugin API does not expose Live
popups. Shibumi therefore shows Recent history and omits the Live section
from the tooltip.
- Source checkouts cloned with a restrictive `umask` such as 077 now keep a
stable payload identity. If an earlier release was installed from such a
checkout and `update` is refused, uninstall with the release you had
installed while keeping your settings, then install Beta.15.4:

```bash
git checkout v0.1.1-beta.15.2 # the tag you had installed
./scripts/shibumi-suite uninstall --keep-settings --yes
git checkout v0.1.1-beta.15.4
./scripts/shibumi-suite install --yes
```
- The notes of 0.1.1-beta.15 remain valid.
- AUR publication remains deferred.
11 changes: 8 additions & 3 deletions ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,8 @@ The lifecycle contract and uncompleted physical gates are defined in

### Ownership, Performance, And Safety

- Every platform capability has one authoritative state and action owner.
- Every platform capability has one authoritative state and action owner,
except the explicitly scoped media-panel controls documented under G9 below.
Quattro or Quickshell remains authoritative when it exposes a sufficient
service contract.
- Shibumi adds a narrow adapter only when the host contract cannot produce the
Expand Down Expand Up @@ -843,9 +844,13 @@ Current Phase 2 foundation:
repository-owned compatibility contract rather than inferred from mutable
installed files.
- G9 replaces only the official media presentation. The keep-loaded
`omarchy.media` service remains the sole MPRIS/PipeWire selection and action
`omarchy.media` service remains the MPRIS/PipeWire selection and transport-action
owner while Shibumi views supply the default row, FULL/muse row, lazy panel,
progress, cover art, and source selection;
progress, cover art, and source selection. The approved panel-only exception is
direct shuffle, repeat and seek through the selected native MprisPlayer's public
properties, gated by its current capabilities. Seek also requires supported
position/length and the same player/track as at press. No discovery, process,
IPC owner or OSD is added; previous/play/pause/next still use Omarchy `runAction`;
- closed media views are worker-free. One lazy process-wide Shibumi spectrum
service owns the optional Cava capability/default-sink probe, bounded Cava
process, streamed configuration, degraded state, and cleanup. It runs only
Expand Down
52 changes: 51 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,56 @@
# Changelog

## [0.1.1-beta.15.3] - Unreleased
## [0.1.1-beta.15.4] - Unreleased

### Added

- Show reported AI limit windows with reset countdowns and pace, a seven-day
token chart, and the provider's plan name when available.
- Show the CPU model and load averages when the CPU panel opens, and optional
RAM type and speed in MT/s when the Memory panel opens.
- Add player-supported Shuffle, Repeat, and seek controls to the media panel.
- Count notifications without opening the panel, group them by app, show
relative times, and focus an existing app window from a Recent entry.
- Admit the exact Beta.15.3 tag and merge checkout revisions as update
predecessors while preserving strict payload and lifecycle checks.

### Changed

- Use consistent text roles in the compact AI panel.
- Arrange CPU and Memory metrics around water-filled load rings. Remove the
CPU panel history chart while retaining the bar's history.
- Show the GPU row only after reported activity and retain it while idle;
use "CPU · GPU" as the title only while the row is visible.
- Arrange the five media buttons in one row and make buttons in the
redesigned panels follow the panel radius.
- Omit the notification tooltip's Live section when the host exposes no
Live model; keep Recent counts and Do Not Disturb status.
- Show AI token counts in compact K/M/B units, matching Omarchy.
- Animate the water rings in the CPU and Memory panels while a panel is
open.

### Fixed

- Keep the AI usage value visible when a slow provider refresh exceeds its
time limit, and mark usage older than two refresh intervals as stale in
the panel.
- Bind Live notification actions to the exact current row and reject stale
clicks after replacement or reordering.
- Keep Hearthstone picker card titles sharp during transforms.
- Keep the Health page visible in the compact Control Center.

### Validation

- Pin the final 24-plugin Beta.15.4 payload and package identity without
inventing future tag or merge revisions.
- Add a Beta.15.3 tag-checkout update arm to the isolated Quattro runtime
fixture, retaining the existing package, fresh-install, Beta.15, and
Beta.15.2 arms and their lifecycle checks.
- Cover the changed panels, lazy telemetry reads, notification counts and
actions with scoped regressions. Keep restrictive-umask fixtures independent
of the caller's umask.

## [0.1.1-beta.15.3] - 2026-09-26

### Fixed

Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.1.1-beta.15.3
0.1.1-beta.15.4
5 changes: 3 additions & 2 deletions contracts/backend-boundary-v1.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
{"scope":"rule","source":"hancore.shibumi.power-state/Service.qml","kind":"helper","kindValue":"omarchy-powerprofiles-list","category":"omarchyBackend","owner":"hancore.shibumi.power-state","capability":"power-profile","count":1,"backend":"omarchy.power","removalStep":"Step 6"},
{"scope":"rule","source":"hancore.shibumi.status/Service.qml","kind":"helper","kindValue":"/tmp/omarchy-screenrecord-filename","category":"omarchyBackend","owner":"hancore.shibumi.status","capability":"recording-voxtype","count":1,"backend":"omarchy.recording","removalStep":"Step 8"},
{"scope":"rule","source":"hancore.shibumi.status/Service.qml","kind":"helper","kindValue":"omarchy-voxtype-status","category":"omarchyBackend","owner":"hancore.shibumi.status","capability":"recording-voxtype","count":1,"backend":"omarchy.voxtype","removalStep":"Step 8"},
{"scope":"hostIdRule","target":"omarchy.agents","category":"omarchyBackend","owner":"hancore.shibumi.ai","capability":"ai-usage","count":10,"backend":"omarchy.agents","removalStep":"Step 8"},
{"scope":"hostIdRule","target":"omarchy.agents","category":"omarchyBackend","owner":"hancore.shibumi.ai","capability":"ai-usage","count":13,"backend":"omarchy.agents","removalStep":"Step 8"},
{"scope":"hostIdRule","target":"omarchy.audio","category":"omarchyBackend","owner":"hancore.shibumi.audio","capability":"audio","count":13,"backend":"omarchy.audio","removalStep":"Step 4A"},
{"scope":"hostIdRule","target":"omarchy.media","category":"omarchyBackend","owner":"hancore.shibumi.media","capability":"media","count":9,"backend":"omarchy.media","removalStep":"Step 7"},
{"scope":"hostIdRule","target":"omarchy.model-usage","category":"omarchyBackend","owner":"hancore.shibumi.ai","capability":"ai-usage","count":8,"backend":"omarchy.model-usage","removalStep":"Step 8"},
Expand Down Expand Up @@ -361,7 +361,7 @@
],
"hostIdRules": [
{"target":"omarchy.active-window","count":2,"category":"hostIntegration","owner":"quattro.host","capability":"bar-host-routing"},
{"target":"omarchy.agents","count":10,"category":"omarchyBackend","owner":"hancore.shibumi.ai","capability":"ai-usage","backend":"omarchy.agents","removalStep":"Step 8","reason":"Remove private Agents provider identifiers after the Shibumi provider adapter is authoritative."},
{"target":"omarchy.agents","count":13,"category":"omarchyBackend","owner":"hancore.shibumi.ai","capability":"ai-usage","backend":"omarchy.agents","removalStep":"Step 8","reason":"Remove private Agents provider identifiers after the Shibumi provider adapter is authoritative."},
{"target":"omarchy.audio","count":13,"category":"omarchyBackend","owner":"hancore.shibumi.audio","capability":"audio","backend":"omarchy.audio","removalStep":"Step 4A","reason":"Remove the official audio component and its compatibility identity after native Audio activation."},
{"target":"omarchy.bar","count":12,"category":"hostIntegration","owner":"quattro.host","capability":"bar-host-routing"},
{"target":"omarchy.bluetooth","count":8,"category":"hostIntegration","owner":"hancore.shibumi.bluetooth","capability":"bluetooth"},
Expand Down Expand Up @@ -399,6 +399,7 @@
{"value":"omarchy-cmd-missing","count":1,"category":"hostIntegration","owner":"quattro.host","capability":"bar-host-routing"},
{"value":"omarchy-cmd-present","count":4,"category":"hostIntegration","owner":"quattro.host","capability":"bar-host-routing"},
{"value":"omarchy-dev","count":2,"category":"hostIntegration","owner":"quattro.host","capability":"bar-host-routing"},
{"value":"omarchy-hyprland-focus-app","count":1,"category":"omarchyAction","owner":"quattro.host","capability":"notifications","reason":"NotificationAdapter.qml invokes the public focus helper through an argv-only Process for Recent entries; it neither launches apps nor replays notification actions."},
{"value":"omarchy-keyboard-panel","count":18,"category":"hostIntegration","owner":"quattro.host","capability":"bar-host-routing"},
{"value":"omarchy-launch-floating-terminal-with-presentation","count":3,"category":"omarchyAction","owner":"quattro.host","capability":"omarchy-update-action"},
{"value":"omarchy-launch-or-focus-tui","count":4,"category":"omarchyAction","owner":"quattro.host","capability":"bar-host-routing"},
Expand Down
63 changes: 63 additions & 0 deletions contracts/lifecycle-predecessors-v1.json
Original file line number Diff line number Diff line change
Expand Up @@ -624,9 +624,72 @@
],
"settingsStorageVersion": 1,
"sourceRevisions": [
"5b1d21f0cea73bb9e7997278a828b3ef295e6c94",
"db579163a4b1004a7cc09ee565cac616db9ff627",
"package:0.1.1-beta.15.3"
],
"suiteVersion": "0.1.1-beta.15.3"
},
{
"id": "public-beta.15.4",
"payloadDigest": "5686a127809125ea0b715f41fd4cf9d9bc6817b372ce8b0370dcb42337a616fa",
"pluginDigests": {
"hancore.shibumi.bar": "fd1d69f365d08ad06dd52e0cb19892ac935109752f6be4b80e2a20adaf3e7fb9",
"hancore.shibumi.state": "8bdbe450c842f7bc6b6483edb652389370201babdef52ae792a9700b51269af4",
"hancore.shibumi.control-center": "2ee96573dc0ea3835a21bbe5acc8f9dfaa8acfe811e00f220598f427352c54cf",
"hancore.shibumi.reactor": "b32cc5ac9d1394254d0c092f83ee2067d17e3d6339dbd63290aedb4f595cf436",
"hancore.shibumi.telemetry": "c0a2d79bfe338e33bfbf492bcbbbc333aba2f723057268265cfab2e556acb332",
"hancore.shibumi.power-state": "b0a25028a9ef266e0593dcad6e5d9133478f6b4754b7a3fa0756e927f754d88d",
"hancore.shibumi.workspaces": "9c19d443cca3e15c3977296fd1dea6c85aa27ba13d2c36991524fdb115dee629",
"hancore.shibumi.update-center": "2382455e00ded224236931fe9ca892bbe7f913fbb8f020b56511d3fb736e700f",
"hancore.shibumi.status": "1716e7ceaff65c45a78c45cdf99b27d59536e76a4f27b889e2168bc8ab3d8a3e",
"hancore.shibumi.memory": "761096b841d78a0b75a76577d12d5378a1c38ba9c2bdacdf35fb8d97e0f8ab6a",
"hancore.shibumi.cpu": "1c1ab2bc7a5e0f2b2c7a7ca8921a63dbe765ecef273abda1d4acbe0f7b20b43b",
"hancore.shibumi.audio": "6e39beda5d952e7828ef727f07dd1300228c8c1715a4c32ca3571b3df889404e",
"hancore.shibumi.ai": "8abd9feb2cc5b9fee5e140ca3c79f4cc9b273ceec1f4ccebc4f6863be7686e68",
"hancore.shibumi.center": "11952ccdb8379bb54fdcf7196b5b3324792a0236d8b9fd3a5c3dcab7c65cac7d",
"hancore.shibumi.media": "7423c21d1e248c87e46bfa050427047fae2a69875447ebd1a62ec892d857bd08",
"hancore.shibumi.quick-access": "1cfe183baa98f3cd662b841f38188ec4a01c6937ced45790318d4c13dfeb484d",
"hancore.shibumi.network": "d885f84b76fa3219767910d49edb9adb79b20c676e05ff0a104e7dfa2d7d6e8a",
"hancore.shibumi.battery": "420bb2f196310d48d679c661605eded0489e1928d1ca81fa8801b7893a88dd25",
"hancore.shibumi.brightness": "655e1c7a89c010ff35031ce48f61c167a680b40b3e91cbd1d1d5cab344cf5fb7",
"hancore.shibumi.power-profile": "9bbd0a75a4ed39c6491bb81de0c407fefef14886626f8f25678f207a96414bca",
"hancore.shibumi.bluetooth": "b76fd398a2398a71086a4fc74bc6896386499e6b9bbca83e99e25f456a5c3953",
"hancore.shibumi.temperature": "fbffe15654561999dab251c27f88702c5273d4e323258f39820406e7d2d9eeca",
"hancore.shibumi.gpu": "6b7b40ae466dad7b127a219750675d023b2849b9e4d3337a58505b776a667e3a",
"hancore.shibumi.storage": "7ec9ba216960a12a5a65664da36d215acc0b5cc170bcc05b4930316b2fd8ac44"
},
"pluginIds": [
"hancore.shibumi.bar",
"hancore.shibumi.state",
"hancore.shibumi.control-center",
"hancore.shibumi.reactor",
"hancore.shibumi.telemetry",
"hancore.shibumi.power-state",
"hancore.shibumi.workspaces",
"hancore.shibumi.update-center",
"hancore.shibumi.status",
"hancore.shibumi.memory",
"hancore.shibumi.cpu",
"hancore.shibumi.audio",
"hancore.shibumi.ai",
"hancore.shibumi.center",
"hancore.shibumi.media",
"hancore.shibumi.quick-access",
"hancore.shibumi.network",
"hancore.shibumi.battery",
"hancore.shibumi.brightness",
"hancore.shibumi.power-profile",
"hancore.shibumi.bluetooth",
"hancore.shibumi.temperature",
"hancore.shibumi.gpu",
"hancore.shibumi.storage"
],
"settingsStorageVersion": 1,
"sourceRevisions": [
"package:0.1.1-beta.15.4"
],
"suiteVersion": "0.1.1-beta.15.4"
}
]
}
2 changes: 1 addition & 1 deletion contracts/plugin-suite-v1.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"schemaVersion": 1,
"suiteId": "hancore.shibumi",
"suiteVersion": "0.1.1-beta.15.3",
"suiteVersion": "0.1.1-beta.15.4",
"settingsStorageVersion": 1,
"hostContract": "contracts/host-facade-v1.json",
"retiredPlugins": [
Expand Down
5 changes: 4 additions & 1 deletion docs/phase2-ownership-map.md
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,10 @@ Shibumi component consumes `shell.firstPartyServiceFor("omarchy.media")` and
the original `omarchy.media` bar alias is suppressed, but the official service
stays loaded and authoritative for player selection, ghost filtering, action
routing, source switching, PipeWire stream correlation, and OSD feedback. The
Shibumi views own only presentation and lazy panel state. One lazy process-wide
Shibumi views own presentation and lazy panel state, with the approved panel-only
exception of capability-gated shuffle/repeat/seek on the selected native player.
Transport still delegates to Omarchy; no discovery, IPC owner or OSD is added.
One lazy process-wide
Shibumi spectrum service owns the optional Cava probe, process, degraded state,
lease accounting, and cleanup. Per-output, per-panel, or per-view Cava owners
are prohibited even though the spectrum is not a second media-state owner.
Expand Down
16 changes: 11 additions & 5 deletions hancore.shibumi.ai/AgentUsageModel.js
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ function validRecordShape(record, expectedId) {

function hasDisplayData(record, limits) {
// All-time counters establish that this fresh record represents an actually
// used provider, but they are never copied into Shibumi's current model rows.
// used provider; all-time model rows do not imply current activity.
return limits.length > 0
|| nonNegativeNumber(record.todayPrompts) > 0
|| nonNegativeNumber(record.todaySessions) > 0
Expand Down Expand Up @@ -109,6 +109,7 @@ function limitSnapshot(limits, index) {
label: boundedString(limit.label,
index === 0 ? "Primary" : "Secondary"),
percent: limit.percent,
title: typeof limit.title === "string" ? boundedString(limit.title, "") : "",
resetsAt: boundedString(limit.resetsAt, "")
}
}
Expand All @@ -133,7 +134,7 @@ function parseRecord(raw, expectedId, nowMs) {
for (var index = 0; index < rawLimits.length; index++) {
var limit = limitSnapshot(rawLimits, index)
if (!limit) return null
if (limits.length < 2) limits.push(limit)
if (limits.length < 6) limits.push(limit)
}
if (!hasDisplayData(record, limits)) return null

Expand All @@ -143,6 +144,13 @@ function parseRecord(raw, expectedId, nowMs) {
providerId: boundedString(record.id, ""),
providerName: boundedString(record.name, record.id),
ready: record.ready === true,
limits: limits,
recentDays: (Array.isArray(record.recentDays) ? record.recentDays : [])
.filter(day => isPlainObject(day) && typeof day.date === "string" && validTimestamp(day.date + "T00:00:00Z")
&& isNonNegativeRecordNumber(day.messageCount))
.map(day => ({ date: day.date, messageCount: day.messageCount }))
.sort((a, b) => a.date.localeCompare(b.date)).slice(-7),
modelUsage: record.modelUsage,
rateLimitPercent: primary ? primary.percent : -1,
rateLimitLabel: primary ? primary.label : "",
rateLimitResetAt: primary ? primary.resetsAt : "",
Expand All @@ -157,9 +165,7 @@ function parseRecord(raw, expectedId, nowMs) {
activeDays: nonNegativeNumber(record.activeDays),
windowTokens: 0,
hourlyTokens: 0,
// Keep the existing Shibumi presentation stable. Omarchy's agents record
// exposes all-time model aggregates, while the current panel's model rows
// are explicitly labeled as recent activity.
// The service formats modelUsage separately as all-time aggregates.
models: [],
tierLabel: boundedString(record.tierLabel, ""),
usageStatusText: boundedString(record.usageStatusText, ""),
Expand Down
Loading
Loading