55
66import { getWindow } from '../../../../base/browser/dom.js' ;
77import { CancellationToken } from '../../../../base/common/cancellation.js' ;
8- import { Disposable , IDisposable } from '../../../../base/common/lifecycle.js' ;
8+ import { Emitter , Event } from '../../../../base/common/event.js' ;
9+ import { Disposable , DisposableStore , IDisposable } from '../../../../base/common/lifecycle.js' ;
10+ import { autorun } from '../../../../base/common/observable.js' ;
911import { URI } from '../../../../base/common/uri.js' ;
1012import { generateUuid } from '../../../../base/common/uuid.js' ;
1113import * as nls from '../../../../nls.js' ;
@@ -29,6 +31,10 @@ interface RegisterOptions {
2931 } ;
3032}
3133
34+ export interface RenderedOutputPart extends IDisposable {
35+ readonly onDidChangeHeight : Event < number > ;
36+ }
37+
3238/**
3339 * Service for rendering chat output items with special MIME types using registered renderers from extensions.
3440 */
@@ -37,7 +43,7 @@ export interface IChatOutputRendererService {
3743
3844 registerRenderer ( mime : string , renderer : IChatOutputItemRenderer , options : RegisterOptions ) : IDisposable ;
3945
40- renderOutputPart ( mime : string , data : Uint8Array , parent : HTMLElement , token : CancellationToken ) : Promise < IDisposable > ;
46+ renderOutputPart ( mime : string , data : Uint8Array , parent : HTMLElement , token : CancellationToken ) : Promise < RenderedOutputPart > ;
4147}
4248
4349/**
@@ -72,7 +78,7 @@ export class ChatOutputRendererService extends Disposable implements IChatOutput
7278 } ;
7379 }
7480
75- async renderOutputPart ( mime : string , data : Uint8Array , parent : HTMLElement , token : CancellationToken ) : Promise < IDisposable > {
81+ async renderOutputPart ( mime : string , data : Uint8Array , parent : HTMLElement , token : CancellationToken ) : Promise < RenderedOutputPart > {
7682 // Activate extensions that contribute to chatOutputRenderer for this mime type
7783 await this . _extensionService . activateByEvent ( `onChatOutputRenderer:${ mime } ` ) ;
7884
@@ -81,7 +87,9 @@ export class ChatOutputRendererService extends Disposable implements IChatOutput
8187 throw new Error ( `No renderer registered for mime type: ${ mime } ` ) ;
8288 }
8389
84- const webview = this . _webviewService . createWebviewElement ( {
90+ const store = new DisposableStore ( ) ;
91+
92+ const webview = store . add ( this . _webviewService . createWebviewElement ( {
8593 title : '' ,
8694 origin : generateUuid ( ) ,
8795 options : {
@@ -91,15 +99,24 @@ export class ChatOutputRendererService extends Disposable implements IChatOutput
9199 } ,
92100 contentOptions : { } ,
93101 extension : rendererData . options . extension ? rendererData . options . extension : undefined ,
94- } ) ;
102+ } ) ) ;
103+
104+ const onDidChangeHeight = store . add ( new Emitter < number > ( ) ) ;
105+ store . add ( autorun ( reader => {
106+ const height = reader . readObservable ( webview . intrinsicContentSize ) ;
107+ if ( height ) {
108+ onDidChangeHeight . fire ( height . height ) ;
109+ parent . style . height = `${ height . height } px` ;
110+ }
111+ } ) ) ;
95112
96113 webview . mountTo ( parent , getWindow ( parent ) ) ;
97-
98114 await rendererData . renderer . renderOutputPart ( mime , data , webview , token ) ;
99115
100116 return {
117+ onDidChangeHeight : onDidChangeHeight . event ,
101118 dispose : ( ) => {
102- webview . dispose ( ) ;
119+ store . dispose ( ) ;
103120 }
104121 } ;
105122 }
0 commit comments