Skip to content

Commit 4426514

Browse files
authored
Fix /clear (microsoft#182243)
1 parent 2e80d6d commit 4426514

13 files changed

+100
-67
lines changed

src/vs/workbench/api/browser/mainThreadInteractiveSession.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { URI } from 'vs/base/common/uri';
99
import { ILogService } from 'vs/platform/log/common/log';
1010
import { IProductService } from 'vs/platform/product/common/productService';
1111
import { ExtHostContext, ExtHostInteractiveSessionShape, IInteractiveRequestDto, MainContext, MainThreadInteractiveSessionShape } from 'vs/workbench/api/common/extHost.protocol';
12-
import { IInteractiveSessionWidgetService } from 'vs/workbench/contrib/interactiveSession/browser/interactiveSessionWidget';
12+
import { IInteractiveSessionWidgetService } from 'vs/workbench/contrib/interactiveSession/browser/interactiveSession';
1313
import { IInteractiveSessionContributionService } from 'vs/workbench/contrib/interactiveSession/common/interactiveSessionContributionService';
1414
import { IInteractiveProgress, IInteractiveRequest, IInteractiveResponse, IInteractiveSession, IInteractiveSessionDynamicRequest, IInteractiveSessionService } from 'vs/workbench/contrib/interactiveSession/common/interactiveSessionService';
1515
import { IExtHostContext, extHostNamedCustomer } from 'vs/workbench/services/extensions/common/extHostCustomers';

src/vs/workbench/contrib/interactiveEditor/browser/interactiveEditorController.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import { EditResponse, EmptyResponse, ErrorResponse, IInteractiveEditorSessionSe
2929
import { EditModeStrategy, LivePreviewStrategy, LiveStrategy, PreviewStrategy } from 'vs/workbench/contrib/interactiveEditor/browser/interactiveEditorStrategies';
3030
import { InteractiveEditorZoneWidget } from 'vs/workbench/contrib/interactiveEditor/browser/interactiveEditorWidget';
3131
import { CTX_INTERACTIVE_EDITOR_HAS_ACTIVE_REQUEST, CTX_INTERACTIVE_EDITOR_LAST_EDIT_TYPE as CTX_INTERACTIVE_EDITOR_LAST_EDIT_KIND, CTX_INTERACTIVE_EDITOR_LAST_FEEDBACK as CTX_INTERACTIVE_EDITOR_LAST_FEEDBACK_KIND, IInteractiveEditorRequest, IInteractiveEditorResponse, INTERACTIVE_EDITOR_ID, EditMode, InteractiveEditorResponseFeedbackKind, CTX_INTERACTIVE_EDITOR_LAST_RESPONSE_TYPE, InteractiveEditorResponseType } from 'vs/workbench/contrib/interactiveEditor/common/interactiveEditor';
32-
import { IInteractiveSessionWidgetService } from 'vs/workbench/contrib/interactiveSession/browser/interactiveSessionWidget';
32+
import { IInteractiveSessionWidgetService } from 'vs/workbench/contrib/interactiveSession/browser/interactiveSession';
3333
import { IInteractiveSessionService } from 'vs/workbench/contrib/interactiveSession/common/interactiveSessionService';
3434
import { INotebookEditorService } from 'vs/workbench/contrib/notebook/browser/services/notebookEditorService';
3535
import { CellUri } from 'vs/workbench/contrib/notebook/common/notebookCommon';

src/vs/workbench/contrib/interactiveSession/browser/actions/interactiveSessionActions.ts

Lines changed: 11 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,14 @@ import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegis
1515
import { IQuickInputService, IQuickPickItem } from 'vs/platform/quickinput/common/quickInput';
1616
import { ViewAction } from 'vs/workbench/browser/parts/views/viewPane';
1717
import { ActiveEditorContext } from 'vs/workbench/common/contextkeys';
18-
import { IViewsService } from 'vs/workbench/common/views';
19-
import { IInteractiveSessionEditorOptions, InteractiveSessionEditor } from 'vs/workbench/contrib/interactiveSession/browser/interactiveSessionEditor';
18+
import { clearChatEditor, clearChatSession } from 'vs/workbench/contrib/interactiveSession/browser/actions/interactiveSessionClear';
19+
import { IInteractiveSessionWidgetService } from 'vs/workbench/contrib/interactiveSession/browser/interactiveSession';
20+
import { IInteractiveSessionEditorOptions } from 'vs/workbench/contrib/interactiveSession/browser/interactiveSessionEditor';
2021
import { InteractiveSessionEditorInput } from 'vs/workbench/contrib/interactiveSession/browser/interactiveSessionEditorInput';
2122
import { InteractiveSessionViewPane } from 'vs/workbench/contrib/interactiveSession/browser/interactiveSessionViewPane';
22-
import { IInteractiveSessionWidgetService } from 'vs/workbench/contrib/interactiveSession/browser/interactiveSessionWidget';
2323
import { CONTEXT_IN_INTERACTIVE_INPUT, CONTEXT_IN_INTERACTIVE_SESSION } from 'vs/workbench/contrib/interactiveSession/common/interactiveSessionContextKeys';
2424
import { IInteractiveSessionDetail, IInteractiveSessionService } from 'vs/workbench/contrib/interactiveSession/common/interactiveSessionService';
2525
import { IInteractiveSessionWidgetHistoryService } from 'vs/workbench/contrib/interactiveSession/common/interactiveSessionWidgetHistoryService';
26-
import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService';
2726
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
2827

2928
export const INTERACTIVE_SESSION_CATEGORY = { value: localize('interactiveSession.category', "Interactive Session"), original: 'Interactive Session' };
@@ -67,19 +66,19 @@ export function registerInteractiveSessionActions() {
6766
id: MenuId.EditorTitle,
6867
group: 'navigation',
6968
order: 0,
70-
when: ActiveEditorContext.isEqualTo(InteractiveSessionEditor.ID),
69+
when: ActiveEditorContext.isEqualTo(InteractiveSessionEditorInput.EditorID),
7170
}]
7271
});
7372
}
7473
async run(accessor: ServicesAccessor, ...args: any[]) {
7574
const widgetService = accessor.get(IInteractiveSessionWidgetService);
76-
const editorService = accessor.get(IEditorService);
77-
const editorGroupsService = accessor.get(IEditorGroupsService);
7875

79-
editorService.replaceEditors([{
80-
editor: editorService.activeEditor!,
81-
replacement: { resource: InteractiveSessionEditorInput.getNewEditorUri(), options: <IInteractiveSessionEditorOptions>{ target: { providerId: widgetService.lastFocusedWidget!.providerId, pinned: true } } }
82-
}], editorGroupsService.activeGroup);
76+
const widget = widgetService.lastFocusedWidget;
77+
if (!widget) {
78+
return;
79+
}
80+
81+
await clearChatEditor(accessor, widget);
8382
}
8483
});
8584

