clear parent widget after continue on (#279651)

This commit is contained in:
Josh Spicer
2025-11-26 15:15:20 -05:00
committed by GitHub
parent b8917d2337
commit 20520e8863

View File

@@ -40,6 +40,7 @@ import { IChatWidgetService } from '../chat.js';
import { CHAT_SETUP_ACTION_ID } from './chatActions.js'; import { CHAT_SETUP_ACTION_ID } from './chatActions.js';
import { PromptFileVariableKind, toPromptFileVariableEntry } from '../../common/chatVariableEntries.js'; import { PromptFileVariableKind, toPromptFileVariableEntry } from '../../common/chatVariableEntries.js';
import { NEW_CHAT_SESSION_ACTION_ID } from '../chatSessions/common.js'; import { NEW_CHAT_SESSION_ACTION_ID } from '../chatSessions/common.js';
import { isResponseVM } from '../../common/chatViewModel.js';
export const enum ActionLocation { export const enum ActionLocation {
ChatWidget = 'chatWidget', ChatWidget = 'chatWidget',
@@ -278,10 +279,64 @@ class CreateRemoteAgentJobAction {
); );
await chatService.removeRequest(sessionResource, addedRequest.id); await chatService.removeRequest(sessionResource, addedRequest.id);
await chatService.sendRequest(sessionResource, userPrompt, { const requestData = await chatService.sendRequest(sessionResource, userPrompt, {
agentIdSilent: continuationTargetType, agentIdSilent: continuationTargetType,
attachedContext: attachedContext.asArray(), attachedContext: attachedContext.asArray(),
}); });
if (requestData) {
await requestData.responseCompletePromise;
const checkAndClose = () => {
const items = widget.viewModel?.getItems() ?? [];
const lastItem = items[items.length - 1];
if (lastItem && isResponseVM(lastItem) && lastItem.isComplete && !lastItem.model.isPendingConfirmation.get()) {
return true;
}
return false;
};
if (checkAndClose()) {
await widget.clear();
return;
}
// Monitor subsequent responses when pending confirmations block us from closing
await new Promise<void>((resolve, reject) => {
let disposed = false;
let disposable: IDisposable | undefined;
let timeout: ReturnType<typeof setTimeout> | undefined;
const cleanup = () => {
if (!disposed) {
disposed = true;
if (timeout !== undefined) {
clearTimeout(timeout);
}
if (disposable) {
disposable.dispose();
}
}
};
try {
disposable = widget.viewModel!.onDidChange(() => {
if (checkAndClose()) {
cleanup();
resolve();
}
});
timeout = setTimeout(() => {
cleanup();
resolve();
}, 30_000); // 30 second timeout
} catch (e) {
cleanup();
reject(e);
}
});
await widget.clear();
}
} catch (e) { } catch (e) {
console.error('Error creating remote coding agent job', e); console.error('Error creating remote coding agent job', e);
throw e; throw e;