Initial support for reloading extensions in the CLI - mcp servers only (#12239)

This commit is contained in:
Jacob MacDonald
2025-10-30 11:05:49 -07:00
committed by GitHub
parent d4cad0cdcc
commit cc081337b7
20 changed files with 437 additions and 107 deletions
+5 -1
View File
@@ -183,7 +183,11 @@ export const AppContainer = (props: AppContainerProps) => {
extensionsUpdateState,
extensionsUpdateStateInternal,
dispatchExtensionStateUpdate,
} = useExtensionUpdates(extensionManager, historyManager.addItem);
} = useExtensionUpdates(
extensionManager,
historyManager.addItem,
config.getEnableExtensionReloading(),
);
const [isPermissionsDialogOpen, setPermissionsDialogOpen] = useState(false);
const openPermissionsDialog = useCallback(
@@ -97,6 +97,10 @@ describe('<ExtensionsList />', () => {
state: ExtensionUpdateState.UPDATED_NEEDS_RESTART,
expectedText: '(updated, needs restart)',
},
{
state: ExtensionUpdateState.UPDATED,
expectedText: '(updated)',
},
{
state: ExtensionUpdateState.ERROR,
expectedText: '(error)',
@@ -48,6 +48,7 @@ export const ExtensionsList: React.FC<ExtensionsList> = ({ extensions }) => {
break;
case ExtensionUpdateState.UP_TO_DATE:
case ExtensionUpdateState.NOT_UPDATABLE:
case ExtensionUpdateState.UPDATED:
stateColor = 'green';
break;
case undefined:
@@ -84,6 +84,7 @@ describe('handleAtCommand', () => {
getReadManyFilesExcludes: () => [],
}),
getUsageStatisticsEnabled: () => false,
getEnableExtensionReloading: () => false,
} as unknown as Config;
const registry = new ToolRegistry(mockConfig);
@@ -96,7 +96,7 @@ describe('useExtensionUpdates', () => {
);
function TestComponent() {
useExtensionUpdates(extensionManager, addItem);
useExtensionUpdates(extensionManager, addItem, false);
return null;
}
@@ -146,7 +146,7 @@ describe('useExtensionUpdates', () => {
});
function TestComponent() {
useExtensionUpdates(extensionManager, addItem);
useExtensionUpdates(extensionManager, addItem, false);
return null;
}
@@ -224,7 +224,7 @@ describe('useExtensionUpdates', () => {
});
function TestComponent() {
useExtensionUpdates(extensionManager, addItem);
useExtensionUpdates(extensionManager, addItem, false);
return null;
}
@@ -307,7 +307,7 @@ describe('useExtensionUpdates', () => {
);
function TestComponent() {
useExtensionUpdates(extensionManager, addItem);
useExtensionUpdates(extensionManager, addItem, false);
return null;
}
@@ -80,6 +80,7 @@ export const useConfirmUpdateRequests = () => {
export const useExtensionUpdates = (
extensionManager: ExtensionManager,
addItem: UseHistoryManagerReturn['addItem'],
enableExtensionReloading: boolean,
) => {
const [extensionsUpdateState, dispatchExtensionStateUpdate] = useReducer(
extensionUpdatesReducer,
@@ -163,6 +164,7 @@ export const useExtensionUpdates = (
extensionManager,
currentState.status,
dispatchExtensionStateUpdate,
enableExtensionReloading,
);
updatePromises.push(updatePromise);
updatePromise
@@ -209,7 +211,13 @@ export const useExtensionUpdates = (
});
});
}
}, [extensions, extensionManager, extensionsUpdateState, addItem]);
}, [
extensions,
extensionManager,
extensionsUpdateState,
addItem,
enableExtensionReloading,
]);
const extensionsUpdateStateComputed = useMemo(() => {
const result = new Map<string, ExtensionUpdateState>();
+1
View File
@@ -10,6 +10,7 @@ import { checkExhaustive } from '../../utils/checks.js';
export enum ExtensionUpdateState {
CHECKING_FOR_UPDATES = 'checking for updates',
UPDATED_NEEDS_RESTART = 'updated, needs restart',
UPDATED = 'updated',
UPDATING = 'updating',
UPDATE_AVAILABLE = 'update available',
UP_TO_DATE = 'up to date',