Skip to content

Commit 845ca7a

Browse files
authored
Implement IChatWidgetService#openSession, adopt for sessions views (#277978)
* Implement IChatWidgetService#openSession, adopt for sessions view * Adopt in sessions view pane * Copilot comment
1 parent 52589a1 commit 845ca7a

File tree

9 files changed

+238
-170
lines changed

9 files changed

+238
-170
lines changed

src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsView.ts

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -33,24 +33,23 @@ import { FuzzyScore } from '../../../../../base/common/filters.js';
3333
import { IMenuService, MenuId, registerAction2 } from '../../../../../platform/actions/common/actions.js';
3434
import { IChatSessionsService } from '../../common/chatSessionsService.js';
3535
import { ICommandService } from '../../../../../platform/commands/common/commands.js';
36-
import { findExistingChatEditorByUri, getSessionItemContextOverlay, NEW_CHAT_SESSION_ACTION_ID } from '../chatSessions/common.js';
36+
import { getSessionItemContextOverlay, NEW_CHAT_SESSION_ACTION_ID } from '../chatSessions/common.js';
3737
import { ACTION_ID_OPEN_CHAT } from '../actions/chatActions.js';
3838
import { IProgressService } from '../../../../../platform/progress/common/progress.js';
3939
import { IChatEditorOptions } from '../chatEditor.js';
40-
import { IEditorService } from '../../../../services/editor/common/editorService.js';
41-
import { assertReturnsDefined, upcast } from '../../../../../base/common/types.js';
40+
import { assertReturnsDefined } from '../../../../../base/common/types.js';
4241
import { IEditorGroupsService } from '../../../../services/editor/common/editorGroupsService.js';
4342
import { DeferredPromise } from '../../../../../base/common/async.js';
4443
import { Event } from '../../../../../base/common/event.js';
4544
import { MutableDisposable } from '../../../../../base/common/lifecycle.js';
46-
import { IEditorOptions } from '../../../../../platform/editor/common/editor.js';
4745
import { ITreeContextMenuEvent } from '../../../../../base/browser/ui/tree/tree.js';
4846
import { MarshalledId } from '../../../../../base/common/marshallingIds.js';
4947
import { getActionBarActions } from '../../../../../platform/actions/browser/menuEntryActionViewItem.js';
5048
import { IChatService } from '../../common/chatService.js';
5149
import { IChatWidgetService } from '../chat.js';
5250
import { AGENT_SESSIONS_VIEW_ID, AGENT_SESSIONS_VIEW_CONTAINER_ID, AgentSessionProviders } from './agentSessions.js';
5351
import { TreeFindMode } from '../../../../../base/browser/ui/tree/abstractTree.js';
52+
import { SIDE_GROUP } from '../../../../services/editor/common/editorService.js';
5453

