@@ -15,9 +15,12 @@ import type {
1515 PermissionRequestResult ,
1616 SessionEvent ,
1717 SessionEventHandler ,
18+ SessionEventPayload ,
19+ SessionEventType ,
1820 SessionHooks ,
1921 Tool ,
2022 ToolHandler ,
23+ TypedSessionEventHandler ,
2124 UserInputHandler ,
2225 UserInputRequest ,
2326 UserInputResponse ,
@@ -53,6 +56,8 @@ export type AssistantMessageEvent = Extract<SessionEvent, { type: "assistant.mes
5356 */
5457export class CopilotSession {
5558 private eventHandlers : Set < SessionEventHandler > = new Set ( ) ;
59+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
60+ private typedEventHandlers : Map < SessionEventType , Set < ( event : any ) => void > > = new Map ( ) ;
5661 private toolHandlers : Map < string , ToolHandler > = new Map ( ) ;
5762 private permissionHandler ?: PermissionHandler ;
5863 private userInputHandler ?: UserInputHandler ;
@@ -190,7 +195,30 @@ export class CopilotSession {
190195 * Events include assistant messages, tool executions, errors, and session state changes.
191196 * Multiple handlers can be registered and will all receive events.
192197 *
193- * @param handler - A callback function that receives session events
198+ * @param eventType - The specific event type to listen for (e.g., "assistant.message", "session.idle")
199+ * @param handler - A callback function that receives events of the specified type
200+ * @returns A function that, when called, unsubscribes the handler
201+ *
202+ * @example
203+ * ```typescript
204+ * // Listen for a specific event type
205+ * const unsubscribe = session.on("assistant.message", (event) => {
206+ * console.log("Assistant:", event.data.content);
207+ * });
208+ *
209+ * // Later, to stop receiving events:
210+ * unsubscribe();
211+ * ```
212+ */
213+ on < K extends SessionEventType > (
214+ eventType : K ,
215+ handler : TypedSessionEventHandler < K >
216+ ) : ( ) => void ;
217+
218+ /**
219+ * Subscribes to all events from this session.
220+ *
221+ * @param handler - A callback function that receives all session events
194222 * @returns A function that, when called, unsubscribes the handler
195223 *
196224 * @example
@@ -210,10 +238,32 @@ export class CopilotSession {
210238 * unsubscribe();
211239 * ```
212240 */
213- on ( handler : SessionEventHandler ) : ( ) => void {
214- this . eventHandlers . add ( handler ) ;
241+ on ( handler : SessionEventHandler ) : ( ) => void ;
242+
243+ on < K extends SessionEventType > (
244+ eventTypeOrHandler : K | SessionEventHandler ,
245+ handler ?: TypedSessionEventHandler < K >
246+ ) : ( ) => void {
247+ // Overload 1: on(eventType, handler) - typed event subscription
248+ if ( typeof eventTypeOrHandler === "string" && handler ) {
249+ const eventType = eventTypeOrHandler ;
250+ if ( ! this . typedEventHandlers . has ( eventType ) ) {
251+ this . typedEventHandlers . set ( eventType , new Set ( ) ) ;
252+ }
253+ this . typedEventHandlers . get ( eventType ) ! . add ( handler ) ;
254+ return ( ) => {
255+ const handlers = this . typedEventHandlers . get ( eventType ) ;
256+ if ( handlers ) {
257+ handlers . delete ( handler ) ;
258+ }
259+ } ;
260+ }
261+
262+ // Overload 2: on(handler) - wildcard subscription
263+ const wildcardHandler = eventTypeOrHandler as SessionEventHandler ;
264+ this . eventHandlers . add ( wildcardHandler ) ;
215265 return ( ) => {
216- this . eventHandlers . delete ( handler ) ;
266+ this . eventHandlers . delete ( wildcardHandler ) ;
217267 } ;
218268 }
219269
@@ -224,6 +274,19 @@ export class CopilotSession {
224274 * @internal This method is for internal use by the SDK.
225275 */
226276 _dispatchEvent ( event : SessionEvent ) : void {
277+ // Dispatch to typed handlers for this specific event type
278+ const typedHandlers = this . typedEventHandlers . get ( event . type ) ;
279+ if ( typedHandlers ) {
280+ for ( const handler of typedHandlers ) {
281+ try {
282+ handler ( event as SessionEventPayload < typeof event . type > ) ;
283+ } catch ( _error ) {
284+ // Handler error
285+ }
286+ }
287+ }
288+
289+ // Dispatch to wildcard handlers
227290 for ( const handler of this . eventHandlers ) {
228291 try {
229292 handler ( event ) ;
@@ -441,6 +504,7 @@ export class CopilotSession {
441504 sessionId : this . sessionId ,
442505 } ) ;
443506 this . eventHandlers . clear ( ) ;
507+ this . typedEventHandlers . clear ( ) ;
444508 this . toolHandlers . clear ( ) ;
445509 this . permissionHandler = undefined ;
446510 }
0 commit comments