@@ -162,26 +161,13 @@ export function registerInteractiveSessionActions() {
162161
}
163162
async run(accessor: ServicesAccessor, ...args: any[]) {
164163
const widgetService = accessor.get(IInteractiveSessionWidgetService);
165-
const viewsService = accessor.get(IViewsService);
166-
const editorService = accessor.get(IEditorService);
167-
const editorGroupsService = accessor.get(IEditorGroupsService);
168164

169165
const widget = widgetService.lastFocusedWidget;
170166
if (!widget) {
171167
return;
172168
}
173169

174-
if ('viewId' in widget.viewContext) {
175-
const view = viewsService.getViewWithId(widget.viewContext.viewId);
176-
if (view instanceof InteractiveSessionViewPane) {
177-
view.clear();
178-
}
179-
} else {
180-
editorService.replaceEditors([{
181-
editor: editorService.activeEditor!,
182-
replacement: { resource: InteractiveSessionEditorInput.getNewEditorUri(), options: <IInteractiveSessionEditorOptions>{ target: { providerId: widgetService.lastFocusedWidget!.providerId, pinned: true } } }
183-
}], editorGroupsService.activeGroup);
184-
}
170+
await clearChatSession(accessor, widget);
185171
}
186172
});
187173
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
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+
import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
7+
import { IViewsService } from 'vs/workbench/common/views';
8+
import { IInteractiveSessionWidgetService, type IInteractiveSessionViewPane, type IInteractiveSessionWidget } from 'vs/workbench/contrib/interactiveSession/browser/interactiveSession';
9+
import { IInteractiveSessionEditorOptions } from 'vs/workbench/contrib/interactiveSession/browser/interactiveSessionEditor';
10+
import { InteractiveSessionEditorInput } from 'vs/workbench/contrib/interactiveSession/browser/interactiveSessionEditorInput';
11+
import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService';
12+
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
13+
14+
export async function clearChatSession(accessor: ServicesAccessor, widget: IInteractiveSessionWidget): Promise<void> {
15+
const viewsService = accessor.get(IViewsService);
16+
17+
if ('viewId' in widget.viewContext) {
18+
// This cast is to break a circular dependency- ideally this would not be called directly for `/clear`
19+
// from the widget class, but from some contribution.
20+
const view = viewsService.getViewWithId(widget.viewContext.viewId);
21+
if (!view || !(view as any as IInteractiveSessionViewPane).clear) {
22+
return;
23+
}
24+
25+
(view as any as IInteractiveSessionViewPane).clear();
26+
} else {
27+
await clearChatEditor(accessor, widget);
28+
}
29+
}
30+
31+
export async function clearChatEditor(accessor: ServicesAccessor, widget: IInteractiveSessionWidget): Promise<void> {
32+
const editorService = accessor.get(IEditorService);
33+
const editorGroupsService = accessor.get(IEditorGroupsService);
34+
const widgetService = accessor.get(IInteractiveSessionWidgetService);
35+
36+
await editorService.replaceEditors([{
37+
editor: editorService.activeEditor!,
38+
replacement: { resource: InteractiveSessionEditorInput.getNewEditorUri(), options: <IInteractiveSessionEditorOptions>{ target: { providerId: widgetService.lastFocusedWidget!.providerId, pinned: true } } }
39+
}], editorGroupsService.activeGroup);
40+
}

