Change:
Ever since I started using the new JS debugger, when running our top level target and then manually closing the code-oss window, the and targets remain: ! Eventually, maybe 1 minute later, the goes away, but the other one stays, I always have to manually disconnect from it. ! cc
This is because is set for the shared process and extension host, which allows them to reconnect when vscode is reloaded. Eventually js-debug in extension host gives up, but the shared process is using the previous Node debugger which doesn't give up. Both these are working as designed, this is kind of a downside of the compound launch configs in that there's no "compound stop".
Yeah, would actually LOVE a compound stop. Could this be a feature of compounds, & Meaning, if something like was set in the compound, all targets would share the same action, and I would see no actions.
We could add a attribute to the compound, however how would that work? Clicking stop on any of the compound sessions would send stop to all sessions? And it would never be rendered as dicsonnect?
Maybe compound launch configs could have a pseudo-root, which has a "stop" action that affects all individual configs? ` The compound config could have an option whether sessions can be stopped individually, or whether stopping one session is treated as stopping the whole set of configuration.
ok makes somewhat sense, the flaw of my proposel is that once compound starts 4 sessions those sessions are not related in any way. So adding a pseudo root might be smart. The pseudo root would not be rendered, and the pseudo root would remember the attribute. Here are code pointers for a PR. We should add the attribute and to the schema . Code pointer for the debug session to add the pseudo root stopAll smartness
I like both options.
This bug has been fixed in to the latest release of ! you can help us out by commenting if things are now working as expected. If things still don't seem right, please ensure you're on version of Insiders (today's or later - you can use in the command pallette to check), and leave a comment letting us know what isn't working as expected. Happy Coding!
Please let's have the bot not do this for ourselves.
BTW, the bot's wording sounds wrong: in to the latest...
Much better, and I this attribute to our compound config. But the behavior partly confuses me and I opened

Discussion:
import { generateUuid } from 'vs/base/common/uuid'; import { DebugStorage } from 'vs/workbench/contrib/debug/common/debugStorage'; import { DebugTelemetry } from 'vs/workbench/contrib/debug/common/debugTelemetry'; <ins> import { DebugCompoundRoot } from 'vs/workbench/contrib/debug/common/debugCompoundRoot'; </ins> export class DebugService implements IDebugService { _serviceBrand: undefined;

return false; } } <ins> if (compound.stopAll) { options = { ...options, compoundRoot: new DebugCompoundRoot() }; } </ins> const values = await Promise.all(compound.configurations.map(configData => { const name = typeof configData === 'string' ? configData : configData.name;

dispose(toDispose); })); } <ins> const compoundRoot = this._options.compoundRoot; if (compoundRoot) { toDispose.push(compoundRoot.onDidSessionStop(() => this.terminate())); } </ins> } getId(): string {

} else { await this.raw.disconnect(restart); } <ins> if (!restart) { this._options.compoundRoot?.sessionStopped(); } </ins> } /**

this.cancelAllRequests(); await this.raw.disconnect(restart); <ins> if (!restart) { this._options.compoundRoot?.sessionStopped(); } </ins> } /**

import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { CancellationToken } from 'vs/base/common/cancellation'; import { DebugConfigurationProviderTriggerKind } from 'vs/workbench/api/common/extHostTypes'; <ins> import { DebugCompoundRoot } from 'vs/workbench/contrib/debug/common/debugCompoundRoot'; </ins> export const VIEWLET_ID = 'workbench.view.debug';

noDebug?: boolean; parentSession?: IDebugSession; repl?: IDebugSessionReplMode; <ins> compoundRoot?: DebugCompoundRoot; </ins> } export interface IDebugSession extends ITreeElement {

export interface ICompound { name: string; <ins> stopAll?: boolean; </ins> preLaunchTask?: string | TaskIdentifier; configurations: (string | { name: string, folder: string })[]; presentation?: IConfigPresentation;

<ins> /*--------------------------------------------------------------------------------------------- *  Copyright (c) Microsoft Corporation. All rights reserved. *  Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { Emitter } from 'vs/base/common/event'; export class DebugCompoundRoot { private stopped = false; private stopEmitter = new Emitter<void>(); onDidSessionStop = this.stopEmitter.event; sessionStopped(): void { if (!this.stopped) { // avoid sending extranous terminate events this.stopped = true; this.stopEmitter.fire(); } } } </ins>

}, description: nls.localize('app.launch.json.compounds.configurations', "Names of configurations that will be started as part of this compound.") }, <ins> stopAll: { type: 'boolean', default: false, description: nls.localize('app.launch.json.compound.stopAll', "Controls whether manually terminating one session will stop all of the compound sessions.") }, </ins> preLaunchTask: { type: 'string', default: '',