11import { describe , expect , it } from "vitest" ;
2- import { AGENT_LANE_NESTED , resolveNestedAgentLane } from "./lanes.js" ;
2+ import {
3+ AGENT_LANE_NESTED ,
4+ isNestedAgentLane ,
5+ resolveNestedAgentLane ,
6+ resolveNestedAgentLaneForSession ,
7+ } from "./lanes.js" ;
38
49describe ( "resolveNestedAgentLane" , ( ) => {
510 it ( "defaults to the nested lane when no lane is provided" , ( ) => {
@@ -16,3 +21,63 @@ describe("resolveNestedAgentLane", () => {
1621 expect ( resolveNestedAgentLane ( " custom-lane " ) ) . toBe ( "custom-lane" ) ;
1722 } ) ;
1823} ) ;
24+
25+ describe ( "resolveNestedAgentLaneForSession (#67502)" , ( ) => {
26+ it ( "falls back to the unscoped nested lane when no session key is provided" , ( ) => {
27+ expect ( resolveNestedAgentLaneForSession ( undefined ) ) . toBe ( AGENT_LANE_NESTED ) ;
28+ expect ( resolveNestedAgentLaneForSession ( "" ) ) . toBe ( AGENT_LANE_NESTED ) ;
29+ expect ( resolveNestedAgentLaneForSession ( " " ) ) . toBe ( AGENT_LANE_NESTED ) ;
30+ } ) ;
31+
32+ it ( "scopes the nested lane per target session key" , ( ) => {
33+ expect ( resolveNestedAgentLaneForSession ( "agent:ebao-next:discord:channel:1" ) ) . toBe (
34+ `${ AGENT_LANE_NESTED } :agent:ebao-next:discord:channel:1` ,
35+ ) ;
36+ } ) ;
37+
38+ it ( "produces distinct lanes for distinct target sessions" , ( ) => {
39+ const laneA = resolveNestedAgentLaneForSession ( "agent:ebao-next:discord:channel:1" ) ;
40+ const laneB = resolveNestedAgentLaneForSession ( "agent:ebao-vue:discord:channel:2" ) ;
41+ expect ( laneA ) . not . toBe ( laneB ) ;
42+ } ) ;
43+
44+ it ( "is deterministic for the same session key across calls" , ( ) => {
45+ const key = "agent:ebao:discord:channel:1" ;
46+ expect ( resolveNestedAgentLaneForSession ( key ) ) . toBe ( resolveNestedAgentLaneForSession ( key ) ) ;
47+ } ) ;
48+
49+ it ( "trims whitespace around the session key before scoping" , ( ) => {
50+ expect ( resolveNestedAgentLaneForSession ( " agent:ebao:main " ) ) . toBe (
51+ `${ AGENT_LANE_NESTED } :agent:ebao:main` ,
52+ ) ;
53+ } ) ;
54+ } ) ;
55+
56+ describe ( "isNestedAgentLane" , ( ) => {
57+ it ( "returns true for the unscoped nested lane" , ( ) => {
58+ expect ( isNestedAgentLane ( AGENT_LANE_NESTED ) ) . toBe ( true ) ;
59+ } ) ;
60+
61+ it ( "returns true for per-session nested lanes" , ( ) => {
62+ expect ( isNestedAgentLane ( resolveNestedAgentLaneForSession ( "agent:a:main" ) ) ) . toBe ( true ) ;
63+ expect ( isNestedAgentLane ( `${ AGENT_LANE_NESTED } :agent:a:main` ) ) . toBe ( true ) ;
64+ } ) ;
65+
66+ it ( "returns false for unrelated lanes" , ( ) => {
67+ expect ( isNestedAgentLane ( "main" ) ) . toBe ( false ) ;
68+ expect ( isNestedAgentLane ( "cron" ) ) . toBe ( false ) ;
69+ expect ( isNestedAgentLane ( "subagent" ) ) . toBe ( false ) ;
70+ expect ( isNestedAgentLane ( "session:agent:a:main" ) ) . toBe ( false ) ;
71+ } ) ;
72+
73+ it ( "returns false for lanes that merely contain 'nested' as a substring" , ( ) => {
74+ expect ( isNestedAgentLane ( "deeply-nested-lane" ) ) . toBe ( false ) ;
75+ expect ( isNestedAgentLane ( "session:nested" ) ) . toBe ( false ) ;
76+ expect ( isNestedAgentLane ( "nestedfoo" ) ) . toBe ( false ) ;
77+ } ) ;
78+
79+ it ( "returns false for empty or missing lane names" , ( ) => {
80+ expect ( isNestedAgentLane ( undefined ) ) . toBe ( false ) ;
81+ expect ( isNestedAgentLane ( "" ) ) . toBe ( false ) ;
82+ } ) ;
83+ } ) ;
0 commit comments