fix: trying this approach to undo regressions for extension loading (#6568)

This commit is contained in:
Michael Neale
2026-01-19 11:55:09 +11:00
committed by GitHub
parent 21d63f4984
commit f3c2f8e803
2 changed files with 42 additions and 16 deletions
+15 -15
View File
@@ -54,22 +54,22 @@ fn get_extensions_map() -> IndexMap<String, ExtensionEntry> {
} }
} }
if !extensions_map.is_empty() { // Always inject platform extensions (code_execution, todo, skills, etc.)
for (name, def) in PLATFORM_EXTENSIONS.iter() { // These are internal agent extensions that should always be available
if !extensions_map.contains_key(*name) { for (name, def) in PLATFORM_EXTENSIONS.iter() {
extensions_map.insert( if !extensions_map.contains_key(*name) {
name.to_string(), extensions_map.insert(
ExtensionEntry { name.to_string(),
config: ExtensionConfig::Platform { ExtensionEntry {
name: def.name.to_string(), config: ExtensionConfig::Platform {
description: def.description.to_string(), name: def.name.to_string(),
bundled: Some(true), description: def.description.to_string(),
available_tools: Vec::new(), bundled: Some(true),
}, available_tools: Vec::new(),
enabled: def.default_enabled,
}, },
); enabled: def.default_enabled,
} },
);
} }
} }
extensions_map extensions_map
+27 -1
View File
@@ -10,6 +10,7 @@ import {
providers, providers,
getProviderModels as apiGetProviderModels, getProviderModels as apiGetProviderModels,
} from '../api'; } from '../api';
import { syncBundledExtensions } from './settings/extensions';
import type { import type {
ConfigResponse, ConfigResponse,
UpsertConfigQuery, UpsertConfigQuery,
@@ -218,7 +219,32 @@ export const ConfigProvider: React.FC<ConfigProviderProps> = ({ children }) => {
// Load extensions // Load extensions
try { try {
const extensionsResponse = await apiGetExtensions(); const extensionsResponse = await apiGetExtensions();
setExtensionsList(extensionsResponse.data?.extensions || []); let extensions = extensionsResponse.data?.extensions || [];
// If no bundled MCP extensions exist, seed config from bundled-extensions.json
// This ensures fresh installs get the default extensions (developer, computercontroller, etc.)
// Platform extensions (code_execution, todo, etc.) are handled by the backend
const hasBundledExtensions = extensions.some(
(ext) => ext.type === 'builtin' && 'bundled' in ext && ext.bundled
);
if (!hasBundledExtensions) {
console.log('No bundled extensions found, syncing from bundled-extensions.json');
const addExtensionForSync = async (
name: string,
config: ExtensionConfig,
enabled: boolean
) => {
const query: ExtensionQuery = { name, config, enabled };
await apiAddExtension({ body: query });
};
await syncBundledExtensions(extensions, addExtensionForSync);
// Reload extensions after sync
const refreshedResponse = await apiGetExtensions();
extensions = refreshedResponse.data?.extensions || [];
}
setExtensionsList(extensions);
setExtensionWarnings(extensionsResponse.data?.warnings || []); setExtensionWarnings(extensionsResponse.data?.warnings || []);
} catch (error) { } catch (error) {
console.error('Failed to load extensions:', error); console.error('Failed to load extensions:', error);