Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 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
76 changes: 76 additions & 0 deletions crates/herdr-gpui/locales/en-US/devices-overview.ftl
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
# The Devices overview: a tab with every device's agents and load, its
# activity over the last two hours, and the sidebar's device tree search.
# Device, host, and agent names are shown as they are.

devices-overview-title = Devices overview
devices-overview-summary = { $devices ->
[one] { $devices } device
*[other] { $devices } devices
} · { $agents ->
[one] { $agents } agent
*[other] { $agents } agents
}
devices-overview-add-device = Add Device
devices-overview-search = Search devices, agents, workspaces
devices-overview-tree-search = Search devices and agents
devices-overview-no-workspace = Open a workspace first
devices-overview-too-many-tabs = Too many tabs are open

# The totals across every device.
devices-overview-working = Working
devices-overview-working-of = of { $total } agents
devices-overview-blocked = Blocked
devices-overview-waiting = waiting for you
devices-overview-idle-or-done = Idle or done
devices-overview-ready = ready for work
devices-overview-online = Devices online
devices-overview-all-reachable = all reachable
devices-overview-not-connected = { $count } not connected

# The legend of agent states.
devices-overview-legend-working = Working
devices-overview-legend-blocked = Blocked
devices-overview-legend-done = Done
devices-overview-legend-idle = Idle

# The activity chart.
devices-overview-activity = Agent activity
devices-overview-last-hours = last 2 h
devices-overview-working-now = working now
devices-overview-peak = peak { $peak } in 2 h
devices-overview-hide-devices = Hide devices
devices-overview-view-devices = View all devices
devices-overview-axis-two-hours = 2 h ago
devices-overview-axis-hour = 1 h ago
devices-overview-axis-now = now
# A device's lane: agents working now of all its agents.
devices-overview-lane-now = { $working }/{ $total } now
devices-overview-lane-connecting = connecting
devices-overview-lane-offline = offline
devices-overview-lane-disabled = disabled

# The device table.
devices-overview-devices = Devices
devices-overview-column-device = Device
devices-overview-column-agents = Agents
devices-overview-column-cpu = CPU
devices-overview-column-memory = Memory
devices-overview-column-gpu = GPU
devices-overview-column-vram = VRAM
devices-overview-column-disk = Disk free
devices-overview-column-uptime = Uptime
devices-overview-offline = Offline
devices-overview-connecting = Connecting
devices-overview-disabled = Disabled
devices-overview-no-agents = No agents
devices-overview-agents-working = { $working }/{ $total } working
devices-overview-agents-blocked = { $count } blocked
devices-overview-no-match = No device, agent or workspace matches the search.
devices-overview-device-no-agents = No agents on this device.
devices-overview-device-unknown = Not connected, so its agents are unknown.
# How a device is reached, under its name: $name is a Herdr session's
# name, $target an SSH destination, $distro a WSL distribution.
devices-overview-this-machine = this machine
devices-overview-session = session { $name }
devices-overview-ssh = ssh { $target }
devices-overview-wsl = WSL · { $distro }
87 changes: 87 additions & 0 deletions crates/herdr-gpui/locales/en-US/overview.ftl
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
# The Overview page: every host's agents, sorted by what needs the user.
# Agent, workspace, branch, and host names are shown as they are.

overview-title = Overview
# The summary beside the title, each left out at zero.
overview-stat-needs = { $count } need you
overview-stat-working = { $count } working
overview-stat-ready = { $count } ready
overview-pinned = Pinned
overview-needs-you = Needs you
overview-ready-for-review = Ready for review
overview-working = Working
overview-idle = Idle
# Shelves under the list that fold, each followed by its count.
overview-snoozed = Snoozed
overview-settled = Settled
overview-closed = Closed
# A row's second line: its workspace, then the agent and its state.
overview-row-detail = { $workspace } · { $detail }
# A snoozed row's second line; $time is when it wakes, such as 18:00 or Mon 09:00.
overview-wakes = Wakes { $time }
# A tag on a row whose snooze ended.
overview-woke = Woke
# A failed orchestrator run; $title is its issue or pull request.
overview-run-failed = Run failed: { $title }

