Skip to content

Commit b2e7cd7

Browse files
committed
Moves AI feedback context management into provider
(#4449, #4518)
1 parent 01e6442 commit b2e7cd7

File tree

4 files changed

+24
-35
lines changed

4 files changed

+24
-35
lines changed

src/commands/aiFeedback.ts

Lines changed: 2 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import type { Disposable, TextEditor, Uri } from 'vscode';
2-
import { window, workspace } from 'vscode';
1+
import type { TextEditor, Uri } from 'vscode';
2+
import { window } from 'vscode';
33
import type { AIFeedbackEvent, AIFeedbackUnhelpfulReasons, Source } from '../constants.telemetry';
44
import type { Container } from '../container';
55
import type { AIResultContext } from '../plus/ai/aiProviderService';
@@ -8,7 +8,6 @@ import type { QuickPickItemOfT } from '../quickpicks/items/common';
88
import { command } from '../system/-webview/command';
99
import { map } from '../system/iterable';
1010
import { Logger } from '../system/logger';
11-
import { createDisposable } from '../system/unifiedDisposable';
1211
import { ActiveEditorCommand } from './commandBase';
1312
import { getCommandUri } from './commandBase.utils';
1413

@@ -42,31 +41,6 @@ export class AIFeedbackUnhelpfulCommand extends ActiveEditorCommand {
4241

4342
type UnhelpfulResult = { reasons?: AIFeedbackUnhelpfulReasons[]; custom?: string };
4443

45-
let _documentCloseTracker: Disposable | undefined;
46-
const _markdownDocuments = new Map<string, AIResultContext>();
47-
export function getMarkdownDocument(documentUri: string): AIResultContext | undefined {
48-
return _markdownDocuments.get(documentUri);
49-
}
50-
export function setMarkdownDocument(documentUri: string, context: AIResultContext, container: Container): void {
51-
_markdownDocuments.set(documentUri, context);
52-
53-
if (!_documentCloseTracker) {
54-
_documentCloseTracker = workspace.onDidCloseTextDocument(document => {
55-
deleteMarkdownDocument(document.uri.toString());
56-
});
57-
container.context.subscriptions.push(
58-
createDisposable(() => {
59-
_documentCloseTracker?.dispose();
60-
_documentCloseTracker = undefined;
61-
_markdownDocuments.clear();
62-
}),
63-
);
64-
}
65-
}
66-
function deleteMarkdownDocument(documentUri: string): void {
67-
_markdownDocuments.delete(documentUri);
68-
}
69-
7044
async function sendFeedback(container: Container, uri: Uri, sentiment: AIFeedbackEvent['sentiment']): Promise<void> {
7145
const context = extractAIResultContext(container, uri);
7246
if (!context) return;

src/commands/explainBase.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import type { AIModel } from '../plus/ai/models/model';
1111
import { getAIResultContext } from '../plus/ai/utils/-webview/ai.utils';
1212
import { getBestRepositoryOrShowPicker } from '../quickpicks/repositoryPicker';
1313
import { showMarkdownPreview } from '../system/-webview/markdown';
14-
import { setMarkdownDocument } from './aiFeedback';
1514
import { GlCommandBase } from './commandBase';
1615
import { getCommandUri } from './commandBase.utils';
1716

@@ -142,7 +141,7 @@ export abstract class ExplainCommandBase extends GlCommandBase {
142141
const content = `${headerContent}\n\n${result.parsed.summary}\n\n${result.parsed.body}`;
143142

144143
// Store the AI result context in the feedback provider for documents that cannot store it in their URI
145-
setMarkdownDocument(documentUri.toString(), context, this.container);
144+
this.container.aiFeedback.setMarkdownDocument(documentUri.toString(), context);
146145

147146
this.container.markdown.updateDocument(documentUri, content);
148147
}

src/plus/ai/utils/-webview/ai.utils.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import type { Disposable, QuickInputButton } from 'vscode';
22
import { env, ThemeIcon, Uri, window } from 'vscode';
3-
import { getMarkdownDocument } from '../../../../commands/aiFeedback';
43
import { Schemes } from '../../../../constants';
54
import type { AIProviders } from '../../../../constants.ai';
65
import type { Container } from '../../../../container';
@@ -289,7 +288,7 @@ export function extractAIResultContext(container: Container, uri: Uri | undefine
289288
if (!authority) return undefined;
290289

291290
try {
292-
const context: AIResultContext | undefined = getMarkdownDocument(uri.toString());
291+
const context: AIResultContext | undefined = container.aiFeedback.getMarkdownDocument(uri.toString());
293292
if (context) return context;
294293

295294
const metadata = decodeGitLensRevisionUriAuthority<MarkdownContentMetadata>(authority);

src/telemetry/aiFeedbackProvider.ts

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ export class AIFeedbackProvider implements Disposable {
1212
constructor() {
1313
// Listen for document close events to clean up contexts
1414
this._disposables.push(
15-
workspace.onDidCloseTextDocument(document => this.removeChangelogDocument(document.uri)),
15+
workspace.onDidCloseTextDocument(document => {
16+
this.removeDocument(document.uri);
17+
}),
1618
);
1719
}
1820

@@ -21,16 +23,19 @@ export class AIFeedbackProvider implements Disposable {
2123
this.addChangelogUri(uri);
2224
}
2325

24-
private removeChangelogDocument(uri: Uri): void {
25-
this.deleteChangelogDocument(uri.toString());
26+
private removeDocument(uri: Uri): void {
27+
const uriString = uri.toString();
28+
this.deleteChangelogDocument(uriString);
2629
this.removeChangelogUri(uri);
30+
this.deleteMarkdownDocument(uriString);
2731
}
2832

2933
private readonly _disposables: Disposable[] = [];
3034
dispose(): void {
3135
this._disposables.forEach(d => void d.dispose());
3236
this._uriResponses.clear();
3337
this._changelogDocuments.clear();
38+
this._markdownDocuments.clear();
3439
this._changelogUris.clear();
3540
this._updateFeedbackContextDebounced = undefined;
3641
this._updateChangelogContextDebounced = undefined;
@@ -70,6 +75,18 @@ export class AIFeedbackProvider implements Disposable {
7075
this._changelogDocuments.delete(documentUri);
7176
}
7277

78+
// Storage for AI feedback context associated with any document
79+
private readonly _markdownDocuments = new Map<string, AIResultContext>();
80+
getMarkdownDocument(documentUri: string): AIResultContext | undefined {
81+
return this._markdownDocuments.get(documentUri);
82+
}
83+
setMarkdownDocument(documentUri: string, context: AIResultContext): void {
84+
this._markdownDocuments.set(documentUri, context);
85+
}
86+
private deleteMarkdownDocument(documentUri: string): void {
87+
this._markdownDocuments.delete(documentUri);
88+
}
89+
7390
// Storage for AI feedback responses by URI
7491
private readonly _uriResponses = new UriMap<AIFeedbackEvent['sentiment']>();
7592
private _updateFeedbackContextDebounced: Deferrable<() => void> | undefined;

0 commit comments

Comments
 (0)