Skip to content

Commit 211d70b

Browse files
committed
Re-implement wait for SI logic
- Remove unnecessary deferred timeout - Ensure everything is tracked and disposed in the overall store - Ensure the no SI timer is disposed
1 parent a746f7a commit 211d70b

File tree

1 file changed

+28
-37
lines changed

1 file changed

+28
-37
lines changed

src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/toolTerminalCreator.ts

Lines changed: 28 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { DeferredPromise, disposableTimeout, timeout } from '../../../../../base/common/async.js';
6+
import { DeferredPromise, disposableTimeout } from '../../../../../base/common/async.js';
77
import type { CancellationToken } from '../../../../../base/common/cancellation.js';
88
import { Codicon } from '../../../../../base/common/codicons.js';
99
import { CancellationError } from '../../../../../base/common/errors.js';
10-
import { DisposableStore } from '../../../../../base/common/lifecycle.js';
10+
import { DisposableStore, MutableDisposable } from '../../../../../base/common/lifecycle.js';
1111
import { ThemeIcon } from '../../../../../base/common/themables.js';
1212
import { IConfigurationService } from '../../../../../platform/configuration/common/configuration.js';
1313
import { TerminalCapability } from '../../../../../platform/terminal/common/capabilities/capabilities.js';
@@ -95,61 +95,52 @@ export class ToolTerminalCreator {
9595
instance: ITerminalInstance,
9696
timeoutMs: number
9797
): Promise<ShellIntegrationQuality> {
98-
const dataFinished = new DeferredPromise<void>();
98+
const store = new DisposableStore();
99+
const result = new DeferredPromise<ShellIntegrationQuality>();
99100

100-
const deferred = new DeferredPromise<ShellIntegrationQuality>();
101-
const timer = disposableTimeout(() => deferred.complete(ShellIntegrationQuality.None), timeoutMs);
101+
const siNoneTimer = store.add(new MutableDisposable());
102+
siNoneTimer.value = disposableTimeout(() => result.complete(ShellIntegrationQuality.None), timeoutMs);
102103

103104
if (instance.capabilities.get(TerminalCapability.CommandDetection)?.hasRichCommandDetection) {
104-
timer.dispose();
105-
deferred.complete(ShellIntegrationQuality.Rich);
105+
// Rich command detection is available immediately.
106+
siNoneTimer.clear();
107+
result.complete(ShellIntegrationQuality.Rich);
106108
} else {
107-
const onSetRichCommandDetection = this._terminalService.createOnInstanceCapabilityEvent(TerminalCapability.CommandDetection, e => e.onSetRichCommandDetection);
108-
109-
const richCommandDetectionListener = onSetRichCommandDetection.event((e) => {
109+
const onSetRichCommandDetection = store.add(this._terminalService.createOnInstanceCapabilityEvent(TerminalCapability.CommandDetection, e => e.onSetRichCommandDetection));
110+
store.add(onSetRichCommandDetection.event((e) => {
110111
if (e.instance !== instance) {
111112
return;
112113
}
113-
deferred.complete(ShellIntegrationQuality.Rich);
114-
});
115-
116-
const store = new DisposableStore();
114+
siNoneTimer.clear();
115+
// Rich command detection becomes available some time after the terminal is created.
116+
result.complete(ShellIntegrationQuality.Rich);
117+
}));
117118

118119
const commandDetection = instance.capabilities.get(TerminalCapability.CommandDetection);
119120
if (commandDetection) {
120-
timer.dispose();
121+
siNoneTimer.clear();
121122
// When command detection lights up, allow up to 200ms for the rich command
122123
// detection sequence to come in before declaring it as basic shell integration.
123-
// up.
124-
Promise.race([
125-
dataFinished.p,
126-
timeout(200)
127-
]).then(() => {
128-
if (!deferred.isResolved) {
129-
deferred.complete(ShellIntegrationQuality.Basic);
130-
}
131-
});
124+
store.add(disposableTimeout(() => {
125+
result.complete(ShellIntegrationQuality.Basic);
126+
}, 200));
132127
} else {
133128
store.add(instance.capabilities.onDidAddCapabilityType(e => {
134129
if (e === TerminalCapability.CommandDetection) {
135-
timer.dispose();
130+
siNoneTimer.clear();
136131
// When command detection lights up, allow up to 200ms for the rich command
137-
// detection sequence to come in before declaring it as basic shell integration.
138-
// up.
139-
Promise.race([
140-
dataFinished.p,
141-
timeout(200)
142-
]).then(() => deferred.complete(ShellIntegrationQuality.Basic));
132+
// detection sequence to come in before declaring it as basic shell
133+
// integration.
134+
store.add(disposableTimeout(() => {
135+
result.complete(ShellIntegrationQuality.Basic);
136+
}, 200));
143137
}
144138
}));
145139
}
146-
147-
deferred.p.finally(() => {
148-
store.dispose();
149-
richCommandDetectionListener.dispose();
150-
});
151140
}
152141

153-
return deferred.p;
142+
result.p.finally(() => store.dispose());
143+
144+
return result.p;
154145
}
155146
}

0 commit comments

Comments
 (0)