@@ -647,4 +647,124 @@ describe("chat view", () => {
647647 expect ( rerendered ?. value ) . toBe ( "gpt-5-mini" ) ;
648648 vi . unstubAllGlobals ( ) ;
649649 } ) ;
650+
651+ it ( "prefers the session label over displayName in the grouped chat session selector" , ( ) => {
652+ const { state } = createChatHeaderState ( { omitSessionFromList : true } ) ;
653+ state . sessionKey = "agent:main:subagent:4f2146de-887b-4176-9abe-91140082959b" ;
654+ state . settings . sessionKey = state . sessionKey ;
655+ state . sessionsResult = {
656+ ts : 0 ,
657+ path : "" ,
658+ count : 1 ,
659+ defaults : { model : "gpt-5" , contextTokens : null } ,
660+ sessions : [
661+ {
662+ key : state . sessionKey ,
663+ kind : "direct" ,
664+ updatedAt : null ,
665+ label : "cron-config-check" ,
666+ displayName : "webchat:g-agent-main-subagent-4f2146de-887b-4176-9abe-91140082959b" ,
667+ } ,
668+ ] ,
669+ } ;
670+ const container = document . createElement ( "div" ) ;
671+ render ( renderChatSessionSelect ( state ) , container ) ;
672+
673+ const [ sessionSelect ] = Array . from ( container . querySelectorAll < HTMLSelectElement > ( "select" ) ) ;
674+ const labels = Array . from ( sessionSelect ?. querySelectorAll ( "option" ) ?? [ ] ) . map ( ( option ) =>
675+ option . textContent ?. trim ( ) ,
676+ ) ;
677+
678+ expect ( labels ) . toContain ( "Subagent: cron-config-check" ) ;
679+ expect ( labels ) . not . toContain ( state . sessionKey ) ;
680+ expect ( labels ) . not . toContain (
681+ "subagent:4f2146de-887b-4176-9abe-91140082959b · webchat:g-agent-main-subagent-4f2146de-887b-4176-9abe-91140082959b" ,
682+ ) ;
683+ } ) ;
684+
685+ it ( "keeps a unique scoped fallback when the current grouped session is missing from sessions.list" , ( ) => {
686+ const { state } = createChatHeaderState ( { omitSessionFromList : true } ) ;
687+ state . sessionKey = "agent:main:subagent:4f2146de-887b-4176-9abe-91140082959b" ;
688+ state . settings . sessionKey = state . sessionKey ;
689+ const container = document . createElement ( "div" ) ;
690+ render ( renderChatSessionSelect ( state ) , container ) ;
691+
692+ const [ sessionSelect ] = Array . from ( container . querySelectorAll < HTMLSelectElement > ( "select" ) ) ;
693+ const labels = Array . from ( sessionSelect ?. querySelectorAll ( "option" ) ?? [ ] ) . map ( ( option ) =>
694+ option . textContent ?. trim ( ) ,
695+ ) ;
696+
697+ expect ( labels ) . toContain ( "subagent:4f2146de-887b-4176-9abe-91140082959b" ) ;
698+ expect ( labels ) . not . toContain ( "Subagent:" ) ;
699+ } ) ;
700+
701+ it ( "keeps a unique scoped fallback when a grouped session row has no label or displayName" , ( ) => {
702+ const { state } = createChatHeaderState ( { omitSessionFromList : true } ) ;
703+ state . sessionKey = "agent:main:subagent:4f2146de-887b-4176-9abe-91140082959b" ;
704+ state . settings . sessionKey = state . sessionKey ;
705+ state . sessionsResult = {
706+ ts : 0 ,
707+ path : "" ,
708+ count : 1 ,
709+ defaults : { model : "gpt-5" , contextTokens : null } ,
710+ sessions : [
711+ {
712+ key : state . sessionKey ,
713+ kind : "direct" ,
714+ updatedAt : null ,
715+ } ,
716+ ] ,
717+ } ;
718+ const container = document . createElement ( "div" ) ;
719+ render ( renderChatSessionSelect ( state ) , container ) ;
720+
721+ const [ sessionSelect ] = Array . from ( container . querySelectorAll < HTMLSelectElement > ( "select" ) ) ;
722+ const labels = Array . from ( sessionSelect ?. querySelectorAll ( "option" ) ?? [ ] ) . map ( ( option ) =>
723+ option . textContent ?. trim ( ) ,
724+ ) ;
725+
726+ expect ( labels ) . toContain ( "subagent:4f2146de-887b-4176-9abe-91140082959b" ) ;
727+ expect ( labels ) . not . toContain ( "Subagent:" ) ;
728+ } ) ;
729+
730+ it ( "disambiguates duplicate grouped labels with the scoped key suffix" , ( ) => {
731+ const { state } = createChatHeaderState ( { omitSessionFromList : true } ) ;
732+ state . sessionKey = "agent:main:subagent:4f2146de-887b-4176-9abe-91140082959b" ;
733+ state . settings . sessionKey = state . sessionKey ;
734+ state . sessionsResult = {
735+ ts : 0 ,
736+ path : "" ,
737+ count : 2 ,
738+ defaults : { model : "gpt-5" , contextTokens : null } ,
739+ sessions : [
740+ {
741+ key : "agent:main:subagent:4f2146de-887b-4176-9abe-91140082959b" ,
742+ kind : "direct" ,
743+ updatedAt : null ,
744+ label : "cron-config-check" ,
745+ } ,
746+ {
747+ key : "agent:main:subagent:6fb8b84b-c31f-410f-b7df-1553c82e43c9" ,
748+ kind : "direct" ,
749+ updatedAt : null ,
750+ label : "cron-config-check" ,
751+ } ,
752+ ] ,
753+ } ;
754+ const container = document . createElement ( "div" ) ;
755+ render ( renderChatSessionSelect ( state ) , container ) ;
756+
757+ const [ sessionSelect ] = Array . from ( container . querySelectorAll < HTMLSelectElement > ( "select" ) ) ;
758+ const labels = Array . from ( sessionSelect ?. querySelectorAll ( "option" ) ?? [ ] ) . map ( ( option ) =>
759+ option . textContent ?. trim ( ) ,
760+ ) ;
761+
762+ expect ( labels ) . toContain (
763+ "Subagent: cron-config-check · subagent:4f2146de-887b-4176-9abe-91140082959b" ,
764+ ) ;
765+ expect ( labels ) . toContain (
766+ "Subagent: cron-config-check · subagent:6fb8b84b-c31f-410f-b7df-1553c82e43c9" ,
767+ ) ;
768+ expect ( labels ) . not . toContain ( "Subagent: cron-config-check" ) ;
769+ } ) ;
650770} ) ;
0 commit comments