diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/chat.runInTerminal.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/chat.runInTerminal.test.ts index f3b7f7e9f81..5d9876eccba 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/chat.runInTerminal.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/chat.runInTerminal.test.ts @@ -8,6 +8,10 @@ import 'mocha'; import * as vscode from 'vscode'; import { DeferredPromise, assertNoRpc, closeAllEditors, disposeAll } from '../utils'; +const enum ShellIntegrationTimeoutOverride { + DisableForTests = -2 +} + const isWindows = process.platform === 'win32'; const isMacOS = process.platform === 'darwin'; const sandboxFileSystemSetting = isMacOS @@ -162,7 +166,7 @@ function extractTextContent(result: vscode.LanguageModelToolResult): string { setup(async () => { const termConfig = vscode.workspace.getConfiguration('terminal.integrated'); await termConfig.update('shellIntegration.enabled', false, vscode.ConfigurationTarget.Global); - await termConfig.update('shellIntegration.timeout', 0, vscode.ConfigurationTarget.Global); + await termConfig.update('shellIntegration.timeout', ShellIntegrationTimeoutOverride.DisableForTests, vscode.ConfigurationTarget.Global); const toolConfig = vscode.workspace.getConfiguration('chat.tools.terminal'); await toolConfig.update('idlePollInterval', 100, vscode.ConfigurationTarget.Global); diff --git a/src/vs/platform/terminal/common/terminal.ts b/src/vs/platform/terminal/common/terminal.ts index dc7c596c346..e9b50861126 100644 --- a/src/vs/platform/terminal/common/terminal.ts +++ b/src/vs/platform/terminal/common/terminal.ts @@ -1060,6 +1060,10 @@ export const enum ShellIntegrationInjectionFailureReason { FailedToCreateTmpDir = 'failedToCreateTmpDir', } +export const enum ShellIntegrationTimeoutOverride { + DisableForTests = -2 +} + export enum TerminalExitReason { Unknown = 0, Shutdown = 1, diff --git a/src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts b/src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts index 6f915a27195..a3453dbac8f 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalConfiguration.ts @@ -625,7 +625,7 @@ const terminalConfiguration: IStringDictionary = { }, [TerminalSettingId.ShellIntegrationTimeout]: { restricted: true, - markdownDescription: localize('terminal.integrated.shellIntegration.timeout', "Configures the duration in milliseconds to wait for shell integration after launch before declaring it's not there. Set to {0} to skip the wait entirely. The default value {1} uses a variable wait time based on whether shell integration injection is enabled and whether it's a remote window. Values between 1 and 499 are clamped to 500ms. Consider setting this to {0} if you intentionally disabled shell integration, or a large value if your shell starts very slowly.", '`0`', '`-1`'), + markdownDescription: localize('terminal.integrated.shellIntegration.timeout', "Configures the duration in milliseconds to wait for shell integration after launch before declaring it's not there. The default value {0} uses a variable wait time based on whether shell integration injection is enabled and whether it's a remote window. Values between 1 and 499 are clamped to 500ms. Consider setting this to a large value if your shell starts very slowly.", '`-1`'), type: 'integer', minimum: -1, maximum: 60000, diff --git a/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts b/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts index b797a6d549a..7ccbb07819d 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalEnvironment.ts @@ -12,7 +12,7 @@ import { URI, uriToFsPath } from '../../../../base/common/uri.js'; import { IWorkspaceContextService, IWorkspaceFolder } from '../../../../platform/workspace/common/workspace.js'; import { IConfigurationResolverService } from '../../../services/configurationResolver/common/configurationResolver.js'; import { sanitizeProcessEnvironment } from '../../../../base/common/processes.js'; -import { IShellLaunchConfig, ITerminalBackend, ITerminalEnvironment, TerminalSettingId, TerminalShellType, WindowsShellType } from '../../../../platform/terminal/common/terminal.js'; +import { IShellLaunchConfig, ITerminalBackend, ITerminalEnvironment, ShellIntegrationTimeoutOverride, TerminalSettingId, TerminalShellType, WindowsShellType } from '../../../../platform/terminal/common/terminal.js'; import { IProcessEnvironment, isWindows, isMacintosh, language, OperatingSystem } from '../../../../base/common/platform.js'; import { escapeNonWindowsPath, sanitizeCwd } from '../../../../platform/terminal/common/terminalEnvironment.js'; import { isNumber, isString } from '../../../../base/common/types.js'; @@ -422,8 +422,10 @@ export function getShellIntegrationTimeout( ): number { const timeoutValue = configurationService.getValue(TerminalSettingId.ShellIntegrationTimeout); let timeoutMs: number; - - if (!isNumber(timeoutValue) || timeoutValue < 0) { + if (isNumber(timeoutValue) && timeoutValue === ShellIntegrationTimeoutOverride.DisableForTests) { + // Used for tests + timeoutMs = 0; + } else if (!isNumber(timeoutValue) || timeoutValue < 0) { timeoutMs = siInjectionEnabled ? 5000 : (isRemote ? 3000 : 2000); } else if (timeoutValue === 0) { timeoutMs = 0; diff --git a/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/executeStrategy/noneExecuteStrategy.ts b/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/executeStrategy/noneExecuteStrategy.ts index c1f1b210253..90df302a36a 100644 --- a/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/executeStrategy/noneExecuteStrategy.ts +++ b/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/executeStrategy/noneExecuteStrategy.ts @@ -106,7 +106,7 @@ export class NoneExecuteStrategy extends Disposable implements ITerminalExecuteS }); const cursorMoveTimeout = new Promise<'timeout'>(resolve => { - const handle = setTimeout(() => resolve('timeout'), 5000); + const handle = setTimeout(() => resolve('timeout'), 1000); store.add({ dispose: () => clearTimeout(handle) }); });