Change:
} } <ins> private async generateChanges(editSession: EditSession, ref: string) { const changes: ({ uri: URI; type: ChangeType; contents: string | undefined })[] = []; const conflictingChanges = []; const workspaceFolders = this.contextService.getWorkspace().folders; for (const folder of editSession.folders) { const cancellationTokenSource = new CancellationTokenSource(); let folderRoot: IWorkspaceFolder | undefined; if (folder.canonicalIdentity) { // Look for an edit session identifier that we can use for (const f of workspaceFolders) { const identity = await this.editSessionIdentityService.getEditSessionIdentifier(f, cancellationTokenSource); this.logService.info(`Matching identity ${identity} against edit session folder identity ${folder.canonicalIdentity}...`); if (equals(identity, folder.canonicalIdentity)) { folderRoot = f; break; } } } else { folderRoot = workspaceFolders.find((f) => f.name === folder.name); } if (!folderRoot) { this.logService.info(`Skipping applying ${folder.workingChanges.length} changes from edit session with ref ${ref} as no matching workspace folder was found.`); return { changes: [], conflictingChanges: [] }; } const localChanges = new Set<string>(); for (const repository of this.scmService.repositories) { if (repository.provider.rootUri !== undefined && this.contextService.getWorkspaceFolder(repository.provider.rootUri)?.name === folder.name ) { const repositoryChanges = this.getChangedResources(repository); repositoryChanges.forEach((change) => localChanges.add(change.toString())); } } for (const change of folder.workingChanges) { const uri = joinPath(folderRoot.uri, change.relativeFilePath); changes.push({ uri, type: change.type, contents: change.contents }); if (await this.willChangeLocalContents(localChanges, uri, change)) { conflictingChanges.push({ uri, type: change.type, contents: change.contents }); } } } return { changes, conflictingChanges }; } private async willChangeLocalContents(localChanges: Set<string>, uriWithIncomingChanges: URI, incomingChange: Change) { if (!localChanges.has(uriWithIncomingChanges.toString())) { return false; } const { contents, type } = incomingChange; switch (type) { case (ChangeType.Addition): { const [originalContents, incomingContents] = await Promise.all([sha1Hex(contents), sha1Hex(encodeBase64((await this.fileService.readFile(uriWithIncomingChanges)).value))]); return originalContents !== incomingContents; } case (ChangeType.Deletion): { return await this.fileService.exists(uriWithIncomingChanges); } default: throw new Error('Unhandled change type.'); } } </ins> async storeEditSession(fromStoreCommand: boolean): Promise<string | undefined> { const folders: Folder[] = []; let hasEdits = false;

Discussion:
Testing Continue from web inside desktop Let the window sit Install update (which restarts the App) you are instantly greeted with a modal dialog (I wasn't even in that window of VS Code) Ideas don't use a modal but the custom modal overlay which is more friendly and doesn't steep focus don't show this when my local changes are no different to those on the server <img width="1391" alt="Screenshot 2022-08-24 at 09 26 13" src="https://user-"
Is the custom modal overlay the same thing as the custom modal dialog, i.e. :+1: I filed for this.