From a7f158ee110e5363bd9eeabea18f81278af34da5 Mon Sep 17 00:00:00 2001 From: Zane <75694352+zanesq@users.noreply.github.com> Date: Wed, 13 Aug 2025 10:30:12 -0700 Subject: [PATCH] speed up loading extensions by loading in parallel (#4054) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit thx verified locally should be gtg 👍 --- ui/desktop/src/extensions.tsx | 55 --------------------------- ui/desktop/src/utils/providerUtils.ts | 20 +++++++--- 2 files changed, 14 insertions(+), 61 deletions(-) diff --git a/ui/desktop/src/extensions.tsx b/ui/desktop/src/extensions.tsx index 4fecb8a587..cfaf5e5360 100644 --- a/ui/desktop/src/extensions.tsx +++ b/ui/desktop/src/extensions.tsx @@ -213,61 +213,6 @@ export async function removeExtension(name: string, silent: boolean = false): Pr } } -// Store extension config in user_settings -function storeExtensionConfig(config: FullExtensionConfig) { - try { - const userSettingsStr = localStorage.getItem('user_settings'); - const userSettings = userSettingsStr - ? JSON.parse(userSettingsStr) - : { models: [], extensions: [] }; - - // Check if config already exists (based on cmd for stdio, uri for sse, name for builtin) - const extensionExists = userSettings.extensions.some( - (extension: { id: string }) => extension.id === config.id - ); - - if (!extensionExists) { - userSettings.extensions.push(config); - localStorage.setItem('user_settings', JSON.stringify(userSettings)); - console.log('Extension config stored successfully in user_settings'); - // Notify settings update through electron IPC - window.electron.emit('settings-updated'); - } else { - console.log('Extension config already exists in user_settings'); - } - } catch (error) { - console.error('Error storing extension config:', error); - } -} - -export async function loadAndAddStoredExtensions() { - try { - const userSettingsStr = localStorage.getItem('user_settings'); - - if (userSettingsStr) { - const userSettings = JSON.parse(userSettingsStr); - const enabledExtensions = userSettings.extensions.filter( - (ext: FullExtensionConfig) => ext.enabled - ); - console.log('Adding extensions from localStorage: ', enabledExtensions); - for (const ext of enabledExtensions) { - await addExtension(ext, true); - } - } else { - console.log('Saving default builtin extensions to localStorage'); - // TODO - Revisit - BUILT_IN_EXTENSIONS.forEach(async (extension: FullExtensionConfig) => { - storeExtensionConfig(extension); - if (extension.enabled) { - await addExtension(extension, true); - } - }); - } - } catch (error) { - console.error('Error loading and activating extensions from localStorage: ', error); - } -} - // Update the path to the binary based on the command export async function replaceWithShims(cmd: string) { const binaryPathMap: Record = { diff --git a/ui/desktop/src/utils/providerUtils.ts b/ui/desktop/src/utils/providerUtils.ts index 5a7a0fa20c..3b2d607c6e 100644 --- a/ui/desktop/src/utils/providerUtils.ts +++ b/ui/desktop/src/utils/providerUtils.ts @@ -291,13 +291,21 @@ export const initializeSystem = async ( await syncBundledExtensions(refreshedExtensions, options.addExtension); } - // Add enabled extensions to agent - for (const extensionEntry of refreshedExtensions) { - if (extensionEntry.enabled) { - const extensionConfig = extractExtensionConfig(extensionEntry); - await addToAgentOnStartup({ addToConfig: options.addExtension, extensionConfig }); + // Add enabled extensions to agent in parallel + const enabledExtensions = refreshedExtensions.filter((ext) => ext.enabled); + + const extensionLoadingPromises = enabledExtensions.map(async (extensionEntry) => { + const extensionConfig = extractExtensionConfig(extensionEntry); + const extensionName = extensionConfig.name; + + try { + await addToAgentOnStartup({ addToConfig: options.addExtension!, extensionConfig }); + } catch (error) { + console.error(`Failed to load extension ${extensionName}:`, error); } - } + }); + + await Promise.allSettled(extensionLoadingPromises); } catch (error) { console.error('Failed to initialize agent:', error); throw error;