Skip to content

Commit 567c44d

Browse files
committed
Store AI result context in memory for markdown documents.
Thats because we cannot modify URI of document to review context after the result is rendered. (#4328, #4489)
1 parent fb3a2ab commit 567c44d

File tree

3 files changed

+37
-4
lines changed

3 files changed

+37
-4
lines changed

src/commands/aiFeedback.ts

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import type { TextEditor, Uri } from 'vscode';
2-
import { window } from 'vscode';
1+
import type { Disposable, TextEditor, Uri } from 'vscode';
2+
import { window, workspace } 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';
@@ -12,6 +12,7 @@ import type { Deferrable } from '../system/function/debounce';
1212
import { debounce } from '../system/function/debounce';
1313
import { filterMap, map } from '../system/iterable';
1414
import { Logger } from '../system/logger';
15+
import { createDisposable } from '../system/unifiedDisposable';
1516
import { ActiveEditorCommand } from './commandBase';
1617
import { getCommandUri } from './commandBase.utils';
1718

@@ -45,6 +46,31 @@ export class AIFeedbackUnhelpfulCommand extends ActiveEditorCommand {
4546

4647
type UnhelpfulResult = { reasons?: AIFeedbackUnhelpfulReasons[]; custom?: string };
4748

49+
let _documentCloseTracker: Disposable | undefined;
50+
const _markdownDocuments = new Map<string, AIResultContext>();
51+
export function getMarkdownDocument(documentUri: string): AIResultContext | undefined {
52+
return _markdownDocuments.get(documentUri);
53+
}
54+
export function setMarkdownDocument(documentUri: string, context: AIResultContext, container: Container): void {
55+
_markdownDocuments.set(documentUri, context);
56+
57+
if (!_documentCloseTracker) {
58+
_documentCloseTracker = workspace.onDidCloseTextDocument(document => {
59+
deleteMarkdownDocument(document.uri.toString());
60+
});
61+
container.context.subscriptions.push(
62+
createDisposable(() => {
63+
_documentCloseTracker?.dispose();
64+
_documentCloseTracker = undefined;
65+
_markdownDocuments.clear();
66+
}),
67+
);
68+
}
69+
}
70+
function deleteMarkdownDocument(documentUri: string): void {
71+
_markdownDocuments.delete(documentUri);
72+
}
73+
4874
const uriResponses = new UriMap<AIFeedbackEvent['sentiment']>();
4975
let _updateContextDebounced: Deferrable<() => void> | undefined;
5076

src/commands/explainBase.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ 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';
1415
import { GlCommandBase } from './commandBase';
1516
import { getCommandUri } from './commandBase.utils';
1617

@@ -135,10 +136,14 @@ export abstract class ExplainCommandBase extends GlCommandBase {
135136
result: AISummarizeResult,
136137
metadata: MarkdownContentMetadata,
137138
): void {
138-
const metadataWithContext: MarkdownContentMetadata = { ...metadata, context: getAIResultContext(result) };
139+
const context = getAIResultContext(result);
140+
const metadataWithContext: MarkdownContentMetadata = { ...metadata, context: context };
139141
const headerContent = getMarkdownHeaderContent(metadataWithContext, this.container.telemetry.enabled);
140142
const content = `${headerContent}\n\n${result.parsed.summary}\n\n${result.parsed.body}`;
141143

144+
// 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);
146+
142147
this.container.markdown.updateDocument(documentUri, content);
143148
}
144149

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type { Disposable, QuickInputButton } from 'vscode';
22
import { env, ThemeIcon, Uri, window } from 'vscode';
3+
import { getMarkdownDocument } from '../../../../commands/aiFeedback';
34
import { Schemes } from '../../../../constants';
45
import type { AIProviders } from '../../../../constants.ai';
56
import type { Container } from '../../../../container';
@@ -289,8 +290,9 @@ export function extractAIResultContext(uri: Uri | undefined): AIResultContext |
289290
if (!authority) return undefined;
290291

291292
try {
293+
const context: AIResultContext | undefined = getMarkdownDocument(uri.toString());
292294
const metadata = decodeGitLensRevisionUriAuthority<MarkdownContentMetadata>(authority);
293-
return metadata.context;
295+
return context ?? metadata.context;
294296
} catch (ex) {
295297
Logger.error(ex, 'extractResultContext');
296298
return undefined;

0 commit comments

Comments
 (0)