From 601018a7db0fdf5b46c0200d655044dc1cef1516 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Mon, 20 May 2024 20:44:31 -0700 Subject: [PATCH] Fix merging chat anchors in markdown content (#213114) * Fix merging multiple chat anchors inside markdown content * Simplify types * Fix tests --- .../contrib/chat/common/annotations.ts | 15 +++++++++------ .../contrib/chat/common/chatModel.ts | 19 ++++++++++++------- ...ctVulnerabilitiesFromText_multiline.0.snap | 3 ++- ...nerabilitiesFromText_multiple_vulns.0.snap | 3 ++- ...VulnerabilitiesFromText_single_line.0.snap | 3 ++- 5 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/vs/workbench/contrib/chat/common/annotations.ts b/src/vs/workbench/contrib/chat/common/annotations.ts index e531e55265abd..8a57732c95daf 100644 --- a/src/vs/workbench/contrib/chat/common/annotations.ts +++ b/src/vs/workbench/contrib/chat/common/annotations.ts @@ -6,13 +6,13 @@ import { MarkdownString } from 'vs/base/common/htmlContent'; import { basename } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import { IRange } from 'vs/editor/common/core/range'; -import { IChatProgressRenderableResponseContent, IChatProgressResponseContent, canMergeMarkdownStrings } from 'vs/workbench/contrib/chat/common/chatModel'; -import { IChatAgentMarkdownContentWithVulnerability, IChatAgentVulnerabilityDetails, IChatContentInlineReference, IChatMarkdownContent, IChatTask } from 'vs/workbench/contrib/chat/common/chatService'; +import { IChatProgressRenderableResponseContent, IChatProgressResponseContent, appendMarkdownString, canMergeMarkdownStrings } from 'vs/workbench/contrib/chat/common/chatModel'; +import { IChatAgentVulnerabilityDetails, IChatMarkdownContent } from 'vs/workbench/contrib/chat/common/chatService'; export const contentRefUrl = 'http://_vscodecontentref_'; // must be lowercase for URI export function annotateSpecialMarkdownContent(response: ReadonlyArray): ReadonlyArray { - const result: Exclude[] = []; + const result: IChatProgressRenderableResponseContent[] = []; for (const item of response) { const previousItem = result[result.length - 1]; if (item.kind === 'inlineReference') { @@ -20,18 +20,21 @@ export function annotateSpecialMarkdownContent(response: ReadonlyArray${item.content.value}`; if (previousItem?.kind === 'markdownContent') { // Since this is inside a codeblock, it needs to be merged into the previous markdown content. - result[result.length - 1] = { content: new MarkdownString(previousItem.content.value + markdownText, { isTrusted: previousItem.content.isTrusted }), kind: 'markdownContent' }; + const merged = appendMarkdownString(previousItem.content, new MarkdownString(markdownText)); + result[result.length - 1] = { content: merged, kind: 'markdownContent' }; } else { result.push({ content: new MarkdownString(markdownText), kind: 'markdownContent' }); } diff --git a/src/vs/workbench/contrib/chat/common/chatModel.ts b/src/vs/workbench/contrib/chat/common/chatModel.ts index a28dd0b464080..500af3ab71569 100644 --- a/src/vs/workbench/contrib/chat/common/chatModel.ts +++ b/src/vs/workbench/contrib/chat/common/chatModel.ts @@ -185,13 +185,7 @@ export class Response implements IResponse { // The last part can't be merged with- not markdown, or markdown with different permissions this._responseParts.push(progress); } else { - lastResponsePart.content = { - value: lastResponsePart.content.value + progress.content.value, - isTrusted: lastResponsePart.content.isTrusted, - supportThemeIcons: lastResponsePart.content.supportThemeIcons, - supportHtml: lastResponsePart.content.supportHtml, - baseUri: lastResponsePart.content.baseUri - } satisfies IMarkdownString; + lastResponsePart.content = appendMarkdownString(lastResponsePart.content, progress.content); } this._updateRepr(quiet); } else if (progress.kind === 'textEdit') { @@ -1018,3 +1012,14 @@ export function canMergeMarkdownStrings(md1: IMarkdownString, md2: IMarkdownStri md1.supportHtml === md2.supportHtml && md1.supportThemeIcons === md2.supportThemeIcons; } + +export function appendMarkdownString(md1: IMarkdownString, md2: IMarkdownString | string): IMarkdownString { + const appendedValue = typeof md2 === 'string' ? md2 : md2.value; + return { + value: md1.value + appendedValue, + isTrusted: md1.isTrusted, + supportThemeIcons: md1.supportThemeIcons, + supportHtml: md1.supportHtml, + baseUri: md1.baseUri + }; +} diff --git a/src/vs/workbench/contrib/chat/test/common/__snapshots__/Annotations_extractVulnerabilitiesFromText_multiline.0.snap b/src/vs/workbench/contrib/chat/test/common/__snapshots__/Annotations_extractVulnerabilitiesFromText_multiline.0.snap index 11c9c2ef292ce..730cb160f969e 100644 --- a/src/vs/workbench/contrib/chat/test/common/__snapshots__/Annotations_extractVulnerabilitiesFromText_multiline.0.snap +++ b/src/vs/workbench/contrib/chat/test/common/__snapshots__/Annotations_extractVulnerabilitiesFromText_multiline.0.snap @@ -4,7 +4,8 @@ value: "some code\nover\nmultiple lines content with vuln\nand\nnewlinesmore code\nwith newline", isTrusted: false, supportThemeIcons: false, - supportHtml: false + supportHtml: false, + baseUri: undefined }, kind: "markdownContent" } diff --git a/src/vs/workbench/contrib/chat/test/common/__snapshots__/Annotations_extractVulnerabilitiesFromText_multiple_vulns.0.snap b/src/vs/workbench/contrib/chat/test/common/__snapshots__/Annotations_extractVulnerabilitiesFromText_multiple_vulns.0.snap index bc1d5cda51e99..714c3f06ed65d 100644 --- a/src/vs/workbench/contrib/chat/test/common/__snapshots__/Annotations_extractVulnerabilitiesFromText_multiple_vulns.0.snap +++ b/src/vs/workbench/contrib/chat/test/common/__snapshots__/Annotations_extractVulnerabilitiesFromText_multiple_vulns.0.snap @@ -4,7 +4,8 @@ value: "some code\nover\nmultiple lines content with vuln\nand\nnewlinesmore code\nwith newlinecontent with vuln\nand\nnewlines", isTrusted: false, supportThemeIcons: false, - supportHtml: false + supportHtml: false, + baseUri: undefined }, kind: "markdownContent" } diff --git a/src/vs/workbench/contrib/chat/test/common/__snapshots__/Annotations_extractVulnerabilitiesFromText_single_line.0.snap b/src/vs/workbench/contrib/chat/test/common/__snapshots__/Annotations_extractVulnerabilitiesFromText_single_line.0.snap index 229ab7c6ac4fe..f68fd93b8bd0b 100644 --- a/src/vs/workbench/contrib/chat/test/common/__snapshots__/Annotations_extractVulnerabilitiesFromText_single_line.0.snap +++ b/src/vs/workbench/contrib/chat/test/common/__snapshots__/Annotations_extractVulnerabilitiesFromText_single_line.0.snap @@ -4,7 +4,8 @@ value: "some code content with vuln after", isTrusted: false, supportThemeIcons: false, - supportHtml: false + supportHtml: false, + baseUri: undefined }, kind: "markdownContent" }