# Row actions.
overview-reopen = Reopen
overview-forget = Forget
overview-snooze = Snooze
overview-settle = Settle
overview-pin = Pin
overview-unpin = Unpin
overview-unsettle = Unsettle
overview-wake-now = Wake now
overview-open = Open
overview-snooze-until = Snooze until
overview-preset-hour = In 1 hour
overview-preset-hours = In 3 hours
overview-preset-evening = This evening
overview-preset-tomorrow = Tomorrow
overview-preset-next-week = Next week
# A time on another day than today: $day is the weekday, $time the clock.
overview-weekday-time = { $day ->
[mon] Mon
[tue] Tue
[wed] Wed
[thu] Thu
[fri] Fri
[sat] Sat
*[sun] Sun
} { $time }
# How long a row has been in its state, in its largest unit.
overview-elapsed-now = now
overview-elapsed-minutes = { $minutes }m
overview-elapsed-hours = { $hours }h
overview-elapsed-days = { $days }d

overview-empty-title = No agents to look at
overview-empty = The Overview gathers the agents on every host this window connects to: those waiting on you and failed runs first, then finished work ready for review, working agents, and idle ones. Snooze or settle a row to put it aside; an agent you close waits under Closed to be reopened.

# The host column.
overview-hosts = Hosts
overview-connecting = Connecting…
overview-not-connected = Not connected
overview-agents = { $total ->
[0] No agents
[one] { $total } agent
*[other] { $total } agents
}
overview-agents-working = { $total ->
[one] { $total } agent
*[other] { $total } agents
} · { $working } working
# Meters on a host card, abbreviated.
overview-meter-cpu = CPU
overview-meter-memory = MEM
overview-meter-gpu = GPU
overview-meter-vram = VRAM

# Reopening a closed agent.
overview-session-gone = The agent's original session is no longer connected
overview-tab-opening = Another tab is still opening
overview-host-switch = Cannot switch to the agent's host
overview-host-timeout = The agent's host did not answer in time
overview-workspace-closed = The agent's workspace is closed
overview-reopen-failed = The agent did not reopen: { $error }
89 changes: 89 additions & 0 deletions crates/herdr-gpui/locales/en-US/usage.ftl
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
# Plan usage: the status bar's segments, the panel a segment opens, and the
# activity bar's Usage section. Service, account, plan, and host names are
# shown as reported.

usage-section-title = Usage
usage-refresh = Refresh
usage-updating = Updating…
usage-off = Plan usage is off. Turn on Usage in Settings to read your agents' limits.
usage-not-read-yet = Not read yet
usage-read-while-selected = Read while this host is selected
usage-no-agents = No signed-in agents found on this host.
usage-not-updated-yet = Not updated yet
# $time is a countdown such as "2h 53m".
usage-updated-ago = Updated { $time } ago
usage-updated-just-now = Updated less than a minute ago
# The panel's line under the service's name: $updated is one of the
# usage-updated messages above, $host the host the numbers are from.
usage-panel-subtitle = { $updated } · { $host }

# Status bar.
usage-unavailable = Usage unavailable
usage-refresh-usage = Refresh usage
# What a screen reader says for a service's segment.
usage-segment = { $name } usage { $percent }% used
usage-segment-idle = { $name } usage
# A segment's window: $percent used, and $time until it resets.
usage-bar-resets = { $percent }% used { $time }
# A window the service names itself, such as a model's quota.
usage-bar-named = { $percent }% used { $name }
# A window whose reset is unknown, by its length, abbreviated.
usage-bar-kind = { $percent }% used { $kind ->
[session] 5h
[daily] day
[weekly] wk
*[monthly] mo
}

# Countdowns, abbreviated: 47m, 2h 53m, 4d 11h.
usage-countdown-minutes = { $minutes }m
usage-countdown-hours = { $hours }h { $minutes }m
usage-countdown-days = { $days }d { $hours }h

