Skip to content

Commit 88254cd

Browse files
committed
fix(control-ui): restore provider usage quota pill in sidebar session switcher
1 parent cf79735 commit 88254cd

3 files changed

Lines changed: 83 additions & 1 deletion

File tree

ui/src/styles/chat/layout.css

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1816,6 +1816,21 @@
18161816
grid-template-areas: "session";
18171817
}
18181818

1819+
.chat-controls__session-row--session-switcher.chat-controls__session-row--has-quota {
1820+
grid-template-columns: minmax(0, 1fr);
1821+
grid-template-areas:
1822+
"agent"
1823+
"session"
1824+
"quota";
1825+
}
1826+
1827+
.chat-controls__session-row--session-switcher.chat-controls__session-row--single-agent.chat-controls__session-row--has-quota {
1828+
grid-template-columns: minmax(0, 1fr);
1829+
grid-template-areas:
1830+
"session"
1831+
"quota";
1832+
}
1833+
18191834
.chat-controls__session-row--compact {
18201835
width: 44px;
18211836
}

ui/src/ui/chat/session-controls.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,10 @@ export function renderChatSessionSelect(
9494
const agentSelect = compact ? "" : renderChatAgentSelect(state, onSwitchSession, agentOptions);
9595
const sessionSwitcherOnly = options.sessionSwitcherOnly ?? false;
9696
const modelSelect = sessionSwitcherOnly ? "" : renderChatModelSelect(state);
97-
const quotaPill = sessionSwitcherOnly ? "" : renderChatQuotaPill(state);
97+
// Quota is informational, not a control: show it whenever there is room
98+
// (hidden only in the collapsed/compact sidebar), independent of
99+
// sessionSwitcherOnly which suppresses the model *control* (#93041).
100+
const quotaPill = compact ? "" : renderChatQuotaPill(state);
98101
const surface = options.surface ?? "desktop";
99102
const selectedSessionLabel = resolveSelectedChatSessionLabel(state, sessionGroups);
100103
const pickerOpen = state.chatSessionPickerOpen && state.chatSessionPickerSurface === surface;

ui/src/ui/views/chat.test.ts

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3393,6 +3393,70 @@ describe("chat session controls", () => {
33933393
expect(state.setTab).toHaveBeenCalledWith("usage");
33943394
});
33953395

3396+
it("shows provider quota in the sidebar session switcher (regression #93041)", () => {
3397+
const { state } = createChatHeaderState();
3398+
state.modelAuthStatusResult = {
3399+
ts: Date.now(),
3400+
providers: [
3401+
{
3402+
provider: "openai",
3403+
displayName: "Codex",
3404+
status: "ok",
3405+
profiles: [{ profileId: "codex", type: "oauth", status: "ok" }],
3406+
usage: {
3407+
windows: [
3408+
{ label: "3h", usedPercent: 18 },
3409+
{ label: "Week", usedPercent: 72 },
3410+
],
3411+
},
3412+
},
3413+
],
3414+
};
3415+
const container = document.createElement("div");
3416+
render(
3417+
renderChatSessionSelect(state, () => undefined, {
3418+
sessionSwitcherOnly: true,
3419+
surface: "sidebar",
3420+
}),
3421+
container,
3422+
);
3423+
3424+
const quota = container.querySelector<HTMLAnchorElement>('[data-chat-provider-usage="true"]');
3425+
expect(quota?.textContent?.replace(/\s+/g, " ").trim()).toBe("Usage 28%");
3426+
3427+
const row = container.querySelector(".chat-controls__session-row");
3428+
expect(row?.classList.contains("chat-controls__session-row--has-quota")).toBe(true);
3429+
});
3430+
3431+
it("hides provider quota when the sidebar session switcher is collapsed", () => {
3432+
const { state } = createChatHeaderState();
3433+
state.modelAuthStatusResult = {
3434+
ts: Date.now(),
3435+
providers: [
3436+
{
3437+
provider: "openai",
3438+
displayName: "Codex",
3439+
status: "ok",
3440+
profiles: [{ profileId: "codex", type: "oauth", status: "ok" }],
3441+
usage: {
3442+
windows: [{ label: "3h", usedPercent: 18 }],
3443+
},
3444+
},
3445+
],
3446+
};
3447+
const container = document.createElement("div");
3448+
render(
3449+
renderChatSessionSelect(state, () => undefined, {
3450+
sessionSwitcherOnly: true,
3451+
compact: true,
3452+
surface: "sidebar",
3453+
}),
3454+
container,
3455+
);
3456+
3457+
expect(container.querySelector('[data-chat-provider-usage="true"]')).toBeNull();
3458+
});
3459+
33963460
it("falls back to the selected agent's main session when no sessions exist yet", () => {
33973461
const { state } = createChatHeaderState();
33983462
const onSwitchSession = vi.fn();

0 commit comments

Comments
 (0)