From 10e78065201c8387494b8aafabb987da87183b3a Mon Sep 17 00:00:00 2001 From: Adam Malczewski Date: Wed, 14 Oct 2026 17:04:35 +0900 Subject: feat(account-usage): sidebar Usage view with Claude/Codex quota bars + on-track pace markers Consumes GET /usage (transport-contract 0.25.0). DaisyUI progress bars per quota window with a dot at the elapsed fraction of the window (the 'on track' level), ahead/under-pace labels, reset countdowns, stale/unavailable/not-configured states. --- src/app/register-views.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'src/app/register-views.ts') diff --git a/src/app/register-views.ts b/src/app/register-views.ts index 5b462fe..05afd89 100644 --- a/src/app/register-views.ts +++ b/src/app/register-views.ts @@ -9,7 +9,7 @@ * * `chat` / `composer` / `message-queue` are CONTENT views (decision 5): they * register with `panelEligible: false` so they never appear in the panel - * dropdowns. All 14 sidebar views keep the eligible default. + * dropdowns. All 15 sidebar views keep the eligible default. * * Imported ONCE by App.svelte's module script — before any tile renders. */ @@ -17,6 +17,7 @@ import type { Component } from "svelte"; import { registerView, type ViewComponent, type ViewRegistration } from "../features/layout"; import type { AppViewPorts } from "./view-ports"; +import AccountUsagePane from "./views/AccountUsagePane.svelte"; import CacheWarmingPane from "./views/CacheWarmingPane.svelte"; import ChatPane from "./views/ChatPane.svelte"; import CompactionPane from "./views/CompactionPane.svelte"; @@ -50,7 +51,7 @@ function asView(component: WrapperComponent): ViewComponent { export function registerBuiltinViews(): void { const views: readonly ViewRegistration[] = [ - // --- sidebar views (panel-eligible by default — the 14 old viewKinds) + // --- sidebar views (panel-eligible by default — the 14 old viewKinds + account-usage) { id: "tabs", label: "Tabs", component: asView(TabsPane) }, { id: "model", label: "Model", component: asView(ModelPane) }, { id: "named-agents", label: "Named Agents", component: asView(NamedAgentsPane) }, @@ -63,6 +64,7 @@ export function registerBuiltinViews(): void { { id: "vision", label: "Vision", component: asView(VisionPane) }, { id: "heartbeat", label: "Heartbeat", component: asView(HeartbeatPane) }, { id: "concurrency", label: "Concurrency", component: asView(ConcurrencyPane) }, + { id: "account-usage", label: "Usage", component: asView(AccountUsagePane) }, { id: "system-prompt", label: "System Prompt", component: asView(SystemPromptPane) }, { id: "settings", label: "Settings", component: asView(SettingsPane) }, // --- content views (never in the panel dropdowns — decision 5) -- cgit v1.2.3