Fix attach to chat not working after window reload (#275142)

This commit is contained in:
Copilot
2025-11-04 23:48:22 +00:00
committed by GitHub
parent 154d54dfbd
commit f8a5f597b9
@@ -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) {