@@ -475,6 +475,49 @@ describe("slackPlugin status", () => {
475475 } ) ;
476476 } ) ;
477477
478+ it ( "uses the current Slack thread session before inherited child reply ids" , async ( ) => {
479+ const resolveRoute = slackPlugin . messaging ?. resolveOutboundSessionRoute ;
480+ if ( ! resolveRoute ) {
481+ throw new Error ( "slack messaging.resolveOutboundSessionRoute unavailable" ) ;
482+ }
483+
484+ const route = await resolveRoute ( {
485+ cfg : { } as OpenClawConfig ,
486+ agentId : "main" ,
487+ target : "channel:C1" ,
488+ currentSessionKey : "agent:main:slack:channel:C1:thread:1712345678.123456" ,
489+ replyToId : "1712345688.654321" ,
490+ } ) ;
491+
492+ expectRecordFields ( route , "Slack route" , {
493+ sessionKey : "agent:main:slack:channel:c1:thread:1712345678.123456" ,
494+ baseSessionKey : "agent:main:slack:channel:c1" ,
495+ threadId : "1712345678.123456" ,
496+ } ) ;
497+ } ) ;
498+
499+ it ( "keeps explicit Slack reply ids ahead of the current thread session" , async ( ) => {
500+ const resolveRoute = slackPlugin . messaging ?. resolveOutboundSessionRoute ;
501+ if ( ! resolveRoute ) {
502+ throw new Error ( "slack messaging.resolveOutboundSessionRoute unavailable" ) ;
503+ }
504+
505+ const route = await resolveRoute ( {
506+ cfg : { } as OpenClawConfig ,
507+ agentId : "main" ,
508+ target : "channel:C1" ,
509+ currentSessionKey : "agent:main:slack:channel:C1:thread:1712345678.123456" ,
510+ replyToId : "1712345688.654321" ,
511+ replyToIsExplicit : true ,
512+ } ) ;
513+
514+ expectRecordFields ( route , "Slack route" , {
515+ sessionKey : "agent:main:slack:channel:c1:thread:1712345688.654321" ,
516+ baseSessionKey : "agent:main:slack:channel:c1" ,
517+ threadId : "1712345688.654321" ,
518+ } ) ;
519+ } ) ;
520+
478521 it ( "canonicalizes bare Slack IM channel targets to direct user session routes" , async ( ) => {
479522 const resolveRoute = slackPlugin . messaging ?. resolveOutboundSessionRoute ;
480523 if ( ! resolveRoute ) {
0 commit comments