Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/platform/agentHost/node/copilot/copilotSessionWrapper.ts
13399 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { CopilotSession, SessionEventPayload, SessionEventType } from '@github/copilot-sdk';
7
import { Emitter, Event } from '../../../../base/common/event.js';
8
import { Disposable, toDisposable } from '../../../../base/common/lifecycle.js';
9
10
/**
11
* Thin wrapper around {@link CopilotSession} that exposes each SDK event as a
12
* proper VS Code `Event<T>`. All subscriptions and the underlying SDK session
13
* are cleaned up on dispose.
14
*/
15
export class CopilotSessionWrapper extends Disposable {
16
17
constructor(readonly session: CopilotSession) {
18
super();
19
this._register(toDisposable(() => {
20
session.destroy().catch(() => { /* best-effort */ });
21
}));
22
}
23
24
get sessionId(): string { return this.session.sessionId; }
25
26
private _onMessageDelta: Event<SessionEventPayload<'assistant.message_delta'>> | undefined;
27
get onMessageDelta(): Event<SessionEventPayload<'assistant.message_delta'>> {
28
return this._onMessageDelta ??= this._sdkEvent('assistant.message_delta');
29
}
30
31
private _onMessage: Event<SessionEventPayload<'assistant.message'>> | undefined;
32
get onMessage(): Event<SessionEventPayload<'assistant.message'>> {
33
return this._onMessage ??= this._sdkEvent('assistant.message');
34
}
35
36
private _onToolStart: Event<SessionEventPayload<'tool.execution_start'>> | undefined;
37
get onToolStart(): Event<SessionEventPayload<'tool.execution_start'>> {
38
return this._onToolStart ??= this._sdkEvent('tool.execution_start');
39
}
40
41
private _onToolComplete: Event<SessionEventPayload<'tool.execution_complete'>> | undefined;
42
get onToolComplete(): Event<SessionEventPayload<'tool.execution_complete'>> {
43
return this._onToolComplete ??= this._sdkEvent('tool.execution_complete');
44
}
45
46
private _onIdle: Event<SessionEventPayload<'session.idle'>> | undefined;
47
get onIdle(): Event<SessionEventPayload<'session.idle'>> {
48
return this._onIdle ??= this._sdkEvent('session.idle');
49
}
50
51
private _onSessionStart: Event<SessionEventPayload<'session.start'>> | undefined;
52
get onSessionStart(): Event<SessionEventPayload<'session.start'>> {
53
return this._onSessionStart ??= this._sdkEvent('session.start');
54
}
55
56
private _onSessionResume: Event<SessionEventPayload<'session.resume'>> | undefined;
57
get onSessionResume(): Event<SessionEventPayload<'session.resume'>> {
58
return this._onSessionResume ??= this._sdkEvent('session.resume');
59
}
60
61
private _onSessionError: Event<SessionEventPayload<'session.error'>> | undefined;
62
get onSessionError(): Event<SessionEventPayload<'session.error'>> {
63
return this._onSessionError ??= this._sdkEvent('session.error');
64
}
65
66
private _onSessionInfo: Event<SessionEventPayload<'session.info'>> | undefined;
67
get onSessionInfo(): Event<SessionEventPayload<'session.info'>> {
68
return this._onSessionInfo ??= this._sdkEvent('session.info');
69
}
70
71
private _onSessionModelChange: Event<SessionEventPayload<'session.model_change'>> | undefined;
72
get onSessionModelChange(): Event<SessionEventPayload<'session.model_change'>> {
73
return this._onSessionModelChange ??= this._sdkEvent('session.model_change');
74
}
75
76
private _onSessionHandoff: Event<SessionEventPayload<'session.handoff'>> | undefined;
77
get onSessionHandoff(): Event<SessionEventPayload<'session.handoff'>> {
78
return this._onSessionHandoff ??= this._sdkEvent('session.handoff');
79
}
80
81
private _onSessionTruncation: Event<SessionEventPayload<'session.truncation'>> | undefined;
82
get onSessionTruncation(): Event<SessionEventPayload<'session.truncation'>> {
83
return this._onSessionTruncation ??= this._sdkEvent('session.truncation');
84
}
85
86
private _onSessionSnapshotRewind: Event<SessionEventPayload<'session.snapshot_rewind'>> | undefined;
87
get onSessionSnapshotRewind(): Event<SessionEventPayload<'session.snapshot_rewind'>> {
88
return this._onSessionSnapshotRewind ??= this._sdkEvent('session.snapshot_rewind');
89
}
90
91
private _onSessionShutdown: Event<SessionEventPayload<'session.shutdown'>> | undefined;
92
get onSessionShutdown(): Event<SessionEventPayload<'session.shutdown'>> {
93
return this._onSessionShutdown ??= this._sdkEvent('session.shutdown');
94
}
95
96
private _onSessionUsageInfo: Event<SessionEventPayload<'session.usage_info'>> | undefined;
97
get onSessionUsageInfo(): Event<SessionEventPayload<'session.usage_info'>> {
98
return this._onSessionUsageInfo ??= this._sdkEvent('session.usage_info');
99
}
100
101
private _onSessionCompactionStart: Event<SessionEventPayload<'session.compaction_start'>> | undefined;
102
get onSessionCompactionStart(): Event<SessionEventPayload<'session.compaction_start'>> {
103
return this._onSessionCompactionStart ??= this._sdkEvent('session.compaction_start');
104
}
105
106
private _onSessionCompactionComplete: Event<SessionEventPayload<'session.compaction_complete'>> | undefined;
107
get onSessionCompactionComplete(): Event<SessionEventPayload<'session.compaction_complete'>> {
108
return this._onSessionCompactionComplete ??= this._sdkEvent('session.compaction_complete');
109
}
110
111
private _onUserMessage: Event<SessionEventPayload<'user.message'>> | undefined;
112
get onUserMessage(): Event<SessionEventPayload<'user.message'>> {
113
return this._onUserMessage ??= this._sdkEvent('user.message');
114
}
115
116
private _onPendingMessagesModified: Event<SessionEventPayload<'pending_messages.modified'>> | undefined;
117
get onPendingMessagesModified(): Event<SessionEventPayload<'pending_messages.modified'>> {
118
return this._onPendingMessagesModified ??= this._sdkEvent('pending_messages.modified');
119
}
120
121
private _onTurnStart: Event<SessionEventPayload<'assistant.turn_start'>> | undefined;
122
get onTurnStart(): Event<SessionEventPayload<'assistant.turn_start'>> {
123
return this._onTurnStart ??= this._sdkEvent('assistant.turn_start');
124
}
125
126
private _onIntent: Event<SessionEventPayload<'assistant.intent'>> | undefined;
127
get onIntent(): Event<SessionEventPayload<'assistant.intent'>> {
128
return this._onIntent ??= this._sdkEvent('assistant.intent');
129
}
130
131
private _onReasoning: Event<SessionEventPayload<'assistant.reasoning'>> | undefined;
132
get onReasoning(): Event<SessionEventPayload<'assistant.reasoning'>> {
133
return this._onReasoning ??= this._sdkEvent('assistant.reasoning');
134
}
135
136
private _onReasoningDelta: Event<SessionEventPayload<'assistant.reasoning_delta'>> | undefined;
137
get onReasoningDelta(): Event<SessionEventPayload<'assistant.reasoning_delta'>> {
138
return this._onReasoningDelta ??= this._sdkEvent('assistant.reasoning_delta');
139
}
140
141
private _onTurnEnd: Event<SessionEventPayload<'assistant.turn_end'>> | undefined;
142
get onTurnEnd(): Event<SessionEventPayload<'assistant.turn_end'>> {
143
return this._onTurnEnd ??= this._sdkEvent('assistant.turn_end');
144
}
145
146
private _onUsage: Event<SessionEventPayload<'assistant.usage'>> | undefined;
147
get onUsage(): Event<SessionEventPayload<'assistant.usage'>> {
148
return this._onUsage ??= this._sdkEvent('assistant.usage');
149
}
150
151
private _onAbort: Event<SessionEventPayload<'abort'>> | undefined;
152
get onAbort(): Event<SessionEventPayload<'abort'>> {
153
return this._onAbort ??= this._sdkEvent('abort');
154
}
155
156
private _onToolUserRequested: Event<SessionEventPayload<'tool.user_requested'>> | undefined;
157
get onToolUserRequested(): Event<SessionEventPayload<'tool.user_requested'>> {
158
return this._onToolUserRequested ??= this._sdkEvent('tool.user_requested');
159
}
160
161
private _onToolPartialResult: Event<SessionEventPayload<'tool.execution_partial_result'>> | undefined;
162
get onToolPartialResult(): Event<SessionEventPayload<'tool.execution_partial_result'>> {
163
return this._onToolPartialResult ??= this._sdkEvent('tool.execution_partial_result');
164
}
165
166
private _onToolProgress: Event<SessionEventPayload<'tool.execution_progress'>> | undefined;
167
get onToolProgress(): Event<SessionEventPayload<'tool.execution_progress'>> {
168
return this._onToolProgress ??= this._sdkEvent('tool.execution_progress');
169
}
170
171
private _onSkillInvoked: Event<SessionEventPayload<'skill.invoked'>> | undefined;
172
get onSkillInvoked(): Event<SessionEventPayload<'skill.invoked'>> {
173
return this._onSkillInvoked ??= this._sdkEvent('skill.invoked');
174
}
175
176
private _onSubagentStarted: Event<SessionEventPayload<'subagent.started'>> | undefined;
177
get onSubagentStarted(): Event<SessionEventPayload<'subagent.started'>> {
178
return this._onSubagentStarted ??= this._sdkEvent('subagent.started');
179
}
180
181
private _onSubagentCompleted: Event<SessionEventPayload<'subagent.completed'>> | undefined;
182
get onSubagentCompleted(): Event<SessionEventPayload<'subagent.completed'>> {
183
return this._onSubagentCompleted ??= this._sdkEvent('subagent.completed');
184
}
185
186
private _onSubagentFailed: Event<SessionEventPayload<'subagent.failed'>> | undefined;
187
get onSubagentFailed(): Event<SessionEventPayload<'subagent.failed'>> {
188
return this._onSubagentFailed ??= this._sdkEvent('subagent.failed');
189
}
190
191
private _onSubagentSelected: Event<SessionEventPayload<'subagent.selected'>> | undefined;
192
get onSubagentSelected(): Event<SessionEventPayload<'subagent.selected'>> {
193
return this._onSubagentSelected ??= this._sdkEvent('subagent.selected');
194
}
195
196
private _onHookStart: Event<SessionEventPayload<'hook.start'>> | undefined;
197
get onHookStart(): Event<SessionEventPayload<'hook.start'>> {
198
return this._onHookStart ??= this._sdkEvent('hook.start');
199
}
200
201
private _onHookEnd: Event<SessionEventPayload<'hook.end'>> | undefined;
202
get onHookEnd(): Event<SessionEventPayload<'hook.end'>> {
203
return this._onHookEnd ??= this._sdkEvent('hook.end');
204
}
205
206
private _onSystemMessage: Event<SessionEventPayload<'system.message'>> | undefined;
207
get onSystemMessage(): Event<SessionEventPayload<'system.message'>> {
208
return this._onSystemMessage ??= this._sdkEvent('system.message');
209
}
210
211
private _onSessionModeChanged: Event<SessionEventPayload<'session.mode_changed'>> | undefined;
212
get onSessionModeChanged(): Event<SessionEventPayload<'session.mode_changed'>> {
213
return this._onSessionModeChanged ??= this._sdkEvent('session.mode_changed');
214
}
215
216
private _sdkEvent<K extends SessionEventType>(eventType: K): Event<SessionEventPayload<K>> {
217
const emitter = this._register(new Emitter<SessionEventPayload<K>>());
218
const unsubscribe = this.session.on(eventType, (data: SessionEventPayload<K>) => emitter.fire(data));
219
this._register(toDisposable(unsubscribe));
220
return emitter.event;
221
}
222
}
223
224