Skip to content

Commit 4e5ed5d

Browse files
authored
move bg button registration (#308000)
fix #304828
1 parent 3609a92 commit 4e5ed5d

File tree

6 files changed

+277
-332
lines changed

6 files changed

+277
-332
lines changed

src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatTerminalToolProgressPart.ts

Lines changed: 218 additions & 314 deletions
Large diffs are not rendered by default.

src/vs/workbench/contrib/terminal/browser/terminal.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,8 @@ export interface IChatTerminalToolProgressPart {
111111
readonly contentIndex: number;
112112
focusTerminal(): Promise<void>;
113113
toggleOutputFromKeyboard(): Promise<void>;
114+
toggleOutputFromAction(): Promise<void>;
115+
continueInBackground(): void;
114116
focusOutput(): void;
115117
getCommandAndOutputAsText(): string | undefined;
116118
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
*--------------------------------------------------------------------------------------------*/
5+
6+
// HACK: Export some chat-specific symbols from `terminalContrib/` that are depended upon elsewhere.
7+
// These are soft layer breakers between `terminal/` and `terminalContrib/` but there are
8+
// difficulties in removing the dependency. These are explicitly defined here to avoid an eslint
9+
// line override.
10+
export { MENU_CHAT_TERMINAL_TOOL_PROGRESS, TerminalChatContextKeys } from '../terminalContrib/chat/browser/terminalChat.js';

src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChat.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export const enum TerminalChatCommandId {
3131
export const MENU_TERMINAL_CHAT_WIDGET_INPUT_SIDE_TOOLBAR = MenuId.for('terminalChatWidget');
3232
export const MENU_TERMINAL_CHAT_WIDGET_STATUS = MenuId.for('terminalChatWidget.status');
3333
export const MENU_TERMINAL_CHAT_WIDGET_TOOLBAR = MenuId.for('terminalChatWidget.toolbar');
34+
export const MENU_CHAT_TERMINAL_TOOL_PROGRESS = MenuId.for('chatTerminalToolProgress');
3435

3536
export const enum TerminalChatContextKeyStrings {
3637
ChatFocus = 'terminalChatFocus',
@@ -45,6 +46,12 @@ export const enum TerminalChatContextKeyStrings {
4546
ChatSessionResponseVote = 'terminalChatSessionResponseVote',
4647
ChatHasTerminals = 'hasChatTerminals',
4748
ChatHasHiddenTerminals = 'hasHiddenChatTerminals',
49+
ChatToolHasInstance = 'chatTerminalToolHasInstance',
50+
ChatToolCanContinueInBackground = 'chatTerminalToolCanContinueInBackground',
51+
ChatToolHasOutput = 'chatTerminalToolHasOutput',
52+
ChatToolUsesCollapsible = 'chatTerminalToolUsesCollapsible',
53+
ChatToolIsHiddenTerminal = 'chatTerminalToolIsHiddenTerminal',
54+
ChatToolOutputExpanded = 'chatTerminalToolOutputExpanded',
4855
}
4956

5057

@@ -76,4 +83,22 @@ export namespace TerminalChatContextKeys {
7683

7784
/** Has hidden chat terminals */
7885
export const hasHiddenChatTerminals = new RawContextKey<boolean>(TerminalChatContextKeyStrings.ChatHasHiddenTerminals, false, localize('terminalHasHiddenChatTerminals', "Whether there are any hidden chat terminals."));
86+
87+
/** Whether the per-instance terminal tool progress part has a terminal instance attached */
88+
export const chatToolHasInstance = new RawContextKey<boolean>(TerminalChatContextKeyStrings.ChatToolHasInstance, false);
89+
90+
/** Whether the continue-in-background action is available */
91+
export const chatToolCanContinueInBackground = new RawContextKey<boolean>(TerminalChatContextKeyStrings.ChatToolCanContinueInBackground, false);
92+
93+
/** Whether terminal output is available for display */
94+
export const chatToolHasOutput = new RawContextKey<boolean>(TerminalChatContextKeyStrings.ChatToolHasOutput, false);
95+
96+
/** Whether the terminal tool uses a collapsible wrapper */
97+
export const chatToolUsesCollapsible = new RawContextKey<boolean>(TerminalChatContextKeyStrings.ChatToolUsesCollapsible, false);
98+
99+
/** Whether the associated terminal is hidden from the user */
100+
export const chatToolIsHiddenTerminal = new RawContextKey<boolean>(TerminalChatContextKeyStrings.ChatToolIsHiddenTerminal, false);
101+
102+
/** Whether the terminal output section is currently expanded */
103+
export const chatToolOutputExpanded = new RawContextKey<boolean>(TerminalChatContextKeyStrings.ChatToolOutputExpanded, false);
79104
}

src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatService.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import { Emitter, Event } from '../../../../../base/common/event.js';
7-
import { Disposable, DisposableMap, IDisposable, toDisposable } from '../../../../../base/common/lifecycle.js';
7+
import { Disposable, DisposableMap, DisposableStore, IDisposable, toDisposable } from '../../../../../base/common/lifecycle.js';
88
import { ResourceMap } from '../../../../../base/common/map.js';
99
import { URI } from '../../../../../base/common/uri.js';
1010
import { ILogService } from '../../../../../platform/log/common/log.js';
@@ -86,6 +86,9 @@ export class TerminalChatService extends Disposable implements ITerminalChatServ
8686
this._sessionAutoApprovalEnabled.delete(resource);
8787
}
8888
}));
89+
90+
// Update context keys when terminal instances change (registered once, not per-registration)
91+
this._register(this._terminalService.onDidChangeInstances(() => this._updateHasToolTerminalContextKeys()));
8992
}
9093

