fix(core): address extension context stickiness and symlink path resolution

This commit addresses two bugs identified during review:

1. Cleared the sticky `activeExtensionContext` when the standard `/plan` command is executed, ensuring subsequent prompts correctly target the default global plan directory.
2. Fixed a path resolution regression in `Storage.getPlansDir()` by constructing the fallback ENOENT path directly against the real project root. This prevents `isSubpath` validation failures and potential traversal vulnerabilities when the project root is a symlink.
This commit is contained in:
Mahima Shanware
2026-04-06 17:41:56 +00:00
parent 39a7d59b27
commit c578567488
5 changed files with 64 additions and 3 deletions
@@ -23,6 +23,8 @@ export const createMockConfig = (overrides: Partial<Config> = {}): Config =>
isInteractive: vi.fn(() => false),
isInitialized: vi.fn(() => true),
setTerminalBackground: vi.fn(),
setActiveExtensionContext: vi.fn(),
hasExtensionPlanDir: vi.fn(() => true),
storage: {
getProjectTempDir: vi.fn().mockReturnValue('/tmp/gemini-test'),
initialize: vi.fn().mockResolvedValue(undefined),
+33
View File
@@ -3182,6 +3182,39 @@ describe('AppContainer State Management', () => {
);
unmount();
});
it('clears activeExtensionContext when /plan is explicitly executed', async () => {
const { checkPermissions } = await import(
'./hooks/atCommandProcessor.js'
);
vi.mocked(checkPermissions).mockResolvedValue([]);
mockedUseSlashCommandProcessor.mockReturnValue({
handleSlashCommand: vi.fn(),
slashCommands: [{ name: 'plan', description: 'test', action: vi.fn() }],
pendingHistoryItems: [],
commandContext: {},
shellConfirmationRequest: null,
confirmationRequest: null,
});
const spySetActiveExtensionContext = vi.spyOn(
mockConfig,
'setActiveExtensionContext',
);
const { unmount } = await act(async () => renderAppContainer());
expect(capturedUIActions).toBeTruthy();
await act(async () =>
capturedUIActions.handleFinalSubmit('/plan my task'),
);
expect(spySetActiveExtensionContext).toHaveBeenCalledWith(undefined);
unmount();
});
});
describe('Overflow Hint Handling', () => {
+7 -3
View File
@@ -1313,9 +1313,13 @@ Logging in with Google... Restarting Gemini CLI to continue.
slashCommands ?? [],
);
if (parsedCommand.extensionContext && config) {
if (config.hasExtensionPlanDir(parsedCommand.extensionContext)) {
config.setActiveExtensionContext(parsedCommand.extensionContext);
if (config) {
if (parsedCommand.extensionContext) {
if (config.hasExtensionPlanDir(parsedCommand.extensionContext)) {
config.setActiveExtensionContext(parsedCommand.extensionContext);
}
} else if (parsedCommand.commandToExecute?.name === 'plan') {
config.setActiveExtensionContext(undefined);
}
}