Skip to content

Commit c1f6b9d

Browse files
authored
* fix #305291 * feedback
1 parent d9b443d commit c1f6b9d

16 files changed

Lines changed: 566 additions & 144 deletions

src/vs/sessions/contrib/chat/test/browser/sessionWorkspacePicker.test.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ function createMockProvider(id: string, opts?: {
5959
unarchiveSession: async () => { },
6060
deleteSession: async () => { },
6161
deleteChat: async () => { },
62-
setRead: () => { },
6362
sendAndCreateChat: async () => { throw new Error('Not implemented'); },
6463
capabilities: { multipleChatsPerSession: false },
6564
};

src/vs/sessions/contrib/copilotChatSessions/browser/copilotChatSessionsProvider.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1317,13 +1317,6 @@ export class CopilotChatSessionsProvider extends Disposable implements ISessions
13171317
}
13181318
}
13191319

1320-
setRead(sessionId: string, read: boolean): void {
1321-
const agentSession = this._findAgentSession(sessionId);
1322-
if (agentSession) {
1323-
agentSession.setRead(read);
1324-
}
1325-
}
1326-
13271320
// -- Send --
13281321

13291322
async sendAndCreateChat(sessionId: string, options: ISendRequestOptions): Promise<ISession> {

src/vs/sessions/contrib/copilotChatSessions/test/browser/copilotChatSessionsProvider.test.ts

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -227,8 +227,6 @@ function createProviderForSendTests(
227227
return disposables.add(instantiationService.createInstance(CopilotChatSessionsProvider));
228228
}
229229

230-
231-
232230
suite('CopilotChatSessionsProvider', () => {
233231
const disposables = new DisposableStore();
234232
let model: MockAgentSessionsModel;
@@ -356,20 +354,6 @@ suite('CopilotChatSessionsProvider', () => {
356354
assert.strictEqual(agentSession.isArchived(), false);
357355
});
358356

359-
test('setRead marks session as read', () => {
360-
const resource = URI.from({ scheme: AgentSessionProviders.Background, path: '/session-1' });
361-
const agentSession = createMockAgentSession(resource, { read: false });
362-
model.addSession(agentSession);
363-
364-
const provider = createProvider(disposables, model);
365-
provider.getSessions();
366-
367-
const session = provider.getSessions()[0];
368-
provider.setRead(session.sessionId, true);
369-
370-
assert.strictEqual(agentSession.isRead(), true);
371-
});
372-
373357
// ---- Single-chat mode (multi-chat disabled) -------
374358

375359
test('single-chat mode: each session has exactly one chat', () => {

src/vs/sessions/contrib/localAgentHost/browser/localAgentHostSessionsProvider.ts

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -510,16 +510,6 @@ export class LocalAgentHostSessionsProvider extends Disposable implements ISessi
510510
// Agent host sessions don't support deleting individual chats
511511
}
512512

513-
setRead(sessionId: string, read: boolean): void {
514-
const rawId = this._rawIdFromChatId(sessionId);
515-
const cached = rawId ? this._sessionCache.get(rawId) : undefined;
516-
if (cached && rawId) {
517-
cached.isRead.set(read, undefined);
518-
const action = { type: ActionType.SessionIsReadChanged as const, session: AgentSession.uri(cached.agentProvider, rawId).toString(), isRead: read };
519-
this._agentHostService.dispatch(action);
520-
}
521-
}
522-
523513
async sendAndCreateChat(chatId: string, options: ISendRequestOptions): Promise<ISession> {
524514
const session = this._currentNewSession;
525515
if (!session || session.sessionId !== chatId) {

src/vs/sessions/contrib/localAgentHost/test/browser/localAgentHostSessionsProvider.test.ts

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -517,19 +517,6 @@ suite('LocalAgentHostSessionsProvider', () => {
517517
assert.strictEqual(provider.getSessions().find(s => s.title.get() === 'To Delete'), undefined);
518518
});
519519

520-
test('setRead toggles read state locally', () => {
521-
const provider = createProvider(disposables, agentHost);
522-
fireSessionAdded(agentHost, 'read-sess', { title: 'Read Test' });
523-
524-
const sessions = provider.getSessions();
525-
const target = sessions.find(s => s.title.get() === 'Read Test');
526-
assert.ok(target);
527-
528-
assert.strictEqual(target!.isRead.get(), true);
529-
provider.setRead(target!.sessionId, false);
530-
assert.strictEqual(target!.isRead.get(), false);
531-
});
532-
533520
// ---- Rename -------
534521

535522
test('renameChat dispatches SessionTitleChanged action', async () => {

src/vs/sessions/contrib/remoteAgentHost/browser/remoteAgentHostSessionsProvider.ts

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -641,18 +641,6 @@ export class RemoteAgentHostSessionsProvider extends Disposable implements ISess
641641
// Agent host sessions don't support deleting individual chats
642642
}
643643

644-
setRead(sessionId: string, read: boolean): void {
645-
const rawId = this._rawIdFromChatId(sessionId);
646-
const cached = rawId ? this._sessionCache.get(rawId) : undefined;
647-
if (cached) {
648-
cached.isRead.set(read, undefined);
649-
if (this._connection && rawId) {
650-
const action = { type: ActionType.SessionIsReadChanged as const, session: AgentSession.uri(cached.agentProvider, rawId).toString(), isRead: read };
651-
this._connection.dispatch(action);
652-
}
653-
}
654-
}
655-
656644
async sendAndCreateChat(chatId: string, options: ISendRequestOptions): Promise<ISession> {
657645
if (!this._connection) {
658646
throw new Error(localize('notConnectedSend', "Cannot send request: not connected to remote agent host '{0}'.", this.label));

src/vs/sessions/contrib/remoteAgentHost/test/browser/remoteAgentHostSessionsProvider.test.ts

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -500,19 +500,6 @@ suite('RemoteAgentHostSessionsProvider', () => {
500500
assert.strictEqual(remaining.find((s) => s.title.get() === 'To Delete'), undefined);
501501
});
502502

503-
test('setRead toggles read state locally', () => {
504-
const provider = createProvider(disposables, connection);
505-
fireSessionAdded(connection, 'read-sess', { title: 'Read Test' });
506-
507-
const sessions = provider.getSessions();
508-
const target = sessions.find((s) => s.title.get() === 'Read Test');
509-
assert.ok(target, 'Session should exist');
510-
511-
assert.strictEqual(target!.isRead.get(), true);
512-
provider.setRead(target!.sessionId, false);
513-
assert.strictEqual(target!.isRead.get(), false);
514-
});
515-
516503
// ---- Rename -------
517504

518505
test('renameSession dispatches SessionTitleChanged action with correct session URI', async () => {

src/vs/sessions/contrib/sessions/browser/sessionsTitleBarWidget.ts

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,9 @@ import { IsAuxiliaryWindowContext } from '../../../../workbench/common/contextke
2828
import { ChatSessionProviderIdContext, IsNewChatSessionContext, SessionsWelcomeVisibleContext } from '../../../common/contextkeys.js';
2929
import { ISessionsProvidersService } from '../../../services/sessions/browser/sessionsProvidersService.js';
3030
import { SessionStatus } from '../../../services/sessions/common/session.js';
31+
import { ISessionsListModelService } from './views/sessionsListModelService.js';
3132
import { SHOW_SESSIONS_PICKER_COMMAND_ID } from './sessionsActions.js';
3233
import { IsSessionArchivedContext, IsSessionPinnedContext, IsSessionReadContext, SessionItemContextMenuId } from './views/sessionsList.js';
33-
import { SessionsView, SessionsViewId } from './views/sessionsView.js';
34-
import { IViewsService } from '../../../../workbench/services/views/common/viewsService.js';
3534
import { basename } from '../../../../base/common/resources.js';
3635
import { ISessionsManagementService } from '../../../services/sessions/common/sessionsManagement.js';
3736

@@ -65,12 +64,12 @@ export class SessionsTitleBarWidget extends BaseActionViewItem {
6564
options: IBaseActionViewItemOptions | undefined,
6665
@IHoverService private readonly hoverService: IHoverService,
6766
@ISessionsManagementService private readonly sessionsManagementService: ISessionsManagementService,
67+
@ISessionsListModelService private readonly sessionsListModelService: ISessionsListModelService,
6868
@IContextMenuService private readonly contextMenuService: IContextMenuService,
6969
@IMenuService private readonly menuService: IMenuService,
7070
@IContextKeyService private readonly contextKeyService: IContextKeyService,
7171
@ISessionsProvidersService private readonly sessionsProvidersService: ISessionsProvidersService,
7272
@ICommandService private readonly commandService: ICommandService,
73-
@IViewsService private readonly viewsService: IViewsService,
7473
) {
7574
super(undefined, action, options);
7675

@@ -302,11 +301,13 @@ export class SessionsTitleBarWidget extends BaseActionViewItem {
302301
return;
303302
}
304303

305-
const isPinned = this.viewsService.getViewWithId<SessionsView>(SessionsViewId)?.sessionsControl?.isSessionPinned(sessionData) ?? false;
304+
const isPinned = this.sessionsListModelService.isSessionPinned(sessionData);
305+
const isArchived = sessionData.isArchived.get();
306+
const isRead = this.sessionsListModelService.isSessionRead(sessionData);
306307
const contextOverlay: [string, boolean | string][] = [
307308
[IsSessionPinnedContext.key, isPinned],
308-
[IsSessionArchivedContext.key, sessionData.isArchived.get()],
309-
[IsSessionReadContext.key, sessionData.isRead.get()],
309+
[IsSessionArchivedContext.key, isArchived],
310+
[IsSessionReadContext.key, isRead],
310311
['chatSessionType', sessionData.sessionType],
311312
[ChatSessionProviderIdContext.key, sessionData.providerId],
312313
];
@@ -339,6 +340,7 @@ class SidebarToggleActionViewItem extends ActionViewItem {
339340
action: IAction,
340341
options: IBaseActionViewItemOptions | undefined,
341342
@ISessionsManagementService private readonly sessionsManagementService: ISessionsManagementService,
343+
@ISessionsListModelService private readonly sessionsListModelService: ISessionsListModelService,
342344
@IWorkbenchLayoutService private readonly layoutService: IWorkbenchLayoutService,
343345
) {
344346
super(context, action, { ...options, icon: true, label: false });
@@ -354,23 +356,21 @@ class SidebarToggleActionViewItem extends ActionViewItem {
354356
this._countBadge.setAttribute('aria-hidden', 'true');
355357
this._updateBadge();
356358

357-
// Single autorun that tracks all badge-relevant state:
358-
// - session list changes (add/remove) via observableSignalFromEvent
359-
// - individual session observable state (status, isRead, isArchived)
360-
// - sidebar visibility changes
359+
// Track session list changes, status changes, and sidebar visibility
361360
const sessionsChanged = observableSignalFromEvent(this, this.sessionsManagementService.onDidChangeSessions);
361+
const listModelChanged = observableSignalFromEvent(this, this.sessionsListModelService.onDidChange);
362362
const sidebarVisibilityChanged = observableSignalFromEvent(this, handler => this.layoutService.onDidChangePartVisibility(e => {
363363
if (e.partId === Parts.SIDEBAR_PART) {
364364
handler(e);
365365
}
366366
}));
367367
this._register(autorun(reader => {
368368
sessionsChanged.read(reader);
369+
listModelChanged.read(reader);
369370
sidebarVisibilityChanged.read(reader);
370371
for (const session of this.sessionsManagementService.getSessions()) {
371372
session.isArchived.read(reader);
372373
session.status.read(reader);
373-
session.isRead.read(reader);
374374
}
375375
this.updateClass();
376376
this._updateBadge();
@@ -412,7 +412,7 @@ class SidebarToggleActionViewItem extends ActionViewItem {
412412
private _countUnreadSessions(): number {
413413
let unread = 0;
414414
for (const session of this.sessionsManagementService.getSessions()) {
415-
if (!session.isArchived.get() && session.status.get() === SessionStatus.Completed && !session.isRead.get()) {
415+
if (!session.isArchived.get() && session.status.get() === SessionStatus.Completed && !this.sessionsListModelService.isSessionRead(session)) {
416416
unread++;
417417
}
418418
}

0 commit comments

Comments
 (0)