5554
export class AgentSessionsView extends ViewPane {
5655

@@ -70,7 +69,6 @@ export class AgentSessionsView extends ViewPane {
7069
@IChatSessionsService private readonly chatSessionsService: IChatSessionsService,
7170
@ICommandService private readonly commandService: ICommandService,
7271
@IProgressService private readonly progressService: IProgressService,
73-
@IEditorService private readonly editorService: IEditorService,
7472
@IEditorGroupsService private readonly editorGroupsService: IEditorGroupsService,
7573
@IChatService private readonly chatService: IChatService,
7674
@IMenuService private readonly menuService: IMenuService,
@@ -132,12 +130,6 @@ export class AgentSessionsView extends ViewPane {
132130
return;
133131
}
134132

135-
const existingSessionEditor = findExistingChatEditorByUri(session.resource, this.editorGroupsService);
136-
if (existingSessionEditor) {
137-
await existingSessionEditor.group.openEditor(existingSessionEditor.editor, e.editorOptions);
138-
return;
139-
}
140-
141133
let sessionOptions: IChatEditorOptions;
142134
if (isLocalAgentSessionItem(session)) {
143135
sessionOptions = {};
@@ -147,14 +139,14 @@ export class AgentSessionsView extends ViewPane {
147139

148140
sessionOptions.ignoreInView = true;
149141

150-
await this.editorService.openEditor({
151-
resource: session.resource,
152-
options: upcast<IEditorOptions, IChatEditorOptions>({
153-
...sessionOptions,
154-
title: { preferred: session.label },
155-
...e.editorOptions
156-
})
157-
});
142+
const options: IChatEditorOptions = {
143+
preserveFocus: false,
144+
...sessionOptions,
145+
...e.editorOptions,
146+
};
147+
148+
const group = e.sideBySide ? SIDE_GROUP : undefined;
149+
await this.chatWidgetService.openSession(session.resource, group, options);
158150
}
159151

160152
private showContextMenu({ element: session, anchor }: ITreeContextMenuEvent<IAgentSessionViewModel>): void {

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ import { ChatSessionsView, ChatSessionsViewContrib } from './chatSessions/view/c
115115
import { ChatSetupContribution, ChatTeardownContribution } from './chatSetup.js';
116116
import { ChatStatusBarEntry } from './chatStatus.js';
117117
import { ChatVariablesService } from './chatVariables.js';
118-
import { ChatWidget, ChatWidgetService } from './chatWidget.js';
118+
import { ChatWidget } from './chatWidget.js';
119119
import { ChatCodeBlockContextProviderService } from './codeBlockContextProviderService.js';
120120
import { ChatDynamicVariableModel } from './contrib/chatDynamicVariables.js';
121121
import { ChatImplicitContextContribution } from './contrib/chatImplicitContext.js';
@@ -130,6 +130,7 @@ import './promptSyntax/promptToolsCodeLensProvider.js';
130130
import { PromptUrlHandler } from './promptSyntax/promptUrlHandler.js';
131131
import { ConfigureToolSets, UserToolSetsContributions } from './tools/toolSetsContribution.js';
132132
import { ChatViewsWelcomeHandler } from './viewsWelcome/chatViewsWelcomeHandler.js';
133+
import { ChatWidgetService } from './chatWidgetService.js';
133134

134135
// Register configuration
135136
const configurationRegistry = Registry.as<IConfigurationRegistry>(ConfigurationExtensions.Configuration);

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ import { EditDeltaInfo } from '../../../../editor/common/textModelEditSource.js'
1313
import { MenuId } from '../../../../platform/actions/common/actions.js';
1414
import { IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';
1515
import { createDecorator } from '../../../../platform/instantiation/common/instantiation.js';
16+
import { GroupIdentifier } from '../../../common/editor.js';
17+
import { IEditorGroup } from '../../../services/editor/common/editorGroupsService.js';
18+
import { ACTIVE_GROUP_TYPE, AUX_WINDOW_GROUP_TYPE, SIDE_GROUP_TYPE } from '../../../services/editor/common/editorService.js';
1619
import { IChatAgentAttachmentCapabilities, IChatAgentCommand, IChatAgentData } from '../common/chatAgents.js';
1720
import { IChatResponseModel } from '../common/chatModel.js';
1821
import { IChatMode } from '../common/chatModes.js';
@@ -22,6 +25,7 @@ import { IChatElicitationRequest, IChatLocationData, IChatSendRequestOptions } f
2225
import { IChatRequestViewModel, IChatResponseViewModel, IChatViewModel } from '../common/chatViewModel.js';
2326
import { ChatAgentLocation, ChatModeKind } from '../common/constants.js';
2427
import { ChatAttachmentModel } from './chatAttachmentModel.js';
28+
import { IChatEditorOptions } from './chatEditor.js';
2529
import { ChatInputPart } from './chatInputPart.js';
2630
import { ChatWidget, IChatViewState, IChatWidgetContrib } from './chatWidget.js';
2731
import { ICodeBlockActionContext } from './codeBlockPart.js';
@@ -51,12 +55,23 @@ export interface IChatWidgetService {
5155

5256
getAllWidgets(): ReadonlyArray<IChatWidget>;
5357
getWidgetByInputUri(uri: URI): IChatWidget | undefined;
58+
openSession(sessionResource: URI, target?: typeof ChatViewPaneTarget): Promise<IChatWidget | undefined>;
59+
openSession(sessionResource: URI, target?: ChatEditorGroupType, options?: IChatEditorOptions): Promise<IChatWidget | undefined>;
60+
openSession(sessionResource: URI, target?: typeof ChatViewPaneTarget | ChatEditorGroupType, options?: IChatEditorOptions): Promise<IChatWidget | undefined>;
5461

5562
getWidgetBySessionResource(sessionResource: URI): IChatWidget | undefined;
5663

5764
getWidgetsByLocations(location: ChatAgentLocation): ReadonlyArray<IChatWidget>;
65+
66+
/**
67+
* An IChatWidget registers itself when created.
68+
*/
69+
register(newWidget: IChatWidget): IDisposable;
5870
}
5971

72+
export type ChatEditorGroupType = IEditorGroup | GroupIdentifier | SIDE_GROUP_TYPE | ACTIVE_GROUP_TYPE | AUX_WINDOW_GROUP_TYPE;
73+
export const ChatViewPaneTarget = Symbol('ChatViewPaneTarget');
74+
6075
export const IQuickChatService = createDecorator<IQuickChatService>('quickChatService');
6176
export interface IQuickChatService {
6277
readonly _serviceBrand: undefined;
@@ -197,6 +212,7 @@ export interface IChatWidget {
197212
readonly onDidSubmitAgent: Event<{ agent: IChatAgentData; slashCommand?: IChatAgentCommand }>;
198213
readonly onDidChangeAgent: Event<{ agent: IChatAgentData; slashCommand?: IChatAgentCommand }>;
199214
readonly onDidChangeParsedInput: Event<void>;
215+
readonly onDidFocus: Event<void>;
200216
readonly location: ChatAgentLocation;
201217
readonly viewContext: IChatWidgetViewContext;
202218
readonly viewModel: IChatViewModel | undefined;

src/vs/workbench/contrib/chat/browser/chatSessions/view/sessionsViewPane.ts

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -38,16 +38,14 @@ import { ResourceLabels } from '../../../../../browser/labels.js';
3838
import { IViewPaneOptions, ViewPane } from '../../../../../browser/parts/views/viewPane.js';
3939
import { IViewDescriptorService } from '../../../../../common/views.js';
4040
import { IEditorGroupsService } from '../../../../../services/editor/common/editorGroupsService.js';
41-
import { IEditorService } from '../../../../../services/editor/common/editorService.js';
42-
import { IViewsService } from '../../../../../services/views/common/viewsService.js';
4341
import { IChatService } from '../../../common/chatService.js';
4442
import { IChatSessionItemProvider, IChatSessionsService, localChatSessionType } from '../../../common/chatSessionsService.js';
4543
import { ChatConfiguration, ChatEditorTitleMaxLength } from '../../../common/constants.js';
4644
import { ACTION_ID_OPEN_CHAT } from '../../actions/chatActions.js';
47-
import { ChatViewId, IChatWidgetService } from '../../chat.js';
45+
import { IChatWidgetService } from '../../chat.js';
4846
import { IChatEditorOptions } from '../../chatEditor.js';
4947
import { ChatSessionTracker } from '../chatSessionTracker.js';
50-
import { ChatSessionItemWithProvider, findExistingChatEditorByUri, getSessionItemContextOverlay, NEW_CHAT_SESSION_ACTION_ID } from '../common.js';
48+
import { ChatSessionItemWithProvider, getSessionItemContextOverlay, NEW_CHAT_SESSION_ACTION_ID } from '../common.js';
5149
import { LocalChatSessionsProvider } from '../localChatSessionsProvider.js';
5250
import { ArchivedSessionItems, GettingStartedDelegate, GettingStartedRenderer, IGettingStartedItem, SessionsDataSource, SessionsDelegate, SessionsRenderer } from './sessionsTreeRenderer.js';
5351

@@ -96,8 +94,6 @@ export class SessionsViewPane extends ViewPane {
9694
@IThemeService themeService: IThemeService,
9795
@IHoverService hoverService: IHoverService,
9896
@IChatService private readonly chatService: IChatService,
99-
@IEditorService private readonly editorService: IEditorService,
100-
@IViewsService private readonly viewsService: IViewsService,
10197
@ILogService private readonly logService: ILogService,
10298
@IProgressService private readonly progressService: IProgressService,
10399
@IMenuService private readonly menuService: IMenuService,
@@ -469,24 +465,10 @@ export class SessionsViewPane extends ViewPane {
469465

470466
private async openChatSession(session: ChatSessionItemWithProvider) {
471467
try {
472-
// Check first if we already have an open editor for this session
473-
const existingEditor = findExistingChatEditorByUri(session.resource, this.editorGroupsService);
474-
if (existingEditor) {
475-
await this.editorService.openEditor(existingEditor.editor, existingEditor.group);
476-
return;
477-
}
478-
if (this.chatWidgetService.getWidgetBySessionResource(session.resource)) {
479-
return;
480-
}
481468
if (session instanceof ArchivedSessionItems) {
482469
return;
483470
}
484471

485-
if (isEqual(session.resource, LocalChatSessionsProvider.CHAT_WIDGET_VIEW_RESOURCE)) {
486-
await this.viewsService.openView(ChatViewId);
487-
return;
488-
}
489-
490472
const options: IChatEditorOptions = {
491473
pinned: true,
492474
ignoreInView: true,
@@ -495,10 +477,7 @@ export class SessionsViewPane extends ViewPane {
495477
},
496478
preserveFocus: true,
497479
};
498-
await this.editorService.openEditor({
499-
resource: session.resource,
500-
options,
501-
});
480+
await this.chatWidgetService.openSession(session.resource, undefined, options);
502481

503482
} catch (error) {
504483
this.logService.error('[SessionsViewPane] Failed to open chat session:', error);

0 commit comments

Comments
 (0)