# A limit's name; $name is a window the service names itself.
usage-kind = { $kind ->
[session] Session
[daily] Daily
[weekly] Weekly
[monthly] Monthly
*[named] { $name }
}
usage-limit-left = { $kind ->
[session] Session
[daily] Daily
[weekly] Weekly
[monthly] Monthly
*[named] { $name }
} { $left }% left
usage-left = { $left }% left
usage-resets-in = Resets in { $time }
usage-pace-ran-out = Ran out
# Whether spending is ahead of an even pace ($margin percent), then whether
# what is left lasts until the window resets or runs out in $time.
usage-pace = { $standing ->
[reserve] { $margin }% in reserve
[deficit] { $margin }% in deficit
*[even] On pace
} · { $outlook ->
[runs-out] Runs out in { $time }
*[lasts] Lasts until reset
}
# $amount and $total are amounts with their unit, such as $12.30.
usage-balance-of = { $amount } of { $total }

# The panel.
usage-dashboard = Usage Dashboard
usage-status-page = Status Page
usage-daily-spend = Daily spend
usage-other-accounts = Other accounts
usage-account-disabled = disabled
# $note is what claude-swap reports about the account.
usage-account-disabled-note = { $note }, disabled
usage-keychain-needed = { $name }'s sign-in is kept in the macOS Keychain, so reading it makes macOS ask for permission. Choose Always Allow to see these numbers at launch without being asked again.
usage-keychain-allow = Allow Keychain Access
usage-keychain-denied = macOS was not allowed to share { $name }'s sign-in. Try again to have macOS ask once more.
usage-keychain-try-again = Try Again
usage-setup = Set up
# $setting is a config key such as [usage.providers.zai] api_key, and
# $variables the environment variables that also set it.
usage-setup-setting-or-env = { $setting } or { $variables }
16 changes: 8 additions & 8 deletions crates/herdr-gpui/src/devices_overview.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
//! Everything it shows is already in the window: the endpoints' snapshots,
//! the system load samples, and the activity history the tick keeps. Drawing
//! reads that prepared state only.
// i18n: migrated

mod chart;
pub(crate) mod history;
Expand All @@ -21,6 +22,7 @@ pub(crate) use chart::sparkline;
pub(crate) use model::{Device, Link, Tally, online_tally};
pub(crate) use view::Look;

use crate::i18n::fl;
use crate::{
HerdrWindow,
browser::{Location, Store, TabId},
Expand Down Expand Up @@ -63,7 +65,7 @@ impl HerdrWindow {
/// brings back the one already open there.
pub(crate) fn open_devices_overview(&mut self, window: &mut Window, cx: &mut Context<Self>) {
let Some((scope, workspace)) = self.browser_key() else {
self.show_flash(Flash::warning("Open a workspace first"), cx);
self.show_flash(Flash::warning(fl!("devices-overview-no-workspace")), cx);
return;
};
let existing = cx.try_global::<Store>().and_then(|store| {
Expand All @@ -78,7 +80,7 @@ impl HerdrWindow {
})
});
let Some(id) = opened else {
self.show_flash(Flash::warning("Too many tabs are open"), cx);
self.show_flash(Flash::warning(fl!("devices-overview-too-many-tabs")), cx);
return;
};
self.dismiss_menu(window, cx);
Expand Down Expand Up @@ -111,11 +113,8 @@ impl HerdrWindow {
if self.devices_overview.pages.contains_key(&id) {
return;
}
let (search, changed) = self.device_search(
self.config.ui.clone(),
"Search devices, agents, workspaces",
cx,
);
let (search, changed) =
self.device_search(self.config.ui.clone(), &fl!("devices-overview-search"), cx);
self.devices_overview.pages.insert(
id,
Page {
Expand Down Expand Up @@ -199,7 +198,8 @@ impl HerdrWindow {
});
}
None => {
let (input, changed) = self.device_search(font, "Search devices and agents", cx);
let (input, changed) =
self.device_search(font, &fl!("devices-overview-tree-search"), cx);
// The sidebar's heading frames it.
input.update(cx, |input, cx| input.set_frameless(cx));
self.devices_overview.tree_search = Some(TreeSearch {
Expand Down
Loading
Loading