From b142504125324b6fa0172bc2f5c1309faefc37ed Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Tue, 21 Jul 2026 18:25:38 +0200 Subject: [PATCH] fix(coding-agent): defer catalog refresh until after TUI startup --- packages/coding-agent/CHANGELOG.md | 4 ++++ packages/coding-agent/src/main.ts | 3 ++- .../src/modes/interactive/interactive-mode.ts | 18 ++++++++++++++---- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index f3670a31..fe7d5cf0 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -2,6 +2,10 @@ ## [Unreleased] +### Fixed + +- Fixed interactive startup waiting for background model catalog refresh while computing the footer provider count. + ## [0.81.0] - 2026-07-21 ### New Features diff --git a/packages/coding-agent/src/main.ts b/packages/coding-agent/src/main.ts index e004436f..ce7465f1 100644 --- a/packages/coding-agent/src/main.ts +++ b/packages/coding-agent/src/main.ts @@ -808,7 +808,8 @@ export async function main(args: string[], options?: MainOptions) { process.exit(1); } - if (!offlineMode && (appMode === "interactive" || appMode === "rpc")) { + // RPC refreshes catalogs here in the background; interactive mode starts its refresh after TUI initialization. + if (!offlineMode && appMode === "rpc") { void modelRuntime.refresh().catch(() => {}); } diff --git a/packages/coding-agent/src/modes/interactive/interactive-mode.ts b/packages/coding-agent/src/modes/interactive/interactive-mode.ts index 5a058c12..7a31aa84 100644 --- a/packages/coding-agent/src/modes/interactive/interactive-mode.ts +++ b/packages/coding-agent/src/modes/interactive/interactive-mode.ts @@ -826,6 +826,13 @@ export class InteractiveMode { async run(): Promise { await this.init(); + if (!process.env.PI_OFFLINE) { + void this.session.modelRuntime + .refresh() + .then(() => this.updateAvailableProviderCount()) + .catch(() => {}); + } + // Start version check asynchronously checkForNewPiVersion(this.version).then((newRelease) => { if (newRelease) { @@ -4352,10 +4359,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)); + /** Update the footer's available provider count from the current snapshot without refreshing catalogs. */ + private updateAvailableProviderCount(): void { + const models = + this.session.scopedModels.length > 0 + ? this.session.scopedModels.map((scoped) => scoped.model) + : this.session.modelRuntime.getAvailableSnapshot(); + const uniqueProviders = new Set(models.map((model) => model.provider)); this.footerDataProvider.setAvailableProviderCount(uniqueProviders.size); }