@@ -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+ private typedEventHandlers : Map < SessionEventType , Set < ( event : SessionEvent ) => void > > =
60+ new Map ( ) ;
5661 private toolHandlers : Map < string , ToolHandler > = new Map ( ) ;
5762 private permissionHandler ?: PermissionHandler ;
5863 private userInputHandler ?: UserInputHandler ;
@@ -190,7 +195,27 @@ 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 > ( eventType : K , handler : TypedSessionEventHandler < K > ) : ( ) => void ;
214+
215+ /**
216+ * Subscribes to all events from this session.
217+ *
218+ * @param handler - A callback function that receives all session events
194219 * @returns A function that, when called, unsubscribes the handler
195220 *
196221 * @example
@@ -210,10 +235,34 @@ export class CopilotSession {
210235 * unsubscribe();
211236 * ```
212237 */
213- on ( handler : SessionEventHandler ) : ( ) => void {
214- this . eventHandlers . add ( handler ) ;
238+ on ( handler : SessionEventHandler ) : ( ) => void ;
239+
240+ on < K extends SessionEventType > (
241+ eventTypeOrHandler : K | SessionEventHandler ,
242+ handler ?: TypedSessionEventHandler < K >
243+ ) : ( ) => void {
244+ // Overload 1: on(eventType, handler) - typed event subscription
245+ if ( typeof eventTypeOrHandler === "string" && handler ) {
246+ const eventType = eventTypeOrHandler ;
247+ if ( ! this . typedEventHandlers . has ( eventType ) ) {
248+ this . typedEventHandlers . set ( eventType , new Set ( ) ) ;
249+ }
250+ // Cast is safe: handler receives the correctly typed event at dispatch time
251+ const storedHandler = handler as ( event : SessionEvent ) => void ;
252+ this . typedEventHandlers . get ( eventType ) ! . add ( storedHandler ) ;
253+ return ( ) => {
254+ const handlers = this . typedEventHandlers . get ( eventType ) ;
255+ if ( handlers ) {
256+ handlers . delete ( storedHandler ) ;
257+ }
258+ } ;
259+ }
260+
261+ // Overload 2: on(handler) - wildcard subscription
262+ const wildcardHandler = eventTypeOrHandler as SessionEventHandler ;
263+ this . eventHandlers . add ( wildcardHandler ) ;
215264 return ( ) => {
216- this . eventHandlers . delete ( handler ) ;
265+ this . eventHandlers . delete ( wildcardHandler ) ;
217266 } ;
218267 }
219268
@@ -224,6 +273,19 @@ export class CopilotSession {
224273 * @internal This method is for internal use by the SDK.
225274 */
226275 _dispatchEvent ( event : SessionEvent ) : void {
276+ // Dispatch to typed handlers for this specific event type
277+ const typedHandlers = this . typedEventHandlers . get ( event . type ) ;
278+ if ( typedHandlers ) {
279+ for ( const handler of typedHandlers ) {
280+ try {
281+ handler ( event as SessionEventPayload < typeof event . type > ) ;
282+ } catch ( _error ) {
283+ // Handler error
284+ }
285+ }
286+ }
287+
288+ // Dispatch to wildcard handlers
227289 for ( const handler of this . eventHandlers ) {
228290 try {
229291 handler ( event ) ;
@@ -441,6 +503,7 @@ export class CopilotSession {
441503 sessionId : this . sessionId ,
442504 } ) ;
443505 this . eventHandlers . clear ( ) ;
506+ this . typedEventHandlers . clear ( ) ;
444507 this . toolHandlers . clear ( ) ;
445508 this . permissionHandler = undefined ;
446509 }
0 commit comments