Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
26 changes: 25 additions & 1 deletion DESIGN.md
Original file line number Diff line number Diff line change
Expand Up @@ -1591,6 +1591,30 @@ Alert rows of the table above from the `--droplet-*` roles in `src/styles.css`.
the email or login right-aligned and ellipsized, then one row per limit (label, reset time, right-aligned percent) over a 4px bar. A problem
note is dim, red for an expired sign-in or a failed request.

### PC load (`.machine-stats`)
- Shown while Settings → Remote PCs → **PC load in the sidebar** is on, for this device only. Until
it is flipped it follows the roster: on while two or more PCs are connected, off for a lone PC,
whose load is not what tells PCs apart.
- Under an expanded, connected PC's name and above its workspaces: one button holding three
meters in a row, each a label, the percent in `tabular-nums` and a 3px bar on a `--border-strong`
track (the plan meters' construction): **CPU**, **Memory** (without the file cache) and
**Disk** (the fullest of the disks that hold the root and home folder), and a caret at the end
that opens the numbers behind them: memory used and total, load average and core count, uptime
and a bar per disk. From 85% the percent and bar take `--status-blocked`, as the plan meters do
from 80%; amber stays chrome. The open or closed choice is kept per PC in this browser.
- It is drawn only for a PC that can say: a PC whose bridge is from before `GET /api/system`
shows nothing, and so does one that has not answered yet. A figure the PC cannot measure
is a dash, never `0%`. The meters are drawn only; the button's label carries the numbers for a
screen reader ("Show system details for Work PC. CPU 4%, Memory 22%, Disk 50%").
- Nothing is read for a PC that is folded, offline or in a hidden tab, nor while the sidebar, its
PCs list or a phone's drawer is closed. The next ask starts 5 s after the last one came back or
timed out, so a stuck PC never has more than one open, and a reading no ask has renewed for a
minute is dropped rather than shown as now. A herdr-core machine shows none: its server runs on
the PC that reaches it, which cannot read that machine's load.
- Reference: no app listed in `src/AGENTS.md` shows a machine's load in its project list that I
know of (they assume one machine); this follows the app's own plan meters and PC group header,
and differs only in measuring a PC instead of a subscription. No code is borrowed.

### New workspace dialog
- Agent select comes from `GET /api/agents`; shell-only is always available. The bridge offers the
agents it types into the pane's shell itself (omo, gjc) exactly where it can start them: its own
Expand Down Expand Up @@ -3351,7 +3375,7 @@ Alert rows of the table above from the `--droplet-*` roles in `src/styles.css`.
herdr's focus), **Alerts**, **Voice input**, **Agents**,
**Shortcuts** (the platform-resolved global bindings), **Phone & devices** (Connect a phone,
Keep screen on, Install; then Portal, where the server offers it; then paired devices; then Access),
**Remote PCs** (Add PC, Update PC bridges automatically; then **Show in sidebar**), **About** (Updates, herdr, the repository links). A button that points at
**Remote PCs** (Add PC, Update PC bridges automatically, PC load in the sidebar; then **Show in sidebar**), **About** (Updates, herdr, the repository links). A button that points at
Updates opens the dialog on About.
- Every page is built from the same parts (`components/SettingsControls.tsx`). A group is an
optional caption (`--fs-sm`, `--fw-semibold`, `--text-dim`, sentence case) over one card:
Expand Down
8 changes: 8 additions & 0 deletions changelog.d/pc-system-load.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
### Added
- Each PC in the sidebar shows its CPU, memory and fullest disk as three small meters under its
name. Tap them for memory used, load average, uptime and every disk. A figure at 85% or more
turns red. Nothing is read for a PC that is folded, offline or in a background tab, or while the
sidebar is closed, and a PC whose bridge is from before this release shows nothing until its
bridge is updated. A herdr-core machine shows none. It is on by
default once two or more PCs are connected; Settings → Remote PCs → PC load in the sidebar turns
it on or off on this device.
1 change: 1 addition & 0 deletions docs/development.md
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,7 @@ bun scripts/sidebar-split-demo-regression.ts # PCs/Agents height split at 390 an
bun scripts/sidebar-split-access-demo-regression.ts # divider review regressions: filter context and focus return, forced-colors focus, short folded phone windows, click-to-focus, live drag percentage, pointer ownership and cancellation, held-snap regrouping and two-line Agents minimums in both densities/orders; synthetic demo only
bun scripts/sidebar-activity-demo-regression.ts # Agents order Activity and pins: blocked pinned, recency, Pin agent / Unpin agent and Pin workspace / Unpin workspace from a right-click and the context-menu key, the ⋯ on a phone, and a finish opened here drawn as ready until the next one
bun scripts/hide-pc-demo-regression.ts # Remote PCs → Show in sidebar at 390 and 1440 on two demo PCs: a hidden PC leaves the sidebar, Agents and palette, the selection moves, the last PC stays, a reload keeps it, its link still opens, the sidebar's note shows it again
bun scripts/pc-load-demo-regression.ts # Remote PCs → PC load in the sidebar on three demo PCs at 390 and 1280: on by default, red from 85%, none for a herdr-core machine, no ask while the drawer or list is out of view, off in its own key; the meters fit a 240px sidebar; screenshots light and dark in UI_EVIDENCE_DIR
bun scripts/sidebar-filter-demo-regression.ts # the roster's label filter on two demo PCs: fuzzy matches with their ancestors, the selection kept as context, pins and folds untouched, a live and an offline roster, the drawer and a reload clearing it; screenshots at 390 and 1440 in UI_EVIDENCE_DIR
bun scripts/sidebar-branch-line-demo-regression.ts # herdr's branch line: a repository and an unmarked git folder say their branch under the name, worktrees and folders outside git stay one line, desktop and phone, dark and light
bun scripts/agent-lock-demo-regression.ts # Lock agent on a pinned Agents row (#2432): only a pinned row locks, a locked one keeps its pin, draws a lock and its tab offers no Close tab; Unlock brings Unpin back; 390 and 1280, light and dark
Expand Down
1 change: 1 addition & 0 deletions docs/guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -334,6 +334,7 @@ across an Ovis restart, which forgets where it saw each `letta` before. Check th
| **Search the conversation** | **Search conversation**, from the pane's menu (right-click on a desktop, the tab's ⋯ on a phone) or the command palette, finds a word in what you wrote and in the agent's answers, earlier pages included; tool output, thinking and progress notes are left out. Matches list newest first as snippets; picking one opens the chat at that message, loading the earlier messages up to it. Nothing in the chat is highlighted, and the phone's screen gains no button. A remote PC offers it once its bridge is updated to one that searches. |
| **Find in terminal** | **More → Find in terminal** or Mod+Shift+F searches literal text in herdr's history, with a match count, previous/next navigation and visible match highlights. Search jumps and scrolling move the same viewport in every attached client, including the TUI. Older bridges retain search navigation without automatic highlights. |
| **Jump across PCs** | The command palette (Mod+Shift+K) searches all connected PCs at once by PC, workspace, branch, tab, pane title or agent kind. PC names distinguish results, and Recent remembers each pane's PC. Picking a result opens that PC and pane directly. Disconnected PCs are omitted; app and plugin actions remain on the currently selected PC. It also finds Settings pages and actions by related words (try `theme` or `font`), and browses folders: type a path such as `~/`, or pick **Browse folders**, and the folder you reach opens in Files. |
| **See each PC's load** | On by default once two or more PCs are connected; turn it on or off for this device in **Settings → Remote PCs → PC load in the sidebar**. Under a PC's name in the sidebar: CPU, memory (without the file cache) and the fullest disk as three small meters, red from 85%. Tap them for memory used and total, load average, uptime and every disk. A PC is read only while its group is open, the sidebar is shown and the page is visible. A remote PC shows nothing until its bridge is updated to this version, and a herdr-core machine shows none. Linux reads `/proc`; elsewhere CPU, load and disks come from the OS, Windows adds memory, and macOS leaves memory out. |
| **Answer prompts** | Approval, question and plan menus become cards. Tap an option, or type its number in the composer. The server checks that the menu is still current before answering. |
| **Compose** | `/` commands and `@` file mentions, any file or image up to 32 MB attached by path, and a draft per pane. Send during work schedules a next-turn message; use its ↑ Send now action to send it now. A strip under the input card names the pane's working folder (the whole path on hover) and, for a workspace of a repository with a worktree open, its branch at the other end; a phone leaves it out. Pick or type a terminal-only command and send normally: after acceptance, the pane's terminal opens over the chat, in this browser only, with **Back to Chat** and **Keep Terminal**; the chat stays where you were reading. For Claude Code's panels (`/config`, `/permissions`, `/theme` and the like) the chat may come back by itself when you close the panel, once Claude records the close; for Codex, omp, pi, gjc, OmO, Hermes (classic CLI), Devin, agy and Grok it comes back after their recorded pickers and panels, once the agent's empty input row is back on the screen; otherwise use **Back to Chat**, the header's Chat, or Back on a phone. If you go back to the same pane's chat while the command's screen is still open, the composer says so (Claude Code and every agent above, not OpenCode) and holds Send, quick replies and a queued message's Send now until the screen closes (**Send anyway** sends the message once); **Show terminal** opens it again. Messages the PC sends by itself at the end of a turn are not held. Automatic queued delivery never changes your view. Chat keeps one quiet **Ran in terminal** row with **Open Terminal**, which shows the terminal over the chat again; ordinary commands keep their outcome chips, and Hermes keeps its informational result cards. `/resume` opens **Earlier sessions…**. [Agent commands in Chat](agent-commands.md) explains where each agent's commands come from and what counts as a result. |
| **Follow every agent** | Live RUN / INPUT / DONE / READY status for all panes, and alerts when an agent needs input, finishes or its terminal ends. |
Expand Down
1 change: 1 addition & 0 deletions scripts/ci-browser.sh
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,7 @@ run_script scripts/sidebar-machine-layout-demo-regression.ts
run_script scripts/sidebar-machine-removal-demo-regression.ts
run_script scripts/sidebar-selection-contrast-demo-regression.ts
run_script scripts/hide-pc-demo-regression.ts
run_script scripts/pc-load-demo-regression.ts
run_script scripts/sidebar-branch-line-demo-regression.ts
run_script scripts/sidebar-tokens-demo-regression.ts
run_script scripts/agent-lock-demo-regression.ts
Expand Down
Loading
Loading