Path: blob/main/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugMessageContentRenderer.ts
13406 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import * as DOM from '../../../../../base/browser/dom.js';6import { DisposableStore } from '../../../../../base/common/lifecycle.js';7import { localize } from '../../../../../nls.js';8import { IClipboardService } from '../../../../../platform/clipboard/common/clipboardService.js';9import { ILanguageService } from '../../../../../editor/common/languages/language.js';10import { IChatDebugUserMessageEvent, IChatDebugAgentResponseEvent, IChatDebugEventMessageContent } from '../../common/chatDebugService.js';11import { renderSection, tokenizeContent } from './chatDebugToolCallContentRenderer.js';1213const $ = DOM.$;1415/**16* Render a user message event with collapsible prompt sections.17* JSON content in sections is syntax-highlighted.18*/19export async function renderUserMessageContent(event: IChatDebugUserMessageEvent, languageService: ILanguageService, clipboardService?: IClipboardService, scrollable?: { scanDomNode(): void }): Promise<{ element: HTMLElement; disposables: DisposableStore }> {20const disposables = new DisposableStore();21const container = $('div.chat-debug-message-content');22container.tabIndex = 0;2324DOM.append(container, $('div.chat-debug-message-content-title', undefined, localize('chatDebug.userMessage', "User Message")));25DOM.append(container, $('div.chat-debug-message-content-summary', undefined, event.message));2627if (event.sections.length > 0) {28const sectionsContainer = DOM.append(container, $('div.chat-debug-message-sections'));29DOM.append(sectionsContainer, $('div.chat-debug-message-sections-label', undefined,30localize('chatDebug.promptSections', "Prompt Sections ({0})", event.sections.length)));3132for (const section of event.sections) {33const { plainText, tokenizedHtml } = await tokenizeContent(section.content, languageService);34renderSection(sectionsContainer, section.name, plainText, tokenizedHtml, disposables, false, clipboardService, scrollable);35}36}3738return { element: container, disposables };39}4041/**42* Render an agent response event with collapsible response sections.43* JSON content in sections is syntax-highlighted.44*/45export async function renderAgentResponseContent(event: IChatDebugAgentResponseEvent, languageService: ILanguageService, clipboardService?: IClipboardService, scrollable?: { scanDomNode(): void }): Promise<{ element: HTMLElement; disposables: DisposableStore }> {46const disposables = new DisposableStore();47const container = $('div.chat-debug-message-content');48container.tabIndex = 0;4950DOM.append(container, $('div.chat-debug-message-content-title', undefined, localize('chatDebug.agentResponse', "Agent Response")));51DOM.append(container, $('div.chat-debug-message-content-summary', undefined, event.message));5253if (event.sections.length > 0) {54const sectionsContainer = DOM.append(container, $('div.chat-debug-message-sections'));55DOM.append(sectionsContainer, $('div.chat-debug-message-sections-label', undefined,56localize('chatDebug.responseSections', "Response Sections ({0})", event.sections.length)));5758for (const section of event.sections) {59const { plainText, tokenizedHtml } = await tokenizeContent(section.content, languageService);60renderSection(sectionsContainer, section.name, plainText, tokenizedHtml, disposables, false, clipboardService, scrollable);61}62}6364return { element: container, disposables };65}6667/**68* Convert a user message or agent response event to plain text for clipboard / editor output.69*/70export function messageEventToPlainText(event: IChatDebugUserMessageEvent | IChatDebugAgentResponseEvent): string {71const lines: string[] = [];72const label = event.kind === 'userMessage' ? localize('chatDebug.userMessage', "User Message") : localize('chatDebug.agentResponse', "Agent Response");73lines.push(`${label}: ${event.message}`);74lines.push('');7576for (const section of event.sections) {77lines.push(`--- ${section.name} ---`);78lines.push(section.content);79lines.push('');80}8182return lines.join('\n');83}8485/**86* Render a resolved message content (from resolveChatDebugLogEvent) with collapsible sections.87* JSON content in sections is syntax-highlighted.88*/89export async function renderResolvedMessageContent(content: IChatDebugEventMessageContent, languageService: ILanguageService, clipboardService?: IClipboardService, scrollable?: { scanDomNode(): void }): Promise<{ element: HTMLElement; disposables: DisposableStore }> {90const disposables = new DisposableStore();91const container = $('div.chat-debug-message-content');92container.tabIndex = 0;9394const title = content.type === 'user'95? localize('chatDebug.userMessage', "User Message")96: localize('chatDebug.agentResponse', "Agent Response");97DOM.append(container, $('div.chat-debug-message-content-title', undefined, title));98DOM.append(container, $('div.chat-debug-message-content-summary', undefined, content.message));99100if (content.sections.length > 0) {101const sectionsContainer = DOM.append(container, $('div.chat-debug-message-sections'));102const label = content.type === 'user'103? localize('chatDebug.promptSections', "Prompt Sections ({0})", content.sections.length)104: localize('chatDebug.responseSections', "Response Sections ({0})", content.sections.length);105DOM.append(sectionsContainer, $('div.chat-debug-message-sections-label', undefined, label));106107for (const section of content.sections) {108const { plainText, tokenizedHtml } = await tokenizeContent(section.content, languageService);109renderSection(sectionsContainer, section.name, plainText, tokenizedHtml, disposables, false, clipboardService, scrollable);110}111}112113return { element: container, disposables };114}115116/**117* Convert a resolved message content to plain text.118*/119export function resolvedMessageToPlainText(content: IChatDebugEventMessageContent): string {120const lines: string[] = [];121const label = content.type === 'user'122? localize('chatDebug.userMessage', "User Message")123: localize('chatDebug.agentResponse', "Agent Response");124lines.push(`${label}: ${content.message}`);125lines.push('');126127for (const section of content.sections) {128lines.push(`--- ${section.name} ---`);129lines.push(section.content);130lines.push('');131}132133return lines.join('\n');134}135136137