Path: blob/main/src/vs/platform/agentHost/node/copilot/copilotSessionWrapper.ts
13399 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { CopilotSession, SessionEventPayload, SessionEventType } from '@github/copilot-sdk';6import { Emitter, Event } from '../../../../base/common/event.js';7import { Disposable, toDisposable } from '../../../../base/common/lifecycle.js';89/**10* Thin wrapper around {@link CopilotSession} that exposes each SDK event as a11* proper VS Code `Event<T>`. All subscriptions and the underlying SDK session12* are cleaned up on dispose.13*/14export class CopilotSessionWrapper extends Disposable {1516constructor(readonly session: CopilotSession) {17super();18this._register(toDisposable(() => {19session.destroy().catch(() => { /* best-effort */ });20}));21}2223get sessionId(): string { return this.session.sessionId; }2425private _onMessageDelta: Event<SessionEventPayload<'assistant.message_delta'>> | undefined;26get onMessageDelta(): Event<SessionEventPayload<'assistant.message_delta'>> {27return this._onMessageDelta ??= this._sdkEvent('assistant.message_delta');28}2930private _onMessage: Event<SessionEventPayload<'assistant.message'>> | undefined;31get onMessage(): Event<SessionEventPayload<'assistant.message'>> {32return this._onMessage ??= this._sdkEvent('assistant.message');33}3435private _onToolStart: Event<SessionEventPayload<'tool.execution_start'>> | undefined;36get onToolStart(): Event<SessionEventPayload<'tool.execution_start'>> {37return this._onToolStart ??= this._sdkEvent('tool.execution_start');38}3940private _onToolComplete: Event<SessionEventPayload<'tool.execution_complete'>> | undefined;41get onToolComplete(): Event<SessionEventPayload<'tool.execution_complete'>> {42return this._onToolComplete ??= this._sdkEvent('tool.execution_complete');43}4445private _onIdle: Event<SessionEventPayload<'session.idle'>> | undefined;46get onIdle(): Event<SessionEventPayload<'session.idle'>> {47return this._onIdle ??= this._sdkEvent('session.idle');48}4950private _onSessionStart: Event<SessionEventPayload<'session.start'>> | undefined;51get onSessionStart(): Event<SessionEventPayload<'session.start'>> {52return this._onSessionStart ??= this._sdkEvent('session.start');53}5455private _onSessionResume: Event<SessionEventPayload<'session.resume'>> | undefined;56get onSessionResume(): Event<SessionEventPayload<'session.resume'>> {57return this._onSessionResume ??= this._sdkEvent('session.resume');58}5960private _onSessionError: Event<SessionEventPayload<'session.error'>> | undefined;61get onSessionError(): Event<SessionEventPayload<'session.error'>> {62return this._onSessionError ??= this._sdkEvent('session.error');63}6465private _onSessionInfo: Event<SessionEventPayload<'session.info'>> | undefined;66get onSessionInfo(): Event<SessionEventPayload<'session.info'>> {67return this._onSessionInfo ??= this._sdkEvent('session.info');68}6970private _onSessionModelChange: Event<SessionEventPayload<'session.model_change'>> | undefined;71get onSessionModelChange(): Event<SessionEventPayload<'session.model_change'>> {72return this._onSessionModelChange ??= this._sdkEvent('session.model_change');73}7475private _onSessionHandoff: Event<SessionEventPayload<'session.handoff'>> | undefined;76get onSessionHandoff(): Event<SessionEventPayload<'session.handoff'>> {77return this._onSessionHandoff ??= this._sdkEvent('session.handoff');78}7980private _onSessionTruncation: Event<SessionEventPayload<'session.truncation'>> | undefined;81get onSessionTruncation(): Event<SessionEventPayload<'session.truncation'>> {82return this._onSessionTruncation ??= this._sdkEvent('session.truncation');83}8485private _onSessionSnapshotRewind: Event<SessionEventPayload<'session.snapshot_rewind'>> | undefined;86get onSessionSnapshotRewind(): Event<SessionEventPayload<'session.snapshot_rewind'>> {87return this._onSessionSnapshotRewind ??= this._sdkEvent('session.snapshot_rewind');88}8990private _onSessionShutdown: Event<SessionEventPayload<'session.shutdown'>> | undefined;91get onSessionShutdown(): Event<SessionEventPayload<'session.shutdown'>> {92return this._onSessionShutdown ??= this._sdkEvent('session.shutdown');93}9495private _onSessionUsageInfo: Event<SessionEventPayload<'session.usage_info'>> | undefined;96get onSessionUsageInfo(): Event<SessionEventPayload<'session.usage_info'>> {97return this._onSessionUsageInfo ??= this._sdkEvent('session.usage_info');98}99100private _onSessionCompactionStart: Event<SessionEventPayload<'session.compaction_start'>> | undefined;101get onSessionCompactionStart(): Event<SessionEventPayload<'session.compaction_start'>> {102return this._onSessionCompactionStart ??= this._sdkEvent('session.compaction_start');103}104105private _onSessionCompactionComplete: Event<SessionEventPayload<'session.compaction_complete'>> | undefined;106get onSessionCompactionComplete(): Event<SessionEventPayload<'session.compaction_complete'>> {107return this._onSessionCompactionComplete ??= this._sdkEvent('session.compaction_complete');108}109110private _onUserMessage: Event<SessionEventPayload<'user.message'>> | undefined;111get onUserMessage(): Event<SessionEventPayload<'user.message'>> {112return this._onUserMessage ??= this._sdkEvent('user.message');113}114115private _onPendingMessagesModified: Event<SessionEventPayload<'pending_messages.modified'>> | undefined;116get onPendingMessagesModified(): Event<SessionEventPayload<'pending_messages.modified'>> {117return this._onPendingMessagesModified ??= this._sdkEvent('pending_messages.modified');118}119120private _onTurnStart: Event<SessionEventPayload<'assistant.turn_start'>> | undefined;121get onTurnStart(): Event<SessionEventPayload<'assistant.turn_start'>> {122return this._onTurnStart ??= this._sdkEvent('assistant.turn_start');123}124125private _onIntent: Event<SessionEventPayload<'assistant.intent'>> | undefined;126get onIntent(): Event<SessionEventPayload<'assistant.intent'>> {127return this._onIntent ??= this._sdkEvent('assistant.intent');128}129130private _onReasoning: Event<SessionEventPayload<'assistant.reasoning'>> | undefined;131get onReasoning(): Event<SessionEventPayload<'assistant.reasoning'>> {132return this._onReasoning ??= this._sdkEvent('assistant.reasoning');133}134135private _onReasoningDelta: Event<SessionEventPayload<'assistant.reasoning_delta'>> | undefined;136get onReasoningDelta(): Event<SessionEventPayload<'assistant.reasoning_delta'>> {137return this._onReasoningDelta ??= this._sdkEvent('assistant.reasoning_delta');138}139140private _onTurnEnd: Event<SessionEventPayload<'assistant.turn_end'>> | undefined;141get onTurnEnd(): Event<SessionEventPayload<'assistant.turn_end'>> {142return this._onTurnEnd ??= this._sdkEvent('assistant.turn_end');143}144145private _onUsage: Event<SessionEventPayload<'assistant.usage'>> | undefined;146get onUsage(): Event<SessionEventPayload<'assistant.usage'>> {147return this._onUsage ??= this._sdkEvent('assistant.usage');148}149150private _onAbort: Event<SessionEventPayload<'abort'>> | undefined;151get onAbort(): Event<SessionEventPayload<'abort'>> {152return this._onAbort ??= this._sdkEvent('abort');153}154155private _onToolUserRequested: Event<SessionEventPayload<'tool.user_requested'>> | undefined;156get onToolUserRequested(): Event<SessionEventPayload<'tool.user_requested'>> {157return this._onToolUserRequested ??= this._sdkEvent('tool.user_requested');158}159160private _onToolPartialResult: Event<SessionEventPayload<'tool.execution_partial_result'>> | undefined;161get onToolPartialResult(): Event<SessionEventPayload<'tool.execution_partial_result'>> {162return this._onToolPartialResult ??= this._sdkEvent('tool.execution_partial_result');163}164165private _onToolProgress: Event<SessionEventPayload<'tool.execution_progress'>> | undefined;166get onToolProgress(): Event<SessionEventPayload<'tool.execution_progress'>> {167return this._onToolProgress ??= this._sdkEvent('tool.execution_progress');168}169170private _onSkillInvoked: Event<SessionEventPayload<'skill.invoked'>> | undefined;171get onSkillInvoked(): Event<SessionEventPayload<'skill.invoked'>> {172return this._onSkillInvoked ??= this._sdkEvent('skill.invoked');173}174175private _onSubagentStarted: Event<SessionEventPayload<'subagent.started'>> | undefined;176get onSubagentStarted(): Event<SessionEventPayload<'subagent.started'>> {177return this._onSubagentStarted ??= this._sdkEvent('subagent.started');178}179180private _onSubagentCompleted: Event<SessionEventPayload<'subagent.completed'>> | undefined;181get onSubagentCompleted(): Event<SessionEventPayload<'subagent.completed'>> {182return this._onSubagentCompleted ??= this._sdkEvent('subagent.completed');183}184185private _onSubagentFailed: Event<SessionEventPayload<'subagent.failed'>> | undefined;186get onSubagentFailed(): Event<SessionEventPayload<'subagent.failed'>> {187return this._onSubagentFailed ??= this._sdkEvent('subagent.failed');188}189190private _onSubagentSelected: Event<SessionEventPayload<'subagent.selected'>> | undefined;191get onSubagentSelected(): Event<SessionEventPayload<'subagent.selected'>> {192return this._onSubagentSelected ??= this._sdkEvent('subagent.selected');193}194195private _onHookStart: Event<SessionEventPayload<'hook.start'>> | undefined;196get onHookStart(): Event<SessionEventPayload<'hook.start'>> {197return this._onHookStart ??= this._sdkEvent('hook.start');198}199200private _onHookEnd: Event<SessionEventPayload<'hook.end'>> | undefined;201get onHookEnd(): Event<SessionEventPayload<'hook.end'>> {202return this._onHookEnd ??= this._sdkEvent('hook.end');203}204205private _onSystemMessage: Event<SessionEventPayload<'system.message'>> | undefined;206get onSystemMessage(): Event<SessionEventPayload<'system.message'>> {207return this._onSystemMessage ??= this._sdkEvent('system.message');208}209210private _onSessionModeChanged: Event<SessionEventPayload<'session.mode_changed'>> | undefined;211get onSessionModeChanged(): Event<SessionEventPayload<'session.mode_changed'>> {212return this._onSessionModeChanged ??= this._sdkEvent('session.mode_changed');213}214215private _sdkEvent<K extends SessionEventType>(eventType: K): Event<SessionEventPayload<K>> {216const emitter = this._register(new Emitter<SessionEventPayload<K>>());217const unsubscribe = this.session.on(eventType, (data: SessionEventPayload<K>) => emitter.fire(data));218this._register(toDisposable(unsubscribe));219return emitter.event;220}221}222223224