From d48dc53dbfccf2fb172a341b2f2ed1999cd10e87 Mon Sep 17 00:00:00 2001 From: merefield Date: Fri, 11 Sep 2026 12:13:35 +0100 Subject: [PATCH 1/2] FEAT: rename Monitor to Sessions and readout to Session Totals --- README.md | 108 +++++++++++++-------------- internal/i18n/locales/da.json | 8 +- internal/i18n/locales/de.json | 8 +- internal/i18n/locales/en-GB.json | 8 +- internal/i18n/locales/es.json | 8 +- internal/i18n/locales/et.json | 8 +- internal/i18n/locales/fi.json | 8 +- internal/i18n/locales/fr.json | 8 +- internal/i18n/locales/it.json | 8 +- internal/i18n/locales/ja.json | 8 +- internal/i18n/locales/nb.json | 8 +- internal/i18n/locales/nl.json | 8 +- internal/i18n/locales/pt-BR.json | 8 +- internal/i18n/locales/pt-PT.json | 8 +- internal/i18n/locales/ru.json | 8 +- internal/i18n/locales/sv.json | 8 +- internal/i18n/locales/tr.json | 8 +- internal/i18n/locales/zh-Hans.json | 8 +- internal/ui/english_snapshot_test.go | 4 +- internal/ui/monitor.go | 2 +- internal/ui/monitor_test.go | 2 +- internal/ui/tabs.go | 14 ++-- internal/ui/tabs_test.go | 17 +++++ internal/ui/theme.go | 2 +- internal/ui/view_test.go | 2 +- intro-post.md | 20 ++--- 26 files changed, 162 insertions(+), 145 deletions(-) diff --git a/README.md b/README.md index 9e1c069..254c6b6 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Codexometer is a retro terminal dashboard and **session command centre** for sessions to follow their activity, see which need attention, and keep quota and reset timing visible without repeatedly opening `/status`. -The **Monitor** brings your sessions into one place: read their latest context, +The **Sessions** brings your sessions into one place: read their latest context, compare token activity, and—with the [shared local app-server setup](#recommended-codex-cli-setup)— answer supported questions, review and confirm command approvals, and send follow-ups to idle sessions. Quota views, account usage history and optional @@ -28,14 +28,14 @@ best-effort local monitoring; interactive controls require live server support. _Hacker theme showing Codex and GPT-5.3-Codex-Spark quota windows._ Codexometer refreshes quota once a minute by default. Passive quota monitoring -and the Usage history tab are read-only and do not start model turns. Monitor +and the Usage history tab are read-only and do not start model turns. Sessions previews are passive too; explicitly sending a follow-up starts a Codex turn and consumes model usage. Redeeming a banked quota reset is an explicit, separately confirmed action. Benchmark runs also require an explicit action and consume Codex quota or API-billed tokens, depending on the selected authentication. -The four primary tabs are **Quota**, **Monitor**, **Usage**, and **Benchmark**. +The four primary tabs are **Quota**, **Sessions**, **Usage**, and **Benchmark**. The interface supports mouse controls, keyboard navigation, five colour themes, and [16 languages with 17 locale options](#language), with the original UK English presentation unchanged by default. @@ -199,11 +199,11 @@ English rendering baseline captured from v0.12.0. - Account token history in a daily activity grid, weekly bars, or a cumulative graph, with a 6/12-month range and lifetime, peak-day, and streak summaries when supplied. This server-side history can lag live local telemetry. -- An always-on Monitor view that measures local token activity while Codexometer +- An always-on Sessions view that measures local token activity while Codexometer is running, with a Reset button and a `p` hotkey for Pause/Resume. Each independent local root session gets its own metrics and 30-second graph; explicitly linked spawned agents are included with their root. -- Dismissible Monitor session rows that automatically return on fresh activity, +- Dismissible session rows that automatically return on fresh activity, without closing or modifying the underlying Codex session. - Highlighted per-session attention badges. A shared Codex app-server supplies exact `INPUT NEEDED` and `APPROVAL NEEDED` states. Without it, a completed @@ -331,11 +331,11 @@ Codexometer works with an ordinary Codex CLI process, but connecting your CLI sessions through one shared app-server unlocks its most accurate live telemetry on macOS, Linux, and WSL: -- **Definite attention states** — Monitor can distinguish `INPUT NEEDED` from +- **Definite attention states** — Sessions can distinguish `INPUT NEEDED` from `APPROVAL NEEDED` using live per-thread status instead of eventually showing the cautious `CHECK SESSION` inactivity fallback. - **Command approval details and controls** — supported live requests show the - command, directory and reason in Monitor's full detail page, with + command, directory and reason in the Sessions tab's full detail page, with buttons matching Codex's offered decisions, with confirmation for grants. Incomplete or unsupported requests still need answering in Codex. - **Resolved-model API equivalents** — live model-reroute and response-usage @@ -343,7 +343,7 @@ telemetry on macOS, Linux, and WSL: actually served it, rather than relying only on the requested model saved in the rollout. - **Better multi-session visibility** — every connected CLI tab or pane remains - a separate Monitor session while sharing the same accurate status source; + a separate session while sharing the same accurate status source; explicitly linked subagents are still folded into their root session. - **No extra Codexometer authentication** — the server, CLI clients, and Codexometer continue to use the prevailing Codex login under the same @@ -431,7 +431,7 @@ Set up the recommended arrangement as follows. the live approval-request events. An older local excerpt can remain until new live context arrives. -5. Leave Codexometer running while you work. The Monitor starts automatically; +5. Leave Codexometer running while you work. Session monitoring starts automatically; use Reset when you want a fresh measured interval, and keep unrelated Codex activity quiet while running Benchmarks if you want the cleanest comparisons. @@ -482,7 +482,7 @@ Codexometer deliberately does not: - send Codex credentials to another service; - invoke a model merely to discover quota information. -The Monitor and observed quota estimator additionally read locally persisted +Sessions and the observed quota estimator additionally read locally persisted Codex rollout files under `$CODEX_HOME/sessions` (normally `~/.codex/sessions`). They decode `token_count` totals, each last response's input/cache/cache-write/output counts, requested model name, timestamps, and @@ -492,13 +492,13 @@ ID, source classification, working directory, and the inherited-history boundary. It also reads lifecycle event names and blocking flags to identify an explicit unresolved input or approval request. To distinguish an open CLI waiting at its prompt from a closed historical session, it inspects the lock -state—not the contents—of Codex's per-thread writer lock. Monitor also extracts +state—not the contents—of Codex's per-thread writer lock. Sessions also extracts bounded assistant replies/commentary, input questions and choices, approval reasons, and command descriptions for its session-context previews. Excerpts stay in process memory, never in preferences or a summarisation service. User prompts, reasoning and arbitrary tool results are not retained by that reader. Text may contain sensitive material the assistant already displayed: terminal -sanitisation is not secret redaction. Press `h` in Monitor to hide previews and +sanitisation is not secret redaction. Press `h` in Sessions to hide previews and close the detail view; this saved preference controls display, not collection. Benchmark turns explicitly started by Codexometer have separate content capture. @@ -514,11 +514,11 @@ app-server subscription for already-loaded thread IDs. From that stream it retains runtime flags, model-reroute/token-usage correlations, and bounded context from assistant messages and input/approval requests. Resolved requests and new turns clear stale pending context. Observation alone never starts a turn -or answers a question. Explicit actions in Monitor can submit follow-up turns +or answers a question. Explicit actions in Sessions can submit follow-up turns to idle sessions, answer supported blocking questions, and send selected command decisions (with confirmation for permission grants). Drafts stay in memory; submitted text enters Codex's normal session history and follow-ups consume -model usage. Nothing is sent automatically; see the Monitor controls below. +model usage. Nothing is sent automatically; see the Sessions controls below. Without a shared daemon, previews use available local rollout text rather than fetching full thread histories. Missing request details are left unavailable; there is no extra model call. @@ -534,33 +534,33 @@ codexometer --codex /path/to/codex | Key | Action | | --- | --- | | `t` | Cycle color themes | -| `Tab` | Select the next top-level tab: Quota, Monitor, Usage, or Benchmark | +| `Tab` | Select the next top-level tab: Quota, Sessions, Usage, or Benchmark | | `Shift+Tab` | Select the previous top-level tab | | `r` | Refresh account history in Usage; otherwise refresh quota data | | `v` | Cycle the active Quota view | -| `s` | Reset the Monitor baseline, or open Benchmark Scope | -| `p` | Pause or resume live monitoring (Monitor view only) | -| `h` | Reset all Monitor rows to graph-only / split detail-and-graph, closing full detail and clearing individual row choices | -| `Left` / `Right` | In Monitor, less / more detail for the selected session: graph ↔ split ↔ wide ↔ full screen; stops at either end | +| `s` | Reset the Sessions baseline, or open Benchmark Scope | +| `p` | Pause or resume live monitoring (Sessions view only) | +| `h` | Reset all Sessions rows to graph-only / split detail-and-graph, closing full detail and clearing individual row choices | +| `Left` / `Right` | In Sessions, less / more detail for the selected session: graph ↔ split ↔ wide ↔ full screen; stops at either end | | `b` | Run the selected benchmark scope (Benchmark view only) | | `a` | Arm, then confirm, Run All (Benchmark view only) | -| `x` | Dismiss the selected Monitor row; close Benchmark detail/Scope, or stop an active suite and retain its incomplete trial | +| `x` | Dismiss the selected Sessions row; close Benchmark detail/Scope, or stop an active suite and retain its incomplete trial | | `d` | Select Daily in Usage, or close the Benchmark Scope screen | | `6` / `1` | Select 6/12 months of Usage history | | `[` / `]` | Select the previous or next benchmark suite | | `Left` / `Right` | Page Usage history, or select the previous or next benchmark suite | | `f` | Show all, passed, or failed benchmark results | | `w` | Select Weekly in Usage, or cycle Cost, Balanced, and Speed benchmark ranking weights | -| `Up` / `Down` | Select a Monitor session row or Benchmark row, or scroll open Benchmark detail | -| `Enter` / `Space` | Open a selected Benchmark result, or toggle a Scope checkbox; in Monitor full detail, `Enter` focuses an available reply editor or submits its text | +| `Up` / `Down` | Select a session row or Benchmark row, or scroll open Benchmark detail | +| `Enter` / `Space` | Open a selected Benchmark result, or toggle a Scope checkbox; in Sessions full detail, `Enter` focuses an available reply editor or submits its text | | `c` | Select Cumulative in Usage, copy the Benchmark result matrix as Markdown, or copy the complete open run detail | | `l` | Clear accumulated Benchmark results while no suite is running | -| `Page Up` / `Page Down` | Page Usage history, Monitor session rows, or Benchmark results | +| `Page Up` / `Page Down` | Page Usage history, session rows, or Benchmark results | | `q` | Quit | -| `Esc` | Step back one Monitor context level, cancel quota-reset confirmation/dismiss its notice, return from Benchmark detail or Scope; otherwise quit | +| `Esc` | Step back one Sessions context level, cancel quota-reset confirmation/dismiss its notice, return from Benchmark detail or Scope; otherwise quit | | `Ctrl+C` | Quit | -The responsive top rail below the account status selects Quota, Monitor, Usage, or +The responsive top rail below the account status selects Quota, Sessions, Usage, or Benchmark by mouse, `Tab`, or `Shift+Tab`. Quota adds a second rail for Bars, Consumption Pace, Pie, and Fuel Tank; select these with the mouse or cycle them with `v`. Codexometer remembers the selected Quota view when you leave @@ -737,7 +737,7 @@ folded into the same process-local accounting used for quota learning; missing or unpriceable benchmark usage fails closed and restarts the learning anchor. Benchmarks funded by `CODEXOMETER_BENCHMARK_API_KEY` are excluded because they do not consume the displayed subscription quota. Benchmark threads remain -hidden from Monitor; hiding presentation does not exclude their aggregate +hidden from Sessions; hiding presentation does not exclude their aggregate subscription impact from Quota views. The embedded rates come from the [official OpenAI API pricing page](https://developers.openai.com/api/docs/pricing) @@ -823,7 +823,7 @@ The default remains the original green hacker-terminal presentation. ## Views and quota presentations -The top-level tabs are **Quota**, **Monitor**, **Usage**, and **Benchmark**. Within Quota, +The top-level tabs are **Quota**, **Sessions**, **Usage**, and **Benchmark**. Within Quota, choose one of these four views with its sub-tab or `v`: 1. **Bars** — chunky quota bars, with one full-width rate-limit window per row. @@ -844,7 +844,7 @@ choose one of these four views with its sub-tab or `v`: **Usage** is a read-only companion to Codex CLI's `/usage` command. It fetches `account/usage/read` through a short-lived local Codex app-server using your prevailing ChatGPT login. No model turn is started and no reset credit is used. -It does not require the shared-daemon configuration used for live Monitor events. +It does not require the shared-daemon configuration used for live Sessions events. - **Daily** (`d`): a GitHub-style activity grid, with seven weekday rows and one column per week. More tokens mean brighter theme-coloured blocks. @@ -889,7 +889,7 @@ available (`—` otherwise). History refreshes when you enter Usage, on the normal refresh interval while Usage is selected, or with `r` / the Refresh button. These are server-side account -statistics, **not live Monitor telemetry**: updates may lag ongoing work. +statistics, **not live Sessions telemetry**: updates may lag ongoing work. Older CLI versions or unsupported accounts can return an unavailable/error state; missing history is never silently presented as zero. A failed refresh labels previously fetched data **STALE**, and a detected account change discards it. @@ -897,23 +897,23 @@ previously fetched data **STALE**, and a detected account change discards it. The endpoint currently exposes daily **total tokens**, not historical per-model, input/output/cache splits, quota percentages, or dollar spend. Consequently this tab does not infer historical API-equivalent cost or combine these totals with -Monitor's local counters. History is held in memory only; restarting fetches it +the Sessions tab's local counters. History is held in memory only; restarting fetches it again from Codex. `--demo` includes sample history for previewing the charts. ### Other top-level views The other top-level views are: -- **Monitor** — the session command centre: inspect context, track activity, +- **Sessions** — the session command centre: inspect context, track activity, and respond through eligible live approval and reply controls for the selected session. It automatically establishes a zero baseline across locally active - Codex sessions when Codexometer starts. A large readout follows newly appended + Codex sessions when Codexometer starts. The **SESSION TOTALS** readout follows newly appended token telemetry and shows total observed tokens, elapsed time, and average rate; a clickable Reset control sits beside it. Pause/Resume remains available through the `p` hotkey only, without a large Pause button taking space from the readout. This pauses measurement, not Codex sessions. Active sessions are checked once per second and the idle cadence relaxes to five seconds. - The Monitor tab light and status label pulse between bright and dim amber + The Sessions tab light and status label pulse between bright and dim amber whenever any session needs input, approval, or a check. With nothing waiting, they pulse green while at least one session is working and remain steady green while the Codex runtime is healthy but idle. They turn red only when local @@ -944,7 +944,7 @@ The other top-level views are: linked agent clears the uncertain group-level warning. Codexometer never guesses `APPROVAL NEEDED` from inactivity. Closing the CLI releases its per-thread writer lock and clears every attention badge. - A session already included in the current Monitor recording can remain as an + A session already included in the current Sessions recording can remain as an `IDLE` historical row so its completed metrics and graph are not discarded. Click the themed `[×]` in a session metrics box to hide that row for the current run without closing or altering the Codex session. Codexometer keeps @@ -952,7 +952,7 @@ The other top-level views are: when tokens, model calls, turn timing, durable activity, or attention moves forward, or when an inactive session becomes active again. An alert already visible when `[×]` is clicked is dismissed with its row; a later new or - changed alert restores it. Resetting the Monitor also restores every dismissed + changed alert restores it. Resetting session monitoring also restores every dismissed row. With the keyboard, `Down` initially selects the top row, `Up` initially selects the bottom row, subsequent arrow presses move the highlight, and `x` closes the selected row. @@ -1000,7 +1000,7 @@ receives its card's remaining width and height, and resizing the terminal immediately reflows and rescales it. The underlying values and reset information never change with presentation. -The Monitor is deliberately separate from the percentage gauges: no token +Session monitoring is deliberately separate from the percentage gauges: no token ceiling is exposed for those quota windows, so a percentage-based bar would be misleading. It follows the local token telemetry underlying Codex's live [`thread/tokenUsage/updated`](https://developers.openai.com/codex/app-server) @@ -1026,7 +1026,7 @@ including nested descendants, are folded into their root by following persisted parent IDs. Review, compact, or other internal work that lacks an explicit parent is never guessed onto a root; if observed, it appears in an `UNATTRIBUTED // INTERNAL` row. When Codex records inherited child history, the -Monitor honors its ownership boundary so copied parent telemetry is not counted +Sessions honors its ownership boundary so copied parent telemetry is not counted twice. Legacy spawned-agent rollouts without an ordinal boundary are separated at the child session timestamp: inherited cumulative totals establish the child counter baseline but are not reported as new usage. @@ -1039,14 +1039,14 @@ new rollout-file activity produces only `CHECK SESSION`, because persisted data cannot distinguish an approval wait from every long-running local tool. The context preview does not infer attention from prose. A linked child's attention state is folded into its root -so one remote Monitor row identifies the CLI session that needs intervention. +so one remote Sessions row identifies the CLI session that needs intervention. A definite approval signal takes precedence, then definite input, then the inferred check state when linked members have mixed states. Because `CHECK SESSION` is only an inactivity inference, fresh activity anywhere in the group suppresses a stale sibling's check; definite input and approval are never suppressed this way. -`CALLS` counts upstream model-response cycles observed after the current Monitor +`CALLS` counts upstream model-response cycles observed after the current Sessions baseline, not complete user turns. A single Codex turn can make several calls while using tools or progressing through an agent loop. `LAST OUT` is the provider-reported output-token count for the latest such call. `TTFT` comes from the completed @@ -1054,7 +1054,7 @@ turn's persisted time-to-first-token measurement; older Codex rollouts that do not contain it display `N/A`. Spawned descendants contribute these pulses to the same root row as their token activity. -The Monitor's per-session quota figure is an estimate, not API attribution. +The per-session quota figure in Sessions is an estimate, not API attribution. Codex exposes account-level quota percentages and local per-session token telemetry separately; it does not report which session consumed each percentage point. Codexometer therefore multiplies the observed account-wide change by a @@ -1139,13 +1139,13 @@ same action on that session. The presentations are: the context above. Resizing to hide the composer releases keyboard focus; enlarge the window and refocus to continue the draft. Approval requests and structured questions do not use this inline composer; use full detail instead. -4. **Full detail:** the existing scrollable Monitor-area view with pinned buttons. +4. **Full detail:** the existing scrollable Sessions-area view with pinned buttons. Its box title mirrors the left telemetry badge (including the blinking **WORKING** ball), or falls back to **SESSION CONTEXT** when no badge applies. The body keeps content-type headings and source details, but does not repeat the session status. The left telemetry box is hidden in this view. Use Up/Down, Page Up/Down, or the mouse wheel to read long requests. - `Left` or `Esc` returns to the main Monitor with the same session showing + `Left` or `Esc` returns to the Sessions overview with the same session showing full-width detail. When a reply editor is available, `Enter` focuses it instead of changing presentation. @@ -1162,7 +1162,7 @@ The old `i` and Enter detail-navigation shortcuts have been removed. Clickable **[←] [→]** buttons sit at the top-right of each row's rightmost box (graph or detail), and on the full-detail box. They mirror the cursor keys: Left is dimmed and inactive at graph-only; Right is dimmed and inactive at full -detail. The Monitor readout header also has **[↑] [↓]** session-selection buttons, +detail. The **SESSION TOTALS** header also has **[↑] [↓]** session-selection buttons, disabled at the first/last visible session. Dismissed sessions are skipped. These session buttons disappear in full detail, where Up/Down scroll the text. On narrow boxes, arrow buttons are omitted if they cannot fit; keyboard and @@ -1311,7 +1311,7 @@ closes. The server arbitrates simultaneous responses from multiple clients. Sending a decision is not proof that the command ran: check Codex for the outcome. Failed or ambiguous sends are not automatically retried. -In full Monitor detail only, successful **Text sent ...** and **Decision sent ...** +In full Sessions detail only, successful **Text sent ...** and **Decision sent ...** notices use a subtle dot wave until the session context or attention state changes. Fast activity updates retain the sent wording for at least three seconds before switching to dots alone; new stop or attention-needed states take priority. @@ -1325,7 +1325,7 @@ same context (or the remainder of its three-second minimum), rather than losing delivery confirmation. New context then replaces it normally. This is a best-effort activity indicator, not proof of execution or a progress percentage; ordinary local observation can lag behind the session. -On the main Monitor screen, visible compact and expanded session-context boxes +On the main Sessions screen, visible compact and expanded session-context boxes also show the same activity dots at the bottom left, independently for each session. Short boxes prioritise readable context and approval controls; the compact view omits the dots when fewer than three body rows fit. Sent-message @@ -1359,7 +1359,7 @@ any command; restart the demo to reset its approval. ### Saved presentation preferences Codexometer stores only the selected theme, main tab, Quota view, benchmark filter, -benchmark ranking weight, and the Monitor context hide/show preference. +benchmark ranking weight, and the Sessions context hide/show preference. No quota estimate or snapshot, raw session telemetry, benchmark result, message content, credential, session ID, email, account fingerprint, or account ID is written. The small JSON file uses the @@ -1879,7 +1879,7 @@ deterministic PASS/FAIL verifier. ```text --codex PATH path to the Codex CLI (default: codex) --check-auth verify the current Codex login and exit ---demo preview simulated quota, Monitor, Usage, and benchmark data +--demo preview simulated quota, Sessions, Usage, and benchmark data --inline render inline instead of using the alternate screen --refresh DURATION refresh interval (default: 1m) --reset-threshold PERCENT show available resets at this consumption level (0-100; default: 80) @@ -1992,7 +1992,7 @@ interval. Pressing `r` refreshes immediately. If a refresh fails after valid data has already been displayed, Codexometer retains the last snapshot and marks it as stale instead of blanking the dashboard. -The Monitor starts with Codexometer and checks appended local token telemetry +Session monitoring starts with Codexometer and checks appended local token telemetry once per second while sessions are active, relaxing to once every five seconds when none are active. It groups explicit agent descendants under their root and rolls each root's observed deltas into synchronized graph buckets. It also updates the @@ -2044,9 +2044,9 @@ Codexometer adapts its header and meter widths, but rich gauges need enough rows to display every quota window. Increase the pane height or press `v` in Quota to return to the compact default Bars view. -### Monitor remains at zero +### Sessions remains at zero -The Monitor observes rollout telemetry under the same `CODEX_HOME` visible to +Sessions observes rollout telemetry under the same `CODEX_HOME` visible to the Codexometer process. Confirm that the Codex session doing work is local and uses that home. A native Windows Codex session and a native Windows Codexometer normally share the same user profile; WSL and native Windows have different @@ -2057,20 +2057,20 @@ appear until its next telemetry event. ## Roadmap -Potential Monitor follow-ups (not implemented): +Potential Sessions follow-ups (not implemented): - **Remember session visibility across restarts.** Persist dismissed rows using durable activity markers, not connection-local counters or approval tokens. Restore them on genuine new activity or verified pending approval, with a conservative fallback that favours showing a session needing attention. -- **Remember the Monitor workspace.** Restore the selected session and each +- **Remember the Sessions workspace.** Restore the selected session and each session's detail level, alongside visibility. Handle missing sessions and smaller terminals gracefully; restoring the layout must not restore editor focus, unsent drafts, or armed approval confirmations. Session identifiers would become persisted data and the saved-preferences documentation would need updating accordingly. -Currently, the main tab, Quota view and global Monitor hide/show preference are +Currently, the main tab, Quota view and global Sessions hide/show preference are saved, but session selection, per-session detail levels and dismissals remain temporary. @@ -2097,7 +2097,7 @@ Codexometer uses: - Lip Gloss v2 for adaptive ANSI styling and layout - Starlark for deterministic, hermetic benchmark-code evaluation - Codex app-server JSON-RPC for authenticated quota data -- Local Codex rollout `token_count` records for live Monitor telemetry +- Local Codex rollout `token_count` records for live Sessions telemetry ## License diff --git a/internal/i18n/locales/da.json b/internal/i18n/locales/da.json index 502e472..35c0e2d 100644 --- a/internal/i18n/locales/da.json +++ b/internal/i18n/locales/da.json @@ -192,8 +192,8 @@ "MODEL": "MODEL", "MODEL // ": "MODEL // ", "MODEL: %s\n": "MODEL: %s\n", - "MONITOR": "MONITOR", - "MONITOR READOUT": "MONITORSTATUS", + "SESSIONS": "SESSIONER", + "SESSION TOTALS": "SESSIONSTOTALER", "MONITORING ●": "OVERVÅGER ●", "MONTHLY": "MÅNEDLIG", "MORE // PEAK DAY %s": "MERE // TOPDAG %s", @@ -329,8 +329,8 @@ "╭ BENCHMARK ╮": "╭ BENCHMARK ╮", "╭ CONSUMPTION PACE ╮": "╭ FORBRUGSTEMPO ╮", "╭ FUEL TANK ╮": "╭ BRÆNDSTOFTANK ╮", - "╭ MONITOR ╮": "╭ MONITOR ╮", - "╭ MONITOR ●╮": "╭ MONITOR ●╮", + "╭ SESSIONS ╮": "╭ SESSIONER ╮", + "╭ SESSIONS ●╮": "╭ SESSIONER ●╮", "╭ PIE ╮": "╭ CIRKEL ╮", "╭ QUOTA ╮": "╭ KVOTE ╮", "╭ USAGE ╮": "╭ FORBRUG ╮", diff --git a/internal/i18n/locales/de.json b/internal/i18n/locales/de.json index 65a1e78..f82e87e 100644 --- a/internal/i18n/locales/de.json +++ b/internal/i18n/locales/de.json @@ -192,8 +192,8 @@ "MODEL": "MODELL", "MODEL // ": "MODELL // ", "MODEL: %s\n": "MODELL: %s\n", - "MONITOR": "MONITOR", - "MONITOR READOUT": "MONITORWERTE", + "SESSIONS": "SITZUNGEN", + "SESSION TOTALS": "SITZUNGSSUMMEN", "MONITORING ●": "ÜBERWACHUNG ●", "MONTHLY": "MONATLICH", "MORE // PEAK DAY %s": "MEHR // TAGESREKORD %s", @@ -329,8 +329,8 @@ "╭ BENCHMARK ╮": "╭ BENCHMARK ╮", "╭ CONSUMPTION PACE ╮": "╭ VERBRAUCHSTEMPO ╮", "╭ FUEL TANK ╮": "╭ TANK ╮", - "╭ MONITOR ╮": "╭ MONITOR ╮", - "╭ MONITOR ●╮": "╭ MONITOR ●╮", + "╭ SESSIONS ╮": "╭ SITZUNGEN ╮", + "╭ SESSIONS ●╮": "╭ SITZUNGEN ●╮", "╭ PIE ╮": "╭ KREIS ╮", "╭ QUOTA ╮": "╭ KONTINGENT ╮", "╭ USAGE ╮": "╭ NUTZUNG ╮", diff --git a/internal/i18n/locales/en-GB.json b/internal/i18n/locales/en-GB.json index 3eaaff1..3e324c2 100644 --- a/internal/i18n/locales/en-GB.json +++ b/internal/i18n/locales/en-GB.json @@ -192,8 +192,8 @@ "MODEL": "MODEL", "MODEL // ": "MODEL // ", "MODEL: %s\n": "MODEL: %s\n", - "MONITOR": "MONITOR", - "MONITOR READOUT": "MONITOR READOUT", + "SESSIONS": "SESSIONS", + "SESSION TOTALS": "SESSION TOTALS", "MONITORING ●": "MONITORING ●", "MONTHLY": "MONTHLY", "MORE // PEAK DAY %s": "MORE // PEAK DAY %s", @@ -329,8 +329,8 @@ "╭ BENCHMARK ╮": "╭ BENCHMARK ╮", "╭ CONSUMPTION PACE ╮": "╭ CONSUMPTION PACE ╮", "╭ FUEL TANK ╮": "╭ FUEL TANK ╮", - "╭ MONITOR ╮": "╭ MONITOR ╮", - "╭ MONITOR ●╮": "╭ MONITOR ●╮", + "╭ SESSIONS ╮": "╭ SESSIONS ╮", + "╭ SESSIONS ●╮": "╭ SESSIONS ●╮", "╭ PIE ╮": "╭ PIE ╮", "╭ QUOTA ╮": "╭ QUOTA ╮", "╭ USAGE ╮": "╭ USAGE ╮", diff --git a/internal/i18n/locales/es.json b/internal/i18n/locales/es.json index 1a003b4..ecd9447 100644 --- a/internal/i18n/locales/es.json +++ b/internal/i18n/locales/es.json @@ -192,8 +192,8 @@ "MODEL": "MODELO", "MODEL // ": "MODELO // ", "MODEL: %s\n": "MODELO: %s\n", - "MONITOR": "MONITOR", - "MONITOR READOUT": "DATOS DEL MONITOR", + "SESSIONS": "SESIONES", + "SESSION TOTALS": "TOTALES DE SESIONES", "MONITORING ●": "MONITORIZANDO ●", "MONTHLY": "MENSUAL", "MORE // PEAK DAY %s": "MÁS // PICO DIARIO %s", @@ -329,8 +329,8 @@ "╭ BENCHMARK ╮": "╭ PRUEBA ╮", "╭ CONSUMPTION PACE ╮": "╭ RITMO DE CONSUMO ╮", "╭ FUEL TANK ╮": "╭ DEPÓSITO ╮", - "╭ MONITOR ╮": "╭ MONITOR ╮", - "╭ MONITOR ●╮": "╭ MONITOR ●╮", + "╭ SESSIONS ╮": "╭ SESIONES ╮", + "╭ SESSIONS ●╮": "╭ SESIONES ●╮", "╭ PIE ╮": "╭ CIRCULAR ╮", "╭ QUOTA ╮": "╭ CUOTA ╮", "╭ USAGE ╮": "╭ USO ╮", diff --git a/internal/i18n/locales/et.json b/internal/i18n/locales/et.json index 35d70ce..ebc554d 100644 --- a/internal/i18n/locales/et.json +++ b/internal/i18n/locales/et.json @@ -192,8 +192,8 @@ "MODEL": "MUDEL", "MODEL // ": "MUDEL // ", "MODEL: %s\n": "MUDEL: %s\n", - "MONITOR": "SEIRE", - "MONITOR READOUT": "SEIRENÄIDUD", + "SESSIONS": "SEANSID", + "SESSION TOTALS": "SEANSSIDE KOGUSUMMAD", "MONITORING ●": "JÄLGIMINE ●", "MONTHLY": "IGAKUINE", "MORE // PEAK DAY %s": "ROHKEM // TIPPPÄEV %s", @@ -329,8 +329,8 @@ "╭ BENCHMARK ╮": "╭ TEST ╮", "╭ CONSUMPTION PACE ╮": "╭ KASUTUSTEMPO ╮", "╭ FUEL TANK ╮": "╭ KÜTUSEPAAK ╮", - "╭ MONITOR ╮": "╭ SEIRE ╮", - "╭ MONITOR ●╮": "╭ SEIRE ●╮", + "╭ SESSIONS ╮": "╭ SEANSID ╮", + "╭ SESSIONS ●╮": "╭ SEANSID ●╮", "╭ PIE ╮": "╭ SEKTOR ╮", "╭ QUOTA ╮": "╭ KVOOT ╮", "╭ USAGE ╮": "╭ KASUTUS ╮", diff --git a/internal/i18n/locales/fi.json b/internal/i18n/locales/fi.json index c7628ad..c0b0ee4 100644 --- a/internal/i18n/locales/fi.json +++ b/internal/i18n/locales/fi.json @@ -192,8 +192,8 @@ "MODEL": "MALLI", "MODEL // ": "MALLI // ", "MODEL: %s\n": "MALLI: %s\n", - "MONITOR": "SEURANTA", - "MONITOR READOUT": "SEURANTATIEDOT", + "SESSIONS": "ISTUNNOT", + "SESSION TOTALS": "ISTUNTOJEN SUMMAT", "MONITORING ●": "SEURATAAN ●", "MONTHLY": "KUUKAUSITTAIN", "MORE // PEAK DAY %s": "ENEMMÄN // HUIPPUPÄIVÄ %s", @@ -329,8 +329,8 @@ "╭ BENCHMARK ╮": "╭ TESTI ╮", "╭ CONSUMPTION PACE ╮": "╭ KULUTUSTAHTI ╮", "╭ FUEL TANK ╮": "╭ POLTTOAINESÄILIÖ ╮", - "╭ MONITOR ╮": "╭ SEURANTA ╮", - "╭ MONITOR ●╮": "╭ SEURANTA ●╮", + "╭ SESSIONS ╮": "╭ ISTUNNOT ╮", + "╭ SESSIONS ●╮": "╭ ISTUNNOT ●╮", "╭ PIE ╮": "╭ PIIRAKKA ╮", "╭ QUOTA ╮": "╭ KIINTIÖ ╮", "╭ USAGE ╮": "╭ KÄYTTÖ ╮", diff --git a/internal/i18n/locales/fr.json b/internal/i18n/locales/fr.json index 1640918..1872ba3 100644 --- a/internal/i18n/locales/fr.json +++ b/internal/i18n/locales/fr.json @@ -192,8 +192,8 @@ "MODEL": "MODÈLE", "MODEL // ": "MODÈLE // ", "MODEL: %s\n": "MODÈLE: %s\n", - "MONITOR": "SUIVI", - "MONITOR READOUT": "MESURES DU SUIVI", + "SESSIONS": "SESSIONS", + "SESSION TOTALS": "TOTAUX DES SESSIONS", "MONITORING ●": "SUIVI ●", "MONTHLY": "MENSUEL", "MORE // PEAK DAY %s": "PLUS // PIC JOURNALIER %s", @@ -329,8 +329,8 @@ "╭ BENCHMARK ╮": "╭ BENCHMARK ╮", "╭ CONSUMPTION PACE ╮": "╭ RYTHME D’UTILISATION ╮", "╭ FUEL TANK ╮": "╭ RÉSERVOIR ╮", - "╭ MONITOR ╮": "╭ SUIVI ╮", - "╭ MONITOR ●╮": "╭ SUIVI ●╮", + "╭ SESSIONS ╮": "╭ SESSIONS ╮", + "╭ SESSIONS ●╮": "╭ SESSIONS ●╮", "╭ PIE ╮": "╭ CAMEMBERT ╮", "╭ QUOTA ╮": "╭ QUOTA ╮", "╭ USAGE ╮": "╭ UTILISATION ╮", diff --git a/internal/i18n/locales/it.json b/internal/i18n/locales/it.json index b1c763c..bfc3f25 100644 --- a/internal/i18n/locales/it.json +++ b/internal/i18n/locales/it.json @@ -192,8 +192,8 @@ "MODEL": "MODELLO", "MODEL // ": "MODELLO // ", "MODEL: %s\n": "MODELLO: %s\n", - "MONITOR": "MONITOR", - "MONITOR READOUT": "DATI MONITOR", + "SESSIONS": "SESSIONI", + "SESSION TOTALS": "TOTALI SESSIONI", "MONITORING ●": "MONITORAGGIO ●", "MONTHLY": "MENSILE", "MORE // PEAK DAY %s": "PIÙ // PICCO GIORNALIERO %s", @@ -329,8 +329,8 @@ "╭ BENCHMARK ╮": "╭ BENCHMARK ╮", "╭ CONSUMPTION PACE ╮": "╭ RITMO DI CONSUMO ╮", "╭ FUEL TANK ╮": "╭ SERBATOIO ╮", - "╭ MONITOR ╮": "╭ MONITOR ╮", - "╭ MONITOR ●╮": "╭ MONITOR ●╮", + "╭ SESSIONS ╮": "╭ SESSIONI ╮", + "╭ SESSIONS ●╮": "╭ SESSIONI ●╮", "╭ PIE ╮": "╭ TORTA ╮", "╭ QUOTA ╮": "╭ QUOTA ╮", "╭ USAGE ╮": "╭ UTILIZZO ╮", diff --git a/internal/i18n/locales/ja.json b/internal/i18n/locales/ja.json index 94dc8df..ee02e07 100644 --- a/internal/i18n/locales/ja.json +++ b/internal/i18n/locales/ja.json @@ -192,8 +192,8 @@ "MODEL": "モデル", "MODEL // ": "モデル // ", "MODEL: %s\n": "モデル: %s\n", - "MONITOR": "モニター", - "MONITOR READOUT": "モニター情報", + "SESSIONS": "セッション", + "SESSION TOTALS": "セッション合計", "MONITORING ●": "監視中 ●", "MONTHLY": "月別", "MORE // PEAK DAY %s": "多 // 最多日 %s", @@ -329,8 +329,8 @@ "╭ BENCHMARK ╮": "╭ ベンチマーク ╮", "╭ CONSUMPTION PACE ╮": "╭ 消費ペース ╮", "╭ FUEL TANK ╮": "╭ 燃料タンク ╮", - "╭ MONITOR ╮": "╭ モニター ╮", - "╭ MONITOR ●╮": "╭ モニター ●╮", + "╭ SESSIONS ╮": "╭ セッション ╮", + "╭ SESSIONS ●╮": "╭ セッション ●╮", "╭ PIE ╮": "╭ 円グラフ ╮", "╭ QUOTA ╮": "╭ 利用枠 ╮", "╭ USAGE ╮": "╭ 使用状況 ╮", diff --git a/internal/i18n/locales/nb.json b/internal/i18n/locales/nb.json index 29d5e61..d4cc2e7 100644 --- a/internal/i18n/locales/nb.json +++ b/internal/i18n/locales/nb.json @@ -192,8 +192,8 @@ "MODEL": "MODELL", "MODEL // ": "MODELL // ", "MODEL: %s\n": "MODELL: %s\n", - "MONITOR": "OVERVÅKING", - "MONITOR READOUT": "OVERVÅKINGSDATA", + "SESSIONS": "ØKTER", + "SESSION TOTALS": "ØKTTOTALER", "MONITORING ●": "OVERVÅKER ●", "MONTHLY": "MÅNEDLIG", "MORE // PEAK DAY %s": "MER // TOPPDAG %s", @@ -329,8 +329,8 @@ "╭ BENCHMARK ╮": "╭ TEST ╮", "╭ CONSUMPTION PACE ╮": "╭ FORBRUKSTAKT ╮", "╭ FUEL TANK ╮": "╭ DRIVSTOFFTANK ╮", - "╭ MONITOR ╮": "╭ OVERVÅKING ╮", - "╭ MONITOR ●╮": "╭ OVERVÅKING ●╮", + "╭ SESSIONS ╮": "╭ ØKTER ╮", + "╭ SESSIONS ●╮": "╭ ØKTER ●╮", "╭ PIE ╮": "╭ SEKTOR ╮", "╭ QUOTA ╮": "╭ KVOTE ╮", "╭ USAGE ╮": "╭ BRUK ╮", diff --git a/internal/i18n/locales/nl.json b/internal/i18n/locales/nl.json index f0a85d6..b06f8b0 100644 --- a/internal/i18n/locales/nl.json +++ b/internal/i18n/locales/nl.json @@ -192,8 +192,8 @@ "MODEL": "MODEL", "MODEL // ": "MODEL // ", "MODEL: %s\n": "MODEL: %s\n", - "MONITOR": "MONITOR", - "MONITOR READOUT": "MONITORGEGEVENS", + "SESSIONS": "SESSIES", + "SESSION TOTALS": "SESSIETOTALEN", "MONITORING ●": "VOLGEN ●", "MONTHLY": "MAANDELIJKS", "MORE // PEAK DAY %s": "MEER // DAGPIEK %s", @@ -329,8 +329,8 @@ "╭ BENCHMARK ╮": "╭ BENCHMARK ╮", "╭ CONSUMPTION PACE ╮": "╭ VERBRUIKSTEMPO ╮", "╭ FUEL TANK ╮": "╭ BRANDSTOFTANK ╮", - "╭ MONITOR ╮": "╭ MONITOR ╮", - "╭ MONITOR ●╮": "╭ MONITOR ●╮", + "╭ SESSIONS ╮": "╭ SESSIES ╮", + "╭ SESSIONS ●╮": "╭ SESSIES ●╮", "╭ PIE ╮": "╭ CIRKEL ╮", "╭ QUOTA ╮": "╭ QUOTUM ╮", "╭ USAGE ╮": "╭ GEBRUIK ╮", diff --git a/internal/i18n/locales/pt-BR.json b/internal/i18n/locales/pt-BR.json index 36198fd..3c92697 100644 --- a/internal/i18n/locales/pt-BR.json +++ b/internal/i18n/locales/pt-BR.json @@ -192,8 +192,8 @@ "MODEL": "MODELO", "MODEL // ": "MODELO // ", "MODEL: %s\n": "MODELO: %s\n", - "MONITOR": "MONITOR", - "MONITOR READOUT": "LEITURA DO MONITOR", + "SESSIONS": "SESSÕES", + "SESSION TOTALS": "TOTAIS DAS SESSÕES", "MONITORING ●": "MONITORANDO ●", "MONTHLY": "MENSAL", "MORE // PEAK DAY %s": "MAIS // DIA DE PICO %s", @@ -329,8 +329,8 @@ "╭ BENCHMARK ╮": "╭ BENCHMARK ╮", "╭ CONSUMPTION PACE ╮": "╭ RITMO DE CONSUMO ╮", "╭ FUEL TANK ╮": "╭ TANQUE ╮", - "╭ MONITOR ╮": "╭ MONITOR ╮", - "╭ MONITOR ●╮": "╭ MONITOR ●╮", + "╭ SESSIONS ╮": "╭ SESSÕES ╮", + "╭ SESSIONS ●╮": "╭ SESSÕES ●╮", "╭ PIE ╮": "╭ PIZZA ╮", "╭ QUOTA ╮": "╭ COTA ╮", "╭ USAGE ╮": "╭ USO ╮", diff --git a/internal/i18n/locales/pt-PT.json b/internal/i18n/locales/pt-PT.json index 32401f5..e257cc6 100644 --- a/internal/i18n/locales/pt-PT.json +++ b/internal/i18n/locales/pt-PT.json @@ -192,8 +192,8 @@ "MODEL": "MODELO", "MODEL // ": "MODELO // ", "MODEL: %s\n": "MODELO: %s\n", - "MONITOR": "MONITOR", - "MONITOR READOUT": "LEITURA DO MONITOR", + "SESSIONS": "SESSÕES", + "SESSION TOTALS": "TOTAIS DAS SESSÕES", "MONITORING ●": "A MONITORIZAR ●", "MONTHLY": "MENSAL", "MORE // PEAK DAY %s": "MAIS // DIA DE PICO %s", @@ -329,8 +329,8 @@ "╭ BENCHMARK ╮": "╭ BENCHMARK ╮", "╭ CONSUMPTION PACE ╮": "╭ RITMO DE CONSUMO ╮", "╭ FUEL TANK ╮": "╭ DEPÓSITO ╮", - "╭ MONITOR ╮": "╭ MONITOR ╮", - "╭ MONITOR ●╮": "╭ MONITOR ●╮", + "╭ SESSIONS ╮": "╭ SESSÕES ╮", + "╭ SESSIONS ●╮": "╭ SESSÕES ●╮", "╭ PIE ╮": "╭ CIRCULAR ╮", "╭ QUOTA ╮": "╭ QUOTA ╮", "╭ USAGE ╮": "╭ UTILIZAÇÃO ╮", diff --git a/internal/i18n/locales/ru.json b/internal/i18n/locales/ru.json index c40056e..fad4cad 100644 --- a/internal/i18n/locales/ru.json +++ b/internal/i18n/locales/ru.json @@ -192,8 +192,8 @@ "MODEL": "МОДЕЛЬ", "MODEL // ": "МОДЕЛЬ // ", "MODEL: %s\n": "МОДЕЛЬ: %s\n", - "MONITOR": "МОНИТОР", - "MONITOR READOUT": "ПОКАЗАТЕЛИ МОНИТОРА", + "SESSIONS": "СЕАНСЫ", + "SESSION TOTALS": "ИТОГИ СЕАНСОВ", "MONITORING ●": "НАБЛЮДЕНИЕ ●", "MONTHLY": "ПО МЕСЯЦАМ", "MORE // PEAK DAY %s": "БОЛЬШЕ // ПИК ЗА ДЕНЬ %s", @@ -329,8 +329,8 @@ "╭ BENCHMARK ╮": "╭ ТЕСТ ╮", "╭ CONSUMPTION PACE ╮": "╭ ТЕМП РАСХОДА ╮", "╭ FUEL TANK ╮": "╭ БАК ╮", - "╭ MONITOR ╮": "╭ МОНИТОР ╮", - "╭ MONITOR ●╮": "╭ МОНИТОР ●╮", + "╭ SESSIONS ╮": "╭ СЕАНСЫ ╮", + "╭ SESSIONS ●╮": "╭ СЕАНСЫ ●╮", "╭ PIE ╮": "╭ КРУГ ╮", "╭ QUOTA ╮": "╭ КВОТА ╮", "╭ USAGE ╮": "╭ ИСПОЛЬЗОВАНИЕ ╮", diff --git a/internal/i18n/locales/sv.json b/internal/i18n/locales/sv.json index 96ca405..6446be9 100644 --- a/internal/i18n/locales/sv.json +++ b/internal/i18n/locales/sv.json @@ -192,8 +192,8 @@ "MODEL": "MODELL", "MODEL // ": "MODELL // ", "MODEL: %s\n": "MODELL: %s\n", - "MONITOR": "ÖVERVAKNING", - "MONITOR READOUT": "ÖVERVAKNINGSDATA", + "SESSIONS": "SESSIONER", + "SESSION TOTALS": "SESSIONSTOTALER", "MONITORING ●": "ÖVERVAKAR ●", "MONTHLY": "MÅNADSVIS", "MORE // PEAK DAY %s": "MER // TOPPDAG %s", @@ -329,8 +329,8 @@ "╭ BENCHMARK ╮": "╭ TEST ╮", "╭ CONSUMPTION PACE ╮": "╭ FÖRBRUKNINGSTAKT ╮", "╭ FUEL TANK ╮": "╭ BRÄNSLETANK ╮", - "╭ MONITOR ╮": "╭ ÖVERVAKNING ╮", - "╭ MONITOR ●╮": "╭ ÖVERVAKNING ●╮", + "╭ SESSIONS ╮": "╭ SESSIONER ╮", + "╭ SESSIONS ●╮": "╭ SESSIONER ●╮", "╭ PIE ╮": "╭ CIRKEL ╮", "╭ QUOTA ╮": "╭ KVOT ╮", "╭ USAGE ╮": "╭ ANVÄNDNING ╮", diff --git a/internal/i18n/locales/tr.json b/internal/i18n/locales/tr.json index 0fdbd37..70daa7c 100644 --- a/internal/i18n/locales/tr.json +++ b/internal/i18n/locales/tr.json @@ -192,8 +192,8 @@ "MODEL": "MODEL", "MODEL // ": "MODEL // ", "MODEL: %s\n": "MODEL: %s\n", - "MONITOR": "İZLEME", - "MONITOR READOUT": "İZLEME VERİLERİ", + "SESSIONS": "OTURUMLAR", + "SESSION TOTALS": "OTURUM TOPLAMLARI", "MONITORING ●": "İZLENİYOR ●", "MONTHLY": "AYLIK", "MORE // PEAK DAY %s": "DAHA FAZLA // ZİRVE GÜN %s", @@ -329,8 +329,8 @@ "╭ BENCHMARK ╮": "╭ TEST ╮", "╭ CONSUMPTION PACE ╮": "╭ TÜKETİM HIZI ╮", "╭ FUEL TANK ╮": "╭ YAKIT DEPOSU ╮", - "╭ MONITOR ╮": "╭ İZLEME ╮", - "╭ MONITOR ●╮": "╭ İZLEME ●╮", + "╭ SESSIONS ╮": "╭ OTURUMLAR ╮", + "╭ SESSIONS ●╮": "╭ OTURUMLAR ●╮", "╭ PIE ╮": "╭ PASTA ╮", "╭ QUOTA ╮": "╭ KOTA ╮", "╭ USAGE ╮": "╭ KULLANIM ╮", diff --git a/internal/i18n/locales/zh-Hans.json b/internal/i18n/locales/zh-Hans.json index 7a3ff88..38864e3 100644 --- a/internal/i18n/locales/zh-Hans.json +++ b/internal/i18n/locales/zh-Hans.json @@ -192,8 +192,8 @@ "MODEL": "模型", "MODEL // ": "模型 // ", "MODEL: %s\n": "模型: %s\n", - "MONITOR": "监控", - "MONITOR READOUT": "监控读数", + "SESSIONS": "会话", + "SESSION TOTALS": "会话总计", "MONITORING ●": "监控中 ●", "MONTHLY": "每月", "MORE // PEAK DAY %s": "多 // 单日峰值 %s", @@ -329,8 +329,8 @@ "╭ BENCHMARK ╮": "╭ 基准测试 ╮", "╭ CONSUMPTION PACE ╮": "╭ 消耗速度 ╮", "╭ FUEL TANK ╮": "╭ 油箱 ╮", - "╭ MONITOR ╮": "╭ 监控 ╮", - "╭ MONITOR ●╮": "╭ 监控 ●╮", + "╭ SESSIONS ╮": "╭ 会话 ╮", + "╭ SESSIONS ●╮": "╭ 会话 ●╮", "╭ PIE ╮": "╭ 饼图 ╮", "╭ QUOTA ╮": "╭ 配额 ╮", "╭ USAGE ╮": "╭ 用量 ╮", diff --git a/internal/ui/english_snapshot_test.go b/internal/ui/english_snapshot_test.go index d5fe043..a320e78 100644 --- a/internal/ui/english_snapshot_test.go +++ b/internal/ui/english_snapshot_test.go @@ -31,9 +31,9 @@ func TestEnglishPresentationSnapshot(t *testing.T) { } } got := fmt.Sprintf("%x", hash.Sum(nil)) - // Baseline intentionally updated for the Monitor's directional detail hint; + // Baseline intentionally updated for Sessions / SESSION TOTALS branding; // all themes, views and three terminal sizes are covered. - const want = "a17b202b9a8c1ca801640b3c0a916a14e1060018225166d02a448848d6053bd6" + const want = "3813648a9bb9fcb16559f4eea5f1375f0e6fdc611d0c6d1191545966b7c0474d" if got != want { t.Fatalf("English presentation changed: got %s, want %s", got, want) } diff --git a/internal/ui/monitor.go b/internal/ui/monitor.go index a9183cf..205606f 100644 --- a/internal/ui/monitor.go +++ b/internal/ui/monitor.go @@ -152,7 +152,7 @@ func (m Model) renderMonitorReadout(width, height int, colors palette) string { lines = append(lines, colors.dimmed().Render(ansi.Truncate(telemetry, innerWidth, ""))) } action := m.renderMonitorNavigation(width, "", false, colors) - return frameSizedWithTitleAction(width, max(height-2, 1), i18n.Text("MONITOR READOUT"), action, strings.Join(lines, "\n"), colors.primary, colors) + return frameSizedWithTitleAction(width, max(height-2, 1), i18n.Text("SESSION TOTALS"), action, strings.Join(lines, "\n"), colors.primary, colors) } func (m Model) renderMonitorButton(width, height int, label string, id footerButtonID, enabled bool, colors palette) string { diff --git a/internal/ui/monitor_test.go b/internal/ui/monitor_test.go index a853824..f94cf20 100644 --- a/internal/ui/monitor_test.go +++ b/internal/ui/monitor_test.go @@ -897,7 +897,7 @@ func TestMonitorViewIsResponsiveAndGraphAutoScales(t *testing.T) { } output := model.render() plain := ansi.Strip(output) - for _, want := range []string{"MONITOR READOUT", "6,250 TOKENS", "RE(S)ET", "LOCAL TOKEN BARS", "AUTO 0-10K", "█", "░"} { + for _, want := range []string{"SESSION TOTALS", "6,250 TOKENS", "RE(S)ET", "LOCAL TOKEN BARS", "AUTO 0-10K", "█", "░"} { if !strings.Contains(plain, want) { t.Errorf("%dx%d monitor missing %q:\n%s", size.width, size.height, want, plain) } diff --git a/internal/ui/tabs.go b/internal/ui/tabs.go index 1393051..a69e748 100644 --- a/internal/ui/tabs.go +++ b/internal/ui/tabs.go @@ -65,14 +65,14 @@ func responsiveTabLabels(width int, tiers [][]string) ([]string, string) { } func mainTabLayout(width int, showMonitorLight bool) ([]mainTab, string) { - monitorFull := i18n.Text("╭ MONITOR ╮") - monitorCompact := "╭MON╮" - monitorMinimal := "[M]" - microMonitor := "M" + monitorFull := i18n.Text("╭ SESSIONS ╮") + monitorCompact := "╭SES╮" + monitorMinimal := "[S]" + microMonitor := "S" if showMonitorLight { - monitorFull = i18n.Text("╭ MONITOR ●╮") - monitorCompact = "╭MON●╮" - monitorMinimal = "[M●]" + monitorFull = i18n.Text("╭ SESSIONS ●╮") + monitorCompact = "╭SES●╮" + monitorMinimal = "[S●]" microMonitor = "●" } labels, separator := responsiveTabLabels(width, [][]string{ diff --git a/internal/ui/tabs_test.go b/internal/ui/tabs_test.go index 30d222c..34df455 100644 --- a/internal/ui/tabs_test.go +++ b/internal/ui/tabs_test.go @@ -41,6 +41,23 @@ func TestMainTabsChooseResponsiveLabels(t *testing.T) { } } +func TestSessionsBrandingAndLegacyPreference(t *testing.T) { + store := &memoryPreferenceStore{preferences: Preferences{MainTab: "monitor", QuotaView: "pie"}} + m := NewWithPreferences(nil, time.Minute, store) + if m.currentMainTab() != mainTabMonitor || m.selectedQuotaView() != viewPie || m.meterView.name() != "SESSIONS" { + t.Fatal("renaming lost the legacy saved tab or its new display name") + } + for _, test := range []struct { + width int + want string + }{{100, "╭ SESSIONS ●╮"}, {22, "╭SES●╮"}, {14, "[S●]"}, {4, "●"}} { + tabs, _ := mainTabLayout(test.width, true) + if tabs[mainTabMonitor].label != test.want { + t.Fatalf("width %d session tab = %q, want %q", test.width, tabs[mainTabMonitor].label, test.want) + } + } +} + func TestQuotaViewTabsChooseResponsiveLabels(t *testing.T) { for _, test := range []struct { width int diff --git a/internal/ui/theme.go b/internal/ui/theme.go index 3d21834..3f1a51d 100644 --- a/internal/ui/theme.go +++ b/internal/ui/theme.go @@ -64,7 +64,7 @@ func (s meterViewID) nextQuota() meterViewID { func (s meterViewID) name() string { return [...]string{ i18n.Text("BARS"), - i18n.Text("MONITOR"), + i18n.Text("SESSIONS"), i18n.Text("PIE"), i18n.Text("CONSUMPTION PACE"), i18n.Text("FUEL TANK"), diff --git a/internal/ui/view_test.go b/internal/ui/view_test.go index 6de7e4f..a46a6c7 100644 --- a/internal/ui/view_test.go +++ b/internal/ui/view_test.go @@ -32,7 +32,7 @@ func TestViewRendersEveryThemeAndViewWithinStandardTerminal(t *testing.T) { t.Errorf("view %d name missing from view", view) } if view == viewMonitor { - if !strings.Contains(output, "MONITOR READOUT") || !strings.Contains(output, "30 SEC LOCAL TOKEN BARS") { + if !strings.Contains(output, "SESSION TOTALS") || !strings.Contains(output, "30 SEC LOCAL TOKEN BARS") { t.Errorf("monitor components missing for theme %d", theme) } } else if view == viewBenchmark { diff --git a/intro-post.md b/intro-post.md index bcfffb4..d16f779 100644 --- a/intro-post.md +++ b/intro-post.md @@ -1,12 +1,12 @@ # Codexometer: your retro Codex session command centre -[Codexometer](https://github.com/merefield/codexometer) is a retro terminal dashboard and **session command centre** for [Codex](https://github.com/openai/codex). Keep it beside your working sessions to see who's busy, who needs attention, and how much quota you have left. With a shared local app-server, Monitor also lets you answer supported questions, review and confirm command approvals, and send follow-ups—all from one place. Quota, token-usage history and model benchmarks remain a tab away. +[Codexometer](https://github.com/merefield/codexometer) is a retro terminal dashboard and **session command centre** for [Codex](https://github.com/openai/codex). Keep it beside your working sessions to see who's busy, who needs attention, and how much quota you have left. With a shared local app-server, Sessions also lets you answer supported questions, review and confirm command approvals, and send follow-ups—all from one place. Quota, token-usage history and model benchmarks remain a tab away. ![codexometer|690x454](upload://xcWugpZYodk0zuFVYsDzluTemtf.png) ## Why use it? -`/status` is useful, but it lives inside the session where you are working. Codexometer keeps quota visible without interrupting that work, while Monitor brings several sessions together so you can inspect the latest context and, where live controls are available, respond without hunting through CLI tabs. +`/status` is useful, but it lives inside the session where you are working. Codexometer keeps quota visible without interrupting that work, while Sessions brings several sessions together so you can inspect the latest context and, where live controls are available, respond without hunting through CLI tabs. It is useful when you want to: @@ -18,30 +18,30 @@ It is useful when you want to: - compare available models and reasoning levels on the same checked tasks; or - inspect how a benchmark was solved rather than seeing only a final score. -The interface runs locally in a terminal, with clickable and hover-highlighted controls, keyboard shortcuts, responsive layouts, five colour themes, and 16 languages with 17 locale options, including Brazilian and European Portuguese. Extra rate-limit windows are accommodated as Codex returns them. Your main tab, theme, Quota view, benchmark filter, ranking and global Monitor hide/show preferences survive restarts. +The interface runs locally in a terminal, with clickable and hover-highlighted controls, keyboard shortcuts, responsive layouts, five colour themes, and 16 languages with 17 locale options, including Brazilian and European Portuguese. Extra rate-limit windows are accommodated as Codex returns them. Your main tab, theme, Quota view, benchmark filter, ranking and global Sessions hide/show preferences survive restarts. ## What does it show? The interface has four main tabs: - **Quota** — switch between Bars, Consumption Pace, Pie, and Fuel Tank presentations. Compare consumption directly with elapsed reset-cycle time, see countdowns and reset dates, and get a pace-aware health signal or an early-exhaustion projection. Learned API-equivalent estimates show both current spend and what 100% of a primary quota window might represent, with conservative confidence and a pricing-source/date footer when space permits. Eligible banked resets can be redeemed with a separate confirmation click. -- **Monitor** — your session command centre, combining per-session context and eligible live reply/approval controls with metrics and scrolling, auto-scaling graphs on a shared 30-second tick. Compare local token shares, model calls, activity, output size, and time to first token; explicitly linked subagents are folded into their parent session. The wider readout keeps a clickable Reset beside it; Pause/Resume is keyboard-only with `p` and pauses measurement, not Codex. Page through sessions and dismiss finished rows with `[×]` without closing them: fresh activity brings them back. -- **Usage** — explore account token history in a GitHub-style daily activity grid, weekly bars, or a cumulative graph. Choose 6 or 12 months (26/52 weeks), browse older periods, and see reported lifetime tokens, peak daily usage, and the current streak. This is server-side history, not the Monitor’s live local counters, so it can lag ongoing work; it does not invent historical dollar costs or per-model breakdowns. +- **Sessions** — your session command centre, combining per-session context and eligible live reply/approval controls with metrics and scrolling, auto-scaling graphs on a shared 30-second tick. Compare local token shares, model calls, activity, output size, and time to first token; explicitly linked subagents are folded into their parent session. The wider **SESSION TOTALS** readout keeps a clickable Reset beside it; Pause/Resume is keyboard-only with `p` and pauses measurement, not Codex. Page through sessions and dismiss finished rows with `[×]` without closing them: fresh activity brings them back. +- **Usage** — explore account token history in a GitHub-style daily activity grid, weekly bars, or a cumulative graph. Choose 6 or 12 months (26/52 weeks), browse older periods, and see reported lifetime tokens, peak daily usage, and the current streak. This is server-side history, not the Sessions tab’s live local counters, so it can lag ongoing work; it does not invent historical dollar costs or per-model breakdowns. - **Benchmark** — run programmatically checked challenges across selected model and reasoning-level combinations, then compare outcomes, wall time, tokens, estimated API-equivalent cost, and rankings. Use `Tab` / `Shift+Tab` or the mouse to navigate. Quota refreshes every minute by default. Passive monitoring and history views do not start model turns; explicitly sent follow-ups and benchmark runs do consume model usage. Click the **Codexometer title** to jump back to Quota’s Bars view. The **version label** links to that version’s release highlights through your terminal’s hyperlink support—typically Ctrl-click. -## Monitor: your session command centre +## Sessions: your session command centre Start with the session that needs you. A **WORKING** badge in its telemetry box blinks only its ball, keeping the text steady; completion and attention states take priority. Recent activity alone is not treated as proof of work. Compact and wide detail panels keep content headings such as **LAST REPLY** or **APPROVAL REQUEST**, while full detail puts the session status in its box title without repeating it in the body. -Give each Monitor session as much space as it needs. Select a session with `Up`/`Down`, then use `Left`/`Right` for less/more detail: **graph only ↔ split detail/graph ↔ full-width detail ↔ full-screen detail**. Clicking the left/right half of that row’s detail/graph area does the same thing, without wrapping at either end. Only that session changes; approval buttons and reply editors keep their own actions. From full-screen detail, Left or Escape returns to the main Monitor with the same session showing full-width detail. While typing, arrows edit your text and Escape first leaves the editor. +Give each session as much space as it needs. Select a session with `Up`/`Down`, then use `Left`/`Right` for less/more detail: **graph only ↔ split detail/graph ↔ full-width detail ↔ full-screen detail**. Clicking the left/right half of that row’s detail/graph area does the same thing, without wrapping at either end. Only that session changes; approval buttons and reply editors keep their own actions. From full-screen detail, Left or Escape returns to the Sessions overview with the same session showing full-width detail. While typing, arrows edit your text and Escape first leaves the editor. Global **Show Detail / Hide Detail** (`h`) resets all rows to split detail/graph or graph-only. That global preference survives restarts, as do your last main tab and Quota view; individual row layouts, selection and dismissals are temporary. -Prefer visible controls? Click **[←] [→]** at the top-right of each row's rightmost box to adjust detail, or **[↑] [↓]** in the Monitor header to select sessions. Unavailable directions are dimmed. The session-selection buttons stay out of full-screen detail, where Up/Down scroll the text; tiny boxes fall back to keyboard and background clicks. +Prefer visible controls? Click **[←] [→]** at the top-right of each row's rightmost box to adjust detail, or **[↑] [↓]** in the Sessions header to select sessions. Unavailable directions are dimmed. The session-selection buttons stay out of full-screen detail, where Up/Down scroll the text; tiny boxes fall back to keyboard and background clicks. If an approval request is too long for inline controls, a highlighted **APPROVAL — OPEN DETAIL →** warning takes you to the complete request. Dismiss another session or enlarge the window and the buttons reappear automatically when there is enough room to review the request safely. @@ -59,7 +59,7 @@ Quota API-EQ also accounts for **requested Fast-mode premiums** on maintained As The reset button normally appears only when Codex reports an available reset and a quota window is at least **80% consumed**. Change that threshold with `--reset-threshold 60`. Click once to reveal confirmation, then again within ten seconds to redeem; `Esc` cancels. A reset refreshes eligible quota and changes the weekly reset schedule—it does not stack additional allowance. -Ordinary Codex CLI sessions work out of the box. For the best Monitor feedback, connect your CLI sessions through a shared local Codex app-server: Codexometer can distinguish **INPUT NEEDED** from **APPROVAL NEEDED**, show command-approval details with controls matching Codex's supported offered choices, and use positively matched resolved-model events for more accurate pricing. Permission grants require confirmation; session-wide and persistent-prefix choices are clearly labelled. Without that setup, it falls back to local session signals and a cautious **CHECK SESSION** inactivity prompt, not a guessed approval alert. See the [recommended setup](https://github.com/merefield/codexometer#recommended-codex-cli-setup). +Ordinary Codex CLI sessions work out of the box. For the best Sessions feedback, connect your CLI sessions through a shared local Codex app-server: Codexometer can distinguish **INPUT NEEDED** from **APPROVAL NEEDED**, show command-approval details with controls matching Codex's supported offered choices, and use positively matched resolved-model events for more accurate pricing. Permission grants require confirmation; session-wide and persistent-prefix choices are clearly labelled. Without that setup, it falls back to local session signals and a cautious **CHECK SESSION** inactivity prompt, not a guessed approval alert. See the [recommended setup](https://github.com/merefield/codexometer#recommended-codex-cli-setup). ## Make it yours @@ -118,7 +118,7 @@ Prefer a non-interactive run? `codexometer --digbench-game P-1` runs a named gam ## Privacy, authentication, and cost -Quota monitoring uses the prevailing Codex login. Monitor can show a bounded last-reply, activity, question, or approval preview beside each session. Excerpts remain in memory and do not trigger another model call; global Hide Detail hides them until you choose to show them again, including by expanding an individual row. With a shared app-server, full detail lets you answer supported blocking questions or send a follow-up to an idle session; a selected wide inline row also offers follow-ups when space permits. Unsupported questions and approvals remain in Codex. Supported command decisions use clickable buttons or numbered shortcuts; grants require a separately labelled confirmation (the same number for one-time approval where key-release support is detected, `C`, or a second click). Broader grants retain `C` or click confirmation, and persistent-prefix rules are shown for review. Approval controls belong to only the current target session. Drafts stay in memory; submitted text becomes part of Codex's normal session history, and follow-up turns consume model usage. Full interaction capture remains restricted to isolated benchmark turns created by Codexometer; Monitor does not harvest user prompts, reasoning, or arbitrary tool output. +Quota monitoring uses the prevailing Codex login. Sessions can show a bounded last-reply, activity, question, or approval preview beside each session. Excerpts remain in memory and do not trigger another model call; global Hide Detail hides them until you choose to show them again, including by expanding an individual row. With a shared app-server, full detail lets you answer supported blocking questions or send a follow-up to an idle session; a selected wide inline row also offers follow-ups when space permits. Unsupported questions and approvals remain in Codex. Supported command decisions use clickable buttons or numbered shortcuts; grants require a separately labelled confirmation (the same number for one-time approval where key-release support is detected, `C`, or a second click). Broader grants retain `C` or click confirmation, and persistent-prefix rules are shown for review. Approval controls belong to only the current target session. Drafts stay in memory; submitted text becomes part of Codex's normal session history, and follow-up turns consume model usage. Full interaction capture remains restricted to isolated benchmark turns created by Codexometer; Sessions does not harvest user prompts, reasoning, or arbitrary tool output. Benchmark transcripts are bounded and sanitized. Credentials, request headers, known runtime identifiers, temporary paths, terminal controls, Codex reasoning, and unrelated local session content are not retained in the detail view. From 6aa5fc65acba592057624b7bb5282acd368fb17e Mon Sep 17 00:00:00 2001 From: merefield Date: Fri, 11 Sep 2026 12:20:13 +0100 Subject: [PATCH 2/2] DOC: clarify Sessions tab wording after review --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 254c6b6..1fbe8f6 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Codexometer is a retro terminal dashboard and **session command centre** for sessions to follow their activity, see which need attention, and keep quota and reset timing visible without repeatedly opening `/status`. -The **Sessions** brings your sessions into one place: read their latest context, +The **Sessions** tab brings your sessions into one place: read their latest context, compare token activity, and—with the [shared local app-server setup](#recommended-codex-cli-setup)— answer supported questions, review and confirm command approvals, and send follow-ups to idle sessions. Quota views, account usage history and optional