Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/vs/sessions/SESSIONS_LIST.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ Pinned sessions appear in a dedicated "Pinned" section at the top. Pin state is
- Sessions start as **unread**
- A session becomes **read** when the user opens it or explicitly marks it
- A session becomes **unread** when it completes in the background (transitions from InProgress to a terminal status while not active)
- Pin and read state are cleaned up when a provider reports a real session removal; remote agent host disconnects hide cached sessions without reporting them as removed

### Navigation

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2040,7 +2040,7 @@ export abstract class BaseAgentHostSessionsProvider extends Disposable implement
this._refreshSessions();
}

protected async _refreshSessions(): Promise<void> {
protected async _refreshSessions(announceExistingAsAdded = false): Promise<void> {
const connection = this.connection;
if (!connection) {
return;
Expand All @@ -2057,6 +2057,9 @@ export abstract class BaseAgentHostSessionsProvider extends Disposable implement

const existing = this._sessionCache.get(rawId);
if (existing) {
if (announceExistingAsAdded) {
added.push(existing);
}
if (existing.update(meta)) {
changed.push(existing);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -375,6 +375,7 @@ export class RemoteAgentHostSessionsProvider extends BaseAgentHostSessionsProvid
return;
}

const wasUnpublished = this._unpublished;
this._connectionListeners.clear();
this._sessionStateSubscriptions.clearAndDisposeAll();
this._connection = connection;
Expand All @@ -396,7 +397,7 @@ export class RemoteAgentHostSessionsProvider extends BaseAgentHostSessionsProvid

// Always refresh sessions when a connection is (re)established
this._cacheInitialized = true;
this._refreshSessions();
this._refreshSessions(wasUnpublished);
}

/**
Expand Down Expand Up @@ -450,9 +451,8 @@ export class RemoteAgentHostSessionsProvider extends BaseAgentHostSessionsProvid
return;
}
this._unpublished = true;
const removed: ISession[] = Array.from(this._sessionCache.values());
if (removed.length > 0) {
this._onDidChangeSessions.fire({ added: [], removed, changed: [] });
if (this._sessionCache.size > 0) {
this._onDidChangeSessions.fire({ added: [], removed: [], changed: [] });
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -838,9 +838,10 @@ suite('RemoteAgentHostSessionsProvider', () => {
assert.deepStrictEqual(
{
sessionCount: provider.getSessions().length,
eventCount: events.length,
eventRemovedTitles: events.flatMap(e => e.removed.map(s => s.title.get())),
},
{ sessionCount: 0, eventRemovedTitles: ['Keep Me'] },
{ sessionCount: 0, eventCount: 1, eventRemovedTitles: [] },
);

// Flush triggers onWillSaveState; the metadata must survive so the
Expand All @@ -862,18 +863,30 @@ suite('RemoteAgentHostSessionsProvider', () => {

provider.unpublishCachedSessions();
assert.strictEqual(provider.getSessions().length, 0);
const events: ISessionChangeEvent[] = [];
disposables.add(provider.onDidChangeSessions(e => events.push(e)));

// Simulate the host coming back online with a fresh connection that
// still reports the same session.
// still reports the same session with updated metadata.
const reconnected = new MockAgentConnection();
disposables.add(toDisposable(() => reconnected.dispose()));
reconnected.addSession(createSession('restore-me', { summary: 'Restore Me' }));
reconnected.addSession(createSession('restore-me', { summary: 'Restored' }));
provider.setConnection(reconnected);
await timeout(0);

assert.deepStrictEqual(
provider.getSessions().map(s => s.title.get()),
['Restore Me'],
{
sessions: provider.getSessions().map(s => s.title.get()),
added: events.flatMap(e => e.added.map(s => s.title.get())),
changed: events.flatMap(e => e.changed.map(s => s.title.get())),
removed: events.flatMap(e => e.removed.map(s => s.title.get())),
},
{
sessions: ['Restored'],
added: ['Restored'],
changed: ['Restored'],
removed: [],
},
);
}));

Expand Down
Loading