src/vs/workbench/contrib/interactiveSession/browser/actions/interactiveSessionCopyActions.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { localize } from 'vs/nls';
88
import { Action2, MenuId, registerAction2 } from 'vs/platform/actions/common/actions';
99
import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService';
1010
import { INTERACTIVE_SESSION_CATEGORY } from 'vs/workbench/contrib/interactiveSession/browser/actions/interactiveSessionActions';
11-
import { IInteractiveSessionWidgetService } from 'vs/workbench/contrib/interactiveSession/browser/interactiveSessionWidget';
11+
import { IInteractiveSessionWidgetService } from 'vs/workbench/contrib/interactiveSession/browser/interactiveSession';
1212
import { IInteractiveRequestViewModel, IInteractiveResponseViewModel, isRequestVM, isResponseVM } from 'vs/workbench/contrib/interactiveSession/common/interactiveSessionViewModel';
1313

1414
export function registerInteractiveSessionCopyActions() {

src/vs/workbench/contrib/interactiveSession/browser/contrib/interactiveSessionInputEditorContrib.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ import { localize } from 'vs/nls';
1717
import { Registry } from 'vs/platform/registry/common/platform';
1818
import { editorForeground, textLinkForeground } from 'vs/platform/theme/common/colorRegistry';
1919
import { IThemeService } from 'vs/platform/theme/common/themeService';
20-
import { IInteractiveSessionWidget } from 'vs/workbench/contrib/interactiveSession/browser/interactiveSession';
21-
import { IInteractiveSessionWidgetService, InteractiveSessionWidget } from 'vs/workbench/contrib/interactiveSession/browser/interactiveSessionWidget';
20+
import { IInteractiveSessionWidget, IInteractiveSessionWidgetService } from 'vs/workbench/contrib/interactiveSession/browser/interactiveSession';
21+
import { InteractiveSessionWidget } from 'vs/workbench/contrib/interactiveSession/browser/interactiveSessionWidget';
2222
import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle';
2323
import { InteractiveSessionInputPart } from 'vs/workbench/contrib/interactiveSession/browser/interactiveSessionInputPart';
2424

src/vs/workbench/contrib/interactiveSession/browser/interactiveSession.contribution.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,11 @@ import { registerInteractiveSessionCodeBlockActions } from 'vs/workbench/contrib
1919
import { registerInteractiveSessionCopyActions } from 'vs/workbench/contrib/interactiveSession/browser/actions/interactiveSessionCopyActions';
2020
import { registerInteractiveSessionExecuteActions } from 'vs/workbench/contrib/interactiveSession/browser/actions/interactiveSessionExecuteActions';
2121
import { registerInteractiveSessionTitleActions } from 'vs/workbench/contrib/interactiveSession/browser/actions/interactiveSessionTitleActions';
22+
import { IInteractiveSessionWidgetService } from 'vs/workbench/contrib/interactiveSession/browser/interactiveSession';
2223
import { InteractiveSessionContributionService } from 'vs/workbench/contrib/interactiveSession/browser/interactiveSessionContributionServiceImpl';
2324
import { IInteractiveSessionEditorOptions, InteractiveSessionEditor } from 'vs/workbench/contrib/interactiveSession/browser/interactiveSessionEditor';
2425
import { InteractiveSessionEditorInput, InteractiveSessionEditorInputSerializer } from 'vs/workbench/contrib/interactiveSession/browser/interactiveSessionEditorInput';
25-
import { IInteractiveSessionWidgetService, InteractiveSessionWidgetService } from 'vs/workbench/contrib/interactiveSession/browser/interactiveSessionWidget';
26+
import { InteractiveSessionWidgetService } from 'vs/workbench/contrib/interactiveSession/browser/interactiveSessionWidget';
2627
import { IInteractiveSessionContributionService } from 'vs/workbench/contrib/interactiveSession/common/interactiveSessionContributionService';
2728
import { IInteractiveSessionService } from 'vs/workbench/contrib/interactiveSession/common/interactiveSessionService';
2829
import { InteractiveSessionService } from 'vs/workbench/contrib/interactiveSession/common/interactiveSessionServiceImpl';
@@ -71,7 +72,7 @@ configurationRegistry.registerConfiguration({
7172
Registry.as<IEditorPaneRegistry>(EditorExtensions.EditorPane).registerEditorPane(
7273
EditorPaneDescriptor.create(
7374
InteractiveSessionEditor,
74-
InteractiveSessionEditor.ID,
75+
InteractiveSessionEditorInput.EditorID,
7576
nls.localize('interactiveSession', "Interactive Session")
7677
),
7778
[
@@ -89,7 +90,7 @@ class InteractiveSessionResolverContribution extends Disposable {
8990
this._register(editorResolverService.registerEditor(
9091
`${Schemas.vscodeInteractiveSesssion}:**/**`,
9192
{
92-
id: InteractiveSessionEditor.ID,
93+
id: InteractiveSessionEditorInput.EditorID,
9394
label: nls.localize('interactiveSession', "Interactive Session"),
9495
priority: RegisteredEditorPriority.builtin
9596
},
@@ -108,7 +109,7 @@ class InteractiveSessionResolverContribution extends Disposable {
108109

109110
const workbenchContributionsRegistry = Registry.as<IWorkbenchContributionsRegistry>(WorkbenchExtensions.Workbench);
110111
workbenchContributionsRegistry.registerWorkbenchContribution(InteractiveSessionResolverContribution, LifecyclePhase.Starting);
111-
Registry.as<IEditorFactoryRegistry>(EditorExtensions.EditorFactory).registerEditorSerializer(InteractiveSessionEditorInput.ID, InteractiveSessionEditorInputSerializer);
112+
Registry.as<IEditorFactoryRegistry>(EditorExtensions.EditorFactory).registerEditorSerializer(InteractiveSessionEditorInput.TypeID, InteractiveSessionEditorInputSerializer);
112113

113114
registerInteractiveSessionActions();
114115
registerInteractiveSessionCopyActions();

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,27 @@ import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
77
import { IInteractiveSlashCommand } from 'vs/workbench/contrib/interactiveSession/common/interactiveSessionService';
88
import { IInteractiveSessionViewModel } from 'vs/workbench/contrib/interactiveSession/common/interactiveSessionViewModel';
99
import { Event } from 'vs/base/common/event';
10+
import { URI } from 'vs/base/common/uri';
11+
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
12+
13+
export const IInteractiveSessionWidgetService = createDecorator<IInteractiveSessionWidgetService>('interactiveSessionWidgetService');
14+
15+
export interface IInteractiveSessionWidgetService {
16+
17+
readonly _serviceBrand: undefined;
18+
19+
/**
20+
* Returns the most recently focused widget if any.
21+
*/
22+
readonly lastFocusedWidget: IInteractiveSessionWidget | undefined;
23+
24+
/**
25+
* Returns whether a view was successfully revealed.
26+
*/
27+
revealViewForProvider(providerId: string): Promise<IInteractiveSessionWidget | undefined>;
28+
29+
getWidgetByInputUri(uri: URI): IInteractiveSessionWidget | undefined;
30+
}
1031

1132
export type IInteractiveSessionWidgetViewContext = { viewId: string } | { resource: boolean };
1233

@@ -22,3 +43,7 @@ export interface IInteractiveSessionWidget {
2243
focusInput(): void;
2344
getSlashCommands(): Promise<IInteractiveSlashCommand[] | undefined>;
2445
}
46+
47+
export interface IInteractiveSessionViewPane {
48+
clear(): void;
49+
}

src/vs/workbench/contrib/interactiveSession/browser/interactiveSessionEditor.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@ export interface IInteractiveSessionEditorOptions extends IEditorOptions {
2727
}
2828

2929
export class InteractiveSessionEditor extends EditorPane {
30-
static readonly ID: string = 'workbench.editor.interactiveSession';
31-
3230
private widget!: InteractiveSessionWidget;
3331

3432
private _scopedContextKeyService!: IScopedContextKeyService;
@@ -47,7 +45,7 @@ export class InteractiveSessionEditor extends EditorPane {
4745
@IContextKeyService private readonly contextKeyService: IContextKeyService,
4846
@IInteractiveSessionService private readonly interactiveSessionService: IInteractiveSessionService,
4947
) {
50-
super(InteractiveSessionEditor.ID, telemetryService, themeService, storageService);
48+
super(InteractiveSessionEditorInput.EditorID, telemetryService, themeService, storageService);
5149
}
5250

5351
public async clear() {

src/vs/workbench/contrib/interactiveSession/browser/interactiveSessionEditorInput.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,13 @@ import { IEditorModel } from 'vs/platform/editor/common/editor';
1313
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
1414
import { EditorInputCapabilities, IEditorSerializer, IUntypedEditorInput } from 'vs/workbench/common/editor';
1515
import { EditorInput } from 'vs/workbench/common/editor/editorInput';
16-
import { IInteractiveSessionEditorOptions, InteractiveSessionEditor } from 'vs/workbench/contrib/interactiveSession/browser/interactiveSessionEditor';
16+
import type { IInteractiveSessionEditorOptions } from 'vs/workbench/contrib/interactiveSession/browser/interactiveSessionEditor';
1717
import { IInteractiveSessionModel } from 'vs/workbench/contrib/interactiveSession/common/interactiveSessionModel';
1818
import { IInteractiveSessionService } from 'vs/workbench/contrib/interactiveSession/common/interactiveSessionService';
1919

2020
export class InteractiveSessionEditorInput extends EditorInput {
21-
static readonly ID: string = 'workbench.input.interactiveSession';
21+
static readonly TypeID: string = 'workbench.input.interactiveSession';
22+
static readonly EditorID: string = 'workbench.editor.interactiveSession';
2223
static count = 0;
2324

2425
private readonly inputCount: number;
@@ -48,7 +49,7 @@ export class InteractiveSessionEditorInput extends EditorInput {
4849
}
4950

5051
override get editorId(): string | undefined {
51-
return InteractiveSessionEditor.ID;
52+
return InteractiveSessionEditorInput.EditorID;
5253
}
5354

5455
override get capabilities(): EditorInputCapabilities {
@@ -60,7 +61,7 @@ export class InteractiveSessionEditorInput extends EditorInput {
6061
}
6162

6263
override get typeId(): string {
63-
return InteractiveSessionEditorInput.ID;
64+
return InteractiveSessionEditorInput.TypeID;
6465
}
6566

6667
override getName(): string {

0 commit comments

Comments
 (0)