Skip to content

Commit e034829

Browse files
author
Loïc Mangeonjean
committed
feat: add shouldAttemptTaskReconnection param to lifecycle service override
1 parent 6e493ac commit e034829

2 files changed

Lines changed: 92 additions & 0 deletions

File tree

src/service-override/lifecycle.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export interface LifecycleServiceParams {
1616
* Allows to force the startup kind
1717
*/
1818
resolveStartupKind?: StartupKindResolver
19+
shouldAttemptTaskReconnection?: (startupKind: StartupKind) => boolean | undefined
1920
}
2021

2122
const DEFAULT_RESOLVE_STARTUP_KIND: StartupKindResolver = (resolveDefault) => resolveDefault()
@@ -36,6 +37,13 @@ export default function getServiceOverride(
3637
super.doResolveStartupKind()
3738
)
3839
}
40+
41+
override get shouldAttemptTaskReconnection(): boolean {
42+
return (
43+
params.shouldAttemptTaskReconnection?.(this.startupKind) ??
44+
super.shouldAttemptTaskReconnection
45+
)
46+
}
3947
}
4048

4149
return {
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2+
From: =?UTF-8?q?Lo=C3=AFc=20Mangeonjean?= <loic@coderpad.io>
3+
Date: Thu, 9 Oct 2025 10:09:30 +0200
4+
Subject: [PATCH] refactor: extract shouldAttemptTaskReconnection flag
5+
6+
---
7+
src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts | 4 ++--
8+
src/vs/workbench/contrib/terminal/browser/terminalService.ts | 4 ++--
9+
src/vs/workbench/services/lifecycle/common/lifecycle.ts | 2 ++
10+
.../workbench/services/lifecycle/common/lifecycleService.ts | 4 ++++
11+
4 files changed, 10 insertions(+), 4 deletions(-)
12+
13+
diff --git a/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts b/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts
14+
index 782478964be..3d0884293ce 100644
15+
--- a/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts
16+
+++ b/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts
17+
@@ -78,7 +78,7 @@ import { IViewDescriptorService } from '../../../common/views.js';
18+
import { IViewsService } from '../../../services/views/common/viewsService.js';
19+
import { configureTaskIcon, isWorkspaceFolder, ITaskQuickPickEntry, QUICKOPEN_DETAIL_CONFIG, QUICKOPEN_SKIP_CONFIG, TaskQuickPick } from './taskQuickPick.js';
20+
import { IWorkbenchEnvironmentService } from '../../../services/environment/common/environmentService.js';
21+
-import { ILifecycleService, ShutdownReason, StartupKind } from '../../../services/lifecycle/common/lifecycle.js';
22+
+import { ILifecycleService, ShutdownReason } from '../../../services/lifecycle/common/lifecycle.js';
23+
import { IPaneCompositePartService } from '../../../services/panecomposite/browser/panecomposite.js';
24+
import { IPathService } from '../../../services/path/common/pathService.js';
25+
import { IPreferencesService } from '../../../services/preferences/common/preferences.js';
26+
@@ -438,7 +438,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer
27+
}
28+
29+
private _attemptTaskReconnection(): void {
30+
- if (this._lifecycleService.startupKind !== StartupKind.ReloadedWindow) {
31+
+ if (!this._lifecycleService.shouldAttemptTaskReconnection) {
32+
this._log(nls.localize('TaskService.skippingReconnection', 'Startup kind not window reload, setting connected and removing persistent tasks'), true);
33+
this._tasksReconnected = true;
34+
this._storageService.remove(AbstractTaskService.PersistentTasks_Key, StorageScope.WORKSPACE);
35+
diff --git a/src/vs/workbench/contrib/terminal/browser/terminalService.ts b/src/vs/workbench/contrib/terminal/browser/terminalService.ts
36+
index f927f4a6830..ad4652f4725 100644
37+
--- a/src/vs/workbench/contrib/terminal/browser/terminalService.ts
38+
+++ b/src/vs/workbench/contrib/terminal/browser/terminalService.ts
39+
@@ -45,7 +45,7 @@ import { IEditorGroupsService } from '../../../services/editor/common/editorGrou
40+
import { ACTIVE_GROUP, ACTIVE_GROUP_TYPE, AUX_WINDOW_GROUP, AUX_WINDOW_GROUP_TYPE, IEditorService, SIDE_GROUP, SIDE_GROUP_TYPE } from '../../../services/editor/common/editorService.js';
41+
import { IWorkbenchEnvironmentService } from '../../../services/environment/common/environmentService.js';
42+
import { IExtensionService } from '../../../services/extensions/common/extensions.js';
43+
-import { ILifecycleService, ShutdownReason, StartupKind, WillShutdownEvent } from '../../../services/lifecycle/common/lifecycle.js';
44+
+import { ILifecycleService, ShutdownReason, WillShutdownEvent } from '../../../services/lifecycle/common/lifecycle.js';
45+
import { IRemoteAgentService } from '../../../services/remote/common/remoteAgentService.js';
46+
import { XtermTerminal } from './xterm/xtermTerminal.js';
47+
import { TerminalInstance } from './terminalInstance.js';
48+
@@ -525,7 +525,7 @@ export class TerminalService extends Disposable implements ITerminalService {
49+
let lastInstance: Promise<ITerminalInstance> | undefined;
50+
for (const terminalLayout of terminalLayouts) {
51+
const attachPersistentProcess = terminalLayout.terminal!;
52+
- if (this._lifecycleService.startupKind !== StartupKind.ReloadedWindow && attachPersistentProcess.type === 'Task') {
53+
+ if (!this._lifecycleService.shouldAttemptTaskReconnection && attachPersistentProcess.type === 'Task') {
54+
continue;
55+
}
56+
mark(`code/terminal/willRecreateTerminal/${attachPersistentProcess.id}-${attachPersistentProcess.pid}`);
57+
diff --git a/src/vs/workbench/services/lifecycle/common/lifecycle.ts b/src/vs/workbench/services/lifecycle/common/lifecycle.ts
58+
index de7ce214df8..bb586caef11 100644
59+
--- a/src/vs/workbench/services/lifecycle/common/lifecycle.ts
60+
+++ b/src/vs/workbench/services/lifecycle/common/lifecycle.ts
61+
@@ -238,6 +238,8 @@ export interface ILifecycleService {
62+
*/
63+
readonly startupKind: StartupKind;
64+
65+
+ readonly shouldAttemptTaskReconnection: boolean;
66+
+
67+
/**
68+
* A flag indicating in what phase of the lifecycle we currently are.
69+
*/
70+
diff --git a/src/vs/workbench/services/lifecycle/common/lifecycleService.ts b/src/vs/workbench/services/lifecycle/common/lifecycleService.ts
71+
index 684345132a0..91d7e737996 100644
72+
--- a/src/vs/workbench/services/lifecycle/common/lifecycleService.ts
73+
+++ b/src/vs/workbench/services/lifecycle/common/lifecycleService.ts
74+
@@ -35,6 +35,10 @@ export abstract class AbstractLifecycleService extends Disposable implements ILi
75+
private _startupKind: StartupKind;
76+
get startupKind(): StartupKind { return this._startupKind; }
77+
78+
+ get shouldAttemptTaskReconnection(): boolean {
79+
+ return this.startupKind === StartupKind.ReloadedWindow;
80+
+ }
81+
+
82+
private _phase = LifecyclePhase.Starting;
83+
get phase(): LifecyclePhase { return this._phase; }
84+

0 commit comments

Comments
 (0)