diff --git a/src/vs/workbench/contrib/terminal/browser/xterm/decorationAddon.ts b/src/vs/workbench/contrib/terminal/browser/xterm/decorationAddon.ts index 6320465258e..c0d71ee566a 100644 --- a/src/vs/workbench/contrib/terminal/browser/xterm/decorationAddon.ts +++ b/src/vs/workbench/contrib/terminal/browser/xterm/decorationAddon.ts @@ -28,12 +28,14 @@ import { ILifecycleService } from '../../../../services/lifecycle/common/lifecyc import { IHoverService } from '../../../../../platform/hover/browser/hover.js'; import { MarkdownString } from '../../../../../base/common/htmlContent.js'; import { IChatContextPickService } from '../../../chat/browser/chatContextPickService.js'; -import { IChatWidgetService } from '../../../chat/browser/chat.js'; +import { IChatWidgetService, showChatView } from '../../../chat/browser/chat.js'; import { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js'; import { TerminalContext } from '../../../chat/browser/actions/chatContext.js'; import { getTerminalUri, parseTerminalUri } from '../terminalUri.js'; import { URI } from '../../../../../base/common/uri.js'; import { ChatAgentLocation } from '../../../chat/common/constants.js'; +import { IViewsService } from '../../../../services/views/common/viewsService.js'; +import { IWorkbenchLayoutService } from '../../../../services/layout/browser/layoutService.js'; interface IDisposableDecoration { decoration: IDecoration; disposables: IDisposable[]; exitCode?: number; markProperties?: IMarkProperties } @@ -67,7 +69,9 @@ export class DecorationAddon extends Disposable implements ITerminalAddon, IDeco @IHoverService private readonly _hoverService: IHoverService, @IChatContextPickService private readonly _contextPickService: IChatContextPickService, @IChatWidgetService private readonly _chatWidgetService: IChatWidgetService, - @IInstantiationService private readonly _instantiationService: IInstantiationService + @IInstantiationService private readonly _instantiationService: IInstantiationService, + @IViewsService private readonly _viewsService: IViewsService, + @IWorkbenchLayoutService private readonly _layoutService: IWorkbenchLayoutService ) { super(); this._register(toDisposable(() => this._dispose())); @@ -527,14 +531,24 @@ export class DecorationAddon extends Disposable implements ITerminalAddon, IDeco return { class: undefined, tooltip: labelAttachToChat, id: 'terminal.attachToChat', label: labelAttachToChat, enabled: true, run: async () => { - const widget = this._chatWidgetService.lastFocusedWidget ?? this._chatWidgetService.getWidgetsByLocations(ChatAgentLocation.Chat)?.find(w => w.attachmentCapabilities.supportsTerminalAttachments); + let widget = this._chatWidgetService.lastFocusedWidget ?? this._chatWidgetService.getWidgetsByLocations(ChatAgentLocation.Chat)?.find(w => w.attachmentCapabilities.supportsTerminalAttachments); + + // If no widget found (e.g., after window reload when chat hasn't been focused), open chat view + if (!widget) { + widget = await showChatView(this._viewsService, this._layoutService); + } + + if (!widget) { + return; + } + let terminalContext: TerminalContext | undefined; if (this._resource) { const parsedUri = parseTerminalUri(this._resource); terminalContext = this._instantiationService.createInstance(TerminalContext, getTerminalUri(parsedUri.workspaceId, parsedUri.instanceId!, undefined, command.id)); } - if (terminalContext && widget && widget.attachmentCapabilities.supportsTerminalAttachments) { + if (terminalContext && widget.attachmentCapabilities.supportsTerminalAttachments) { try { const attachment = await terminalContext.asAttachment(widget); if (attachment) {