9194
registerTerminalInstanceWithToolSession(terminalToolSessionId: string | undefined, instance: ITerminalInstance): void {
@@ -96,15 +99,15 @@ export class TerminalChatService extends Disposable implements ITerminalChatServ
9699
this._terminalInstancesByToolSessionId.set(terminalToolSessionId, instance);
97100
this._toolSessionIdByTerminalInstance.set(instance, terminalToolSessionId);
98101
this._onDidRegisterTerminalInstanceForToolSession.fire(instance);
99-
this._terminalInstanceListenersByToolSessionId.set(terminalToolSessionId, instance.onDisposed(() => {
102+
const instanceStore = new DisposableStore();
103+
instanceStore.add(instance.onDisposed(() => {
100104
this._terminalInstancesByToolSessionId.delete(terminalToolSessionId);
101105
this._toolSessionIdByTerminalInstance.delete(instance);
102106
this._terminalInstanceListenersByToolSessionId.deleteAndDispose(terminalToolSessionId);
103107
this._persistToStorage();
104108
this._updateHasToolTerminalContextKeys();
105109
}));
106-
107-
this._register(this._chatService.onDidDisposeSession(e => {
110+
instanceStore.add(this._chatService.onDidDisposeSession(e => {
108111
for (const resource of e.sessionResources) {
109112
if (LocalChatSessionUri.parseLocalSessionId(resource) === terminalToolSessionId) {
110113
this._terminalInstancesByToolSessionId.delete(terminalToolSessionId);
@@ -117,9 +120,7 @@ export class TerminalChatService extends Disposable implements ITerminalChatServ
117120
}
118121
}
119122
}));
120-
121-
// Update context keys when terminal instances change (including when terminals are created, disposed, revealed, or hidden)
122-
this._register(this._terminalService.onDidChangeInstances(() => this._updateHasToolTerminalContextKeys()));
123+
this._terminalInstanceListenersByToolSessionId.set(terminalToolSessionId, instanceStore);
123124

124125
if (isNumber(instance.shellLaunchConfig?.attachPersistentProcess?.id) || isNumber(instance.persistentProcessId)) {
125126
this._persistToStorage();

src/vs/workbench/contrib/terminalContrib/chatAgentTools/test/electron-browser/runInTerminalTool.test.ts

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,14 @@ suite('RunInTerminalTool', () => {
145145
onDidChangeSessionArchivedState: chatSessionArchivedEmitter.event,
146146
} as IAgentSessionsService['model']
147147
});
148+
instantiationService.stub(ITerminalService, {
149+
createTerminal: async () => createdTerminalInstance,
150+
onDidDisposeInstance: terminalServiceDisposeEmitter.event,
151+
onDidChangeInstances: Event.None,
152+
revealTerminal: async () => { },
153+
setActiveInstance: () => { },
154+
setNextCommandId: async () => { }
155+
});
148156
instantiationService.stub(ITerminalChatService, store.add(instantiationService.createInstance(TerminalChatService)));
149157
instantiationService.stub(IWorkspaceContextService, workspaceContextService);
150158
instantiationService.stub(IHistoryService, {
@@ -182,13 +190,6 @@ suite('RunInTerminalTool', () => {
182190
return [];
183191
},
184192
});
185-
instantiationService.stub(ITerminalService, {
186-
createTerminal: async () => createdTerminalInstance,
187-
onDidDisposeInstance: terminalServiceDisposeEmitter.event,
188-
revealTerminal: async () => { },
189-
setActiveInstance: () => { },
190-
setNextCommandId: async () => { }
191-
});
192193
instantiationService.stub(ITerminalProfileResolverService, {
193194
getDefaultProfile: async () => ({ path: 'bash' } as ITerminalProfile)
194195
});
@@ -2075,6 +2076,12 @@ suite('ChatAgentToolsContribution - tool registration refresh', () => {
20752076
onDidChangeSessionArchivedState: chatSessionArchivedEmitter.event,
20762077
} as IAgentSessionsService['model']
20772078
});
2079+
const terminalInstancesChangedEmitter = store.add(new Emitter<void>());
2080+
instantiationService.stub(ITerminalService, {
2081+
onDidDisposeInstance: terminalServiceDisposeEmitter.event,
2082+
onDidChangeInstances: terminalInstancesChangedEmitter.event,
2083+
setNextCommandId: async () => { }
2084+
});
20782085
instantiationService.stub(ITerminalChatService, store.add(instantiationService.createInstance(TerminalChatService)));
20792086
instantiationService.stub(IHistoryService, {
20802087
getLastActiveWorkspaceRoot: () => undefined
@@ -2102,10 +2109,6 @@ suite('ChatAgentToolsContribution - tool registration refresh', () => {
21022109
treeSitterLibraryService.isTest = true;
21032110
instantiationService.stub(ITreeSitterLibraryService, treeSitterLibraryService);
21042111

2105-
instantiationService.stub(ITerminalService, {
2106-
onDidDisposeInstance: terminalServiceDisposeEmitter.event,
2107-
setNextCommandId: async () => { }
2108-
});
21092112
instantiationService.stub(ITerminalProfileResolverService, {
21102113
getDefaultProfile: async () => ({ path: 'bash' } as ITerminalProfile)
21112114
});

0 commit comments

Comments
 (0)