@@ -55,9 +55,9 @@ import { ChatEditorOptions } from 'vs/workbench/contrib/chat/browser/chatOptions
55
55
import { CodeBlockPart , ICodeBlockData , ICodeBlockPart } from 'vs/workbench/contrib/chat/browser/codeBlockPart' ;
56
56
import { IChatAgentMetadata } from 'vs/workbench/contrib/chat/common/chatAgents' ;
57
57
import { CONTEXT_CHAT_RESPONSE_SUPPORT_ISSUE_REPORTING , CONTEXT_REQUEST , CONTEXT_RESPONSE , CONTEXT_RESPONSE_FILTERED , CONTEXT_RESPONSE_VOTE } from 'vs/workbench/contrib/chat/common/chatContextKeys' ;
58
- import { IPlaceholderMarkdownString } from 'vs/workbench/contrib/chat/common/chatModel' ;
58
+ import { IChatProgressResponseContent } from 'vs/workbench/contrib/chat/common/chatModel' ;
59
59
import { chatAgentLeader , chatSubcommandLeader } from 'vs/workbench/contrib/chat/common/chatParserTypes' ;
60
- import { IChatContentReference , IChatReplyFollowup , IChatResponseProgressFileTreeData , IChatService , InteractiveSessionVoteDirection } from 'vs/workbench/contrib/chat/common/chatService' ;
60
+ import { IChatContentInlineReference , IChatContentReference , IChatReplyFollowup , IChatResponseProgressFileTreeData , IChatService , InteractiveSessionVoteDirection } from 'vs/workbench/contrib/chat/common/chatService' ;
61
61
import { IChatResponseMarkdownRenderData , IChatResponseRenderData , IChatResponseViewModel , IChatWelcomeMessageViewModel , isRequestVM , isResponseVM , isWelcomeVM } from 'vs/workbench/contrib/chat/common/chatViewModel' ;
62
62
import { IWordCountResult , getNWords } from 'vs/workbench/contrib/chat/common/chatWordCounter' ;
63
63
import { createFileIconThemableTreeContainerScope } from 'vs/workbench/contrib/files/browser/views/explorerView' ;
@@ -319,7 +319,7 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer<Ch
319
319
const markdown = 'kind' in element . message ?
320
320
element . message . message :
321
321
convertParsedRequestToMarkdown ( element . message ) ;
322
- this . basicRenderElement ( [ new MarkdownString ( markdown ) ] , element , index , templateData ) ;
322
+ this . basicRenderElement ( [ { content : new MarkdownString ( markdown ) , kind : 'markdownContent' } ] , element , index , templateData ) ;
323
323
} else {
324
324
this . renderWelcomeMessage ( element , templateData ) ;
325
325
}
@@ -400,7 +400,7 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer<Ch
400
400
}
401
401
}
402
402
403
- private basicRenderElement ( value : ReadonlyArray < IMarkdownString | IChatResponseProgressFileTreeData > , element : ChatTreeItem , index : number , templateData : IChatListItemTemplate ) {
403
+ private basicRenderElement ( value : ReadonlyArray < Exclude < IChatProgressResponseContent , IChatContentInlineReference > > , element : ChatTreeItem , index : number , templateData : IChatListItemTemplate ) {
404
404
const fillInIncompleteTokens = isResponseVM ( element ) && ( ! element . isComplete || element . isCanceled || element . errorDetails ?. responseIsFiltered || element . errorDetails ?. responseIsIncomplete ) ;
405
405
406
406
dom . clearNode ( templateData . value ) ;
@@ -414,9 +414,11 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer<Ch
414
414
415
415
let fileTreeIndex = 0 ;
416
416
for ( const data of value ) {
417
- const result = 'value' in data
418
- ? this . renderMarkdown ( data , element , templateData , fillInIncompleteTokens )
419
- : this . renderTreeData ( data , element , templateData , fileTreeIndex ++ ) ;
417
+ const result = data . kind === 'treeData'
418
+ ? this . renderTreeData ( data . treeData , element , templateData , fileTreeIndex ++ )
419
+ : data . kind === 'markdownContent'
420
+ ? this . renderMarkdown ( data . content , element , templateData , fillInIncompleteTokens )
421
+ : this . renderPlaceholder ( new MarkdownString ( data . content ) , templateData ) ;
420
422
templateData . value . appendChild ( result . element ) ;
421
423
templateData . elementDisposables . add ( result ) ;
422
424
}
@@ -519,10 +521,10 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer<Ch
519
521
const renderedPart = renderedParts [ index ] ;
520
522
// Is this part completely new?
521
523
if ( ! renderedPart ) {
522
- if ( isInteractiveProgressTreeData ( part ) ) {
523
- partsToRender [ index ] = part ;
524
+ if ( part . kind === 'treeData' ) {
525
+ partsToRender [ index ] = part . treeData ;
524
526
} else {
525
- const wordCountResult = this . getDataForProgressiveRender ( element , part , { renderedWordCount : 0 , lastRenderTime : 0 } ) ;
527
+ const wordCountResult = this . getDataForProgressiveRender ( element , contentToMarkdown ( part . content ) , { renderedWordCount : 0 , lastRenderTime : 0 } ) ;
526
528
if ( wordCountResult !== undefined ) {
527
529
partsToRender [ index ] = {
528
530
renderedWordCount : wordCountResult . actualWordCount ,
@@ -535,13 +537,13 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer<Ch
535
537
}
536
538
537
539
// Did this part go from being a placeholder string to resolved tree data?
538
- else if ( isInteractiveProgressTreeData ( part ) && ! isInteractiveProgressTreeData ( renderedPart ) ) {
539
- partsToRender [ index ] = part ;
540
+ else if ( part . kind === 'treeData' && ! isInteractiveProgressTreeData ( renderedPart ) ) {
541
+ partsToRender [ index ] = part . treeData ;
540
542
}
541
543
542
544
// Did this part's content change?
543
- else if ( ! isInteractiveProgressTreeData ( part ) && ! isInteractiveProgressTreeData ( renderedPart ) ) {
544
- const wordCountResult = this . getDataForProgressiveRender ( element , part , renderedPart ) ;
545
+ else if ( part . kind !== 'treeData' && ! isInteractiveProgressTreeData ( renderedPart ) ) {
546
+ const wordCountResult = this . getDataForProgressiveRender ( element , contentToMarkdown ( part . content ) , renderedPart ) ;
545
547
// Check if there are any new words to render
546
548
if ( wordCountResult !== undefined && renderedPart . renderedWordCount !== wordCountResult ?. actualWordCount ) {
547
549
partsToRender [ index ] = {
@@ -578,8 +580,7 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer<Ch
578
580
// Avoid doing progressive rendering for multiple markdown parts simultaneously
579
581
else if ( ! hasRenderedOneMarkdownBlock ) {
580
582
const { value } = wordCountResults [ index ] ;
581
- const isPlaceholder = isPlaceholderMarkdown ( renderableResponse [ index ] ) ;
582
- result = isPlaceholder
583
+ result = renderableResponse [ index ] . kind === 'asyncContent'
583
584
? this . renderPlaceholder ( new MarkdownString ( value ) , templateData )
584
585
: this . renderMarkdown ( new MarkdownString ( value ) , element , templateData , true ) ;
585
586
hasRenderedOneMarkdownBlock = true ;
@@ -1278,6 +1279,6 @@ function isInteractiveProgressTreeData(item: IChatResponseProgressFileTreeData |
1278
1279
return 'label' in item ;
1279
1280
}
1280
1281
1281
- function isPlaceholderMarkdown ( item : IPlaceholderMarkdownString | IMarkdownString | IChatResponseProgressFileTreeData ) : item is IPlaceholderMarkdownString {
1282
- return 'isPlaceholder' in item ;
1282
+ function contentToMarkdown ( str : string | IMarkdownString ) : IMarkdownString {
1283
+ return typeof str === 'string' ? { value : str } : str ;
1283
1284
}
0 commit comments