From 09d1b099b7ffd3c21de25ee60ca4888c2f9cf75d Mon Sep 17 00:00:00 2001 From: Denis Badurina Date: Fri, 23 Jan 2026 15:02:52 +0100 Subject: [PATCH] cheers --- .../coding-agent/src/core/footer-data-provider.ts | 15 +++++++++++++-- .../src/modes/interactive/components/footer.ts | 5 +++++ .../src/modes/interactive/interactive-mode.ts | 12 ++++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/packages/coding-agent/src/core/footer-data-provider.ts b/packages/coding-agent/src/core/footer-data-provider.ts index 3ad6a20d..f1b4889a 100644 --- a/packages/coding-agent/src/core/footer-data-provider.ts +++ b/packages/coding-agent/src/core/footer-data-provider.ts @@ -42,6 +42,7 @@ export class FooterDataProvider { private cachedBranch: string | null | undefined = undefined; private gitWatcher: FSWatcher | null = null; private branchChangeCallbacks = new Set<() => void>(); + private availableProviderCount = 0; constructor() { this.setupGitWatcher(); @@ -90,6 +91,16 @@ export class FooterDataProvider { this.extensionStatuses.clear(); } + /** Number of unique providers with available models (for footer display) */ + getAvailableProviderCount(): number { + return this.availableProviderCount; + } + + /** Internal: update available provider count */ + setAvailableProviderCount(count: number): void { + this.availableProviderCount = count; + } + /** Internal: cleanup */ dispose(): void { if (this.gitWatcher) { @@ -126,8 +137,8 @@ export class FooterDataProvider { } } -/** Read-only view for extensions - excludes setExtensionStatus and dispose */ +/** Read-only view for extensions - excludes setExtensionStatus, setAvailableProviderCount and dispose */ export type ReadonlyFooterDataProvider = Pick< FooterDataProvider, - "getGitBranch" | "getExtensionStatuses" | "onBranchChange" + "getGitBranch" | "getExtensionStatuses" | "getAvailableProviderCount" | "onBranchChange" >; diff --git a/packages/coding-agent/src/modes/interactive/components/footer.ts b/packages/coding-agent/src/modes/interactive/components/footer.ts index 255df2ae..f1562e32 100644 --- a/packages/coding-agent/src/modes/interactive/components/footer.ts +++ b/packages/coding-agent/src/modes/interactive/components/footer.ts @@ -168,6 +168,11 @@ export class FooterComponent implements Component { } } + // Prepend the provider in parenthesis to the right side if there's multiple providers + if (this.footerData.getAvailableProviderCount() > 1 && state.model) { + rightSide = `(${state.model.provider}) ${rightSide}`; + } + let statsLeftWidth = visibleWidth(statsLeft); const rightSideWidth = visibleWidth(rightSide); diff --git a/packages/coding-agent/src/modes/interactive/interactive-mode.ts b/packages/coding-agent/src/modes/interactive/interactive-mode.ts index 0afd278b..5a4a5f70 100644 --- a/packages/coding-agent/src/modes/interactive/interactive-mode.ts +++ b/packages/coding-agent/src/modes/interactive/interactive-mode.ts @@ -476,6 +476,9 @@ export class InteractiveMode { this.footerDataProvider.onBranchChange(() => { this.ui.requestRender(); }); + + // Initialize available provider count for footer display + await this.updateAvailableProviderCount(); } /** @@ -2781,6 +2784,13 @@ export class InteractiveMode { } } + /** Update the footer's available provider count from current model candidates */ + private async updateAvailableProviderCount(): Promise { + const models = await this.getModelCandidates(); + const uniqueProviders = new Set(models.map((m) => m.provider)); + this.footerDataProvider.setAvailableProviderCount(uniqueProviders.size); + } + private showModelSelector(initialSearchInput?: string): void { this.showSelector((done) => { const selector = new ModelSelectorComponent( @@ -3173,6 +3183,7 @@ export class InteractiveMode { try { this.session.modelRegistry.authStorage.logout(providerId); this.session.modelRegistry.refresh(); + await this.updateAvailableProviderCount(); this.showStatus(`Logged out of ${providerName}`); } catch (error: unknown) { this.showError(`Logout failed: ${error instanceof Error ? error.message : String(error)}`); @@ -3267,6 +3278,7 @@ export class InteractiveMode { // Success restoreEditor(); this.session.modelRegistry.refresh(); + await this.updateAvailableProviderCount(); this.showStatus(`Logged in to ${providerName}. Credentials saved to ${getAuthPath()}`); } catch (error: unknown) { restoreEditor();